[
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yaml",
    "content": "name: 报告Bug/Report a bug\ndescription: 报告APP出现的问题/Reporting problems with the APP\ntitle: \"[Bug]: \"\nlabels: [\"bug🐞\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        感谢报告问题, 请先补全标题后填写以下信息.\n        \n        Thank you for reporting a problem, please complete the title and fill in the following information.\n  - type: textarea\n    id: what-happened\n    attributes:\n      label: 描述/Description\n      description: 描述问题/Describe the problem\n    validations:\n      required: true\n  - type: input\n    id: version\n    attributes:\n      label: Version\n      description: | \n        使用的APP版本/App version\n        非最新版本请尝试更新/Please try to update if it is not the latest version\n    validations:\n      required: true\n  - type: dropdown\n    id: platform\n    attributes:\n      label: 使用的操作系统/Operating system\n      multiple: true\n      options:\n        - Android\n        - iOS\n        - Windows\n        - macOS\n        - other\n    validations:\n      required: true\n  - type: textarea\n    id: logs\n    attributes:\n      label: 日志/logs\n      description: 上传日志, 在设置-logs中, 点击右上角的菜单后, 点击导出日志; 或者将错误相关日志粘贴到这里\n  - type: textarea\n    id: screenshotOrVideo\n    attributes:\n      label: 截图或视频/Screenshot or video\n      description: 在这里上传相关的屏幕截图或者视频/Upload relevant screenshots or videos here"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/enhancement.yaml",
    "content": "name: 功能建议/Feature Request\ndescription: 提出改进APP的建议/Suggest improvements to the APP\ntitle: \"[Enhancement]: \"\nlabels: [\"enhancement🚀\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        欢迎提出功能建议, 请先补全标题后填写以下信息.\n        \n        Welcome to make a feature request, please fill in the following information after completing the title.\n  - type: textarea\n    id: what-happened\n    attributes:\n      label: 描述/Description\n      description: 描述具体的建议/Describe your suggestion.\n    validations:\n      required: true\n  - type: dropdown\n    id: platform\n    attributes:\n      label: 操作系统/Operating System\n      description: 如果建议针对某个平台, 请在此选择/If the feature is for a particular platform, please select here\n      multiple: true\n      options:\n        - Android\n        - iOS\n        - Windows\n        - macOS\n        - other\n    validations:\n      required: false\n  - type: textarea\n    id: screenshotOrVideo\n    attributes:\n      label: 图片/picture\n      description: 如果需要图片描述, 请在这里上传/If you need a picture description, please upload it here."
  },
  {
    "path": ".github/ISSUE_TEMPLATE/other.yaml",
    "content": "name: 其它/other\ndescription: 其它内容/Other contents\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        如果你想报告App运行时出现的问题(无法查看某个漫画源, 无法登录, 某个功能无法使用等情况), 请切换到报告Bug模板;\n\n        如果你想提出功能建议或者优化建议, 请切换到功能建议模板;\n\n        对于其它情况, 填写并提交此处的内容.\n\n        If you wish to report issues occurring during the app's runtime (such as the inability to view a particular comic source, login issues, non-functional features, etc.), please switch to the Bug Report template.\n\n        If you would like to make feature requests or optimization suggestions, please switch to the Feature Request template.\n\n        For any other situations, please fill out and submit the content here.\n  - type: textarea\n    id: what-happened\n    attributes:\n      label: Content\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/workflows/delete_old_workflows.yml",
    "content": "name: Delete old workflow runs\non:\n  workflow_dispatch:\n    inputs:\n      days:\n        description: 'Days-worth of runs to keep for each workflow'\n        required: true\n        default: '30'\n      minimum_runs:\n        description: 'Minimum runs to keep for each workflow'\n        required: true\n        default: '6'\n      delete_workflow_pattern:\n        description: 'Name or filename of the workflow (if not set, all workflows are targeted)'\n        required: false\n      delete_workflow_by_state_pattern:\n        description: 'Filter workflows by state: active, deleted, disabled_fork, disabled_inactivity, disabled_manually'\n        required: true\n        default: \"ALL\"\n        type: choice\n        options:\n          - \"ALL\"\n          - active\n          - deleted\n          - disabled_inactivity\n          - disabled_manually\n      delete_run_by_conclusion_pattern:\n        description: 'Remove runs based on conclusion: action_required, cancelled, failure, skipped, success'\n        required: true\n        default: \"ALL\"\n        type: choice\n        options:\n          - \"ALL\"\n          - \"Unsuccessful: action_required,cancelled,failure,skipped\"\n          - action_required\n          - cancelled\n          - failure\n          - skipped\n          - success\n      dry_run:\n        description: 'Logs simulated changes, no deletions are performed'\n        required: false\n\njobs:\n  del_runs:\n    runs-on: ubuntu-latest\n    permissions:\n      actions: write\n      contents: read\n    steps:\n      - name: Delete workflow runs\n        uses: Mattraks/delete-workflow-runs@v2\n        with:\n          token: ${{ github.token }}\n          repository: ${{ github.repository }}\n          retain_days: ${{ github.event.inputs.days }}\n          keep_minimum_runs: ${{ github.event.inputs.minimum_runs }}\n          delete_workflow_pattern: ${{ github.event.inputs.delete_workflow_pattern }}\n          delete_workflow_by_state_pattern: ${{ github.event.inputs.delete_workflow_by_state_pattern }}\n          delete_run_by_conclusion_pattern: >-\n            ${{\n              startsWith(github.event.inputs.delete_run_by_conclusion_pattern, 'Unsuccessful:')\n              && 'action_required,cancelled,failure,skipped'\n              || github.event.inputs.delete_run_by_conclusion_pattern\n            }}\n          dry_run: ${{ github.event.inputs.dry_run }}"
  },
  {
    "path": ".github/workflows/ios_simulator.yml",
    "content": "name: Build IOS SIMULATOR\nrun-name: Build IOS SIMULATOR\non:\n  workflow_dispatch: {}\njobs:\n  Build_IOS_SIMULATOR:\n    runs-on: macos-13\n    steps:\n    - uses: actions/checkout@v3\n    - uses: subosito/flutter-action@v2\n      with:\n        channel: 'stable'\n        architecture: x64\n    - run: sudo xcode-select --switch /Applications/Xcode_14.3.1.app\n    - run: flutter pub get\n    - run: flutter build ios --simulator --no-codesign\n    - uses: actions/upload-artifact@v3\n      with:\n        name: build_files\n        path: /Users/runner/work/PicaComic/PicaComic/build/ios/iphonesimulator\n"
  },
  {
    "path": ".github/workflows/linux.yml",
    "content": "name: Build Linux\nrun-name: Build Linux\non:\n  workflow_dispatch: {}\njobs:\n  Build_Linux:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: subosito/flutter-action@v2\n        with:\n          channel: 'stable'\n          architecture: x64\n      - run: |\n          sudo apt-get update -y\n          sudo apt-get install -y ninja-build libgtk-3-dev webkit2gtk-4.1\n          dart pub global activate flutter_to_debian\n      - run: python3 debian/build.py\n      - run: dart run flutter_to_arch\n      - run: |\n          sudo rm -rf build/linux/arch/app.tar.gz\n          sudo rm -rf build/linux/arch/pkg\n          sudo rm -rf build/linux/arch/src\n          sudo rm -rf build/linux/arch/PKGBUILD\n      - uses: actions/upload-artifact@v4\n        with:\n          name: deb_build\n          path: build/linux/x64/release/debian\n      - uses: actions/upload-artifact@v4\n        with:\n          name: arch_build\n          path: build/linux/arch/"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: Build IOS\nrun-name: Build IOS\non:\n  workflow_dispatch: {}\njobs:\n  Build_IOS:\n    runs-on: macos-13\n    steps:\n    - uses: actions/checkout@v3\n    - uses: subosito/flutter-action@v2\n      with:\n        channel: 'stable'\n        architecture: x64\n    - run: sudo xcode-select --switch /Applications/Xcode_14.3.1.app\n    - run: flutter pub get\n    - run: flutter build ios --release --no-codesign\n    - run: |\n        mkdir -p /Users/runner/work/PicaComic/PicaComic/build/ios/iphoneos/Payload\n        mv /Users/runner/work/PicaComic/PicaComic/build/ios/iphoneos/Runner.app /Users/runner/work/PicaComic/PicaComic/build/ios/iphoneos/Payload\n        cd /Users/runner/work/PicaComic/PicaComic/build/ios/iphoneos/\n        zip -r app-ios.ipa Payload\n    - uses: actions/upload-artifact@v4\n      with:\n        name: app-ios.ipa\n        path: /Users/runner/work/PicaComic/PicaComic/build/ios/iphoneos/app-ios.ipa\n  Build_MacOS:\n    runs-on: macos-13\n    steps:\n    - uses: actions/checkout@v3\n    - uses: subosito/flutter-action@v2\n      with:\n        channel: 'stable'\n        architecture: x64\n    - run: sudo xcode-select --switch /Applications/Xcode_14.3.1.app\n    - run: flutter pub get\n    - run: flutter build macos --release\n    - uses: actions/upload-artifact@v4\n      with:\n        name: macos-build.zip\n        path: build/macos/Build/Products/Release/pica_comic.app\n "
  },
  {
    "path": ".gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\nmigrate_working_dir/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n**/ios/Flutter/.last_build_id\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\n/build/\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\n\n# Android Studio will place build artifacts here\n/android/app/debug\n/android/app/profile\n/android/app/release\n.vscode/"
  },
  {
    "path": ".metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled.\n\nversion:\n  revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n  channel: stable\n\nproject_type: app\n\n# Tracks metadata for the flutter migrate command\nmigration:\n  platforms:\n    - platform: root\n      create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n      base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n    - platform: android\n      create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n      base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n    - platform: ios\n      create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n      base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n    - platform: linux\n      create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n      base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n    - platform: macos\n      create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n      base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n    - platform: web\n      create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n      base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n    - platform: windows\n      create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n      base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a\n\n  # User provided section\n\n  # List of Local paths (relative to this file) that should be\n  # ignored by the migrate tool.\n  #\n  # Files that are not part of the templates will be ignored by default.\n  unmanaged_files:\n    - 'lib/main.dart'\n    - 'ios/Runner.xcodeproj/project.pbxproj'\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2023 Nyne\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "Deprecated, use new project: [venera](https://github.com/venera-app/venera).\n\n# Pica Comic\n\n[![flutter](https://img.shields.io/badge/flutter-3.24.1-blue)](https://flutter.dev/) \n[![License](https://img.shields.io/github/license/wgh136/PicaComic)](https://github.com/wgh136/PicaComic/blob/master/LICENSE)\n[![Download](https://img.shields.io/github/v/release/wgh136/PicaComic)](https://github.com/wgh136/PicaComic/releases)\n[![stars](https://img.shields.io/github/stars/wgh136/PicaComic)](https://github.com/wgh136/PicaComic/stargazers)\n\nA comic app with multiple sources built with flutter.\n\n## How to use\n\n1. Clone the repository\n```shell\ngit clone https://github.com/wgh136/PicaComic\n```\n2. Install flutter: https://docs.flutter.dev/get-started/install\n3. Build Application: https://docs.flutter.dev/deployment\n\n## Introduction\n\n### Built-in Comic Source\n\nCurrently, Pica Comic has 5 built-in comic sources:\n- picacg\n- e-hentai/exhentai\n- jmcomic\n- hitomi\n- 绅士漫画\n- nhentai\n\n### Custom Comic Source\n\nYou can add custom comic sources in the app after version 3.0.0.\n\n### Features\n\n- Browse manga\n- Online reading\n- Download manga\n- Manage local favorites and network favorites\n- Data sync(using webdav)\n- Reading history\n\n### History\n\nThis project initially started as an unofficial app for picacg \nand later evolved into an app that supports multiple comic sources.\n\n## Build From Source Code\nSee [https://docs.flutter.dev/](https://docs.flutter.dev/)\n\n## Thanks\n\n### Projects\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt)](https://github.com/tonquer/JMComic-qt)\n\nThe image restructuring algorithm used to display jm images is from this project.\n\n### Tags Translation\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=EhTagTranslation&repo=Database)](https://github.com/EhTagTranslation/Database)\n\nThe Chinese translation of the manga tags is from this project.\n"
  },
  {
    "path": "analysis_options.yaml",
    "content": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n# The issues identified by the analyzer are surfaced in the UI of Dart-enabled\n# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be\n# invoked from the command line by running `flutter analyze`.\n\n# The following line activates a set of recommended lints for Flutter apps,\n# packages, and plugins designed to encourage good coding practices.\ninclude: package:flutter_lints/flutter.yaml\n\nlinter:\n  # The lint rules applied to this project can be customized in the\n  # section below to disable rules from the `package:flutter_lints/flutter.yaml`\n  # included above or to enable additional rules. A list of all available lints\n  # and their documentation is published at\n  # https://dart-lang.github.io/linter/lints/index.html.\n  #\n  # Instead of disabling a lint rule for the entire project in the\n  # section below, it can also be suppressed for a single line of code\n  # or a specific dart file by using the `// ignore: name_of_lint` and\n  # `// ignore_for_file: name_of_lint` syntax on the line or in the file\n  # producing the lint.\n  rules:\n    # avoid_print: false  # Uncomment to disable the `avoid_print` rule\n    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "android/.gitignore",
    "content": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remember to never publicly share your keystore.\n# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app\nkey.properties\n**/*.keystore\n**/*.jks\n"
  },
  {
    "path": "android/app/build.gradle",
    "content": "plugins {\n    id \"com.android.application\"\n    id \"kotlin-android\"\n    id \"dev.flutter.flutter-gradle-plugin\"\n}\n\ndef localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertiesFile.exists()) {\n    localPropertiesFile.withReader('UTF-8') { reader ->\n        localProperties.load(reader)\n    }\n}\n\ndef flutterVersionCode = localProperties.getProperty('flutter.versionCode')\nif (flutterVersionCode == null) {\n    flutterVersionCode = '1'\n}\n\ndef flutterVersionName = localProperties.getProperty('flutter.versionName')\nif (flutterVersionName == null) {\n    flutterVersionName = '1.0'\n}\n\n\ndef keystorePropertiesFile = rootProject.file(\"key.properties\")\ndef keystoreProperties = new Properties()\nkeystoreProperties.load(new FileInputStream(keystorePropertiesFile))\n\nandroid {\n    compileSdk 34\n    ndkVersion flutter.ndkVersion\n\n    splits{\n        abi {\n            enable true\n            universalApk true\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    kotlinOptions {\n        jvmTarget = '1.8'\n    }\n\n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n\n    defaultConfig {\n        applicationId \"com.github.wgh136.pica_comic\"\n        // You can update the following values to match your application needs.\n        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.\n        minSdkVersion 21\n        targetSdk 34\n        versionCode flutterVersionCode.toInteger()\n        versionName flutterVersionName\n        multiDexEnabled true\n    }\n\n    signingConfigs {\n        debug {\n            storeFile file(keystoreProperties['storeFile'])\n            storePassword keystoreProperties['storePassword']\n            keyAlias keystoreProperties['keyAlias']\n            keyPassword keystoreProperties['keyPassword']\n        }\n        release {\n            keyAlias keystoreProperties['keyAlias']\n            keyPassword keystoreProperties['keyPassword']\n            storeFile file(keystoreProperties['storeFile'])\n            storePassword keystoreProperties['storePassword']\n        }\n    }\n\n    buildTypes {\n        release {\n            // Signing with the debug keys for now, so `flutter run --release` works.\n            signingConfig signingConfigs.release\n            applicationVariants.all { variant ->\n                variant.outputs.all { output ->\n                    def abi = output.getFilter(com.android.build.OutputFile.ABI)\n                    if (abi != null) {   // null for the universal-debug, universal-release variants\n                        outputFileName = \"PicaComic-${variant.versionName}-${abi}.apk\"\n                    } else {\n                        outputFileName = \"PicaComic-${variant.versionName}.apk\"\n                    }\n                }\n            }\n        }\n    }\n    namespace 'com.kokoiro.xyz.pica_comic'\n}\n\nflutter {\n    source '../..'\n}\n\ndependencies {\n    implementation 'com.google.android.gms:play-services-base:18.3.0'\n}\n"
  },
  {
    "path": "android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for development. Specifically,\n         the Flutter tool needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />\n    <uses-permission android:name=\"android.permission.USE_BIOMETRIC\"/>\n    <uses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n   <application\n        android:label=\"Pica Comic\"\n        android:name=\"${applicationName}\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:requestLegacyExternalStorage=\"true\"\n        android:usesCleartextTraffic=\"true\">\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\"\n            android:launchMode=\"singleTop\"\n            android:theme=\"@style/LaunchTheme\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\"\n            android:hardwareAccelerated=\"true\"\n            android:windowSoftInputMode=\"adjustResize\">\n            <!-- Specifies an Android theme to apply to this Activity as soon as\n                 the Android process has started. This theme is visible to the user\n                 while the Flutter UI initializes. After that, this theme continues\n                 to determine the Window background behind the Flutter UI. -->\n            <meta-data\n              android:name=\"io.flutter.embedding.android.NormalTheme\"\n              android:resource=\"@style/NormalTheme\"\n              />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n            <intent-filter android:label=\"filter_view_uris\">\n                <action android:name=\"android.intent.action.VIEW\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <data android:scheme=\"https\"/>\n                <data android:host=\"e-hentai.org\"/>\n                <data android:scheme=\"https\"/>\n                <data android:host=\"exhentai.org\"/>\n                <data android:scheme=\"https\"/>\n                <data android:host=\"nhentai.net\"/>\n                <data android:scheme=\"https\"/>\n                <data android:host=\"hitomi.la\"/>\n            </intent-filter>\n        </activity>\n        <!-- Don't delete the meta-data below.\n             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->\n        <meta-data\n            android:name=\"flutterEmbedding\"\n            android:value=\"2\" />\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/kotlin/com/kokoiro/xyz/pica_comic/MainActivity.kt",
    "content": "package com.kokoiro.xyz.pica_comic\n\nimport android.os.Build\nimport android.view.KeyEvent\nimport android.view.WindowManager\nimport io.flutter.embedding.android.FlutterFragmentActivity\nimport io.flutter.embedding.engine.FlutterEngine\nimport io.flutter.plugin.common.EventChannel\nimport io.flutter.plugin.common.MethodChannel\nimport io.flutter.plugins.GeneratedPluginRegistrant\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.net.Uri\nimport android.os.Environment\nimport android.Manifest\nimport androidx.core.content.ContextCompat\nimport com.google.android.gms.common.GoogleApiAvailability\n\nclass MainActivity: FlutterFragmentActivity() {\n    var volumeListen = VolumeListen()\n    var listening = false\n\n\n    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {\n        GeneratedPluginRegistrant.registerWith(flutterEngine)\n\n        val channel = EventChannel(flutterEngine.dartExecutor.binaryMessenger, \"com.kokoiro.xyz.pica_comic/volume\")\n        channel.setStreamHandler(\n            object : EventChannel.StreamHandler {\n                override fun onListen(arguments: Any?, events: EventChannel.EventSink) {\n                    listening = true\n                    volumeListen.whenUp = {\n                        events.success(1)\n                    }\n                    volumeListen.whenDown = {\n                        events.success(2)\n                    }\n                }\n                override fun onCancel(arguments: Any?) {\n                    listening = false\n                }\n        })\n        //拦截屏幕截图\n        MethodChannel(flutterEngine.dartExecutor.binaryMessenger,\"com.kokoiro.xyz.pica_comic/screenshot\").setMethodCallHandler{\n                _, _ ->\n            window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)\n        }\n        MethodChannel(flutterEngine.dartExecutor.binaryMessenger,\"com.kokoiro.xyz.pica_comic/secure\").setMethodCallHandler{\n                _, _ ->\n            window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)\n        }\n        //获取cpu架构\n        MethodChannel(flutterEngine.dartExecutor.binaryMessenger,\"com.kokoiro.xyz.pica_comic/device\").setMethodCallHandler{\n                _, res ->\n            res.success(getDeviceInfo())\n        }\n        //获取http代理\n        MethodChannel(flutterEngine.dartExecutor.binaryMessenger,\"kokoiro.xyz.pica_comic/proxy\").setMethodCallHandler{\n                _, res ->\n            res.success(getProxy())\n        }\n        //保持屏幕常亮\n        MethodChannel(flutterEngine.dartExecutor.binaryMessenger,\"com.kokoiro.xyz.pica_comic/keepScreenOn\").setMethodCallHandler{\n                call, _ ->\n            if(call.method == \"set\")\n                window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n            else\n                window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n        }\n\n        MethodChannel(flutterEngine.dartExecutor.binaryMessenger,\"pica_comic/playServer\").setMethodCallHandler{\n                _, res ->\n            val flag = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) == com.google.android.gms.common.ConnectionResult.SUCCESS\n            res.success(flag)\n        }\n\n        MethodChannel(flutterEngine.dartExecutor.binaryMessenger,\"pica_comic/settings\").setMethodCallHandler{\n                call, res ->\n            if(call.method == \"link\") {\n                val intent = Intent(\n                    android.provider.Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,\n                    Uri.parse(\"package:com.github.wgh136.pica_comic\"),\n                )\n                startActivity(intent)\n                res.success(null)\n            } else if(call.method == \"files\") {\n                val intent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {\n                    Intent(android.provider.Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)\n                } else {\n                    Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS)\n                }\n                intent.data = Uri.parse(\"package:com.github.wgh136.pica_comic\")\n                startActivity(intent)\n                res.success(null)\n            } else if(call.method == \"files_check\") {\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {\n                    res.success(Environment.isExternalStorageManager())\n                } else {\n                    res.success(\n                        ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED\n                            && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)\n                }\n            }\n\n        }\n    }\n\n    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {\n        if(listening){\n            when (keyCode) {\n                KeyEvent.KEYCODE_VOLUME_DOWN -> {\n                    volumeListen.down()\n                    return true\n                }\n                KeyEvent.KEYCODE_VOLUME_UP -> {\n                    volumeListen.up()\n                    return true\n                }\n            }\n        }\n        return super.onKeyDown(keyCode, event)\n    }\n\n    private fun getDeviceInfo(): String{\n        //获取cpu架构从而找到应当下载的app版本\n        return Build.SUPPORTED_ABIS[0]\n    }\n\n    private fun getProxy(): String{\n        val host = System.getProperty(\"http.proxyHost\")\n        val port = System.getProperty(\"http.proxyPort\")\n        return if(host!=null&&port!=null){\n            \"$host:$port\"\n        }else{\n            \"No Proxy\"\n        }\n    }\n}\n\nclass VolumeListen{\n    var whenUp = fun() {}\n    var whenDown = fun() {}\n    fun up(){\n        whenUp()\n    }\n    fun down(){\n        whenDown()\n    }\n}\n"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@android:color/white\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/drawable-v21/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"?android:colorBackground\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.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=\"@mipmap/ic_launcher_background\"/>\n  <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n  <monochrome android:drawable=\"@mipmap/ic_launcher_monochrome\"/>\n</adaptive-icon>"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Light.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             the Flutter engine draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n\n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Light.NoTitleBar\">\n        <item name=\"android:windowBackground\">?android:colorBackground</item>\n        <item name=\"android:windowLayoutInDisplayCutoutMode\">shortEdges</item>\n        <item name=\"android:navigationBarColor\">@android:color/transparent</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "android/app/src/main/res/values-night/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             the Flutter engine draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n\n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <item name=\"android:windowBackground\">?android:colorBackground</item>\n        <item name=\"android:windowLayoutInDisplayCutoutMode\">shortEdges</item>\n        <item name=\"android:navigationBarColor\">@android:color/transparent</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for development. Specifically,\n         the Flutter tool needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />\n</manifest>\n"
  },
  {
    "path": "android/build.gradle",
    "content": "import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile\n\nallprojects {\n    tasks.withType(AbstractKotlinCompile).configureEach {\n        kotlinOptions {\n            jvmTarget = \"1.8\"\n            apiVersion = \"1.8\"\n            languageVersion = \"1.8\"\n        }\n    }\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\nrootProject.buildDir = '../build'\nsubprojects {\n    project.buildDir = \"${rootProject.buildDir}/${project.name}\"\n}\nsubprojects {\n    project.evaluationDependsOn(':app')\n}\n\ntasks.register(\"clean\", Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.0-all.zip\n"
  },
  {
    "path": "android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx1536M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\nandroid.defaults.buildfeatures.buildconfig=true\nandroid.nonTransitiveRClass=false\nandroid.nonFinalResIds=false\n"
  },
  {
    "path": "android/settings.gradle",
    "content": "pluginManagement {\n    def flutterSdkPath = {\n        def properties = new Properties()\n        file(\"local.properties\").withInputStream { properties.load(it) }\n        def flutterSdkPath = properties.getProperty(\"flutter.sdk\")\n        assert flutterSdkPath != null, \"flutter.sdk not set in local.properties\"\n        return flutterSdkPath\n    }\n    settings.ext.flutterSdkPath = flutterSdkPath()\n\n    includeBuild(\"${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle\")\n\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n}\n\nplugins {\n    id \"dev.flutter.flutter-plugin-loader\" version \"1.0.0\"\n    id \"com.android.application\" version \"8.1.1\" apply false\n    id \"org.jetbrains.kotlin.android\" version \"1.9.0\" apply false\n}\n\ninclude \":app\""
  },
  {
    "path": "assets/init.js",
    "content": "/// encode, decode, hash, decrypt\nlet Convert = {\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {string}\n     */\n    encodeBase64: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"base64\",\n            value: value,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {string} value\n     * @returns {ArrayBuffer}\n     */\n    decodeBase64: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"base64\",\n            value: value,\n            isEncode: false\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {ArrayBuffer}\n     */\n    md5: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"md5\",\n            value: value,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {ArrayBuffer}\n     */\n    sha1: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"sha1\",\n            value: value,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {ArrayBuffer}\n     */\n    sha256: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"sha256\",\n            value: value,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {ArrayBuffer}\n     */\n    sha512: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"sha512\",\n            value: value,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @returns {ArrayBuffer}\n     */\n    decryptAesEcb: (value, key) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"aes-ecb\",\n            value: value,\n            key: key,\n            isEncode: false\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @param {ArrayBuffer} iv\n     * @returns {ArrayBuffer}\n     */\n    decryptAesCbc: (value, key, iv) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"aes-ecb\",\n            value: value,\n            key: key,\n            iv: iv,\n            isEncode: false\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @param {number} blockSize\n     * @returns {ArrayBuffer}\n     */\n    decryptAesCfb: (value, key, blockSize) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"aes-cfb\",\n            value: value,\n            key: key,\n            blockSize: blockSize,\n            isEncode: false\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @param {number} blockSize\n     * @returns {ArrayBuffer}\n     */\n    decryptAesOfb: (value, key, blockSize) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"aes-ofb\",\n            value: value,\n            key: key,\n            blockSize: blockSize,\n            isEncode: false\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @returns {ArrayBuffer}\n     */\n    decryptRsa: (value, key) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"rsa\",\n            value: value,\n            key: key,\n            isEncode: false\n        });\n    }\n}\n\nfunction randomInt(min, max) {\n    return sendMessage({\n        method: 'random',\n        min: min,\n        max: max\n    });\n}\n\nclass _Timer {\n    delay = 0;\n\n    callback = () => { };\n\n    status = false;\n\n    constructor(delay, callback) {\n        this.delay = delay;\n        this.callback = callback;\n    }\n\n    run() {\n        this.status = true;\n        this._interval();\n    }\n\n    _interval() {\n        if (!this.status) {\n            return;\n        }\n        this.callback();\n        setTimeout(this._interval.bind(this), this.delay);\n    }\n\n    cancel() {\n        this.status = false;\n    }\n}\n\nfunction setInterval(callback, delay) {\n    let timer = new _Timer(delay, callback);\n    timer.run();\n    return timer;\n}\n\nfunction Cookie(name, value, domain = null) {\n    let obj = {};\n    obj.name = name;\n    obj.value = value;\n    if (domain) {\n        obj.domain = domain;\n    }\n    return obj;\n}\n\n/**\n * Network object for sending HTTP requests and managing cookies.\n * @namespace Network\n */\nlet Network = {\n    /**\n     * Sends an HTTP request.\n     * @param {string} method - The HTTP method (e.g., GET, POST, PUT, PATCH, DELETE).\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @returns {Promise<ArrayBuffer>} The response from the request.\n     */\n    async fetchBytes(method, url, headers, data) {\n        let result = await sendMessage({\n            method: 'http',\n            http_method: method,\n            bytes: true,\n            url: url,\n            headers: headers,\n            data: data,\n        });\n\n        if (result.error) {\n            throw result.error;\n        }\n\n        return result;\n    },\n\n    /**\n     * Sends an HTTP request.\n     * @param {string} method - The HTTP method (e.g., GET, POST, PUT, PATCH, DELETE).\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @returns {Promise<Object>} The response from the request.\n     */\n    async sendRequest(method, url, headers, data) {\n        let result = await sendMessage({\n            method: 'http',\n            http_method: method,\n            url: url,\n            headers: headers,\n            data: data,\n        });\n\n        if (result.error) {\n            throw result.error;\n        }\n\n        return result;\n    },\n\n    /**\n     * Sends an HTTP GET request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @returns {Promise<Object>} The response from the request.\n     */\n    async get(url, headers) {\n        return this.sendRequest('GET', url, headers);\n    },\n\n    /**\n     * Sends an HTTP POST request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @returns {Promise<Object>} The response from the request.\n     */\n    async post(url, headers, data) {\n        return this.sendRequest('POST', url, headers, data);\n    },\n\n    /**\n     * Sends an HTTP PUT request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @returns {Promise<Object>} The response from the request.\n     */\n    async put(url, headers, data) {\n        return this.sendRequest('PUT', url, headers, data);\n    },\n\n    /**\n     * Sends an HTTP PATCH request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @returns {Promise<Object>} The response from the request.\n     */\n    async patch(url, headers, data) {\n        return this.sendRequest('PATCH', url, headers, data);\n    },\n\n    /**\n     * Sends an HTTP DELETE request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @returns {Promise<Object>} The response from the request.\n     */\n    async delete(url, headers) {\n        return this.sendRequest('DELETE', url, headers);\n    },\n\n    /**\n     * Sets cookies for a specific URL.\n     * @param {string} url - The URL to set the cookies for.\n     * @param {Cookie[]} cookies - The cookies to set.\n     */\n    setCookies(url, cookies) {\n        sendMessage({\n            method: 'cookie',\n            function: 'set',\n            url: url,\n            cookies: cookies,\n        });\n    },\n\n    /**\n     * Retrieves cookies for a specific URL.\n     * @param {string} url - The URL to get the cookies from.\n     * @returns {Promise<Cookie[]>} The cookies for the given URL.\n     */\n    getCookies(url) {\n        return sendMessage({\n            method: 'cookie',\n            function: 'get',\n            url: url,\n        });\n    },\n\n    /**\n     * Deletes cookies for a specific URL.\n     * @param {string} url - The URL to delete the cookies from.\n     */\n    deleteCookies(url) {\n        sendMessage({\n            method: 'cookie',\n            function: 'delete',\n            url: url,\n        });\n    },\n};\n\n/**\n * HtmlDocument class for parsing HTML and querying elements.\n */\nclass HtmlDocument {\n    static _key = 0;\n\n    key = 0;\n\n    /**\n     * Constructor for HtmlDocument.\n     * @param {string} html - The HTML string to parse.\n     */\n    constructor(html) {\n        this.key = HtmlDocument._key;\n        HtmlDocument._key++;\n        sendMessage({\n            method: \"html\",\n            function: \"parse\",\n            key: this.key,\n            data: html\n        })\n    }\n\n    /**\n     * Query a single element from the HTML document.\n     * @param {string} query - The query string.\n     * @returns {HtmlElement} The first matching element.\n     */\n    querySelector(query) {\n        let k = sendMessage({\n            method: \"html\",\n            function: \"querySelector\",\n            key: this.key,\n            query: query\n        })\n        if(!k) return null;\n        return new HtmlElement(k);\n    }\n\n    /**\n     * Query all matching elements from the HTML document.\n     * @param {string} query - The query string.\n     * @returns {HtmlElement[]} An array of matching elements.\n     */\n    querySelectorAll(query) {\n        let ks = sendMessage({\n            method: \"html\",\n            function: \"querySelectorAll\",\n            key: this.key,\n            query: query\n        })\n        return ks.map(k => new HtmlElement(k));\n    }\n}\n\n/**\n * HtmlDom class for interacting with HTML elements.\n */\nclass HtmlElement {\n    key = 0;\n\n    /**\n     * Constructor for HtmlDom.\n     * @param {number} k - The key of the element.\n     */\n    constructor(k) {\n        this.key = k;\n    }\n\n    /**\n     * Get the text content of the element.\n     * @returns {string} The text content.\n     */\n    get text() {\n        return sendMessage({\n            method: \"html\",\n            function: \"getText\",\n            key: this.key\n        })\n    }\n\n    /**\n     * Get the attributes of the element.\n     * @returns {Object} The attributes.\n     */\n    get attributes() {\n        return sendMessage({\n            method: \"html\",\n            function: \"getAttributes\",\n            key: this.key\n        })\n    }\n\n    /**\n     * Query a single element from the current element.\n     * @param {string} query - The query string.\n     * @returns {HtmlElement} The first matching element.\n     */\n    querySelector(query) {\n        let k = sendMessage({\n            method: \"html\",\n            function: \"dom_querySelector\",\n            key: this.key,\n            query: query\n        })\n        if(!k) return null;\n        return new HtmlElement(k);\n    }\n\n    /**\n     * Query all matching elements from the current element.\n     * @param {string} query - The query string.\n     * @returns {HtmlElement[]} An array of matching elements.\n     */\n    querySelectorAll(query) {\n        let ks = sendMessage({\n            method: \"html\",\n            function: \"dom_querySelectorAll\",\n            key: this.key,\n            query: query\n        })\n        return ks.map(k => new HtmlElement(k));\n    }\n\n    /**\n     * Get the children of the current element.\n     * @returns {HtmlElement[]} An array of child elements.\n     */\n    get children() {\n        let ks = sendMessage({\n            method: \"html\",\n            function: \"getChildren\",\n            key: this.key\n        })\n        return ks.map(k => new HtmlElement(k));\n    }\n}\n\nfunction log(level, title, content) {\n    sendMessage({\n        method: 'log',\n        level: level,\n        title: title,\n        content: content,\n    })\n}\n\nlet console = {\n    log: (content) => {\n        log('info', 'JS Console', content)\n    },\n    warn: (content) => {\n        log('warning', 'JS Console', content)\n    },\n    error: (content) => {\n        log('error', 'JS Console', content)\n    },\n};\n\nclass ComicSource {\n    name = \"\"\n\n    key = \"\"\n\n    version = \"\"\n\n    minAppVersion = \"\"\n\n    url = \"\"\n\n    /**\n     * load data with its key\n     * @param {string} dataKey\n     * @returns {any}\n     */\n    loadData(dataKey) {\n        return sendMessage({\n            method: 'load_data',\n            key: this.key,\n            data_key: dataKey\n        })\n    }\n\n    /**\n     * save data\n     * @param {string} dataKey\n     * @param data\n     */\n    saveData(dataKey, data) {\n        return sendMessage({\n            method: 'save_data',\n            key: this.key,\n            data_key: dataKey,\n            data: data\n        })\n    }\n\n    /**\n     * delete data\n     * @param {string} dataKey\n     */\n    deleteData(dataKey) {\n        return sendMessage({\n            method: 'delete_data',\n            key: this.key,\n            data_key: dataKey,\n        })\n    }\n\n    init() { }\n\n    static sources = {}\n}"
  },
  {
    "path": "assets/tags.json",
    "content": "{\n    \"rows\": {\n        \"female\": \"女性\",\n        \"male\": \"男性\",\n        \"mixed\": \"混合\",\n        \"language\": \"语言\",\n        \"other\": \"其他\",\n        \"group\": \"团队\",\n        \"artist\": \"艺术家\",\n        \"cosplayer\": \"Coser\",\n        \"parody\": \"原作\",\n        \"character\": \"角色\",\n        \"reclass\": \"重新分类\",\n        \"temp\": \"临时\"\n    },\n    \"reclass\": {\n        \"doujinshi\": \"同人志\",\n        \"manga\": \"漫画\",\n        \"artistcg\": \"画师CG\",\n        \"gamecg\": \"游戏CG\",\n        \"non-h\": \"无H\",\n        \"imageset\": \"图集\",\n        \"western\": \"西方\",\n        \"cosplay\": \"Cosplay\",\n        \"misc\": \"杂项\",\n        \"asianporn\": \"亚洲色情\",\n        \"private\": \"私有\"\n    },\n    \"language\": {\n        \"afrikaans\": \"南非语\",\n        \"albanian\": \"阿尔巴尼亚语\",\n        \"arabic\": \"阿拉伯语\",\n        \"aramaic\": \"阿拉姆语\",\n        \"armenian\": \"亚美尼亚语\",\n        \"bengali\": \"孟加拉语\",\n        \"bosnian\": \"波斯尼亚语\",\n        \"bulgarian\": \"保加利亚语\",\n        \"burmese\": \"缅甸语\",\n        \"catalan\": \"加泰罗尼亚语\",\n        \"cebuano\": \"宿务语\",\n        \"chinese\": \"汉语\",\n        \"cree\": \"克里语\",\n        \"creole\": \"克里奥尔语\",\n        \"croatian\": \"克罗地亚语\",\n        \"czech\": \"捷克语\",\n        \"danish\": \"丹麦语\",\n        \"dutch\": \"荷兰语\",\n        \"english\": \"英语\",\n        \"esperanto\": \"世界语\",\n        \"estonian\": \"爱沙尼亚语\",\n        \"finnish\": \"芬兰语\",\n        \"french\": \"法语\",\n        \"georgian\": \"格鲁吉亚语\",\n        \"german\": \"德语\",\n        \"greek\": \"希腊语\",\n        \"gujarati\": \"古吉拉特语\",\n        \"hebrew\": \"希伯来语\",\n        \"hindi\": \"印地语\",\n        \"hmong\": \"苗语\",\n        \"hungarian\": \"匈牙利语\",\n        \"icelandic\": \"冰岛语\",\n        \"indonesian\": \"印尼语\",\n        \"irish\": \"爱尔兰语\",\n        \"italian\": \"意大利语\",\n        \"japanese\": \"日语\",\n        \"javanese\": \"爪哇語\",\n        \"kannada\": \"卡纳达语\",\n        \"kazakh\": \"哈萨克语\",\n        \"khmer\": \"高棉语\",\n        \"korean\": \"韩语\",\n        \"kurdish\": \"库尔德语\",\n        \"ladino\": \"犹太西班牙语\",\n        \"lao\": \"老挝语\",\n        \"latin\": \"拉丁语\",\n        \"latvian\": \"拉脱维亚语\",\n        \"marathi\": \"马拉地语\",\n        \"mongolian\": \"蒙古语\",\n        \"ndebele\": \"恩德贝莱语\",\n        \"nepali\": \"尼泊尔语\",\n        \"norwegian\": \"挪威语\",\n        \"oromo\": \"奥罗莫语\",\n        \"papiamento\": \"帕皮阿门托语\",\n        \"pashto\": \"普什图语\",\n        \"persian\": \"波斯语\",\n        \"polish\": \"波兰语\",\n        \"portuguese\": \"葡萄牙语\",\n        \"punjabi\": \"旁遮普语\",\n        \"romanian\": \"罗马尼亚语\",\n        \"russian\": \"俄语\",\n        \"sango\": \"桑戈语\",\n        \"sanskrit\": \"梵语\",\n        \"serbian\": \"塞尔维亚语\",\n        \"shona\": \"绍纳语\",\n        \"slovak\": \"斯洛伐克语\",\n        \"slovenian\": \"斯洛文尼亚语\",\n        \"somali\": \"索马里语\",\n        \"spanish\": \"西班牙语\",\n        \"swahili\": \"斯瓦希里语\",\n        \"swedish\": \"瑞典语\",\n        \"tagalog\": \"他加禄语\",\n        \"tamil\": \"泰米尔语\",\n        \"telugu\": \"泰卢固语\",\n        \"thai\": \"泰语\",\n        \"tibetan\": \"藏语\",\n        \"tigrinya\": \"提格雷尼亚语\",\n        \"turkish\": \"土耳其语\",\n        \"ukrainian\": \"乌克兰语\",\n        \"urdu\": \"乌尔都语\",\n        \"vietnamese\": \"越南语\",\n        \"welsh\": \"威尔士语\",\n        \"yiddish\": \"意第绪语\",\n        \"zulu\": \"祖鲁语\",\n        \"speechless\": \"无言\",\n        \"text cleaned\": \"文字清除\",\n        \"translated\": \"翻译\",\n        \"rewrite\": \"改写\"\n    },\n    \"parody\": {\n        \"86\": \"86 -不存在的战区-\",\n        \"300\": \"300\",\n        \"original\": \"原创\",\n        \"touhou project\": \"东方Project\",\n        \"moetan\": \"萌单✏️\",\n        \"kanon\": \"Kanon❄\",\n        \"air\": \"AIR🕊\",\n        \"clannad\": \"CLANNAD👪\",\n        \"angel beats\": \"Angel Beats!❤\",\n        \"charlotte\": \"Charlotte🌠\",\n        \"little busters\": \"Little Busters!⚾🐈\",\n        \"rewrite\": \"Rewrite\",\n        \"ore no imouto ga konna ni kawaii wake ga nai\": \"我的妹妹不可能那么可爱\",\n        \"kantai collection\": \"舰队Collection\",\n        \"pokemon\": \"精灵宝可梦\",\n        \"higurashi no naku koro ni\": \"寒蝉鸣泣之时🔪\",\n        \"saki\": \"天才麻将少女🀄️\",\n        \"puella magi madoka magica\": \"魔法少女小圆\",\n        \"puella magi madoka magica side story magia record\": \"魔法纪录 魔法少女小圆外传\",\n        \"toradora\": \"龙与虎\",\n        \"lotte no omocha\": \"露蒂的玩具\",\n        \"sword art online\": \"刀剑神域\",\n        \"sword art online alternative gun gale online\": \"刀剑神域外传Gun Gale Online\",\n        \"to love-ru\": \"出包王女\",\n        \"ro-kyu-bu\": \"萝球社🏀\",\n        \"tantei opera milky holmes\": \"侦探歌剧 少女福尔摩斯🔎\",\n        \"hyperdimension neptunia\": \"超次元游戏：海王星🎮\",\n        \"love live\": \"LoveLive! School idol project\",\n        \"love live sunshine\": \"Love Live! Sunshine!!\",\n        \"love live nijigasaki high school idol club\": \"LoveLive!虹咲学园学园偶像同好会\",\n        \"sora no otoshimono\": \"天降之物\",\n        \"boku wa tomodachi ga sukunai\": \"我的朋友很少\",\n        \"vocaloid\": \"VOCALOID\",\n        \"voiceroid\": \"VOICEROID\",\n        \"date a live\": \"约会大作战\",\n        \"the idolmaster\": \"偶像大师\",\n        \"my little pony friendship is magic\": \"小马宝莉：友谊就是魔法🐎\",\n        \"himouto umaru-chan\": \"干物妹！小埋\",\n        \"bakemonogatari\": \"化物语\",\n        \"yahari ore no seishun love come wa machigatteiru\": \"我的青春恋爱物语果然有问题\",\n        \"tengen toppa gurren lagann\": \"天元突破\",\n        \"cardcaptor sakura\": \"魔卡少女樱\",\n        \"mayoi neko overrun\": \"迷途猫OverRun\",\n        \"outbreak company\": \"萌萌侵略者\",\n        \"kyoukai no kanata\": \"境界的彼方\",\n        \"hataraku maou-sama\": \"打工吧！魔王大人\",\n        \"haiyore nyaruko-san\": \"潜行吧！奈亚子\",\n        \"hentai ouji to warawanai neko\": \"变态王子与不笑猫\",\n        \"nagi no asukara\": \"来自风平浪静的明天\",\n        \"sekai seifuku bouryaku no zvezda\": \"世界征服～谋略之星～\",\n        \"no game no life\": \"游戏人生\",\n        \"barakamon\": \"元气囝仔\",\n        \"divine gate\": \"神圣之门\",\n        \"sayonara zetsubou sensei\": \"再见！绝望先生\",\n        \"highschool of the dead\": \"学园默示录\",\n        \"gakkou gurashi\": \"学园孤岛\",\n        \"a channel\": \"A频道\",\n        \"granblue fantasy\": \"碧蓝幻想\",\n        \"gundam\": \"高达\",\n        \"gundam age\": \"机动战士高达AGE\",\n        \"gundam 00\": \"机动战士高达00\",\n        \"gundam 0080\": \"机动战士高达0080 口袋里的战争\",\n        \"gundam 0083\": \"机动战士高达0083 星尘回忆录\",\n        \"gundam unicorn\": \"机动战士高达UC\",\n        \"gundam f91\": \"机动战士高达F91\",\n        \"gundam seed\": \"机动战士高达SEED\",\n        \"gundam seed destiny\": \"机动战士高达SEED DESTINY\",\n        \"gundam zz\": \"机动战士高达ZZ\",\n        \"mobile suit gundam\": \"机动战士高达\",\n        \"mobile suit gundam lost war chronicles\": \"机动战士高达战记 Lost War Chronicles\",\n        \"mobile suit gundam tekketsu no orphans\": \"机动战士高达 铁血的孤儿\",\n        \"gundam wing\": \"新机动战记高达W\",\n        \"gundam build fighters\": \"高达创战者\",\n        \"gundam build fighters try\": \"高达创战者TRY\",\n        \"gundam build divers\": \"高达创形者\",\n        \"gundam g no reconguista\": \"高达G之复国运动\",\n        \"gundam x\": \"机动新世纪高达X\",\n        \"victory gundam\": \"机动战士V高达\",\n        \"zeta gundam\": \"机动战士Z高达\",\n        \"g gundam\": \"机动武斗传G高达\",\n        \"turn a gundam\": \"∀高达\",\n        \"kiniro mosaic\": \"黄金拼图\",\n        \"gochuumon wa usagi desu ka\": \"请问您今天要来点兔子吗？\",\n        \"non non biyori\": \"悠哉日常大王\",\n        \"oda nobuna no yabou\": \"织田信奈的野望\",\n        \"tamako market\": \"玉子市场\",\n        \"yama no susume\": \"向山进发\",\n        \"pripara\": \"美妙天堂\",\n        \"sora no method\": \"天体的秩序\",\n        \"accel world\": \"加速世界\",\n        \"dungeon ni deai o motomeru no wa machigatteiru darou ka\": \"在地下城寻求邂逅是否搞错了什么\",\n        \"c cube\": \"C³-魔方少女-\",\n        \"shingeki no kyojin\": \"进击的巨人\",\n        \"onidere\": \"鬼骄\",\n        \"infinite stratos\": \"无限斯特拉托斯\",\n        \"disgaea\": \"魔界战记\",\n        \"chuunibyou demo koi ga shitai\": \"中二病也要谈恋爱！\",\n        \"ano hi mita hana no namae wo bokutachi wa mada shiranai\": \"我们仍未知道那天所看见的花的名字。\",\n        \"amagi brilliant park\": \"甘城光辉游乐园\",\n        \"hidan no aria\": \"绯弹的亚莉亚🔫\",\n        \"steinsgate\": \"命运石之门\",\n        \"lucky star\": \"幸运☆星\",\n        \"zero no tsukaima\": \"零之使魔\",\n        \"shakugan no shana\": \"灼眼的夏娜\",\n        \"the melancholy of haruhi suzumiya\": \"凉宫春日的忧郁\",\n        \"kannagi\": \"神薙\",\n        \"kashimashi\": \"女生爱女生\",\n        \"to heart\": \"ToHeart\",\n        \"toheart2\": \"ToHeart2\",\n        \"k-on\": \"轻音少女\",\n        \"he is my master\": \"我的主人\",\n        \"code geass\": \"叛逆的鲁鲁修\",\n        \"naruto\": \"火影忍者\",\n        \"school rumble\": \"校园迷糊大王\",\n        \"mahou sensei negima\": \"魔法老师\",\n        \"uq holder\": \"悠久持有者！\",\n        \"neon genesis evangelion\": \"新世纪福音战士\",\n        \"hidamari sketch\": \"向阳素描\",\n        \"mahou shoujo lyrical nanoha\": \"魔法少女奈叶\",\n        \"rosario vampire\": \"十字架与吸血鬼\",\n        \"pretty cure\": \"光之美少女\",\n        \"futari wa pretty cure\": \"光之美少女\",\n        \"futari wa precure splash star\": \"光之美少女 Splash Star\",\n        \"yes precure 5\": \"Yes! 光之美少女5\",\n        \"fresh precure\": \"光之美少女：幸福精灵\",\n        \"heartcatch precure\": \"光之美少女：甜蜜天使！\",\n        \"suite precure\": \"光之美少女：美乐天使\",\n        \"smile precure\": \"Smile 光之美少女！\",\n        \"dokidoki precure\": \"心跳！光之美少女\",\n        \"happinesscharge precure\": \"幸福爆发 光之美少女！\",\n        \"go princess precure\": \"Go! 公主 光之美少女\",\n        \"maho girls precure\": \"魔法使 光之美少女！\",\n        \"kirakira precure a la mode\": \"光之美少女：食尚甜心\",\n        \"hugtto precure\": \"拥抱！光之美少女\",\n        \"star twinkle precure\": \"星光闪亮☆光之美少女\",\n        \"jojos bizarre adventure\": \"JOJO的奇妙冒险\",\n        \"pangya\": \"魔法飞球\",\n        \"shokugeki no soma\": \"食戟之灵\",\n        \"working\": \"迷糊餐厅🍴\",\n        \"kono subarashii sekai ni syukufuku o\": \"为美好的世界献上祝福！\",\n        \"ore no kanojo to osananajimi ga shuraba sugiru\": \"我女友与青梅竹马的惨烈修罗场\",\n        \"ore no nounai sentakushi ga gakuen love comedy wo zenryoku de jama shiteiru\": \"我的脑内恋碍选项\",\n        \"overwatch\": \"守望先锋\",\n        \"halo\": \"光环\",\n        \"mass effect\": \"质量效应\",\n        \"half-life\": \"半衰期\",\n        \"portal\": \"传送门\",\n        \"the witcher\": \"巫师\",\n        \"the elder scrolls\": \"上古卷轴\",\n        \"defense of the ancients\": \"刀塔\",\n        \"re zero kara hajimeru isekai seikatsu\": \"Re：从零开始的异世界生活\",\n        \"saenai heroine no sodatekata\": \"路人女主的养成方法\",\n        \"koihime musou\": \"恋姬†无双\",\n        \"senran kagura\": \"闪乱神乐\",\n        \"kobayashi-san-chi no maid dragon\": \"小林家的龙女仆\",\n        \"new game\": \"NEW GAME!\",\n        \"shirobako\": \"白箱\",\n        \"girlish number\": \"少女编号\",\n        \"gabriel dropout\": \"珈百璃的堕落\",\n        \"chobits\": \"人形电脑天使心\",\n        \"dead or alive\": \"死或生\",\n        \"eromanga sensei\": \"埃罗芒阿老师\",\n        \"dorei to no seikatsu\": \"与奴隶的生活 -Teaching Feeling-\",\n        \"girls und panzer\": \"少女与战车\",\n        \"seto no hanayome\": \"濑户的花嫁\",\n        \"brave witches\": \"无畏魔女\",\n        \"strike witches\": \"强袭魔女\",\n        \"kemono friends\": \"兽娘动物园\",\n        \"league of legends\": \"英雄联盟\",\n        \"kill la kill\": \"斩服少女\",\n        \"dagashi kashi\": \"粗点心战争\",\n        \"street fighter\": \"街头霸王\",\n        \"fate grand order\": \"Fate/Grand Order\",\n        \"fate stay night\": \"Fate/stay night\",\n        \"fate apocrypha\": \"Fate/Apocrypha\",\n        \"fate zero\": \"Fate/Zero\",\n        \"fate hollow ataraxia\": \"Fate/hollow ataraxia\",\n        \"fate extra\": \"Fate/EXTRA\",\n        \"fate kaleid liner prisma illya\": \"Fate/kaleid liner 魔法少女☆伊莉雅\",\n        \"mahou tsukai no yoru\": \"魔法使之夜\",\n        \"kara no kyoukai\": \"空之境界\",\n        \"canaan\": \"迦南\",\n        \"tsukihime\": \"月姬\",\n        \"kimi no na wa.\": \"你的名字。\",\n        \"mashiro iro symphony\": \"纯白交响曲\",\n        \"dragon quest\": \"勇者斗恶龙\",\n        \"dragon quest i\": \"勇者斗恶龙I\",\n        \"dragon quest ii\": \"勇者斗恶龙II 恶灵的众神\",\n        \"dragon quest iii\": \"勇者斗恶龙III 传说的开始\",\n        \"dragon quest iv\": \"勇者斗恶龙IV 被引导的人们\",\n        \"dragon quest v\": \"勇者斗恶龙V 天空的新娘\",\n        \"dragon quest vi\": \"勇者斗恶龙VI 幻之大地\",\n        \"dragon quest vii\": \"勇者斗恶龙VII 伊甸的战士们\",\n        \"dragon quest viii\": \"勇者斗恶龙VIII 天空、碧海、大地与被诅咒的公主\",\n        \"dragon quest ix\": \"勇者斗恶龙IX 星空的守护者\",\n        \"dragon quest x\": \"勇者斗恶龙X 觉醒的五种族 Online\",\n        \"dragon quest xi\": \"勇者斗恶龙XI 追寻逝去的时光\",\n        \"dragon quest dai no daibouken\": \"勇者斗恶龙 达尔大冒险\",\n        \"dragon quest monsters\": \"勇者斗恶龙怪兽篇\",\n        \"dragon quest yuusha abel densetsu\": \"勇者斗恶龙 勇者阿贝尔传说\",\n        \"dragon quest heroes\": \"勇者斗恶龙 英雄\",\n        \"left 4 dead\": \"求生之路\",\n        \"bloodrayne\": \"吸血莱恩\",\n        \"star wars\": \"星球大战\",\n        \"shin megami tensei\": \"真·女神转生\",\n        \"shin megami tensei devil children\": \"真·女神转生 恶魔之子\",\n        \"devil survivor\": \"女神异闻录 恶魔幸存者\",\n        \"persona\": \"女神异闻录\",\n        \"persona 2\": \"女神异闻录2\",\n        \"persona 3\": \"女神异闻录3\",\n        \"persona 4\": \"女神异闻录4\",\n        \"persona 5\": \"女神异闻录5\",\n        \"monsters inc.\": \"怪兽电力公司\",\n        \"hai to gensou no grimgar\": \"灰与幻想的格林姆迦尔\",\n        \"pretty rhythm\": \"美妙旋律\",\n        \"mamono musume zukan\": \"魔物娘图鉴\",\n        \"getsuyoubi no tawawa\": \"星期一的丰满\",\n        \"phantasy star\": \"梦幻之星\",\n        \"phantasy star 2\": \"梦幻之星II 不归的终点\",\n        \"phantasy star online\": \"梦幻之星Online\",\n        \"phantasy star online 2\": \"梦幻之星Online 2\",\n        \"phantasy star portable 2\": \"梦幻之星：携带版2\",\n        \"phantasy star universe\": \"梦幻之星 宇宙\",\n        \"phantasy star zero\": \"梦幻之星ZERO\",\n        \"arms\": \"ARMS\",\n        \"astro boy\": \"铁臂阿童木\",\n        \"detective conan\": \"名侦探柯南\",\n        \"ore twintail ni narimasu.\": \"我，要成为双马尾\",\n        \"kiss x sis\": \"亲吻姐姐\",\n        \"kimikiss\": \"君吻\",\n        \"super sonico\": \"超级索尼子\",\n        \"final fantasy\": \"最终幻想\",\n        \"final fantasy ii\": \"最终幻想II\",\n        \"final fantasy iii\": \"最终幻想III\",\n        \"final fantasy iv\": \"最终幻想IV\",\n        \"final fantasy v\": \"最终幻想V\",\n        \"final fantasy vi\": \"最终幻想VI\",\n        \"final fantasy vii\": \"最终幻想VII\",\n        \"final fantasy viii\": \"最终幻想VIII\",\n        \"final fantasy ix\": \"最终幻想IX\",\n        \"final fantasy x\": \"最终幻想X\",\n        \"final fantasy x-2\": \"最终幻想X-2\",\n        \"final fantasy xi\": \"最终幻想XI\",\n        \"final fantasy xii\": \"最终幻想XII\",\n        \"final fantasy xiii\": \"最终幻想XIII\",\n        \"final fantasy xiv\": \"最终幻想XIV\",\n        \"final fantasy xv\": \"最终幻想XV\",\n        \"final fantasy crystal chronicles\": \"最终幻想水晶编年史\",\n        \"final fantasy tactics\": \"最终幻想战略版\",\n        \"final fantasy tactics advance\": \"最终幻想战略版Advance\",\n        \"dissidia final fantasy\": \"最终幻想大乱斗\",\n        \"final fantasy unlimited\": \"最终幻想：无限\",\n        \"final fantasy type-0\": \"最终幻想 零式\",\n        \"kill me baby\": \"爱杀宝贝\",\n        \"shinryaku ika musume\": \"侵略！乌贼娘\",\n        \"one piece\": \"海贼王\",\n        \"dragon ball\": \"龙珠\",\n        \"dragon ball z\": \"龙珠Z\",\n        \"dragon ball gt\": \"龙珠GT\",\n        \"dragon ball super\": \"龙珠超\",\n        \"sakurasou no pet na kanojo\": \"樱花庄的宠物女孩\",\n        \"myriad colors phantom world\": \"无彩限的怪灵世界\",\n        \"soul eater\": \"噬魂师\",\n        \"urara meirochou\": \"Urara迷路帖\",\n        \"ranma 12\": \"乱马½\",\n        \"yosuga no sora\": \"缘之空\",\n        \"fire emblem if\": \"火焰之纹章 if\",\n        \"fire emblem\": \"火焰之纹章\",\n        \"fire emblem awakening\": \"火焰之纹章 觉醒\",\n        \"fire emblem gaiden\": \"火焰之纹章外传\",\n        \"fire emblem seisen no keifu\": \"火焰之纹章 圣战之系谱\",\n        \"fire emblem thracia 776\": \"火焰之纹章 多拉基亚776\",\n        \"fire emblem fuuin no tsurugi\": \"火焰之纹章 封印之剑\",\n        \"fire emblem rekka no ken\": \"火焰之纹章 烈火之剑\",\n        \"fire emblem the sacred stones\": \"火焰之纹章 圣魔之光石\",\n        \"fire emblem path of radiance\": \"火焰之纹章 苍炎之轨迹\",\n        \"fire emblem radiant dawn\": \"火焰之纹章 晓之女神\",\n        \"fire emblem mystery of the emblem\": \"火焰之纹章 纹章之谜\",\n        \"fire emblem heroes\": \"火焰之纹章 英雄\",\n        \"gintama\": \"银魂\",\n        \"panty and stocking with garterbelt\": \"吊带袜天使\",\n        \"kamen rider\": \"假面骑士\",\n        \"kamen rider decade\": \"假面骑士Decade\",\n        \"kamen rider amazon\": \"假面骑士亚马逊\",\n        \"kamen rider wizard\": \"假面骑士Wizard\",\n        \"kamen rider drive\": \"假面骑士Drive\",\n        \"kamen rider ex-aid\": \"假面骑士EX-AID\",\n        \"kamen rider w\": \"假面骑士W\",\n        \"kamen rider hibiki\": \"假面骑士响鬼\",\n        \"kamen rider kabuto\": \"假面骑士Kabuto\",\n        \"kamen rider den-o\": \"假面骑士电王\",\n        \"kamen rider fourze\": \"假面骑士Fourze\",\n        \"kamen rider ooo\": \"假面骑士OOO\",\n        \"kaiji\": \"赌博默示录\",\n        \"my hero academia\": \"我的英雄学院\",\n        \"shinmai maou no testament\": \"新妹魔王的契约者\",\n        \"youjo senki\": \"幼女战记\",\n        \"touken ranbu\": \"刀剑乱舞\",\n        \"teen titans\": \"少年泰坦\",\n        \"undertale\": \"传说之下\",\n        \"five nights at freddys\": \"在弗雷迪的五个夜晚\",\n        \"one punch man\": \"一拳超人\",\n        \"black rock shooter\": \"黑岩射手\",\n        \"dragons crown\": \"龙之皇冠\",\n        \"noir\": \"黑街二人组\",\n        \"guilty crown\": \"罪恶王冠\",\n        \"nana\": \"娜娜\",\n        \"nier\": \"尼尔\",\n        \"nier automata\": \"尼尔：机械纪元\",\n        \"psycho-pass\": \"心理测量者\",\n        \"ben 10\": \"少年骇客\",\n        \"hey arnold\": \"嘿，阿诺德！\",\n        \"bungou stray dogs\": \"文豪Stray Dogs\",\n        \"gugure kokkuri-san\": \"银仙\",\n        \"zootopia\": \"疯狂动物城\",\n        \"umineko no naku koro ni\": \"海猫鸣泣之时\",\n        \"ah my goddess\": \"我的女神\",\n        \"denpa onna to seishun otoko\": \"电波女与青春男\",\n        \"mirai nikki\": \"未来日记\",\n        \"oshiete galko-chan\": \"告诉我！辣妹子酱\",\n        \"eureka 7\": \"交响诗篇\",\n        \"darkstalkers\": \"恶魔战士\",\n        \"x-men\": \"X战警\",\n        \"x-men evolution\": \"X战警：进化\",\n        \"ichigo 100\": \"草莓100%\",\n        \"tonari no kaibutsu-kun\": \"邻座的怪同学\",\n        \"danganronpa\": \"弹丸论破\",\n        \"koutetsujou no kabaneri\": \"甲铁城的卡巴内利\",\n        \"yu-gi-oh\": \"游戏王\",\n        \"yu-gi-oh 5ds\": \"游戏王5D's\",\n        \"yu-gi-oh zexal\": \"游戏王ZEXAL\",\n        \"yu-gi-oh arc-v\": \"游戏王ARC-V\",\n        \"yu-gi-oh gx\": \"游戏王－怪兽之决斗GX\",\n        \"yu-gi-oh vrains\": \"游戏王VRAINS\",\n        \"kimi ni todoke\": \"好想告诉你\",\n        \"akatsuki no yona\": \"晨曦公主\",\n        \"onii-chan dakedo ai sae areba kankeinai yo ne\": \"就算是哥哥，有爱就没问题了，对吧\",\n        \"oniichan no koto nanka zenzen suki janain dakara ne\": \"腹黑妹妹控兄记!!\",\n        \"sora no woto\": \"空之音\",\n        \"occult academy\": \"世纪末超自然学院\",\n        \"gatchaman crowds\": \"科学小飞侠Crowds\",\n        \"saya no uta\": \"沙耶之歌\",\n        \"vividred operation\": \"绯色战姬\",\n        \"kodomo no jikan\": \"萝莉的时间\",\n        \"shuffle\": \"Shuffle!\",\n        \"power rangers\": \"超能战士\",\n        \"rune soldier\": \"魔法战士李维\",\n        \"kirby\": \"星之卡比\",\n        \"sakura quest\": \"樱花任务\",\n        \"aldnoah.zero\": \"ALDNOAH.ZERO\",\n        \"maoyuu maou yuusha\": \"魔王勇者\",\n        \"splatoon\": \"喷射战士\",\n        \"prunus girl\": \"樱桃少女\",\n        \"king of fighters\": \"拳皇\",\n        \"love plus\": \"爱相随\",\n        \"love hina\": \"纯情房东俏房客\",\n        \"akagami no shirayukihime\": \"赤发的白雪姬\",\n        \"minami-ke\": \"南家三姐妹\",\n        \"queens blade\": \"女王之刃\",\n        \"sekirei\": \"鹡鸰女神\",\n        \"yuuki yuuna wa yuusha de aru\": \"结城友奈是勇者\",\n        \"blazblue\": \"苍翼默示录\",\n        \"frame arms girl\": \"机甲少女\",\n        \"busou shinki\": \"武装神姬\",\n        \"bayonetta\": \"猎天使魔女\",\n        \"devil may cry\": \"鬼泣\",\n        \"tekken\": \"铁拳\",\n        \"super mario brothers\": \"超级马力欧兄弟\",\n        \"spider-man\": \"蜘蛛侠\",\n        \"gunsmith cats\": \"猫眼女枪手\",\n        \"puzzle and dragons\": \"智龙迷城\",\n        \"senki zesshou symphogear\": \"战姬绝唱Symphogear\",\n        \"shaman king\": \"通灵王\",\n        \"gegege no kitarou\": \"怪怪怪的鬼太郎\",\n        \"marmalade boy\": \"橘子酱男孩\",\n        \"esper mami\": \"超能力魔美\",\n        \"fushigi no umi no nadia\": \"蓝宝石之谜\",\n        \"martian successor nadesico\": \"机动战舰抚子\",\n        \"kino no tabi\": \"奇诺之旅\",\n        \"infinite ryvius\": \"无限的未知\",\n        \"machine robo\": \"天威勇士\",\n        \"rage of bahamut\": \"巴哈姆特之怒\",\n        \"kono naka ni hitori imouto ga iru\": \"其中1个是妹妹\",\n        \"sailor moon\": \"美少女战士\",\n        \"dog days\": \"犬勇者物语\",\n        \"onegai teacher\": \"拜托了☆老师\",\n        \"onegai twins\": \"拜托了☆双子星\",\n        \"rinne no lagrange\": \"轮回的拉格朗日\",\n        \"monster musume no iru nichijou\": \"魔物娘的相伴日常\",\n        \"black lagoon\": \"黑礁\",\n        \"steven universe\": \"史帝芬宇宙\",\n        \"the legend of zelda\": \"塞尔达传说\",\n        \"totally spies\": \"少女特工组\",\n        \"the legend of korra\": \"科拉传奇\",\n        \"kangoku senkan\": \"监狱战舰\",\n        \"prison school\": \"监狱学园\",\n        \"macross\": \"超时空要塞\",\n        \"the super dimension fortress macross\": \"超时空要塞Macross\",\n        \"macross 7\": \"超时空要塞7\",\n        \"macross frontier\": \"超时空要塞F\",\n        \"macross plus\": \"超时空要塞Plus\",\n        \"macross delta\": \"超时空要塞Δ\",\n        \"macross vf-x\": \"超时空要塞VF-X\",\n        \"little red riding hood\": \"小红帽\",\n        \"gekkan shoujo nozaki-kun\": \"月刊少女野崎君\",\n        \"girl friend beta\": \"临时女友\",\n        \"bakuman\": \"食梦者\",\n        \"nisekoi\": \"伪恋\",\n        \"blade and soul\": \"剑灵\",\n        \"inu x boku ss\": \"妖狐×仆SS\",\n        \"guilty gear\": \"罪恶装备\",\n        \"nanatsu no taizai\": \"七大罪\",\n        \"starcraft\": \"星际争霸\",\n        \"alice in wonderland\": \"爱丽丝梦游仙境\",\n        \"ikkitousen\": \"一骑当千\",\n        \"g.i. joe\": \"特种部队\",\n        \"metroid\": \"银河战士\",\n        \"metal gear solid\": \"合金装备\",\n        \"tomb raider\": \"古墓丽影\",\n        \"xena warrior princess\": \"战士公主西娜\",\n        \"the fifth element\": \"第五元素\",\n        \"terminator\": \"终结者\",\n        \"yurikuma arashi\": \"百合熊风暴\",\n        \"adventure time\": \"探险时光\",\n        \"strike the blood\": \"噬血狂袭\",\n        \"valkyrie drive\": \"女武神驱动\",\n        \"saber marionette\": \"机械女神\",\n        \"dance with devils\": \"与魔共舞\",\n        \"samurai 7\": \"七武士\",\n        \"samurai jack\": \"杰克武士\",\n        \"samurai deeper kyo\": \"鬼眼狂刀\",\n        \"samurai pizza cats\": \"功夫猫党\",\n        \"samurai spirits\": \"侍魂\",\n        \"hyakka ryouran samurai girls\": \"百花缭乱 武士少女\",\n        \"samurai champloo\": \"混沌武士\",\n        \"afro samurai\": \"爆炸头武士\",\n        \"samurai sentai shinkenger\": \"侍战队真剑者\",\n        \"samurai flamenco\": \"武士弗拉明戈\",\n        \"onechambara bikini samurai squad\": \"忌血的继承者\",\n        \"samurai warriors\": \"战国无双\",\n        \"dynasty warriors\": \"真·三国无双\",\n        \"demons souls\": \"恶魔之魂\",\n        \"seiken densetsu\": \"圣剑传说\",\n        \"seiken densetsu 3\": \"圣剑传说3\",\n        \"kore wa zombie desu ka\": \"这个是僵尸吗？\",\n        \"ojamajo doremi\": \"小魔女DoReMi\",\n        \"terra formars\": \"火星异种\",\n        \"spirited away\": \"千与千寻\",\n        \"el hazard\": \"神秘的世界\",\n        \"langrisser\": \"梦幻模拟战\",\n        \"slayers\": \"秀逗魔导士\",\n        \"grendizer\": \"UFO机器人 古连泰沙\",\n        \"keroro gunsou\": \"Keroro军曹\",\n        \"sakura taisen\": \"樱花大战\",\n        \"saint seiya\": \"圣斗士星矢\",\n        \"agent aika\": \"海底娇娃蓝华\",\n        \"city hunter\": \"城市猎人\",\n        \"super robot wars\": \"超级机器人大战\",\n        \"super robot wars w\": \"超级机器人大战W\",\n        \"super robot wars k\": \"超级机器人大战K\",\n        \"super robot wars z 2nd\": \"第2次超级机器人大战Z\",\n        \"endless frontier\": \"无限边界：超级机器人大战OG传说\",\n        \"hellsing\": \"地狱之歌\",\n        \"super black jack\": \"兔女郎的诱惑\",\n        \"hell teacher nube\": \"地狱老师\",\n        \"hitsugi no chaika\": \"棺姬嘉依卡\",\n        \"kishin douji zenki\": \"鬼神童子\",\n        \"muv-luv\": \"Muv-Luv\",\n        \"muv-luv alternative total eclipse\": \"Muv-Luv Alternative Total eclipse\",\n        \"dangaioh\": \"破邪大星弹劾皇\",\n        \"3x3 eyes\": \"三只眼\",\n        \"bakuretsu hunters\": \"爆走猎人\",\n        \"vampire princess miyu\": \"吸血姬美夕\",\n        \"reco love\": \"真爱记录\",\n        \"spice and wolf\": \"狼与香辛料\",\n        \"youkai watch\": \"妖怪手表\",\n        \"battle programmer shirase\": \"战争程序员白濑\",\n        \"kung fu panda\": \"功夫熊猫\",\n        \"star vs. the forces of evil\": \"星蝶公主\",\n        \"the amazing world of gumball\": \"阿甘妙世界\",\n        \"wakfu\": \"沃土\",\n        \"wander over yonder\": \"宇宙小奇兵\",\n        \"batman\": \"蝙蝠侠\",\n        \"resident evil\": \"生化危机\",\n        \"kim possible\": \"麻辣女孩\",\n        \"jinrui wa suitai shimashita\": \"人类衰退之后\",\n        \"miss machiko\": \"真知子老师\",\n        \"gaogaigar\": \"勇者王\",\n        \"hibike euphonium\": \"吹响！上低音号\",\n        \"ragnarok online\": \"仙境传说\",\n        \"no more heroes\": \"英雄不再\",\n        \"akuma no riddle\": \"恶魔之谜\",\n        \"overlord\": \"不死者之王\",\n        \"full ani\": \"Fullani\",\n        \"full metal panic\": \"全金属狂潮\",\n        \"fullmetal alchemist\": \"钢之炼金术师\",\n        \"full moon o sagashite\": \"寻找满月\",\n        \"full metal daemon muramasa\": \"装甲恶鬼村正\",\n        \"futsuu no joshikousei ga locodol yattemita.\": \"普通女高中生要做当地偶像\",\n        \"fallout\": \"辐射\",\n        \"fancy lala\": \"梦幻拉拉\",\n        \"final fight\": \"快打旋风\",\n        \"beauty and the beast\": \"美女与野兽\",\n        \"baka to test to shoukanjuu\": \"笨蛋测验召唤兽\",\n        \"arcana heart\": \"圣灵之心\",\n        \"heroman\": \"HEROMAN\",\n        \"anyamaru tantei kiruminzoo\": \"动物侦探奇鲁米\",\n        \"kyoukai senjou no horizon\": \"境界线上的地平线\",\n        \"rwby\": \"RWBY\",\n        \"lupin iii\": \"鲁邦三世\",\n        \"ensemble stars\": \"偶像梦幻祭\",\n        \"ajin\": \"亚人\",\n        \"kingdom hearts\": \"王国之心\",\n        \"tobaku haouden zero\": \"赌博霸王传 零\",\n        \"kannazuki no miko\": \"神无月的巫女\",\n        \"haikyuu\": \"排球少年!!\",\n        \"free\": \"Free! 男子游泳部\",\n        \"itsuka tenma no kuro usagi\": \"曾几何时天魔的黑兔\",\n        \"magic knight rayearth\": \"魔法骑士雷亚斯\",\n        \"kochikame\": \"乌龙派出所\",\n        \"bakusou kyoudai lets and go\": \"四驱兄弟\",\n        \"the powerpuff girls\": \"飞天小女警\",\n        \"powerpuff girls z\": \"飞天小女警Z\",\n        \"omoikkiri kagaku adventure sou nanda\": \"充满干劲十足的科学冒险—神秘智慧石\",\n        \"wedding peach\": \"爱天使传说 婚纱桃子\",\n        \"fushigiboshi no futagohime\": \"不可思议星球的☆双胞胎公主\",\n        \"aquarion\": \"创圣的亚库艾里翁\",\n        \"aquarion logos\": \"创圣的亚库艾里翁LOGOS\",\n        \"aquarion evol\": \"创圣的亚库艾里翁EVOL\",\n        \"welcome to the n.h.k.\": \"欢迎加入NHK！\",\n        \"sakurako-san no ashimoto ni wa shitai ga umatteiru\": \"樱子小姐的脚下埋着尸体\",\n        \"shimoneta to iu gainen ga sonzai shinai taikutsu na sekai\": \"下流梗不存在的灰暗世界\",\n        \"kyonyuu fantasy\": \"巨乳幻想\",\n        \"puyo puyo\": \"噗哟噗哟\",\n        \"kaku-san-sei million arthur\": \"扩散性百万亚瑟王\",\n        \"genji tsuushin agedama\": \"电脑小奇侠\",\n        \"dennou coil\": \"电脑线圈\",\n        \"god eater\": \"噬神者\",\n        \"demi-chan wa kataritai\": \"亚人酱有话要说\",\n        \"akazukin chacha\": \"小红帽恰恰\",\n        \"idol janshi suchie-pai\": \"美少女雀士\",\n        \"twin angels\": \"淫兽圣战\",\n        \"shadow lady\": \"月光淑女\",\n        \"oboro muramasa\": \"胧村正\",\n        \"zettai bouei leviathan\": \"绝对防卫利维坦\",\n        \"tokimeki memorial\": \"心跳回忆\",\n        \"future card buddyfight\": \"未来卡 搭档对战\",\n        \"fun fun pharmacy\": \"不可思议魔法药店\",\n        \"aiura\": \"校园日记 AIURA\",\n        \"gokujou seitokai\": \"极上学生会\",\n        \"show by rock\": \"Show By Rock!!\",\n        \"star fox\": \"星际火狐\",\n        \"white album\": \"白色相簿❄\",\n        \"tenchi muyo\": \"天地无用！\",\n        \"variable geo\": \"格斗女神\",\n        \"ashita no nadja\": \"明日的娜嘉\",\n        \"goldfish warning\": \"魔力小金鱼\",\n        \"mazinger z\": \"魔神Z\",\n        \"magi the labyrinth of magic\": \"魔笛MAGI\",\n        \"ultraman\": \"奥特曼\",\n        \"we bare bears\": \"咱们裸熊\",\n        \"gravity falls\": \"怪诞小镇\",\n        \"karakai jouzu no takagi-san\": \"擅长捉弄人的高木同学\",\n        \"goshogun\": \"战国魔神豪将军\",\n        \"plawres sanshiro\": \"无敌三四郎\",\n        \"hime-chans ribbon\": \"缎带魔法少女\",\n        \"taimanin asagi\": \"对魔忍阿莎姬\",\n        \"makai kishi ingrid\": \"魔界骑士英格丽德\",\n        \"taimanin yukikaze\": \"对魔忍雪风\",\n        \"kick-ass\": \"海扁王\",\n        \"gad guard\": \"钢铁守护者\",\n        \"tears to tiara\": \"提亚拉之泪\",\n        \"tenshi no inai 12-gatsu\": \"天使不在的12月\",\n        \"comic party\": \"漫画同人会\",\n        \"kizuato\": \"痕\",\n        \"sentimental graffiti\": \"青涩宝贝\",\n        \"bleach\": \"死神\",\n        \"hayate no gotoku\": \"旋风管家\",\n        \"yoake mae yori ruriiro na\": \"更胜黎明前的琉璃色\",\n        \"fortune arterial\": \"FORTUNE ARTERIAL\",\n        \"princess holiday\": \"公主假日 ~回转苹果亭的一千零一夜~\",\n        \"tsuki wa higashi ni hi wa nishi ni\": \"东月西阳\",\n        \"daitoshokan no hitsujikai\": \"大图书馆的牧羊人\",\n        \"aiyoku no eustia\": \"秽翼的尤斯蒂娅\",\n        \"rokka no yuusha\": \"六花的勇者\",\n        \"seiren\": \"清恋\",\n        \"oniisama e...\": \"亲亲天使心\",\n        \"long riders\": \"长骑美眉\",\n        \"flower knight girl\": \"美少女花骑士\",\n        \"mitsudomoe\": \"超元气三姐妹\",\n        \"no-rin\": \"农林\",\n        \"space battleship yamato\": \"宇宙战舰大和号\",\n        \"utawarerumono\": \"传颂之物\",\n        \"utawarerumono itsuwari no kamen\": \"传颂之物 虚伪的假面\",\n        \"highschool dxd\": \"恶魔高校D×D\",\n        \"the world god only knows\": \"只有神知道的世界\",\n        \"mabinogi\": \"洛奇\",\n        \"m.u.g.e.n\": \"MUGEN\",\n        \"summon night\": \"召唤之夜\",\n        \"mai-hime\": \"舞-HiME\",\n        \"mai-otome\": \"舞-乙HiME\",\n        \"hyouka\": \"冰菓\",\n        \"ookami-san to shichinin no nakama-tachi\": \"大神与七位伙伴\",\n        \"machine-doll wa kizutsukanai\": \"机巧少女不会受伤\",\n        \"its not my fault that im not popular\": \"我不受欢迎，怎么想都是你们的错！\",\n        \"mouretsu pirates\": \"迷你裙宇宙海贼\",\n        \"gantz\": \"杀戮都市\",\n        \"angry birds\": \"愤怒的小鸟\",\n        \"zero kara hajimeru mahou no sho\": \"从零开始的魔法书\",\n        \"knights of sidonia\": \"希德尼娅的骑士\",\n        \"sket dance\": \"学园救援团\",\n        \"summer wars\": \"夏日大作战\",\n        \"flcl\": \"特别的她\",\n        \"the girl who leapt through time\": \"穿越时空的少女\",\n        \"inazuma eleven\": \"闪电十一人\",\n        \"battle royale\": \"大逃杀\",\n        \"archaic sealed heat\": \"远古封印之炎\",\n        \"fruits basket\": \"水果篮子\",\n        \"tari tari\": \"TARI TARI\",\n        \"the legend of heroes\": \"英雄传说\",\n        \"the legend of the legendary heroes\": \"传说中勇者的传说\",\n        \"the last of us\": \"最后生还者\",\n        \"wall-e\": \"机器人总动员\",\n        \"alpha teens on machines\": \"A.T.O.M.\",\n        \"tera\": \"神谕之战\",\n        \"digimon\": \"数码宝贝\",\n        \"digimon adventure\": \"数码宝贝大冒险\",\n        \"digimon tamers\": \"数码宝贝03驯兽师之王\",\n        \"digimon frontier\": \"数码宝贝04无限地带\",\n        \"digimon savers\": \"数码宝贝05拯救者\",\n        \"digimon xros wars\": \"数码宝贝06合体战争\",\n        \"digimon universe appli monsters\": \"数码宝贝宇宙-应用怪兽\",\n        \"snow white and the seven dwarfs\": \"白雪公主和七个小矮人\",\n        \"shadowverse\": \"影之诗\",\n        \"eyeshield 21\": \"光速跑者21号\",\n        \"skullgirls\": \"骷髅女孩\",\n        \"the ring\": \"午夜凶铃\",\n        \"the lord of the rings\": \"指环王\",\n        \"the matrix\": \"黑客帝国\",\n        \"evil dead\": \"鬼玩人\",\n        \"from dusk till dawn\": \"杀出个黎明\",\n        \"the sims\": \"模拟人生\",\n        \"the big o\": \"魅影巨神\",\n        \"the lion king\": \"狮子王\",\n        \"frozen\": \"冰雪奇缘\",\n        \"mortal kombat\": \"格斗之王\",\n        \"aladdin\": \"阿拉丁\",\n        \"the little mermaid\": \"小美人鱼\",\n        \"atlantis the lost empire\": \"亚特兰蒂斯：失落的帝国\",\n        \"sengoku otome\": \"战国少女～桃色异传～\",\n        \"monster hunter\": \"怪物猎人\",\n        \"sennen sensou aigis\": \"千年战争Aigis\",\n        \"star ocean 3\": \"星之海洋3\",\n        \"kokoro connect\": \"心灵链环\",\n        \"robopon\": \"机甲宝贝\",\n        \"upotte\": \"枪械少女!!\",\n        \"tokyo mew mew\": \"东京喵喵\",\n        \"mahoromatic\": \"魔力女管家\",\n        \"sister princess\": \"妹妹公主\",\n        \"ace attorney\": \"逆转裁判\",\n        \"tiger and bunny\": \"老虎和兔子\",\n        \"ghost in the shell\": \"攻壳机动队\",\n        \"hunter x hunter\": \"全职猎人\",\n        \"howls moving castle\": \"哈尔的移动城堡\",\n        \"kikis delivery service\": \"魔女宅急便\",\n        \"ace combat\": \"皇牌空战\",\n        \"mermaid melody pichi pichi pitch\": \"人鱼的旋律\",\n        \"attack no. 1\": \"女排No.1\",\n        \"devilman\": \"恶魔人\",\n        \"la seine no hoshi\": \"月光女侠\",\n        \"winx club\": \"魔法俏佳人\",\n        \"cats eye\": \"猫眼三姐妹\",\n        \"transformers\": \"变形金刚\",\n        \"high school fleet\": \"高校舰队\",\n        \"shinmai fukei kiruko-san\": \"新人女警斩子小姐\",\n        \"how to train your dragon\": \"驯龙高手\",\n        \"hacka doll\": \"骇客娃娃\",\n        \"kaiju girls\": \"怪兽娘\",\n        \"shinrabansho\": \"神罗万象\",\n        \"azumanga daioh\": \"阿滋漫画大王\",\n        \"galaxy fight\": \"银河快打\",\n        \"youkai hyakkitan\": \"妖怪百姬谭\",\n        \"papa no iu koto wo kikinasai\": \"要听爸爸的话！\",\n        \"himegoto\": \"搞姬日常\",\n        \"nogizaka haruka no himitsu\": \"乃木坂春香的秘密\",\n        \"south park\": \"南方公园\",\n        \"soushin shoujo matoi\": \"装神少女小缠\",\n        \"kindaichi shounen no jikenbo\": \"金田一少年事件簿\",\n        \"kekkai sensen\": \"血界战线\",\n        \"tokyo afterschool summoners\": \"东京放课后召唤师\",\n        \"saga frontier\": \"沙加开拓者\",\n        \"twelve kingdoms\": \"十二国记\",\n        \"atelier series\": \"炼金工作室\",\n        \"atelier marie\": \"玛莉的工作室\",\n        \"atelier elie\": \"艾莉的工作室\",\n        \"atelier lilie\": \"莉莉的工作室\",\n        \"atelier judie\": \"尤蒂的工作室\",\n        \"atelier iris\": \"伊莉斯的工作室\",\n        \"mana khemia\": \"玛娜传奇\",\n        \"atelier rorona\": \"罗罗娜的工作室\",\n        \"atelier totori\": \"托托莉的工作室\",\n        \"atelier meruru\": \"梅露露的工作室\",\n        \"atelier ayesha\": \"爱夏的工作室\",\n        \"atelier escha and logy\": \"艾斯卡与罗吉的工作室\",\n        \"atelier shallie\": \"夏莉的工作室\",\n        \"atelier sophie\": \"索菲的工作室\",\n        \"atelier firis\": \"菲莉丝的工作室\",\n        \"atelier lulua\": \"露露亚的工作室\",\n        \"atelier ryza\": \"莱莎的工作室\",\n        \"atelier lina\": \"莉娜的工作室\",\n        \"my neighbor totoro\": \"龙猫\",\n        \"professor layton\": \"雷顿教授\",\n        \"bubblegum crisis\": \"泡泡糖危机\",\n        \"kamikaze kaitou jeanne\": \"神风怪盗贞德\",\n        \"boruto\": \"博人传\",\n        \"kuromukuro\": \"黑骸\",\n        \"minecraft\": \"我的世界\",\n        \"world masterpiece theater\": \"世界名作剧场\",\n        \"the adventures of tom sawyer\": \"汤姆·索亚历险记\",\n        \"les miserables shoujo cosette\": \"悲惨世界 少女珂赛特\",\n        \"lucy of the southern rainbow\": \"南方彩虹的露西\",\n        \"tico of the seven seas\": \"七海的堤可\",\n        \"space adventure cobra\": \"哥布拉传奇\",\n        \"cutey honey\": \"甜心战士\",\n        \"megazone 23\": \"无限地带23\",\n        \"ganbare robocon\": \"加油啊！！小露宝\",\n        \"moero robocon\": \"燃烧吧！！小露宝\",\n        \"rainbow sentai robin\": \"彩虹战队罗宾\",\n        \"remi nobodys girl\": \"无家可归的孩子蕾米\",\n        \"revolutionary girl utena\": \"少女革命\",\n        \"corrector yui\": \"Cyber守护星\",\n        \"steel angel kurumi\": \"钢铁天使胡桃\",\n        \"zoids\": \"ZOIDS\",\n        \"world of warcraft\": \"魔兽世界\",\n        \"diablo\": \"暗黑破坏神\",\n        \"star trek\": \"星际迷航\",\n        \"binan koukou chikyuu bouei-bu love\": \"美男高校地球防卫部LOVE!\",\n        \"asobi ni iku yo\": \"玩伴猫耳娘\",\n        \"assassins creed\": \"刺客信条\",\n        \"peter pan\": \"小飞侠\",\n        \"romeos blue skies\": \"罗密欧的蓝天\",\n        \"3000 leagues in search of mother\": \"三千里寻母记\",\n        \"alps no shoujo heidi\": \"阿尔卑斯山的少女\",\n        \"anne of green gables\": \"绿山墙的安妮\",\n        \"futari no lotte\": \"我与我 两个绿蒂\",\n        \"katri girl of the meadows\": \"牧场上的少女卡特莉\",\n        \"the bush baby\": \"大草原上的小天使 灌丛婴猴\",\n        \"the story of perrine\": \"佩琳物语\",\n        \"dr. slump\": \"阿拉蕾\",\n        \"zettai muteki raijin-oh\": \"绝对无敌\",\n        \"dirty pair\": \"搞怪拍档\",\n        \"ai no wakakusa monogatari\": \"爱的小妇人物语\",\n        \"the story of pollyanna\": \"爱少女波丽安娜物语\",\n        \"princess sarah\": \"小公主莎拉\",\n        \"tobe isami\": \"伊沙米大冒险\",\n        \"doraemon\": \"哆啦A梦\",\n        \"pretty sammy\": \"魔法少女砂沙美\",\n        \"ochame na futago\": \"青葱岁月\",\n        \"miracle girl limit-chan\": \"奇迹少女理美\",\n        \"mahou no yousei persia\": \"魔法妖精贝露莎\",\n        \"minky momo\": \"魔法公主明琪桃子\",\n        \"majokko megu-chan\": \"魔女Megu\",\n        \"creamy mami\": \"我是小甜甜\",\n        \"magical angel sweet mint\": \"欢欢仙子\",\n        \"sally the witch\": \"魔法使莎莉\",\n        \"mahou shoujo lalabel\": \"魔法少女拉拉贝尔\",\n        \"hana no ko lunlun\": \"花仙子\",\n        \"magical emi\": \"魔法之星爱美\",\n        \"floral magician mary bell\": \"俏皮小花仙\",\n        \"mahou tsukai chappy\": \"魔法使恰比\",\n        \"marvelous melmo\": \"神奇糖\",\n        \"pastel yumi\": \"魔法偶像神笔由美\",\n        \"laputa castle in the sky\": \"天空之城\",\n        \"appleseed\": \"苹果核战记\",\n        \"himitsu no akko-chan\": \"亚子的秘密\",\n        \"yawara\": \"以柔克刚\",\n        \"cyborg 009\": \"人造人009\",\n        \"future boy conan\": \"未来少年柯南\",\n        \"muka muka paradise\": \"为食龙少爷\",\n        \"the goose that laid the golden eggs\": \"下金蛋的鹅\",\n        \"andersen monogatari\": \"安徒生童话\",\n        \"cinderella\": \"灰姑娘\",\n        \"k.o. beast\": \"KO世纪三兽士\",\n        \"trapp family story\": \"崔普一家物语\",\n        \"wakakusa monogatari nan to jo-sensei\": \"小妇人物语 南与乔老师\",\n        \"watashi no ashinaga ojisan\": \"长腿叔叔\",\n        \"nurse angel ririka sos\": \"守护天使莉莉佳\",\n        \"youre under arrest\": \"逮捕令\",\n        \"phantom quest corp\": \"幽幻怪社\",\n        \"urusei yatsura\": \"福星小子\",\n        \"attacker you\": \"胜利女排\",\n        \"giant gorg\": \"巨神GORG\",\n        \"gunslinger girl\": \"神枪少女\",\n        \"yu yu hakusho\": \"幽游白书\",\n        \"stella no mahou\": \"斯特拉的魔法\",\n        \"hinako note\": \"雏子的笔记\",\n        \"hoozuki no reitetsu\": \"鬼灯的冷彻\",\n        \"daiya no ace\": \"钻石王牌\",\n        \"durarara\": \"无头骑士异闻录 DuRaRaRa!!\",\n        \"supernatural\": \"邪恶力量\",\n        \"koi to senkyo to chocolate\": \"恋爱与选举与巧克力\",\n        \"goblin slayer\": \"哥布林杀手\",\n        \"dungeon meshi\": \"迷宫饭\",\n        \"kanokon\": \"我的狐仙女友\",\n        \"ladies versus butlers\": \"大小姐×执事！\",\n        \"arpeggio of blue steel\": \"苍蓝钢铁的琶音\",\n        \"maken-ki\": \"魔剑姬！\",\n        \"expelled from paradise\": \"乐园追放 -Expelled from Paradise-\",\n        \"glasslip\": \"玻璃之唇\",\n        \"hanasaku iroha\": \"花开伊吕波\",\n        \"akaneiro ni somaru saka\": \"茜色染红的街道\",\n        \"hoshizora e kakaru hashi\": \"架向星空之桥\",\n        \"gj-bu\": \"GJ部\",\n        \"kaze no yojimbo\": \"旋风之用心棒\",\n        \"kishin taisen gigantic formula\": \"机神大战-巨型方程式\",\n        \".hack\": \".hack\",\n        \".hacksign\": \".hack//SIGN\",\n        \".hackg.u.\": \".hack//G.U.\",\n        \".hackroots\": \".hack//Roots\",\n        \".hacklegend of the twilight\": \".hack//黄昏的腕轮传说\",\n        \"log horizon\": \"记录的地平线\",\n        \"kamisama minarai himitsu no cocotama\": \"见习神明 秘密的COCOTAMA\",\n        \"phantom of inferno\": \"幻灵镇魂曲\",\n        \"dramatical murder\": \"戏剧性谋杀\",\n        \"robotics notes\": \"机器人笔记\",\n        \"rampo kitan game of laplace\": \"乱步奇谭 拉普拉斯的游戏\",\n        \"gravity rush\": \"重力眩晕\",\n        \"cowboy bebop\": \"星际牛仔\",\n        \"wii fit\": \"Wii Fit\",\n        \"uta no prince-sama\": \"歌之王子殿下\",\n        \"hime chen otogi chikku idol lilpri\": \"变身！公主偶像\",\n        \"ib\": \"Ib\",\n        \"ichigo mashimaro\": \"草莓棉花糖\",\n        \"yuusha ni narenakatta ore wa shibushibu shuushoku wo ketsui shimashita.\": \"当不成勇者的我，只好认真找工作了。\",\n        \"chrono crusade\": \"圣枪修女\",\n        \"lost universe\": \"宇宙刑警\",\n        \"amanchu\": \"蓝海少女！\",\n        \"mangaka-san to assistant-san to\": \"漫画家与助手\",\n        \"sisters natsu no saigo no hi\": \"SISTERS～夏最后之日～\",\n        \"tokyo 7th sisters\": \"东京 7th Sisters\",\n        \"7th dragon\": \"第七龙神\",\n        \"project blue earth sos\": \"蓝色计划-地球SOS\",\n        \"sakura hime\": \"樱姬华传\",\n        \"the 3rd birthday\": \"第三次生日\",\n        \"asuka 120\": \"飞鸟120% 燃烧的学园祭\",\n        \"jumping rabbit\": \"小兔飞飞\",\n        \"the fairly oddparents\": \"反斗家族\",\n        \"amagami\": \"圣诞之吻\",\n        \"fosters home for imaginary friends\": \"亲亲麻吉\",\n        \"futurama\": \"飞出个未来\",\n        \"kimi ga yobu megiddo no oka de\": \"你在米吉多之丘的呼唤\",\n        \"kuroko no basuke\": \"黑子的篮球\",\n        \"boku to maou\": \"魔王与我\",\n        \"cerberus\": \"刻耳柏洛斯\",\n        \"robot girls z\": \"机器人少女Z\",\n        \"akibas trip\": \"秋叶原之旅\",\n        \"bravely default\": \"勇气默示录\",\n        \"madan no ou to vanadis\": \"魔弹之王与战姬\",\n        \"star driver\": \"STAR DRIVER 闪亮的塔科特\",\n        \"tales of\": \"传说\",\n        \"tales of phantasia\": \"幻想传说\",\n        \"tales of destiny\": \"宿命传说\",\n        \"tales of eternia\": \"永恒传说\",\n        \"tales of symphonia\": \"仙乐传说\",\n        \"tales of rebirth\": \"重生传说\",\n        \"tales of legendia\": \"遗迹传说\",\n        \"tales of the abyss\": \"深渊传说\",\n        \"tales of innocence\": \"圣洁传说\",\n        \"tales of vesperia\": \"薄暮传说\",\n        \"tales of hearts\": \"心灵传说\",\n        \"tales of graces\": \"圣恩传说\",\n        \"tales of xillia\": \"无尽传说\",\n        \"tales of zestiria\": \"情热传说\",\n        \"tales of berseria\": \"狂战传说\",\n        \"tales of asteria\": \"星彩传说\",\n        \"little witch academia\": \"小魔女学园\",\n        \"rokudenashi majutsu koushi to akashic records\": \"不正经的魔术讲师与禁忌教典\",\n        \"martial champion\": \"武术冠军\",\n        \"virtua fighter\": \"VR战士\",\n        \"muscle bomber\": \"摔跤霸王\",\n        \"aria\": \"水星领航员\",\n        \"rozen maiden\": \"蔷薇少女\",\n        \"soulcalibur\": \"魂之系列\",\n        \"empowered\": \"Empowered\",\n        \"parasite eve\": \"寄生前夜\",\n        \"predator\": \"铁血战士\",\n        \"underworld\": \"黑夜传说\",\n        \"danny phantom\": \"幻影丹尼\",\n        \"the loud house\": \"喧闹一家亲\",\n        \"nodame cantabile\": \"交响情人梦\",\n        \"another\": \"Another\",\n        \"valkyria chronicles\": \"战场女武神\",\n        \"princess lover\": \"公主恋人\",\n        \"witchblade\": \"魔女之刃\",\n        \"warship girls\": \"战舰少女\",\n        \"sexfriend\": \"SEXFRIEND\",\n        \"school days\": \"日在校园\",\n        \"walkure romanze\": \"少女骑士物语\",\n        \"majin bone\": \"魔神之骨\",\n        \"starry sky\": \"Starry☆Sky\",\n        \"amano megumi ha sukidarake\": \"天野惠浑身是破绽！\",\n        \"yowamushi pedal\": \"飚速宅男\",\n        \"black cat\": \"黑猫\",\n        \"superjail\": \"超级监狱\",\n        \"superman\": \"超人\",\n        \"iron man\": \"钢铁侠\",\n        \"iron man armored adventures\": \"钢铁侠：装甲冒险\",\n        \"jackie chan adventures\": \"成龙历险记\",\n        \"avengers\": \"复仇者联盟\",\n        \"monster\": \"怪物\",\n        \"jungle wa itsumo hare nochi guu\": \"热带雨林的爆笑生活\",\n        \"w.i.t.c.h.\": \"魔力W.i.t.c.h.\",\n        \"ninja gaiden\": \"忍者外传\",\n        \"otome wa boku ni koishiteru\": \"少女爱上姐姐\",\n        \"fairy tail\": \"妖精的尾巴\",\n        \"oni chichi\": \"鬼父\",\n        \"clamp gakuen tanteidan\": \"CLAMP学园侦探团\",\n        \"soredemo machi wa mawatteiru\": \"女仆咖啡厅\",\n        \"happy tree friends\": \"欢乐树的朋友们\",\n        \"kare kano\": \"他和她的事情\",\n        \"spongebob squarepants\": \"海绵宝宝\",\n        \"wizard of oz\": \"绿野仙踪\",\n        \"cream lemon\": \"乳霜柠檬\",\n        \"dream c club\": \"梦幻俱乐部\",\n        \"katekyo hitman reborn\": \"家庭教师HITMAN REBORN!\",\n        \"tsugumomo\": \"怪怪守护神\",\n        \"the simpsons\": \"辛普森一家\",\n        \"ano natsu de matteru\": \"在盛夏等待\",\n        \"net ghost pipopa\": \"网络精灵PIPOPA\",\n        \"dominion tank police\": \"特搜战车队\",\n        \"ruin explorers\": \"秘境探险\",\n        \"streets of rage\": \"怒之铁拳\",\n        \"yume no crayon oukoku\": \"梦之蜡笔王国\",\n        \"megaman\": \"洛克人\",\n        \"megaman zero\": \"洛克人ZERO\",\n        \"megaman zx\": \"洛克人ZX\",\n        \"mega man x\": \"洛克人X\",\n        \"megaman battle network\": \"洛克人EXE\",\n        \"mega man legends\": \"洛克人DASH\",\n        \"mega man star force\": \"流星洛克人\",\n        \"konjiki no gash\": \"金色的卡修\",\n        \"super doll licca-chan\": \"丽佳公主\",\n        \"kasumin\": \"妙妙魔法屋\",\n        \"di gi charat\": \"铃铛猫娘\",\n        \"lamento\": \"挽歌\",\n        \"dexters laboratory\": \"德克斯特的实验室\",\n        \"mahoujin guru guru\": \"咕噜咕噜魔法阵\",\n        \"mon colle knights\": \"六门天外\",\n        \"is\": \"I\\\"s\",\n        \"beast wars\": \"百变金刚\",\n        \"wonder project j2\": \"J计划2\",\n        \"nights into dreams...\": \"梦精灵\",\n        \"waku waku 7\": \"火热火热7\",\n        \"okusan\": \"新手人妻\",\n        \"gakkou no kaidan\": \"学校怪谈\",\n        \"gear fighter dendoh\": \"GEAR战士电童\",\n        \"hand maid may\": \"袖珍女侍小梅\",\n        \"vandread\": \"银河冒险战记\",\n        \"mahou shoujo ai\": \"魔法少女爱\",\n        \"ys\": \"伊苏\",\n        \"yumeria\": \"梦物语\",\n        \"re creators\": \"Re:CREATORS\",\n        \"gasaraki\": \"饿沙罗鬼\",\n        \"yuyushiki\": \"悠悠式\",\n        \"sonic the hedgehog\": \"刺猬索尼克\",\n        \"beat blades haruka\": \"超昂闪忍遥\",\n        \"hikaru no go\": \"棋魂\",\n        \"rosenkreuzstilette\": \"蔷薇十字小剑\",\n        \"kuon no kizuna\": \"久远之绊\",\n        \"viper gts\": \"蝰蛇GTS\",\n        \"dragon age\": \"龙腾世纪\",\n        \"nyan koi\": \"猫愿三角恋\",\n        \"another lady innocent\": \"Front Innocent\",\n        \"historys strongest disciple kenichi\": \"史上最强弟子兼一\",\n        \"growlanser\": \"梦幻骑士\",\n        \"kono bijutsubu ni wa mondai ga aru\": \"这个美术社大有问题！\",\n        \"seikon no qwaser\": \"圣痕炼金士\",\n        \"high school kimengumi\": \"高校奇面组\",\n        \"onmyou taisenki\": \"阴阳大战记\",\n        \"ao no kanata no four rhythm\": \"苍之彼方的四重奏\",\n        \"captain commando\": \"名将\",\n        \"voltage fighter gowcaizer\": \"超人学园钢帝王\",\n        \"legend of lemnear\": \"极黑之翼\",\n        \"duel masters\": \"决斗大师\",\n        \"battle spirits\": \"战斗之魂\",\n        \"galaxy express 999\": \"银河铁道999\",\n        \"gaiking\": \"新大空魔龙\",\n        \"girls frontline\": \"少女前线\",\n        \"zettai karen children\": \"绝对可怜CHILDREN\",\n        \"selector infected wixoss\": \"选择感染者WIXOSS\",\n        \"chain chronicle\": \"锁链战记\",\n        \"the vision of escaflowne\": \"圣天空战记\",\n        \"kodomo no omocha\": \"玩偶游戏\",\n        \"quiz nanairo dreams\": \"七彩梦\",\n        \"rival schools\": \"私立正义学园\",\n        \"medabots\": \"徽章战士\",\n        \"zettai junpaku mahou shoujo\": \"绝对纯白魔法少女\",\n        \"namiuchigiwa no muromi-san\": \"人鱼又上钩\",\n        \"kuttsukiboshi\": \"紧扣的星星\",\n        \"maria-sama ga miteru\": \"圣母在上\",\n        \"youkoso jitsuryoku shijou shugi no kyoushitsu e\": \"欢迎来到实力至上主义的教室\",\n        \"kakegurui\": \"狂赌之渊\",\n        \"hajimete no gal\": \"第一次的辣妹\",\n        \"medaka box\": \"最强会长黑神\",\n        \"suisei no gargantia\": \"翠星之加尔刚蒂亚\",\n        \"mayo chiki\": \"迷茫管家与懦弱的我\",\n        \"rance\": \"兰斯\",\n        \"brave police j-decker\": \"勇者警察\",\n        \"witch craft works\": \"魔女的使命\",\n        \"heavy object\": \"重装武器\",\n        \"baby princess\": \"宝贝公主\",\n        \"bioshock\": \"生化奇兵\",\n        \"bioshock infinite\": \"生化奇兵：无限\",\n        \"akame ga kill\": \"斩·赤红之瞳！\",\n        \"harry potter\": \"哈利波特\",\n        \"tom and jerry\": \"猫和老鼠\",\n        \"mahouka koukou no rettousei\": \"魔法科高中的劣等生\",\n        \"euphoria\": \"euphoria\",\n        \"tangled\": \"长发公主\",\n        \"inside out\": \"头脑特工队\",\n        \"danball senki\": \"纸箱战机\",\n        \"hyper police\": \"猫狐警探\",\n        \"cosmic baton girl comet-san\": \"彗星公主\",\n        \"zone of the enders\": \"终极地带\",\n        \"photo kano\": \"写真女友\",\n        \"the kabocha wine\": \"南瓜酒\",\n        \"joshi shougakusei hajimemashita\": \"今天开始当女子小学生\",\n        \"cardfight vanguard\": \"卡片战斗先导者\",\n        \"the onechanbara\": \"THE 御姐玫瑰\",\n        \"gosick\": \"GOSICK\",\n        \"beyblade\": \"战斗陀螺\",\n        \"big hero 6\": \"超能陆战队\",\n        \"yuragisou no yuuna-san\": \"汤摇庄的幽奈同学\",\n        \"teekyuu\": \"女高网球部\",\n        \"jinsei\": \"人生\",\n        \"rail wars\": \"RAIL WARS! -日本国有铁道公安队-\",\n        \"rokujouma no shinryakusha\": \"三坪房间的侵略者！？\",\n        \"sabagebu\": \"生存游戏社\",\n        \"occultic nine\": \"超自然9人组\",\n        \"fist of the north star\": \"北斗神拳\",\n        \"monster girl quest\": \"勇者大战魔物娘\",\n        \"ghost sweeper mikami\": \"GS美神 极乐大作战！！\",\n        \"battle athletes\": \"大运动会\",\n        \"knights of ramune\": \"柠檬汽水骑士\",\n        \"saint tail\": \"怪盗圣少女\",\n        \"kyouran kazoku nikki\": \"狂乱家族日记\",\n        \"2x2 shinobuden\": \"酷伊忍者传\",\n        \"marriage royale\": \"皇家新娘\",\n        \"choukou tenshi escalayer\": \"超昂天使 Escalayer\",\n        \"mahou senshi sweet knights\": \"魔法战士 Sweet Knights\",\n        \"read or die\": \"R.O.D\",\n        \"uchuu no stellvia\": \"宇宙星路\",\n        \"ore monogatari\": \"俺物语!!\",\n        \"yuruyuri\": \"摇曳百合\",\n        \"death note\": \"死亡笔记\",\n        \"cooking papa\": \"妙厨老爹\",\n        \"rumble roses\": \"火爆玫瑰\",\n        \"genshiken\": \"现视研\",\n        \"pia carrot e youkoso\": \"欢迎来到Pia Carrot!!\",\n        \"pia carrot e youkoso 2\": \"欢迎来到Pia Carrot!!2\",\n        \"pia carrot e youkoso 3\": \"欢迎来到Pia Carrot!!3\",\n        \"bokutachi wa benkyou ga dekinai\": \"我们真的学不来\",\n        \"netoge no yome wa onnanoko ja nai to omotta\": \"线上游戏的老婆不可能是女生？\",\n        \"schoolgirl strikers\": \"学园少女突袭者\",\n        \"danna ga nani o itteiru ka wakaranai ken\": \"关于完全听不懂老公在说什么的事\",\n        \"golden sun\": \"黄金太阳\",\n        \"the grim adventures of billy and mandy\": \"爱酷一族\",\n        \"inspector gadget\": \"神探加杰特\",\n        \"the life and times of juniper lee\": \"魔法少女Juniper Lee\",\n        \"sousei no onmyouji\": \"双星之阴阳师\",\n        \"sengoku collection\": \"战国Collection\",\n        \"doctor strange\": \"奇异博士\",\n        \"knights and magic\": \"骑士&魔法\",\n        \"mahou shoujo ikusei keikaku\": \"魔法少女育成计划\",\n        \"arslan senki\": \"亚尔斯兰战记\",\n        \"chousoku henkei gyrozetter\": \"超速变形螺旋杰特\",\n        \"kengan ashura\": \"拳愿阿修罗\",\n        \"tonari no miko-san wa minna warau\": \"邻家的巫女在微笑\",\n        \"aikatsu\": \"偶活学园！\",\n        \"aho-girl\": \"笨女孩\",\n        \"azur lane\": \"碧蓝航线\",\n        \"isekai shokudou\": \"异世界食堂\",\n        \"baccano\": \"永生之酒\",\n        \"berserk\": \"剑风传奇\",\n        \"isekai wa smartphone to tomo ni.\": \"带着智能手机闯荡异世界。\",\n        \"atelier tanaka\": \"田中是年龄=没女朋友的魔法师\",\n        \"servant x service\": \"跟班×服务\",\n        \"bakuon\": \"爆音少女！！\",\n        \"inou-battle wa nichijou-kei no naka de\": \"日常系的异能战斗\",\n        \"denkigai no honya-san\": \"电器街的漫画店\",\n        \"bladedance of elementalers\": \"精灵使的剑舞\",\n        \"da capo\": \"初音岛\",\n        \"da capo ii\": \"初音岛II\",\n        \"da capo iii\": \"初音岛III\",\n        \"tejina senpai\": \"魔术前辈\",\n        \"valkyrie no bouken\": \"女武士大冒险\",\n        \"mugen senshi valis\": \"梦幻战士\",\n        \"dream hunter rem\": \"梦猎人丽梦\",\n        \"made in abyss\": \"来自深渊\",\n        \"wonder momo\": \"神奇桃子\",\n        \"hero bank\": \"英雄银行\",\n        \"monsuno\": \"兽旋战斗\",\n        \"tengai makyou\": \"天外魔境\",\n        \"wingman\": \"银翼超人\",\n        \"fight ippatsu juuden-chan\": \"魔力充电娘\",\n        \"needless\": \"超能力大战\",\n        \"the sacred blacksmith\": \"圣剑锻造师\",\n        \"kampfer\": \"肯普法\",\n        \"onmyoji\": \"阴阳师\",\n        \"brynhildr in the darkness\": \"极黑的布伦希尔特\",\n        \"super real mahjong\": \"超真实麻将\",\n        \"journey to the west\": \"西游记\",\n        \"busou renkin\": \"武装炼金\",\n        \"jigoku shoujo\": \"地狱少女\",\n        \"midori no hibi\": \"美鸟的日记\",\n        \"seirei no moribito\": \"精灵守护者\",\n        \"air gear\": \"飞轮少年\",\n        \"bamboo blade\": \"竹刀少女\",\n        \"dance in the vampire bund\": \"吸血鬼同盟\",\n        \"freezing\": \"零度战姬\",\n        \"omamori himari\": \"守护猫娘绯鞠\",\n        \"shinkyoku soukai polyphonica\": \"神曲奏界Polyphonica\",\n        \"tenjou tenge\": \"天上天下\",\n        \"unbalance x unbalance\": \"萌道鲜师\",\n        \"ange vierge\": \"圣洁天使\",\n        \"blend s\": \"调教咖啡厅\",\n        \"command and conquer\": \"命令与征服\",\n        \"uninhabited planet survive\": \"星球流浪记\",\n        \"fatal fury\": \"饿狼传说\",\n        \"princess crown\": \"公主王冠\",\n        \"burst angel\": \"爆裂天使\",\n        \"k\": \"K\",\n        \"prince of tennis\": \"网球王子\",\n        \"lord of lords ryu knight\": \"霸王大系龙骑士\",\n        \"tonde buurin\": \"飞天少女猪\",\n        \"nano core\": \"纳米核心\",\n        \"elsword\": \"艾尔之光\",\n        \"betterman\": \"进化战记\",\n        \"tenshi ni narumon\": \"天使不设防！\",\n        \"kamen no maid guy\": \"假面男仆\",\n        \"etrian odyssey\": \"世界树的迷宫\",\n        \"in search of the lost future\": \"寻找失去的未来\",\n        \"art of fighting\": \"龙虎之拳\",\n        \"burning force\": \"燃烧战队\",\n        \"golden axe\": \"战斧\",\n        \"popful mail\": \"啵咕物语\",\n        \"the wing of madoola\": \"玛多拉之翼\",\n        \"gakusen toshi asterisk\": \"学战都市Asterisk\",\n        \"tokyo ghoul\": \"东京食尸鬼\",\n        \"doki doki literature club\": \"心动文学俱乐部！\",\n        \"regalia the three sacred stars\": \"雷加利亚三圣星\",\n        \"kaze no densetsu xanadu\": \"风之传说XANADU\",\n        \"tower of druaga\": \"迷宫塔\",\n        \"valkyrie profile\": \"北欧女神\",\n        \"serial experiments lain\": \"玲音\",\n        \"ansatsu kyoushitsu\": \"暗杀教室\",\n        \"mirrors edge\": \"镜之边缘\",\n        \"galilei donna\": \"伽利略少女\",\n        \"teenage mutant ninja turtles\": \"忍者神龟\",\n        \"all purpose cultural cat girl nuku nuku\": \"万能文化猫娘\",\n        \"absolute duo\": \"绝对双刃\",\n        \"avatar\": \"阿凡达\",\n        \"avatar the last airbender\": \"降世神通：最后的气宗\",\n        \"coppelion\": \"核爆末世录\",\n        \"maison ikkoku\": \"相聚一刻\",\n        \"mikakunin de shinkoukei\": \"未确认进行式\",\n        \"tasogare otome x amnesia\": \"黄昏少女×失忆\",\n        \"guild wars\": \"激战\",\n        \"battle girl high school\": \"战斗女子高校\",\n        \"nausicaa of the valley of the wind\": \"风之谷\",\n        \"porco rosso\": \"红猪\",\n        \"princess mononoke\": \"幽灵公主\",\n        \"the secret world of arrietty\": \"借东西的小人阿莉埃蒂\",\n        \"mimi wo sumaseba\": \"侧耳倾听\",\n        \"space patrol luluco\": \"宇宙巡警露露子\",\n        \"shakunetsu no takkyuu musume\": \"灼热的乒乓球娘\",\n        \"silver spoon\": \"银之匙\",\n        \"imouto sae ireba ii.\": \"如果有妹妹就好了。\",\n        \"bang dream\": \"BanG Dream!\",\n        \"fantasy earth zero\": \"幻想大陆\",\n        \"fantastic four\": \"神奇四侠\",\n        \"wonder woman\": \"神奇女侠\",\n        \"family guy\": \"恶搞之家\",\n        \"galaxy angel\": \"银河天使\",\n        \"nurse witch komugi\": \"魔法护士小麦\",\n        \"popotan\": \"蒲公英之恋\",\n        \"xenoblade\": \"异度之刃\",\n        \"xenoblade x\": \"异度之刃X\",\n        \"xenoblade chronicles 2\": \"异度之刃2\",\n        \"xenogears\": \"异度装甲\",\n        \"xenosaga\": \"异度传说\",\n        \"shining sword romance\": \"剑芒罗曼史\",\n        \"shining in the darkness\": \"光明与黑暗\",\n        \"shining force\": \"光明力量\",\n        \"shining force exa\": \"光明力量EXA\",\n        \"shining force feather\": \"光明力量 羽翼\",\n        \"shining soul\": \"光明之魂\",\n        \"shining tears\": \"光明之泪\",\n        \"shining wind\": \"光明之风\",\n        \"shining hearts\": \"光明之心\",\n        \"shining blade\": \"光明之刃\",\n        \"shining ark\": \"光明之舟\",\n        \"shining resonance\": \"光明之响\",\n        \"lunar silver star story\": \"露娜 银河之星物语\",\n        \"lunar eternal blue\": \"露娜 永恒之蓝\",\n        \"maria holic\": \"玛莉亚狂热\",\n        \"boku no pico\": \"我的Pico\",\n        \"azure striker gunvolt\": \"苍蓝雷霆：刚巴尔特\",\n        \"narutaru\": \"星星公主\",\n        \"bokusatsu tenshi dokuro-chan\": \"扑杀天使朵库萝\",\n        \"rick and morty\": \"瑞克和莫蒂\",\n        \"slow start\": \"Slow Start\",\n        \"princess principal\": \"Princess Principal\",\n        \"sangokushi taisen\": \"三国志大战\",\n        \"sengoku taisen\": \"战国大战\",\n        \"chinpui\": \"大耳鼠\",\n        \"pani poni dash\": \"不可思议的教室\",\n        \"suigetsu\": \"水月\",\n        \"mizuiro\": \"水色\",\n        \"dragonaut\": \"龙鸣\",\n        \"under night in-birth\": \"夜下降生\",\n        \"world trigger\": \"境界触发者\",\n        \"mouse\": \"MØUSE\",\n        \"atashinchi\": \"我们这一家\",\n        \"crayon shin-chan\": \"蜡笔小新\",\n        \"looney tunes\": \"乐一通\",\n        \"yuru camp\": \"摇曳露营△\",\n        \"saiki kusuo no psi nan\": \"齐木楠雄的灾难\",\n        \"monster strike\": \"怪物弹珠\",\n        \"noragami\": \"野良神\",\n        \"z slash x\": \"Z/X\",\n        \"shin angyo onshi\": \"新暗行御史\",\n        \"kouchuu ouja mushiking\": \"甲虫王者\",\n        \"darling in the franxx\": \"DARLING in the FRANXX\",\n        \"fairy fencer f\": \"妖精剑士f\",\n        \"honkai gakuen\": \"崩坏学园\",\n        \"quiz magic academy\": \"问答魔法学院\",\n        \"houseki no kuni\": \"宝石之国\",\n        \"atlach-nacha\": \"ATLACH＝NACHA\",\n        \"princess maker\": \"美少女梦工场\",\n        \"grisaia no kajitsu\": \"灰色的果实\",\n        \"sakura trick\": \"樱Trick\",\n        \"pop team epic\": \"pop子和pipi美的日常\",\n        \"lollipop chainsaw\": \"电锯甜心\",\n        \"alternative girls\": \"妃十三学园 Alternative Girls\",\n        \"deadpool\": \"死侍\",\n        \"mitsuboshi colors\": \"三颗星彩色冒险\",\n        \"nekopara\": \"猫娘乐园\",\n        \"keijo\": \"竞女!!!!!!!!\",\n        \"the emoji movie\": \"表情奇幻冒险\",\n        \"animal crossing\": \"动物之森\",\n        \"black clover\": \"黑色五叶草\",\n        \"blues clues\": \"蓝色斑点狗\",\n        \"cooking mama\": \"料理妈妈\",\n        \"dragons lair\": \"龙穴历险记\",\n        \"romance of the three kingdoms\": \"三国演义\",\n        \"death march kara hajimaru isekai kyousoukyoku\": \"爆肝工程师的异世界狂想曲\",\n        \"shironeko project\": \"白猫计划\",\n        \"toji no miko\": \"刀使之巫女\",\n        \"major\": \"棒球大联盟\",\n        \"sora yori mo tooi basho\": \"比宇宙更远的地方\",\n        \"border break\": \"边境保卫战\",\n        \"last period\": \"最终休止符 -无止境的螺旋物语-\",\n        \"stella glow\": \"星光幻歌\",\n        \"ryuuou no oshigoto\": \"龙王的工作！\",\n        \"uma musume pretty derby\": \"赛马娘Pretty Derby🐎\",\n        \"os-tan\": \"OS娘\",\n        \"sunohara-sou no kanrinin-san\": \"春原庄的管理员小姐\",\n        \"yotsubato\": \"四叶妹妹！\",\n        \"dragon nest\": \"龙之谷\",\n        \"kuroinu kedakaki seijo wa hakudaku ni somaru\": \"黑兽～被白浊沾污的高傲圣女～\",\n        \"initial d\": \"头文字D\",\n        \"final romance\": \"对战偶像麻雀：最终罗曼史\",\n        \"violet evergarden\": \"紫罗兰永恒花园\",\n        \"sokkou seitokai\": \"速攻学生会\",\n        \"shantae\": \"桑塔\",\n        \"nekojishi\": \"家有大猫\",\n        \"tomo-chan wa onnanoko\": \"小智是女孩啦！\",\n        \"strawberry panic\": \"惊爆草莓\",\n        \"isekai izakaya nobu\": \"异世界居酒屋「阿信」\",\n        \"alias carnival\": \"ALIA's CARNIVAL!\",\n        \"tesagure bukatsu-mono\": \"摸索吧！部活剧\",\n        \"dna2\": \"DNA²\",\n        \"guardians of the galaxy\": \"银河护卫队\",\n        \"legendz\": \"龙王传说\",\n        \"cross ange\": \"天使与龙的轮舞\",\n        \"dungeon fighter online\": \"地下城与勇士\",\n        \"warhammer\": \"战锤\",\n        \"rakudai kishi no cavalry\": \"落第骑士英雄谭\",\n        \"xxxholic\": \"×××HOLiC\",\n        \"beatless\": \"BEATLESS\",\n        \"ao no exorcist\": \"青之驱魔师\",\n        \"gate - jieitai kano chi nite kaku tatakaeri\": \"GATE奇幻自卫队\",\n        \"playerunknowns battlegrounds\": \"绝地求生\",\n        \"masamune-kun no revenge\": \"政宗君的复仇\",\n        \"hataraku saibou\": \"工作细胞\",\n        \"binbougami ga\": \"穷神来了\",\n        \"princess connect\": \"公主连结Re:Dive\",\n        \"kuzu no honkai\": \"人渣的本愿\",\n        \"elfen lied\": \"妖精的旋律\",\n        \"katanagatari\": \"刀语\",\n        \"plastic memories\": \"可塑性记忆\",\n        \"ijiranaide nagatoro-san\": \"不要欺负我，长瀞同学\",\n        \"bijin onna joushi takizawa-san\": \"美女上司泷泽小姐\",\n        \"bible black\": \"黑暗圣经\",\n        \"uzaki-chan wa asobitai\": \"宇崎酱想要玩耍！\",\n        \"one kagayaku kisetsu e\": \"ONE～光辉的季节～\",\n        \"guardian heroes\": \"守护英雄\",\n        \"the incredibles\": \"超人总动员\",\n        \"yakitate japan\": \"日式面包王\",\n        \"planetarian\": \"星之梦\",\n        \"cave story\": \"洞窟物语\",\n        \"btooom\": \"BTOOOM!惊爆游戏\",\n        \"nichijou\": \"日常\",\n        \"isekai maou to shoukan shoujo no dorei majutsu\": \"异界少女召唤术\",\n        \"winnie the pooh\": \"小熊维尼\",\n        \"bravest warriors\": \"无惧勇士\",\n        \"candy candy\": \"小甜甜\",\n        \"moana\": \"海洋奇缘\",\n        \"scooby-doo\": \"叔比狗\",\n        \"miraculous ladybug\": \"瓢虫少女\",\n        \"inazuma eleven go\": \"闪电十一人GO\",\n        \"mushibugyo\": \"虫奉行\",\n        \"kid icarus\": \"光神话 帕尔提娜之镜\",\n        \"legend of queen opala\": \"奥帕拉女王传奇\",\n        \"shoujo kageki revue starlight\": \"少女歌剧Revue Starlight\",\n        \"deathsmiles\": \"死亡微笑\",\n        \"kaitou joker\": \"怪盗Joker\",\n        \"qualidea code\": \"Qualidea Code\",\n        \"shuumatsu no izetta\": \"终末的伊泽塔\",\n        \"donkey kong\": \"大金刚\",\n        \"whistle\": \"哨声响起\",\n        \"ore ga suki nano wa imouto dakedo imouto ja nai\": \"我喜欢的是小说里的你\",\n        \"seishun buta yarou wa bunny girl senpai no yume o minai\": \"青春猪头少年不会梦到兔女郎学姐\",\n        \"ssss.gridman\": \"SSSS.GRIDMAN\",\n        \"barbie\": \"芭比娃娃\",\n        \"hellboy\": \"地狱男爵\",\n        \"akebi no mi\": \"山姬之实\",\n        \"stardew valley\": \"星露谷物语\",\n        \"tensei shitara slime datta ken\": \"关于我转生变成史莱姆这档事\",\n        \"quiz rpg mahoutsukai to kuroneko no wiz\": \"黑猫维兹\",\n        \"boku no dorei shoukan\": \"我的奴隶妓院\",\n        \"silent mobius\": \"魔法阵都市\",\n        \"sora wo kakeru shoujo\": \"穿越宇宙的少女\",\n        \"cevio\": \"CeVIO\",\n        \"gotoubun no hanayome\": \"五等分的新娘\",\n        \"pan de peace\": \"面包带来和平\",\n        \"borderlands\": \"无主之地\",\n        \"usagi-chan de cue\": \"天生兔女郎\",\n        \"ueno-san wa bukiyou\": \"笨拙之极的上野\",\n        \"wake up girls\": \"Wake Up, Girls!\",\n        \"golden kamuy\": \"黄金神威\",\n        \"komi-san wa komyushou desu.\": \"古见同学有交流障碍症\",\n        \"kaguya-sama wa kokurasetai\": \"辉夜大小姐想让我告白\",\n        \"watashi ni tenshi ga maiorita\": \"天使降临到我身边！\",\n        \"darkest dungeon\": \"暗黑地牢\",\n        \"idol wars z\": \"IDOL WARS Z\",\n        \"sewayaki kitsune no senko-san\": \"贤惠幼妻仙狐小姐\",\n        \"shomin sample\": \"我被绑架到贵族女校当“庶民样本”\",\n        \"arknights\": \"明日方舟\",\n        \"kimetsu no yaiba\": \"鬼灭之刃\",\n        \"tenki no ko\": \"天气之子\",\n        \"arifureta shokugyou de sekai saikyou\": \"平凡职业造就世界最强\",\n        \"asobi asobase\": \"游戏3人娘\",\n        \"zombie land saga\": \"佐贺偶像是传奇\",\n        \"nazo no kanojo x\": \"谜样女友X\",\n        \"shoujo shuumatsu ryokou\": \"少女终末旅行\",\n        \"dumbbell nan kilo moteru\": \"流汗吧!健身少女\",\n        \"thumbelina\": \"拇指姑娘\",\n        \"masou gakuen hxh\": \"魔装学园H×H\",\n        \"hundred\": \"百武装战记\",\n        \"dr. stone\": \"石纪元\",\n        \"uchi no ko no tame naraba ore wa moshikashitara maou mo taoseru kamo shirenai\": \"为了女儿，我说不定连魔王都能干掉。\",\n        \"tsujou kougeki ga zentai kougeki de 2-kai kougeki no okaasan wa suki desu ka\": \"普通攻击是全体二连击，这样的妈妈你喜欢吗？\",\n        \"wagaya no oinari-sama\": \"我家有个狐仙大人\",\n        \"enen no shouboutai\": \"炎炎消防队\",\n        \"lord el-melloi ii sei no jikenbo\": \"君主·埃尔梅罗二世事件簿\",\n        \"inuyasha\": \"犬夜叉\",\n        \"jashin-chan dropkick\": \"邪神与厨二病少女\",\n        \"ishuzoku reviewers\": \"异种族风俗娘评鉴指南\",\n        \"d-frag\": \"属性同好会\",\n        \"heavens memo pad\": \"神的记事本\",\n        \"houkago play\": \"放课后play\",\n        \"ookiku furikabutte\": \"王牌投手 振臂高挥\",\n        \"black bullet\": \"漆黑的子弹\",\n        \"mawaru penguindrum\": \"回转企鹅罐\",\n        \"ben-to\": \"便·当\",\n        \"one week friends\": \"一周的朋友\",\n        \"sanoba witch\": \"魔女的夜宴\",\n        \"tonari no seki-kun\": \"上课小动作\",\n        \"high score girl\": \"高分少女\",\n        \"claymore\": \"大剑\",\n        \"sinoalice\": \"死亡爱丽丝\",\n        \"machikado mazoku\": \"街角魔族\",\n        \"the hunchback of notre dame\": \"钟楼怪人\",\n        \"kodoku no gourmet\": \"孤独的美食家\",\n        \"kishuku gakkou no juliet\": \"寄宿学校的朱丽叶\",\n        \"kemurikusa\": \"烟草\",\n        \"tate no yuusha no nariagari\": \"盾之勇者成名录\",\n        \"watashi nouryoku wa heikinchi de tte itta yo ne\": \"我，不是说了能力要平均值么！\",\n        \"itai no wa iya nano de bougyoryoku ni kyokufuri shitai to omoimasu.\": \"因为太怕痛就全点防御力了\",\n        \"rurouni kenshin\": \"浪客剑心\",\n        \"gankutsuou\": \"岩窟王\",\n        \"kiddy grade\": \"天使特警\",\n        \"yat space travel agency\": \"星际漫游YAYAYA\",\n        \"teisou gyakuten sekai\": \"贞操逆转世界\",\n        \"mondaiji-tachi ga isekai kara kuru sou desu yo\": \"问题儿童都来自异世界？\",\n        \"alice gear aegis\": \"机战少女Alice\",\n        \"houkago no pleiades\": \"放学后的昴星团\",\n        \"senren banka\": \"千恋＊万花\",\n        \"kiratto pri chan\": \"美妙☆频道\",\n        \"cafe stella to shinigami no chou\": \"星光咖啡馆与死神之蝶\",\n        \"riddle joker\": \"RIDDLE JOKER\",\n        \"grand theft auto\": \"侠盗猎车手\",\n        \"hitori bocchi no marumaru seikatsu\": \"一个人的OO小日子\",\n        \"asteroid in love\": \"恋爱小行星\",\n        \"koi wa ameagari no you ni\": \"恋如雨止\",\n        \"fire emblem three houses\": \"火焰之纹章 风花雪月\",\n        \"kanojo okarishimasu\": \"租借女友\",\n        \"15 bishoujo hyouryuuki\": \"15美少女漂流记\",\n        \"ore no natsuyasumi\": \"我的暑假\",\n        \"shinchou yuusha kono yuusha ga ore tueee kuse ni shinchou sugiru\": \"这个勇者明明超强却过分慎重\",\n        \"helltaker\": \"Helltaker\",\n        \"cyborg kuro-chan\": \"超级酷乐猫\",\n        \"oretachi ni tsubasa wa nai\": \"我们没有翅膀\",\n        \"blade of the immortal\": \"无限之住人\",\n        \"nande koko ni sensei ga\": \"为什么老师会在这里！？\",\n        \"what happens in vegas\": \"情迷拉斯维加斯\",\n        \"ore o suki nano wa omae dake kayo\": \"喜欢本大爷的竟然就你一个？\",\n        \"tricolour lovestory\": \"三色△绘恋\",\n        \"mahjong soul\": \"雀魂麻将\",\n        \"genshin impact\": \"原神\",\n        \"mobile suit gundam the 08th ms team\": \"机动战士高达 第08MS小队\",\n        \"hoshizora no memoria\": \"星空的记忆\",\n        \"bocchi kaibutsu to moumoku shoujo\": \"孤独怪物与盲少女\",\n        \"choujin koukousei-tachi wa isekai demo yoyuu de ikinuku you desu\": \"超人高中生们即便在异世界也能从容生存！\",\n        \"maou-sama retry\": \"重来吧，魔王大人！\",\n        \"maitetsu\": \"爱上火车\",\n        \"houkago teibou nisshi\": \"放学后海堤日记\",\n        \"ochikobore fruit tart\": \"满溢的水果挞\",\n        \"comic girls\": \"Comic Girls\",\n        \"endro\": \"Endro!\",\n        \"harukana receive\": \"遥的接球\",\n        \"majo no tabitabi\": \"魔女之旅\",\n        \"chainsaw man\": \"电锯人\",\n        \"josou sanmyaku\": \"女装山脉\",\n        \"penguin highway\": \"企鹅公路\",\n        \"irotoridori no sekai\": \"五彩斑斓的世界\",\n        \"tokyo xanadu\": \"东京迷城\",\n        \"terra battle\": \"地球战争\",\n        \"summer pockets\": \"Summer Pockets\",\n        \"the tatami galaxy\": \"四叠半神话大系\",\n        \"glitch techs\": \"电玩先锋\",\n        \"the owl house\": \"猫头鹰魔法社\",\n        \"maoujou de oyasumi\": \"在魔王城说晚安\",\n        \"dungeons and dragons\": \"龙与地下城\",\n        \"lilo and stitch\": \"星际宝贝\",\n        \"my life as a teenage robot\": \"我的青少年机器人时代\",\n        \"milo murphys law\": \"迈罗·墨菲定律\",\n        \"phineas and ferb\": \"飞哥与小佛\",\n        \"cthulhu mythos\": \"克苏鲁神话\",\n        \"kipo and the age of wonderbeasts\": \"奇波和神奇动物的时代\",\n        \"amphibia\": \"奇幻沼泽\",\n        \"american dragon jake long\": \"美国龙：杰克龙\",\n        \"hazbin hotel\": \"地狱客栈\",\n        \"hotel transylvania\": \"精灵旅社\",\n        \"hilda\": \"希尔达\",\n        \"the dragon prince\": \"龙太子\",\n        \"code lyoko\": \"虚幻勇士\",\n        \"the smurfs\": \"蓝精灵\",\n        \"young justice\": \"少年正义联盟\",\n        \"justice league\": \"正义联盟\",\n        \"avalon code\": \"创世法典\",\n        \"doctor who\": \"神秘博士\",\n        \"rune factory\": \"符文工房\",\n        \"coraline\": \"鬼妈妈\",\n        \"dororo\": \"多罗罗\",\n        \"sekiro shadows die twice\": \"只狼：影逝二度\",\n        \"kamihime project\": \"神姬Project\",\n        \"merc storia\": \"梅露可物语\",\n        \"twelve forever\": \"永远12岁\",\n        \"warriors orochi\": \"无双大蛇\",\n        \"little nightmares\": \"小小噩梦\",\n        \"healin good precure\": \"元气魔法♡光之美少女\",\n        \"uchi no maid ga uzasugiru\": \"我家的女仆有够烦！\",\n        \"flying witch\": \"飞翔的魔女\",\n        \"mushoku tensei\": \"无职转生\",\n        \"tanaka-kun wa itsumo kedaruge\": \"田中君总是如此慵懒\",\n        \"yakusoku no neverland\": \"约定的梦幻岛\",\n        \"iya na kao sare nagara opantsu misete moraitai\": \"很想被人用一脸嫌弃的眼神把胖次给我看\",\n        \"wrestle angels\": \"摔角天使\",\n        \"nijisanji\": \"彩虹社\",\n        \"blue archive\": \"蔚蓝档案\",\n        \"the legend of luo xiaohei\": \"罗小黑战记\",\n        \"sk8 the infinity\": \"SK8 无限滑板\",\n        \"beatmania\": \"狂热节拍\",\n        \"honzuki no gekokujou\": \"小书痴的下克上\",\n        \"oide yo mizuryuu kei land\": \"欢迎光临！水龙敬乐园\",\n        \"shuriken sentai ninninger\": \"手里剑战队忍忍者\",\n        \"hajimete no hitozuma\": \"第一次的人妻体验\",\n        \"sdorica\": \"Sdorica\",\n        \"kaifuku jutsushi no yarinaoshi\": \"回复术士的重启人生\",\n        \"sd gundam sangokuden\": \"SD高达三国传\",\n        \"promare\": \"普罗米亚\",\n        \"ssss.dynazenon\": \"SSSS.电光机王\",\n        \"yagate kimi ni naru\": \"终将成为你\",\n        \"maji de watashi ni koi shinasai\": \"请认真的和我恋爱\",\n        \"lodoss-tou senki\": \"罗德岛战记\",\n        \"tantei wa mou shindeiru.\": \"侦探已死\",\n        \"the secret of kells\": \"凯尔经的秘密\",\n        \"anarchy reigns\": \"极度混乱\",\n        \"tropical-rouge precure\": \"热情闪耀！光之美少女\",\n        \"jujutsu kaisen\": \"咒术回战\",\n        \"shugo chara\": \"守护甜心\",\n        \"manatsu no yo no inmu\": \"仲夏夜之淫梦 | Cookie☆\",\n        \"mujaki no rakuen\": \"无邪气乐园\",\n        \"hololive\": \"Hololive\",\n        \"hinamatsuri\": \"超能力女儿\",\n        \"citrus\": \"citrus～柑橘味香气～\",\n        \"tsubasa reservoir chronicle\": \"翼·年代记\",\n        \"yamada-kun to 7-nin no majo\": \"山田君与7人魔女\",\n        \"aki sora\": \"秋日天空\",\n        \"beelzebub\": \"魔王奶爸\",\n        \"kaichou wa maid-sama\": \"会长是女仆大人\",\n        \"el shaddai\": \"全能之神：梅塔特隆的升天\",\n        \"plants vs. zombies\": \"植物大战僵尸\",\n        \"madou king granzort\": \"魔动王\",\n        \"sono hanabira ni kuchizuke o\": \"亲吻那片花瓣🌸\",\n        \"jormungand\": \"军火女王\",\n        \"the wolf and the seven young kids\": \"狼和七只小山羊\",\n        \"the ugly duckling\": \"丑小鸭\",\n        \"the little match girl\": \"卖火柴的小女孩\",\n        \"hansel and gretel\": \"糖果屋\",\n        \"slime taoshite 300-nen shiranai uchi ni level max ni nattemashita\": \"打了300年的史莱姆，不知不觉就练到了满级\",\n        \"shinsekai yori\": \"来自新世界\",\n        \"tonikaku kawaii\": \"总之就是非常可爱\",\n        \"danshi koukousei no nichijou\": \"男子高中生的日常\",\n        \"seitokai yakuindomo\": \"妄想学生会\",\n        \"parasyte\": \"寄生兽\",\n        \"mairimashita iruma-kun\": \"入间同学入魔了\",\n        \"yubisaki milk tea\": \"指尖奶茶\",\n        \"kyoukai no rinne\": \"境界之轮回\",\n        \"shuumatsu no harem\": \"终末的后宫\",\n        \"bishoujo mangekyou\": \"美少女万华镜\",\n        \"koe de oshigoto\": \"声优初体验！\",\n        \"id invaded\": \"异度侵入 ID:INVADED\",\n        \"hataage kemono michi\": \"萌兽宠物店\",\n        \"valkyria chronicles 2\": \"战场女武神2\",\n        \"valkyria chronicles 3\": \"战场女武神3\",\n        \"kumo desu ga nani ka\": \"转生成蜘蛛又怎样！\",\n        \"kuma kuma kuma bear\": \"熊熊勇闯异世界\",\n        \"marco to ginga ryuu\": \"丸子与银河龙\",\n        \"moyashimon\": \"萌菌物语\",\n        \"wonder egg priority\": \"奇蛋物语\",\n        \"love live superstar\": \"Love Live! Superstar!!\",\n        \"tales of arise\": \"破晓传说\",\n        \"osananajimi ga zettai ni makenai love comedy\": \"青梅竹马绝对不会输的恋爱喜剧\",\n        \"buried stars\": \"深埋之星\",\n        \"gunbuster\": \"飞跃巅峰\",\n        \"13 sentinels aegis rim\": \"十三机兵防卫圈\",\n        \"infinite space\": \"无限航路\",\n        \"tonari no kyuuketsuki-san\": \"邻家索菲\",\n        \"rabi ribi\": \"Rabi-Ribi\",\n        \"little witch nobeta\": \"小魔女诺贝塔\",\n        \"mieruko-chan\": \"看得见的女孩\",\n        \"shigatsu wa kimi no uso\": \"四月是你的谎言\",\n        \"axis powers hetalia\": \"黑塔利亚 Axis Powers\",\n        \"disney twisted-wonderland\": \"迪士尼扭曲仙境\",\n        \"sono bisque doll wa koi o suru\": \"更衣人偶坠入爱河\",\n        \"hypnosis mic\": \"催眠麦克风\",\n        \"project sekai\": \"世界计划\",\n        \"needy streamer overload\": \"主播女孩重度依赖\",\n        \"elden ring\": \"艾尔登法环\",\n        \"otome game no hametsu flag shika nai akuyaku reijou ni tensei shiteshimatta...\": \"转生成为了只有乙女游戏破灭Flag的邪恶大小姐\",\n        \"osomatsu-san\": \"阿松\",\n        \"arena of valor\": \"王者荣耀\",\n        \"douluo continent\": \"斗罗大陆\",\n        \"grand blue\": \"碧蓝之海\",\n        \"blue submarine no. 6\": \"青之6号\",\n        \"jaku-chara tomozaki-kun\": \"弱势角色友崎君\",\n        \"aikatsu friends\": \"偶活学园Friends！\",\n        \"jahy-sama wa kujikenai\": \"贾希大人不气馁\",\n        \"ling long incarnation\": \"灵笼:INCARNATION\",\n        \"kouyoku senki exs-tia\": \"光翼战姬EXS-TIA\",\n        \"assault lily\": \"突击莉莉\",\n        \"harem tengoku da to omottara yandere jigoku datta.\": \"原本以为是后宫天国谁知道竟是病娇地狱\",\n        \"akebi-chan no sailor fuku\": \"明日同学的水手服\",\n        \"mahou shoujo celesphonia\": \"魔法少女天穹法妮雅\",\n        \"noel\": \"NOeL: NOT DiGITAL\",\n        \"tsumamigui\": \"妻中蜜\",\n        \"senpai ga uzai kouhai no hanashi\": \"关于前辈很烦人的事\",\n        \"neko no otera no chion-san\": \"猫之寺的知恩姐\",\n        \"spy x family\": \"间谍过家家\",\n        \"kawaikereba hentai demo suki ni natte kuremasu ka\": \"只要长得可爱，即使是变态你也喜欢吗?\",\n        \"dorohedoro\": \"异兽魔都\",\n        \"bokura wa minna kawaisou\": \"我们大家的河合庄\",\n        \"game of thrones\": \"权力的游戏\",\n        \"red pride of eden\": \"伊甸园的骄傲\",\n        \"nana to kaoru\": \"奈奈与薰的SM日记\",\n        \"kawaii dake ja nai shikimori-san\": \"式守同学不只可爱而已\",\n        \"toaru project\": \"魔法禁书系列\",\n        \"tenka hyakken\": \"天华百剑\",\n        \"oshiro project\": \"御城少女Project\",\n        \"amaama to inazuma\": \"天真与闪电\",\n        \"kin-iro loveriche\": \"金辉恋曲四重奏\",\n        \"ganbare douki-chan\": \"加油吧同期酱\",\n        \"drakengard\": \"龙背上的骑兵\",\n        \"bobobo-bo bo-bobo\": \"鼻毛真拳\",\n        \"majuu senshi luna varga\": \"魔兽战士\",\n        \"saijaku muhai no bahamut\": \"最弱无败神装机龙\",\n        \"trinity seven\": \"七人魔法使\",\n        \"venus eleven vivid\": \"Venus Eleven Vivid！\",\n        \"emil chronicle online\": \"艾米尔编年史\",\n        \"megido 72\": \"恶魔72\",\n        \"umihara kawase\": \"海腹川背\",\n        \"owari no seraph\": \"终结的炽天使\",\n        \"starless\": \"STARLESS\",\n        \"smite\": \"神之浩劫\",\n        \"takopii no genzai\": \"章鱼噼的原罪\",\n        \"super cub\": \"本田小狼与我\",\n        \"kekkaishi\": \"结界师\",\n        \"senyoku no sigrdrifa\": \"战翼的希格德莉法\",\n        \"densetsu no yuusha da garn\": \"勇者传说\",\n        \"video girl ai\": \"电影少女\",\n        \"last origin\": \"Last Origin\",\n        \"seven mortal sins\": \"sin 七大罪\",\n        \"jibaku shounen hanako-kun\": \"地缚少年花子君\",\n        \"shinkansen henkei robo shinkalion\": \"新干线战士\",\n        \"07-ghost\": \"07-GHOST\",\n        \"10 carat torte\": \"天降托蒂！\",\n        \"11eyes\": \"11eyes -罪与罚与赎的少女-\",\n        \"12-sai.\": \"12岁。\",\n        \"13 reasons why\": \"十三个理由\",\n        \"21 emon\": \"21卫门\",\n        \"nanabun no nijyuuni\": \"22/7\",\n        \"3-gatsu no lion\": \"3月的狮子\",\n        \"81diver\": \"81diver\",\n        \"91 days\": \"91Days\",\n        \"a dog of flanders\": \"弗兰德斯的狗\",\n        \"a little snow fairy sugar\": \"小小雪精灵\",\n        \"a nightmare on elm street\": \"猛鬼街\",\n        \"kimi no iru machi\": \"有你的小镇\",\n        \"a.d.police\": \"A.D.POLICE\",\n        \"abenobashi mahou shoutengai\": \"阿倍野桥魔法商店街\",\n        \"acca 13-ku kansatsu-ka\": \"ACCA13区监察课\",\n        \"acchi kocchi\": \"一起一起这里那里\",\n        \"adachi to shimamura\": \"安达与岛村\",\n        \"adventures of the gummi bears\": \"妙妙熊历险记\",\n        \"agarest senki\": \"亚迦雷斯特战记\",\n        \"ai no senshi rainbowman\": \"彩虹化身侠\",\n        \"ai shimai\": \"爱姐妹\",\n        \"ai yori aoshi\": \"青出于蓝\",\n        \"aim for the ace\": \"网球甜心\",\n        \"air master\": \"Air Master\",\n        \"akatsuki blitzkampf\": \"葬晓电光战记\",\n        \"akira\": \"阿基拉\",\n        \"aku no onna kanbu\": \"恶之女干部\",\n        \"akuyaku reijou nanode last boss o kattemimashita\": \"作为恶役大小姐就该养魔王\",\n        \"alice tantei kyoku\": \"爱丽丝侦探局\",\n        \"alien 9\": \"校园外星人\",\n        \"alien vs predator\": \"异形大战铁血战士\",\n        \"allison to lillia\": \"艾莉森与莉莉亚\",\n        \"a.i. ga tomaranai\": \"电脑情人梦\",\n        \"akihabara dennou gumi\": \"秋叶原电脑组\",\n        \"alpen rose\": \"阿尔卑斯杜鹃\",\n        \"alvin and the chipmunks\": \"鼠来宝\",\n        \"am driver\": \"滑板战士\",\n        \"amaenaideyo\": \"极乐天师\",\n        \"amazing nurse nanako\": \"菜菜子解体诊书\",\n        \"american dad\": \"特工老爹\",\n        \"american mcgees alice\": \"爱丽丝梦游魔境\",\n        \"amnesia\": \"失忆症\",\n        \"an american tail\": \"美国鼠谭\",\n        \"ane doki\": \"御姐百分百\",\n        \"ane haramix\": \"姐姐☆懷孕\",\n        \"angel blade\": \"Angel Blade\",\n        \"animal yokochou\": \"动物横町\",\n        \"animaniacs\": \"狂欢三宝\",\n        \"anna millers\": \"安娜·米勒\",\n        \"anne happy\": \"Anne Happy♪\",\n        \"anpanman\": \"面包超人\",\n        \"ao no flag\": \"青旗\",\n        \"aoharu x kikanjuu\": \"青春×机关枪\",\n        \"aoi shiro\": \"青城\",\n        \"aoi umi no tristia\": \"发明工坊\",\n        \"ape escape\": \"捉猴啦\",\n        \"ar nosurge\": \"Ar nosurge ～献给诞生之星的祈祷诗～\",\n        \"ciel nosurge\": \"静籁之空 ～献给失落之星的诗～\",\n        \"ar tonelico\": \"魔塔大陆\",\n        \"ar tonelico qoga\": \"魔塔大陆3\",\n        \"araiguma rascal\": \"小浣熊\",\n        \"arcana famiglia\": \"魔力家族\",\n        \"area no kishi\": \"足球骑士\",\n        \"ares no tsubasa\": \"传奇之翼\",\n        \"arete hime\": \"阿莱蒂公主\",\n        \"armored trooper votoms\": \"装甲骑兵波德姆兹\",\n        \"arrow emblem hawk of the grand prix\": \"神威赛车手\",\n        \"asa made jugyou chu\": \"授课到天亮Chu!\",\n        \"ashita e free kick\": \"踢向明天\",\n        \"ashita no joe\": \"明日之丈\",\n        \"ask dr. rin\": \"恋爱占卜师\",\n        \"asoko de hataraku musubu-san\": \"在那里工作的结小姐\",\n        \"astro fighter sunred\": \"天体战士桑雷德\",\n        \"astro plan\": \"太空历险记\",\n        \"asura cryin\": \"魔神相克者\",\n        \"atsumare fushigi kenkyuubu\": \"集合！不可思议研究社\",\n        \"aura battler dunbine\": \"圣战士丹拜因\",\n        \"ayashi no ceres\": \"梦幻妖子\",\n        \"azfareo no sobayounin\": \"苍龙的仆人\",\n        \"azuki-chan\": \"小红豆\",\n        \"b gata h kei\": \"B型H系\",\n        \"b-daman\": \"B传说！战斗弹珠人\",\n        \"back to the future\": \"回到未来\",\n        \"bagi the monster of mighty nature\": \"大自然的魔兽巴奇\",\n        \"bakuen campus guardress\": \"爆炎学院\",\n        \"bakugan\": \"爆丸\",\n        \"bakunyuu maid kari\": \"爆乳女仆狩猎\",\n        \"bakutou sengen daigunder\": \"爆斗宣言大钢弹\",\n        \"baldr force\": \"BALDR FORCE\",\n        \"ballroom e youkoso\": \"舞动青春\",\n        \"band yarouze\": \"来组乐队吧!\",\n        \"banished from the heros party i decided to live a quiet life in the countryside\": \"因为不是真正的伙伴而被逐出勇者队伍，流落到边境展开慢活人生\",\n        \"banjo-kazooie\": \"班卓熊大冒险\",\n        \"banner of the stars\": \"星界的战旗\",\n        \"baribari densetsu\": \"极速狂飙\",\n        \"battery\": \"野球少年\",\n        \"battle angel alita\": \"铳梦\",\n        \"battle arena toshinden\": \"斗神传\",\n        \"battle royal high school\": \"真魔神传\",\n        \"beck\": \"BECK\",\n        \"beelzebub-jou no okinimesu mama.\": \"只要贝尔哲布布大小姐喜欢就好\",\n        \"beet the vandel buster\": \"冒险王比特\",\n        \"beetlejuice\": \"阴间大法师\",\n        \"bemubemu hunter kotengu tenmaru\": \"伏魔小旋风\",\n        \"bernard-jou iwaku.\": \"伯纳德小姐说\",\n        \"beyond oasis\": \"托尔的传说\",\n        \"big wars\": \"Big Wars\",\n        \"binchou-tan\": \"备长炭\",\n        \"binzume yousei\": \"瓶诘妖精\",\n        \"birdy the mighty\": \"铁腕女警\",\n        \"bishounen tanteidan\": \"美少年侦探团\",\n        \"black butler\": \"黑执事\",\n        \"black desert online\": \"黑色沙漠\",\n        \"black jack\": \"怪医黑杰克\",\n        \"black magic m-66\": \"黑魔术玛丽奥M-66\",\n        \"blade runner\": \"银翼杀手\",\n        \"blast of tempest\": \"绝园的暴风雨\",\n        \"blood plus\": \"血战\",\n        \"blood royale\": \"BLOOD ROYAL\",\n        \"blood-c\": \"BLOOD-C\",\n        \"bloodstained\": \"血污\",\n        \"bloody roar\": \"血腥咆哮\",\n        \"blue dragon\": \"蓝龙\",\n        \"blue spring ride\": \"青春之旅\",\n        \"bna brand new animal\": \"动物新世代 BNA\",\n        \"boku dake ga inai machi\": \"只有我不存在的城市\",\n        \"boku no kanojo ga majimesugiru shobitch na ken\": \"关于我女友是个一本正经的碧池这件事\",\n        \"boku to misaki-sensei\": \"我和美咲老师\",\n        \"boku to roboko\": \"我与机器子\",\n        \"bokura no taiyou\": \"我们的太阳\",\n        \"bokutachi no remake\": \"我们的重制人生\",\n        \"bomberman jetters\": \"轰炸超人\",\n        \"boogiepop\": \"不吉波普\",\n        \"bounen no xamdou\": \"亡念之扎姆德\",\n        \"braceface\": \"Braceface\",\n        \"brandy and mr. whiskers\": \"小布与伟仔\",\n        \"bratz\": \"Bratz\",\n        \"brave 10\": \"BRAVE10\",\n        \"brave express might gaine\": \"勇者特急队\",\n        \"brave fencer musashi\": \"勇敢的剑士 武藏传\",\n        \"brave nine\": \"Brave Nine\",\n        \"brave story\": \"勇者物语\",\n        \"bravestarr\": \"布雷斯塔警长\",\n        \"breakers\": \"BREAKERS\",\n        \"breath of fire\": \"龙息之焰\",\n        \"breath of fire ii\": \"龙息之焰II\",\n        \"breath of fire iii\": \"龙息之焰III\",\n        \"breath of fire iv\": \"龙息之焰IV\",\n        \"breath of fire v\": \"龙息之焰V\",\n        \"breath of fire 6\": \"龙息之焰6\",\n        \"broken blade\": \"破刃之剑\",\n        \"bubuki buranki\": \"舞武器·舞乱伎\",\n        \"bucky ohare\": \"Bucky O'Hare\",\n        \"buffy the vampire slayer\": \"吸血鬼猎人巴菲\",\n        \"bully\": \"恶霸鲁尼\",\n        \"bungou to alchemist\": \"文豪与炼金术师\",\n        \"burn up\": \"杀人科\",\n        \"burn up w\": \"杀人科 W\",\n        \"burn up scramble\": \"杀人科 SCRAMBLE\",\n        \"busou shoujo machiavellianism\": \"武装少女Machiavellianism\",\n        \"buzz lightyear of star command\": \"巴斯光年的星际使命\",\n        \"c the money of soul and possibility control\": \"C钱‧未来式\",\n        \"cage of eden\": \"逃离伊甸园\",\n        \"caligula\": \"卡里古拉\",\n        \"call me by your name\": \"请以你的名字呼唤我\",\n        \"call of duty\": \"使命召唤\",\n        \"can can bunny\": \"Can Can Bunny\",\n        \"carole and tuesday\": \"卡罗尔与星期二\",\n        \"casshan\": \"再造人卡辛\",\n        \"casshern sins\": \"卡辛~罪~\",\n        \"fantasy bishoujo juniku ojisan to\": \"与变成了异世界美少女的大叔一起冒险\",\n        \"trauma center\": \"超执刀\",\n        \"alchemy stars\": \"白夜极光\",\n        \"genkai tokki monster monpiece\": \"限界凸骑 Monster Monpiece\",\n        \"castlevania\": \"恶魔城\",\n        \"casual romance club\": \"放学后恋爱俱乐部\",\n        \"chalkzone\": \"粉笔世界\",\n        \"chaos breaker\": \"混沌斩断\",\n        \"chaos child\": \"混沌之子\",\n        \"chaos head\": \"混沌之脑\",\n        \"cheer danshi\": \"男子啦啦队！！\",\n        \"chibi maruko-chan\": \"樱桃小丸子\",\n        \"chibi vampire\": \"增血鬼果林\",\n        \"chichi chichi\": \"乳乳乳乳\",\n        \"chikyu misaki\": \"地球美纱树\",\n        \"childs play\": \"鬼娃回魂\",\n        \"chio-chan no tsuugakuro\": \"千绪的通学路\",\n        \"chip n dale rescue rangers\": \"救援突击队\",\n        \"cho aniki\": \"超兄贵\",\n        \"chogattai majutsu robot ginguiser\": \"超合体魔术机器人\",\n        \"chokotto sister\": \"我的裘可妹妹\",\n        \"chou dokyuu shoujo 4946\": \"超弩级少女4946\",\n        \"chou kuse ni narisou\": \"城市小飞女\",\n        \"choudenshi bioman\": \"超电子生化人\",\n        \"chouja raideen\": \"超者雷登\",\n        \"choujikuu kidan southern cross\": \"超时空骑团\",\n        \"choujuu kishin dancougar\": \"超兽机神\",\n        \"choukou shinki ixseal\": \"超昂神骑爱克希尔\",\n        \"chrono cross\": \"穿越时空\",\n        \"chrono trigger\": \"时空之轮\",\n        \"chu-bra\": \"青春CUP\",\n        \"chuuka ichiban\": \"中华一番！\",\n        \"class of heroes\": \"剑与魔法与学园\",\n        \"clock tower\": \"钟楼惊魂\",\n        \"clover point\": \"Clover Point\",\n        \"cocoro restarter\": \"心灵重启！\",\n        \"code realize sousei no himegimi\": \"Code:Realize ～创世的姬君～\",\n        \"codename kids next door\": \"小孩大联盟\",\n        \"combat mecha xabungle\": \"战斗装甲Xabungle\",\n        \"combattler v\": \"超力电磁侠 孔巴特拉V\",\n        \"conan the barbarian\": \"蛮王柯南\",\n        \"concon-collector\": \"Concon-Collector\",\n        \"conker\": \"松鼠库克倒霉的一天\",\n        \"cooking idol ai mai main\": \"料理偶像\",\n        \"corruption of champions\": \"英雄的堕落\",\n        \"crash b-daman\": \"爆球Hit！轰烈弹珠人\",\n        \"crash bandicoot\": \"古惑狼\",\n        \"cross game\": \"幸运四叶草\",\n        \"crush gear nitro\": \"新超激力战斗车\",\n        \"crypt killer\": \"妖霸天下\",\n        \"cyberbots\": \"装甲战士\",\n        \"cyberpunk\": \"赛博朋克\",\n        \"d.gray-man\": \"驱魔少年\",\n        \"d.n.angel\": \"天使怪盗\",\n        \"d.p.s.\": \"D.P.S.\",\n        \"daa daa daa\": \"Da!Da!Da!\",\n        \"daiakuji\": \"大恶司\",\n        \"daibanchou -big bang age-\": \"大番长 -Big Bang Age-\",\n        \"daicon\": \"DAICON\",\n        \"daisenryaku\": \"大战略\",\n        \"daphne in the brilliant blue\": \"光与水的女神\",\n        \"dark chronicle\": \"暗云编年史\",\n        \"dark water\": \"Dark Water\",\n        \"darker than black\": \"DARKER THAN BLACK\",\n        \"darkwing duck\": \"狡猾飞天德\",\n        \"dave the barbarian\": \"野蛮人戴夫\",\n        \"day break illusion\": \"穿透幻影的太阳\",\n        \"dead end\": \"Dead End\",\n        \"dead rising\": \"丧尸围城\",\n        \"deadman wonderland\": \"死囚乐园\",\n        \"deception\": \"刻命馆\",\n        \"defense devil\": \"防御魔鬼\",\n        \"demento\": \"狂城丽影\",\n        \"demonbane\": \"斩魔大圣DEMONBANE\",\n        \"dennou boukenki webdiver\": \"电脑冒险记\",\n        \"makai tenshi jibril\": \"魔界天使吉普莉露\",\n        \"dennou tenshi djibril\": \"电脑天使吉普莉露\",\n        \"denpa teki na kanojo\": \"电波系彼女\",\n        \"detective school q\": \"侦探学园Q\",\n        \"the idolmaster sidem\": \"偶像大師SideM\",\n        \"ryuugajou nanana no maizoukin\": \"龙娘七七七埋藏的宝藏\",\n        \"grandia\": \"冒險奇譚\",\n        \"grappler baki\": \"刃牙\",\n        \"mayonaka no tantei nightwalker\": \"真夜中的侦探\",\n        \"boku no kokoro no yabai yatsu\": \"我内心的糟糕念头\",\n        \"inaka ni kaeru to yakeni natsuita kasshoku ponytail shota ga iru\": \"单马尾表弟 (暂译)\",\n        \"paripi koumei\": \"派对浪客诸葛孔明\",\n        \"sore ga seiyuu\": \"那就是声优！\",\n        \"advance of zeta\": \"ADVANCE OF Ζ 提坦斯的旗下\",\n        \"summertime render\": \"夏日重现\",\n        \"kiteretsu daihyakka\": \"奇天烈大百科\",\n        \"perman\": \"飞人\",\n        \"danshi koukousei de urekko light novel sakka o shiteiru keredo\": \"身为男高中生兼当红轻小说作家的我，正被年纪比我小且从事声优工作的女同学掐住脖子\",\n        \"destiny child\": \"命运之子\",\n        \"ousama ranking\": \"国王排名\",\n        \"regular show\": \"天兵公园\",\n        \"talespin\": \"航空小英雄\",\n        \"tiny toons\": \"迷你乐一通\",\n        \"recess\": \"下课后\",\n        \"garfield\": \"加菲猫\",\n        \"ok k.o. lets be heroes\": \"OK K.O.!英雄赞\",\n        \"ratchet and clank\": \"瑞奇与叮当\",\n        \"kangokutou mary skelter\": \"神狱塔：断罪玛丽\",\n        \"hourou musuko\": \"放浪男孩\",\n        \"moshidora\": \"如果杜拉\",\n        \"yumekui merry\": \"食梦者玛莉\",\n        \"ikoku meiro no croisee\": \"异国迷宫的十字路口\",\n        \"corpse party\": \"尸体派对\",\n        \"jewelpet tinkle\": \"宝石宠物Twinkle☆\",\n        \"dragon crisis\": \"龙之界点\",\n        \"who framed roger rabbit\": \"谁陷害了兔子罗杰\",\n        \"the bad guys\": \"坏蛋联盟\",\n        \"hige o soru. soshite joshikousei o hirou.\": \"剃须。然后捡到女高中生。\",\n        \"horimiya\": \"堀桑与宫村君\",\n        \"ef a tale of memories\": \"悠久之翼\",\n        \"gaikotsu kishi-sama tadaima isekai e odekakechuu\": \"骸骨骑士大人异世界冒险中\",\n        \"kou-1 desu ga isekai de joushu hajimemashita\": \"虽然才高一却在异世界当起城主\",\n        \"kansen x shoujo\": \"感染×少女\",\n        \"digimon story cyber sleuth\": \"数码宝贝物语 网络侦探\",\n        \"among us\": \"Among Us\",\n        \"landstalker\": \"秘境魔宝\",\n        \"wizardry\": \"巫术系列\",\n        \"cotton\": \"棉花小魔女系列\",\n        \"waccha primagi\": \"绫镜魔法\",\n        \"sonic soldier borgman\": \"超音战士\",\n        \"brave girl ravens\": \"Brave Girl Ravens\",\n        \"tsukuyomi moon phase\": \"月咏\",\n        \"punishing gray raven\": \"战双帕弥什\",\n        \"guardian tales\": \"坎公骑冠剑\",\n        \"otome game sekai wa mob ni kibishii sekai desu\": \"乙女游戏世界对路人角色很不友好\",\n        \"kenja no mago\": \"贤者之孙\",\n        \"lycoris recoil\": \"莉可丽丝\",\n        \"tachibana-san-chi no dansei jijou\": \"橘OO家O男性事情\",\n        \"dig delight direct drive dj\": \"D4DJ\",\n        \"seirei gensouki\": \"精灵幻想记\",\n        \"soredemo ayumu wa yosetekuru\": \"即使如此依旧步步进逼\",\n        \"nikujo no susume\": \"肉女的推荐\",\n        \"eiyuu senki\": \"英雄战姬\",\n        \"shoujo mahou gaku little witch romanesque\": \"少女魔法学\",\n        \"words worth\": \"光与影的传说\",\n        \"drifters\": \"漂流武士\",\n        \"counter side\": \"Counter:Side\",\n        \"kunoichi tsubaki no mune no uchi\": \"女忍者椿的心事\",\n        \"kanojo mo kanojo\": \"女友成双\",\n        \"ero trap dungeon\": \"色情迷宫\",\n        \"yofukashi no uta\": \"彻夜之歌\",\n        \"zannen onna kanbu black general-san\": \"遗憾女干部黑暗将军小姐\",\n        \"digimon ghost game\": \"数码宝贝幽灵游戏\",\n        \"yuusha to maou\": \"魔王勇者\",\n        \"onegai my melody\": \"我爱美乐蒂\",\n        \"bikkuriman\": \"仙魔大战\",\n        \"munou na nana\": \"无能力者娜娜\",\n        \"nurarihyon no mago\": \"滑头鬼之孙\",\n        \"bomber girl\": \"轰炸女孩\",\n        \"burn the witch\": \"龙与魔女（BURN THE WITCH）\",\n        \"hataraku onii-san\": \"打工小哥\",\n        \"tomica kizuna gattai earth granner\": \"极速牵绊 地球先锋队\",\n        \"netojuu no susume\": \"网络胜利组\",\n        \"camp buddy\": \"Camp Buddy\",\n        \"eto rangers\": \"十二生肖守护神\",\n        \"mob psycho 100\": \"灵能百分百\",\n        \"space pirate captain harlock\": \"宇宙海贼哈洛克船长\",\n        \"devil survivor 2\": \"恶魔幸存者2\",\n        \"henshin\": \"变身-emergence-\",\n        \"magika no kenshi to basileus\": \"魔技科的剑士与召唤魔王\",\n        \"aragami\": \"荒神\",\n        \"owari no chronicle\": \"终焉的年代记\",\n        \"les miserables\": \"悲惨世界\",\n        \"isekai ojisan\": \"异世界舅舅\",\n        \"star ocean\": \"星之海洋\",\n        \"kami no rhapsody\": \"神之狂想曲\",\n        \"nintama rantarou\": \"落第忍者乱太郎\",\n        \"mahoutsukai no yome\": \"魔法使的新娘\",\n        \"subarashiki hibi\": \"美好的每一天～不连续的存在～\",\n        \"tron\": \"创：战纪\",\n        \"tokyo revengers\": \"东京复仇者\",\n        \"mobile suit gundam the witch from mercury\": \"机动战士高达 水星的魔女\",\n        \"shijou saikyou no daimaou murabito a ni tensei suru\": \"史上最强大魔王转生为村民A\",\n        \"genjitsu shugi yuusha no oukoku saikenki\": \"现实主义勇者的王国重建记\",\n        \"zenless zone zero\": \"绝区零\",\n        \"mato seihei no slave\": \"魔都精兵的奴隶\",\n        \"bocchi the rock\": \"孤独摇滚！\",\n        \"scp foundation\": \"SCP基金会\",\n        \"kinnikuman\": \"金肉人\",\n        \"ever 17\": \"Ever17（时空轮回）\",\n        \"memories off\": \"告别回忆\",\n        \"shiei no sona-nyl -what a beautiful memories-\": \"紫影的索纳尼尔 ～何等美好的记忆～\",\n        \"katawa shoujo\": \"片轮少女\",\n        \"sound horizon\": \"泡沫の恋\",\n        \"honor of kings\": \"王者荣耀\",\n        \"naraka bladepoint\": \"永劫无间\",\n        \"teletubbies\": \"天线宝宝\",\n        \"goddess of victory nikke\": \"胜利女神：妮姬\",\n        \"identity v\": \"第五人格\",\n        \"morenatsu\": \"漏夏\",\n        \"mad rat dead\": \"疯老鼠之死\",\n        \"enjou genmu tan\": \"艳娘幻梦谭\",\n        \"from argonavis\": \"from ARGONAVIS\",\n        \"god of war\": \"战神\",\n        \"the world ends with you\": \"美妙世界\",\n        \"scarlet nexus\": \"绯红结系\",\n        \"dragalia lost\": \"Dragalia Lost ～失落的龙约～\",\n        \"kimi ga nozomu eien\": \"你所期望的永远\",\n        \"matantei loki ragnarok\": \"魔侦探洛基\",\n        \"washio sumi wa yuusha de aru\": \"鹫尾须美是勇者\",\n        \"kono healer mendokusai\": \"这个僧侣有够烦\",\n        \"super dimension century orguss\": \"超时空世纪\",\n        \"ouchi ni kaeru made ga mashimaro desu\": \"回家之前的棉花糖\",\n        \"karakuri circus\": \"傀儡马戏团\",\n        \"waka okami wa shougakusei\": \"温泉屋的小老板娘\",\n        \"kamen rider kuuga\": \"假面骑士空我\",\n        \"raramagi honyarara magic\": \"不确定魔法\",\n        \"space battleship yamato 2199\": \"宇宙战舰大和号2199\",\n        \"power pro kun pocket\": \"口袋力量棒球\",\n        \"anothereidos of dragon vein r\": \"龙脉·另一种姿态\",\n        \"the saga of darren shan\": \"向达伦大冒险\",\n        \"delicious party precure\": \"美味派对♡光之美少女\",\n        \"ai the somnium files\": \"AI：梦境档案\",\n        \"ku-neru maruta\": \"吃吃睡睡的玛璐塔\",\n        \"school shock\": \"雏蜂\",\n        \"shinigami bocchan to kuro maid\": \"死神少爷与黑女仆\",\n        \"2.43 seiin high school boys volleyball team\": \"2.43 清阴高中男子排球社\",\n        \"elf-san wa yaserarenai.\": \"精灵小姐瘦不下来\",\n        \"pretty face\": \"漂亮脸蛋\",\n        \"yi lian\": \"忆恋\",\n        \"meili xinshijie i\": \"美丽新世界i\",\n        \"kage no jitsuryokusha ni naritakute\": \"我想成为影之强者！\",\n        \"okane ga nai\": \"欠金情人\",\n        \"valvrave the liberator\": \"革命机\",\n        \"dodge danpei\": \"斗球儿弹平\",\n        \"sinbad legend of the seven seas\": \"辛巴达七海传奇\",\n        \"tenshin ranman\": \"天神乱漫\",\n        \"hajimete no orusuban\": \"第一次看家\",\n        \"nanami to konomi no oshiete a-b-c\": \"ななみとこのみのおしえてA・B・C\",\n        \"hajimete no oishasan\": \"はじめてのおいしゃさん\",\n        \"hajimete no otetsudai\": \"はじめてのおてつだい\",\n        \"otonari no tenshi-sama ni itsunomanika dame ningen ni sareteita ken\": \"关于我在无意间被隔壁的天使变成废柴这件事\",\n        \"onii-chan wa oshimai\": \"别当哥哥了！\",\n        \"shiki\": \"尸鬼\",\n        \"shikabane hime\": \"尸姬\",\n        \"ayakashi triangle\": \"妖幻三重奏\",\n        \"tensei oujo to tensai reijou no mahou kakumei\": \"转生公主与天才千金的魔法革命\",\n        \"summer camp island\": \"幽灵与莫莉·麦琪\",\n        \"luca\": \"夏日友晴天\",\n        \"spy kyoushitsu\": \"间谍教室\",\n        \"galaxy cyclone braiger\": \"银河旋风\",\n        \"mahou shoujo nante mouiidesukara.\": \"魔法少女什么的已经够了啦。\",\n        \"tom clancys rainbow six\": \"彩虹六号\",\n        \"sangoku rensenki\": \"三国恋战记~少女的兵法\",\n        \"epic seven\": \"第七史诗\",\n        \"godzilla\": \"哥斯拉\",\n        \"cloud meadow\": \"云端牧场\",\n        \"ookami kodomo no ame to yuki\": \"狼的孩子雨和雪\",\n        \"akiba maid sensou\": \"秋叶原冥途战争\",\n        \"kyuuketsuki sugu shinu\": \"吸血鬼马上死\",\n        \"devil summoner soul hackers\": \"恶魔召唤师\",\n        \"saikin yatotta maid ga ayashii\": \"最近雇的女仆有点怪\",\n        \"benriya saitou-san isekai ni iku\": \"万事屋斋藤先生转生异世界\",\n        \"mar\": \"MÄR魔兵传奇\",\n        \"kinsou no vermeil\": \"金装的维尔梅\",\n        \"ganbare goemon\": \"大盗五右卫门\",\n        \"jikkyou powerful pro yakyuu\": \"实况力量棒球系列\",\n        \"dolphin wave\": \"洶湧海豚\",\n        \"suzume no tojimari\": \"铃芽之旅\",\n        \"warframe\": \"星际战甲\",\n        \"brok the investigator\": \"鳄鱼侦探布罗格\",\n        \"horizon zero dawn\": \"地平线 零之曙光\",\n        \"un-go\": \"UN-GO\",\n        \"inma kourin devil carnival\": \"淫魔降臨デビル☆カーニバル\",\n        \"ryu ga gotoku\": \"如龙\",\n        \"atomic heart\": \"原子之心\",\n        \"yomawari\": \"夜廻\",\n        \"the addams family\": \"亚当斯一家\",\n        \"thundercats\": \"霹雳猫\",\n        \"gargoyles\": \"夜行神龙\",\n        \"dora the explorer\": \"爱探险的朵拉\",\n        \"gremlins\": \"小魔怪\",\n        \"lazytown\": \"懒人小镇\",\n        \"deltarune\": \"三角符文\",\n        \"vampire knight\": \"吸血鬼骑士\",\n        \"blue reflection\": \"蔚蓝反射（幻舞少女之剑）\",\n        \"fumikiri jikan\": \"平交道时间\",\n        \"all out\": \"ALL OUT!!\",\n        \"kuma miko\": \"熊巫女\",\n        \"tsuki ni yorisou otome no sahou\": \"近月少女的礼仪\",\n        \"witchs weapon\": \"魔女兵器\",\n        \"dead by daylight\": \"黎明杀机\",\n        \"sakuna of rice and ruin\": \"天穗之咲稻姬\",\n        \"oshi no ko\": \"我推的孩子\",\n        \"tensei shitara ken deshita\": \"转生就是剑\",\n        \"juuou mujin no fafnir\": \"铳皇无尽的法夫纳\",\n        \"soukyuu no fafner\": \"苍穹之法芙娜\",\n        \"heaven burns red\": \"炽焰天穹\",\n        \"fire emblem engage\": \"火焰之纹章 结合\",\n        \"watashi no yuri wa oshigoto desu\": \"我的百合乃工作是也！\",\n        \"sekai saikou no ansatsusha isekai kizoku ni tensei suru\": \"世界顶尖的暗杀者转生为异世界贵族\",\n        \"sengoku bushouki muramasa\": \"战国武将姬\",\n        \"idola phantasy star saga\": \"梦幻之星·伊多拉传说\",\n        \"golden time\": \"青春纪行\",\n        \"honkai star rail\": \"崩坏：星穹铁道\",\n        \"tongari boushi no atelier\": \"尖帽子的魔法工坊\",\n        \"sankarea\": \"散华礼弥\",\n        \"princess resurrection\": \"怪物王女\",\n        \"world flipper\": \"世界弹射物语\",\n        \"kikai sentai zenkaiger\": \"机界战队全开者\",\n        \"ng knight lamune and 40\": \"VS骑士\",\n        \"midnight girls\": \"Midnight Girls R\",\n        \"xenoblade chronicles 3\": \"异度神剑3\",\n        \"hollow knight\": \"空洞骑士\",\n        \"koutetsu no majo annerose\": \"钢铁魔女安妮罗杰\",\n        \"wuqi mitu\": \"无期迷途\",\n        \"jigokuraku\": \"地狱乐\",\n        \"tokyo mirage sessions fe\": \"幻影异闻录♯FE\",\n        \"odin sphere\": \"奥丁领域\",\n        \"ga geijutsuka art design class\": \"GA 艺术科美术设计班\",\n        \"tower of fantasy\": \"幻塔\",\n        \"ase to sekken\": \"汗皂交香\",\n        \"idoly pride\": \"偶像荣耀\",\n        \"nu carnival\": \"新世界狂欢\",\n        \"siren\": \"死魂曲\",\n        \"lapis relights\": \"宝石幻想 光芒重现\",\n        \"franken fran\": \"疯狂怪医芙兰\",\n        \"kaminaki sekai no kamisama katsudou\": \"无神世界中的神明活动\",\n        \"shoukan yuusha to f-kei kareshi\": \"召唤勇者与F系男友\",\n        \"megami device\": \"女神装置\",\n        \"skip to loafer\": \"跳跃和乐福鞋\",\n        \"astral chain\": \"异界锁链\",\n        \"taiyou no kiba dougram\": \"太阳之牙\",\n        \"natsuiro kiseki\": \"夏色奇迹\",\n        \"slam dunk\": \"灌篮高手\",\n        \"tenshi souzou re-boot\": \"天使☆嚣嚣 RE-BOOT!\",\n        \"2.5-jigen no yuuwaku\": \"2.5次元的诱惑\",\n        \"golden boy\": \"黄金小子\",\n        \"valorant\": \"无畏契约\",\n        \"zom 100 zombie ni naru made ni shitai 100 no koto\": \"僵尸百分百\",\n        \"hirogaru sky precure\": \"开阔天空！光之美少女\",\n        \"dororon enma-kun\": \"咚隆隆炎魔君\",\n        \"kekko kamen\": \"穴光假面\",\n        \"tamagotchi\": \"电子宠物蛋\",\n        \"sousou no frieren\": \"葬送的芙莉莲\",\n        \"maou gakuin no futekigousha\": \"魔王学院的不适任者\",\n        \"jewelpet\": \"宝石宠物\",\n        \"jewelpet sunshine\": \"宝石宠物 Sunshine\",\n        \"eve burst error\": \"EVE burst error\",\n        \"mahou shoujo tokushusen asuka\": \"魔法少女特殊战明日香\",\n        \"ponyo\": \"崖上的波妞\",\n        \"lv1 maou to one room yuusha\": \"LV1魔王与独居废勇者\",\n        \"love live hasunosora jogakuin school idol club\": \"莲之空女学院学园偶像俱乐部\",\n        \"little lord fauntleroy\": \"小公子西迪\",\n        \"tensai ouji no akaji kokka saisei jutsu\": \"天才王子的赤字国家振兴术\",\n        \"mardock scramble\": \"壳中少女\",\n        \"grimoire shiritsu grimoire mahou gakuen\": \"私立格里莫瓦魔法学园\",\n        \"futoku no guild\": \"不道德公会\",\n        \"kemono jihen\": \"怪物事变\",\n        \"oounabara to wadanohara\": \"大海原与大海原\",\n        \"zero escape\": \"极限脱出\",\n        \"araburu kisetsu no otome-domo yo\": \"骚动时节的少女们啊\",\n        \"yuusha party o tsuihou sareta beast tamer saikyoushu no nekomimi shoujo to deau\": \"被开除出勇者队伍的驯兽使，邂逅了最强种猫耳少女\",\n        \"doukyuusei\": \"同级生\",\n        \"dohna dohna issho ni warui koto o shiyou\": \"多娜多娜一起干坏事吧\",\n        \"chizuru-chan kaihatsu nikki\": \"千鹤酱的开发日志\",\n        \"arc the lad\": \"妖精战士\",\n        \"haiiro teien\": \"灰色庭园\",\n        \"shuumatsu nani shitemasu ka isogashii desu ka sukutte moratte ii desu ka\": \"末日时在做什么？有没有空？可以来拯救吗？\",\n        \"flint the time detective\": \"时空侦探\",\n        \"fumetsu no anata e\": \"致不灭的你\",\n        \"shiro seijo to kuro bokushi\": \"白圣女与黑牧师\",\n        \"slow loop\": \"SLOW LOOP\",\n        \"taimadou gakuen 35 shiken shoutai\": \"对魔导学园35试验小队\",\n        \"ongeki\": \"音击Ongeki\",\n        \"yamada-kun to lv999 no koi o suru\": \"和山田进行LV.999的恋爱\",\n        \"yu-gi-oh sevens\": \"游戏王SEVENS\",\n        \"ore no shikabane wo koeteyuke\": \"跨越我的尸体\",\n        \"puss in boots the last wish\": \"穿靴子的猫:最后的愿望\",\n        \"fatal frame\": \"零系列\",\n        \"arknights endfield\": \"明日方舟：终末地\",\n        \"calabiyau\": \"卡拉彼丘\",\n        \"soltyrei\": \"曙光少女\",\n        \"meikyuu black company\": \"异世界迷宫黑心企业\",\n        \"kimi no koto ga daidaidaidaidaisuki na 100-nin no kanojo\": \"超超超超超喜欢你的100个女朋友\",\n        \"kimagure orange road\": \"橙路\",\n        \"mahoutsukai no yakusoku\": \"魔法使的约定\",\n        \"genesis climber mospeada\": \"机甲创世记\",\n        \"tottemo luckyman\": \"幸运超人\",\n        \"super radical gag family\": \"浦安铁筋家族\",\n        \"edomae elf\": \"江户前精灵\",\n        \"eizouken ni wa te wo dasu na\": \"别对映像研出手！\",\n        \"rikei ga koi ni ochita no de shuomei shite mita.\": \"理科生坠入情网，故尝试证明。\",\n        \"yu-gi-oh go rush\": \"游戏王GO RUSH\",\n        \"tearmoon teikoku monogatari\": \"堤亚穆帝国物语～从断头台开始，公主重生后的逆转人生～\",\n        \"invincible\": \"无敌少侠\",\n        \"urotsukidoji\": \"超神传说\",\n        \"shutsudou minisuka police\": \"出动！迷你裙警察\",\n        \"engage kiss\": \"契约之吻\",\n        \"seitokai no ichizon\": \"学生会的一己之见\",\n        \"tsuritama\": \"钓球\",\n        \"mahou shoujo ni akogarete\": \"憧憬成为魔法少女\",\n        \"myo-chan sensei wa kaku katariki\": \"小美代老师如是说\",\n        \"kusuriya no hitorigoto\": \"药师少女的独语\",\n        \"equestria girls\": \"小马宝莉：魔法公主\",\n        \"palworld\": \"幻兽帕普\",\n        \"limbus company\": \"边狱公司\",\n        \"trigun\": \"枪神\",\n        \"saimin seishidou\": \"催眠性指导\",\n        \"tekkaman blade\": \"宇宙骑士BLADE\"\n    },\n    \"character\": {\n        \"alice\": \"爱丽丝\",\n        \"akane hino\": \"日野茜\",\n        \"ibuki\": \"伊吹\",\n        \"yui\": \"由依 | 结衣\",\n        \"hisui\": \"翡翠 | 飞彗\",\n        \"rider\": \"Rider | 龙女\",\n        \"maya\": \"摩耶\",\n        \"jeanne darc\": \"圣女贞德\",\n        \"katsuragi\": \"葛城\",\n        \"kasumi\": \"霞\",\n        \"leo\": \"丽王 | 利昂\",\n        \"haruna\": \"榛名 | 春奈\",\n        \"chitose\": \"千岁\",\n        \"murakumo\": \"丛 | 丛云\",\n        \"nachi\": \"那智\",\n        \"kagura\": \"神乐\",\n        \"ram\": \"拉姆\",\n        \"ink nijihara\": \"虹原茵可\",\n        \"pastel ink\": \"闪亮茵可\",\n        \"sumi kuroi\": \"黑威澄\",\n        \"alice shiratori\": \"白鸟爱丽丝\",\n        \"reimu hakurei\": \"博丽灵梦\",\n        \"marisa kirisame\": \"雾雨魔理沙\",\n        \"mima\": \"魅魔\",\n        \"sariel\": \"萨丽爱尔\",\n        \"chiyuri kitashirakawa\": \"北白河千百合\",\n        \"yumemi okazaki\": \"冈崎梦美\",\n        \"elly\": \"艾丽\",\n        \"gengetsu\": \"幻月\",\n        \"mugetsu\": \"梦月\",\n        \"kurumi\": \"胡桃\",\n        \"yumeko\": \"梦子\",\n        \"shinki\": \"神绮\",\n        \"rumia\": \"露米娅\",\n        \"daiyousei\": \"大妖精\",\n        \"cirno\": \"琪露诺\",\n        \"hong meiling\": \"红美铃\",\n        \"koakuma\": \"小恶魔\",\n        \"patchouli knowledge\": \"帕秋莉·诺蕾姬\",\n        \"sakuya izayoi\": \"十六夜咲夜\",\n        \"remilia scarlet\": \"蕾米莉亚·斯卡雷特\",\n        \"flandre scarlet\": \"芙兰朵露·斯卡雷特\",\n        \"letty whiterock\": \"蕾迪·霍瓦特罗克\",\n        \"chen\": \"橙\",\n        \"alice margatroid\": \"爱丽丝·玛格特洛依德\",\n        \"shanghai\": \"上海人偶\",\n        \"hourai\": \"蓬莱人偶\",\n        \"lily white\": \"莉莉霍瓦特\",\n        \"lily black\": \"莉莉黑\",\n        \"lunasa prismriver\": \"露娜萨·普莉兹姆利巴\",\n        \"merlin prismriver\": \"梅露兰·普莉兹姆利巴\",\n        \"lyrica prismriver\": \"莉莉卡·普莉兹姆利巴\",\n        \"youmu konpaku\": \"魂魄妖梦\",\n        \"yuyuko saigyouji\": \"西行寺幽幽子\",\n        \"ran yakumo\": \"八云蓝\",\n        \"yukari yakumo\": \"八云紫\",\n        \"suika ibuki\": \"伊吹萃香\",\n        \"wriggle nightbug\": \"莉格露·奈特巴格\",\n        \"mystia lorelei\": \"米斯蒂娅·萝蕾拉\",\n        \"keine kamishirasawa\": \"上白泽慧音\",\n        \"tewi inaba\": \"因幡帝\",\n        \"reisen udongein inaba\": \"铃仙·优昙华院·因幡\",\n        \"eirin yagokoro\": \"八意永琳\",\n        \"kaguya houraisan\": \"蓬莱山辉夜\",\n        \"fujiwara no mokou\": \"藤原妹红\",\n        \"aya shameimaru\": \"射命丸文\",\n        \"medicine melancholy\": \"梅蒂欣·梅兰可莉\",\n        \"yuuka kazami\": \"风见幽香\",\n        \"komachi onozuka\": \"小野塚小町\",\n        \"eiki shiki\": \"四季映姬·亚玛萨那度\",\n        \"shizuha aki\": \"秋静叶\",\n        \"minoriko aki\": \"秋穰子\",\n        \"hina kagiyama\": \"键山雏\",\n        \"nitori kawashiro\": \"河城荷取\",\n        \"momiji inubashiri\": \"犬走椛\",\n        \"sanae kochiya\": \"东风谷早苗\",\n        \"kanako yasaka\": \"八坂神奈子\",\n        \"suwako moriya\": \"洩矢诹访子\",\n        \"iku nagae\": \"永江衣玖\",\n        \"tenshi hinanai\": \"比那名居天子\",\n        \"kisume\": \"琪斯美\",\n        \"yamame kurodani\": \"黑谷山女\",\n        \"parsee mizuhashi\": \"水桥帕露西\",\n        \"yuugi hoshiguma\": \"星熊勇仪\",\n        \"satori komeiji\": \"古明地觉\",\n        \"rin kaenbyou\": \"火焰猫燐\",\n        \"utsuho reiuji\": \"灵乌路空\",\n        \"koishi komeiji\": \"古明地恋\",\n        \"nazrin\": \"纳兹琳\",\n        \"kogasa tatara\": \"多多良小伞\",\n        \"ichirin kumoi\": \"云居一轮\",\n        \"unzan\": \"云山\",\n        \"minamitsu murasa\": \"村纱水蜜\",\n        \"shou toramaru\": \"寅丸星\",\n        \"byakuren hijiri\": \"圣白莲\",\n        \"nue houjuu\": \"封兽鵺\",\n        \"hatate himekaidou\": \"姬海棠果\",\n        \"kyouko kasodani\": \"幽谷响子\",\n        \"yoshika miyako\": \"宫古芳香\",\n        \"seiga kaku\": \"霍青娥\",\n        \"soga no tojiko\": \"苏我屠自古\",\n        \"mononobe no futo\": \"物部布都\",\n        \"toyosatomimi no miko\": \"丰聪耳神子\",\n        \"mamizou futatsuiwa\": \"二岩猯藏\",\n        \"hata no kokoro\": \"秦心\",\n        \"wakasagihime\": \"若鹭姬\",\n        \"sekibanki\": \"赤蛮奇\",\n        \"kagerou imaizumi\": \"今泉影狼\",\n        \"benben tsukumo\": \"九十九弁弁\",\n        \"yatsuhashi tsukumo\": \"九十九八桥\",\n        \"seija kijin\": \"鬼人正邪\",\n        \"shinmyoumaru sukuna\": \"少名针妙丸\",\n        \"raiko horikawa\": \"堀川雷鼓\",\n        \"sumireko usami\": \"宇佐见堇子\",\n        \"seiran\": \"清兰\",\n        \"ringo\": \"铃瑚\",\n        \"doremy sweet\": \"哆来咪·苏伊特\",\n        \"sagume kishin\": \"稀神探女\",\n        \"clownpiece\": \"克劳恩皮丝\",\n        \"junko\": \"纯狐\",\n        \"hecatia lapislazuli\": \"赫卡提亚·拉碧斯拉祖利\",\n        \"joon yorigami\": \"依神女苑\",\n        \"shion yorigami\": \"依神紫苑\",\n        \"eternity larva\": \"爱塔妮缇拉尔瓦\",\n        \"nemuno sakata\": \"坂田合欢乃\",\n        \"aunn komano\": \"高丽野阿吽\",\n        \"narumi yatadera\": \"矢田寺成美\",\n        \"satono nishida\": \"尔子田里乃\",\n        \"mai teireida\": \"丁礼田舞\",\n        \"okina matara\": \"摩多罗隐岐奈\",\n        \"eika ebisu\": \"戎璎花\",\n        \"urumi ushizaki\": \"牛崎润美\",\n        \"kutaka niwatari\": \"庭渡久侘歌\",\n        \"yachie kicchou\": \"吉吊八千慧\",\n        \"mayumi joutouguu\": \"杖刀偶磨弓\",\n        \"keiki haniyasushin\": \"埴安神袿姬\",\n        \"saki kurokoma\": \"骊驹早鬼\",\n        \"mike goutokuji\": \"豪德寺三花\",\n        \"takane yamashiro\": \"山城高岭\",\n        \"sannyo komakusa\": \"驹草山如\",\n        \"misumaru tamatsukuri\": \"玉造魅须丸\",\n        \"tsukasa kudamaki\": \"菅牧典\",\n        \"megumu iizunamaru\": \"饭纲丸龙\",\n        \"chimata tenkyuu\": \"天弓千亦\",\n        \"momoyo himemushi\": \"姬虫百百世\",\n        \"tokiko\": \"朱鹭子\",\n        \"rinnosuke morichika\": \"森近霖之助\",\n        \"sunny milk\": \"桑尼米尔克\",\n        \"luna child\": \"露娜切露德\",\n        \"star sapphire\": \"斯塔萨菲雅\",\n        \"watatsuki no toyohime\": \"绵月丰姬\",\n        \"watatsuki no yorihime\": \"绵月依姬\",\n        \"hieda no akyuu\": \"稗田阿求\",\n        \"kasen ibara\": \"茨木华扇\",\n        \"kosuzu motoori\": \"本居小铃\",\n        \"miyoi okunoda\": \"奥野田美宵\",\n        \"renko usami\": \"宇佐见莲子\",\n        \"maribel han\": \"玛艾露贝莉·赫恩\",\n        \"hakurei miko\": \"先代巫女\",\n        \"honoka kosaka\": \"高坂穗乃果\",\n        \"yukiho kosaka\": \"高坂雪穗\",\n        \"eli ayase\": \"绚濑绘里\",\n        \"arisa ayase\": \"绚濑亚里沙\",\n        \"kotori minami\": \"南小鸟\",\n        \"umi sonoda\": \"园田海未\",\n        \"rin hoshizora\": \"星空凛\",\n        \"maki nishikino\": \"西木野真姬\",\n        \"nozomi tojo\": \"东条希\",\n        \"hanayo koizumi\": \"小泉花阳\",\n        \"nico yazawa\": \"矢泽妮可\",\n        \"tsubasa kira\": \"绮罗翼\",\n        \"erena toudou\": \"统堂英玲奈\",\n        \"anju yuuki\": \"优木杏树\",\n        \"chika takami\": \"高海千歌\",\n        \"riko sakurauchi\": \"樱内梨子\",\n        \"kanan matsuura\": \"松浦果南\",\n        \"dia kurosawa\": \"黑泽黛雅\",\n        \"you watanabe\": \"渡边曜\",\n        \"tsuki watanabe\": \"渡边月\",\n        \"yoshiko tsushima\": \"津岛善子\",\n        \"hanamaru kunikida\": \"国木田花丸\",\n        \"mari ohara\": \"小原鞠莉\",\n        \"ruby kurosawa\": \"黑泽露比\",\n        \"seira kazuno\": \"鹿角圣良\",\n        \"ria kazuno\": \"鹿角理亚\",\n        \"ayumu uehara\": \"上原步梦\",\n        \"kasumi nakasu\": \"中须霞\",\n        \"shizuku osaka\": \"樱坂雫\",\n        \"karin asaka\": \"朝香果林\",\n        \"ai miyashita\": \"宫下爱\",\n        \"kanata konoe\": \"近江彼方\",\n        \"haruka konoe\": \"近江遥\",\n        \"setsuna yuki\": \"优木雪菜\",\n        \"emma verde\": \"艾玛·维尔德\",\n        \"rina tennoji\": \"天王寺璃奈\",\n        \"rensouhou-chan\": \"连装炮酱\",\n        \"chiyoda\": \"千代田\",\n        \"akebono\": \"曙\",\n        \"ushio\": \"潮\",\n        \"ikazuchi\": \"雷\",\n        \"kamoi\": \"神威\",\n        \"maruyu\": \"丸输\",\n        \"z3\": \"Z3\",\n        \"italia\": \"意大利\",\n        \"luigi torelli\": \"路易吉·托雷利\",\n        \"iona\": \"伊欧娜\",\n        \"mamiya\": \"间宫\",\n        \"shikikan\": \"指挥官\",\n        \"ka-class\": \"潜艇KA级\",\n        \"so-class\": \"潜艇SO级\",\n        \"ri-class\": \"重巡RI级\",\n        \"re-class\": \"战舰RE级\",\n        \"ta-class\": \"战舰TA级\",\n        \"wo-class\": \"空母WO级\",\n        \"teitoku\": \"提督\",\n        \"nagato\": \"长门\",\n        \"mutsu\": \"陆奥\",\n        \"ise\": \"伊势\",\n        \"hyuuga\": \"日向\",\n        \"yukikaze\": \"雪风\",\n        \"akagi\": \"赤城\",\n        \"kaga\": \"加贺\",\n        \"souryuu\": \"苍龙\",\n        \"hiryuu\": \"飞龙\",\n        \"shimakaze\": \"岛风\",\n        \"fubuki\": \"吹雪\",\n        \"shirayuki\": \"白雪\",\n        \"hatsuyuki\": \"初雪\",\n        \"miyuki\": \"深雪\",\n        \"isonami\": \"矶波\",\n        \"ayanami\": \"绫波\",\n        \"shikinami\": \"敷波\",\n        \"ooi\": \"大井\",\n        \"kitakami\": \"北上\",\n        \"kongou\": \"金刚\",\n        \"hiei\": \"比睿\",\n        \"kirishima\": \"雾岛\",\n        \"houshou\": \"凤翔\",\n        \"fusou\": \"扶桑\",\n        \"yamashiro\": \"山城\",\n        \"tenryuu\": \"天龙\",\n        \"tatsuta\": \"龙田\",\n        \"ryuujou\": \"龙骧\",\n        \"mutsuki\": \"睦月\",\n        \"kisaragi\": \"如月\",\n        \"satsuki\": \"皋月\",\n        \"fumizuki\": \"文月\",\n        \"nagatsuki\": \"长月\",\n        \"kikuzuki\": \"菊月\",\n        \"mikazuki\": \"三日月\",\n        \"mochizuki\": \"望月\",\n        \"kuma\": \"球磨\",\n        \"tama\": \"多摩\",\n        \"kiso\": \"木曾\",\n        \"nagara\": \"长良\",\n        \"isuzu\": \"五十铃\",\n        \"natori\": \"名取\",\n        \"yura\": \"由良\",\n        \"sendai\": \"川内\",\n        \"jintsuu\": \"神通\",\n        \"naka\": \"那珂\",\n        \"mogami\": \"最上\",\n        \"furutaka\": \"古鹰\",\n        \"kako\": \"加古\",\n        \"aoba\": \"青叶\",\n        \"myoukou\": \"妙高\",\n        \"ashigara\": \"足柄\",\n        \"haguro\": \"羽黑\",\n        \"takao\": \"高雄\",\n        \"atago\": \"爱宕\",\n        \"choukai\": \"鸟海\",\n        \"tone\": \"利根\",\n        \"chikuma\": \"筑摩\",\n        \"hiyou\": \"飞鹰\",\n        \"junyou\": \"隼鹰\",\n        \"oboro\": \"胧\",\n        \"sazanami\": \"涟\",\n        \"akatsuki\": \"晓\",\n        \"hibiki\": \"响\",\n        \"inazuma\": \"电\",\n        \"hatsuharu\": \"初春\",\n        \"nenohi\": \"子日\",\n        \"wakaba\": \"若叶\",\n        \"hatsushimo\": \"初霜\",\n        \"shiratsuyu\": \"白露\",\n        \"shigure\": \"时雨\",\n        \"murasame\": \"村雨\",\n        \"yuudachi\": \"夕立\",\n        \"samidare\": \"五月雨\",\n        \"suzukaze\": \"凉风\",\n        \"asashio\": \"朝潮\",\n        \"ooshio\": \"大潮\",\n        \"michishio\": \"满潮\",\n        \"arashio\": \"荒潮\",\n        \"arare\": \"霰\",\n        \"kagerou\": \"阳炎\",\n        \"shiranui\": \"不知火\",\n        \"kuroshio\": \"黑潮\",\n        \"shouhou\": \"祥凤\",\n        \"shoukaku\": \"翔鹤\",\n        \"zuikaku\": \"瑞鹤\",\n        \"kinu\": \"鬼怒\",\n        \"abukuma\": \"阿武隈\",\n        \"yuubari\": \"夕张\",\n        \"zuihou\": \"瑞凤\",\n        \"mikuma\": \"三隈\",\n        \"hatsukaze\": \"初风\",\n        \"maikaze\": \"舞风\",\n        \"kinugasa\": \"衣笠\",\n        \"i-19\": \"伊19\",\n        \"suzuya\": \"铃谷\",\n        \"kumano\": \"熊野\",\n        \"i-168\": \"伊168\",\n        \"i-58\": \"伊58\",\n        \"i-8\": \"伊8\",\n        \"yamato\": \"大和\",\n        \"akigumo\": \"秋云\",\n        \"yuugumo\": \"夕云\",\n        \"makigumo\": \"卷云\",\n        \"naganami\": \"长波\",\n        \"agano\": \"阿贺野\",\n        \"noshiro\": \"能代\",\n        \"yahagi\": \"矢矧\",\n        \"sakawa\": \"酒匂\",\n        \"musashi\": \"武藏\",\n        \"taihou\": \"大凤\",\n        \"katori\": \"香取\",\n        \"i-401\": \"伊401\",\n        \"akitsu maru\": \"秋津丸\",\n        \"yayoi\": \"弥生\",\n        \"uzuki\": \"卯月\",\n        \"isokaze\": \"矶风\",\n        \"urakaze\": \"浦风\",\n        \"tanikaze\": \"谷风\",\n        \"hamakaze\": \"滨风\",\n        \"bismarck\": \"俾斯麦\",\n        \"z1\": \"Z1\",\n        \"prinz eugen\": \"欧根亲王\",\n        \"amatsukaze\": \"天津风\",\n        \"akashi\": \"明石\",\n        \"ooyodo\": \"大淀\",\n        \"taigei\": \"大鲸\",\n        \"ryuuhou\": \"龙凤\",\n        \"tokitsukaze\": \"时津风\",\n        \"unryuu\": \"云龙\",\n        \"amagi\": \"天城\",\n        \"harusame\": \"春雨\",\n        \"hayashimo\": \"早霜\",\n        \"kiyoshimo\": \"清霜\",\n        \"asagumo\": \"朝云\",\n        \"yamagumo\": \"山云\",\n        \"nowaki\": \"野分\",\n        \"akizuki\": \"秋月\",\n        \"teruzuki\": \"照月\",\n        \"hatsuzuki\": \"初月\",\n        \"takanami\": \"高波\",\n        \"asashimo\": \"朝霜\",\n        \"u-511\": \"U-511\",\n        \"graf zeppelin\": \"齐柏林伯爵\",\n        \"saratoga\": \"萨拉托加\",\n        \"ro-500\": \"吕500\",\n        \"warspite\": \"厌战\",\n        \"iowa\": \"衣阿华\",\n        \"littorio\": \"利托里奥\",\n        \"roma\": \"罗马\",\n        \"libeccio\": \"西南风\",\n        \"aquila\": \"天鹰\",\n        \"akitsushima\": \"秋津洲\",\n        \"zara\": \"扎拉\",\n        \"pola\": \"波拉\",\n        \"mizuho\": \"瑞穗\",\n        \"okinami\": \"冲波\",\n        \"kazagumo\": \"风云\",\n        \"arashi\": \"岚\",\n        \"hagikaze\": \"萩风\",\n        \"oyashio\": \"亲潮\",\n        \"yamakaze\": \"山风\",\n        \"umikaze\": \"海风\",\n        \"kawakaze\": \"江风\",\n        \"hayasui\": \"速吸\",\n        \"kashima\": \"鹿岛\",\n        \"kamikaze\": \"神风\",\n        \"asakaze\": \"朝风\",\n        \"harukaze\": \"春风\",\n        \"matsukaze\": \"松风\",\n        \"hatakaze\": \"旗风\",\n        \"amagiri\": \"天雾\",\n        \"sagiri\": \"狭雾\",\n        \"minazuki\": \"水无月\",\n        \"i-26\": \"伊26\",\n        \"hamanami\": \"滨波\",\n        \"fujinami\": \"藤波\",\n        \"uranami\": \"浦波\",\n        \"commandant teste\": \"特斯特长官\",\n        \"richelieu\": \"黎塞留\",\n        \"i-400\": \"伊400\",\n        \"i-13\": \"伊13\",\n        \"i-14\": \"伊14\",\n        \"gangut\": \"甘古特\",\n        \"tashkent\": \"塔什干\",\n        \"ark royal\": \"皇家方舟\",\n        \"shimushu\": \"占守\",\n        \"kunashiri\": \"国后\",\n        \"jervis\": \"贾维斯 | 杰维斯\",\n        \"suzutsuki\": \"凉月\",\n        \"etorofu\": \"择捉\",\n        \"matsuwa\": \"松轮\",\n        \"sado\": \"佐渡\",\n        \"tsushima\": \"对马\",\n        \"gambier bay\": \"甘比尔湾\",\n        \"intrepid\": \"无畏\",\n        \"johnston\": \"约翰斯顿\",\n        \"maestrale\": \"西北风\",\n        \"fletcher\": \"弗莱彻\",\n        \"unicorn\": \"独角兽\",\n        \"belfast\": \"贝尔法斯特\",\n        \"illustrious\": \"光辉\",\n        \"terror\": \"恐怖\",\n        \"vampire\": \"吸血鬼\",\n        \"laffey\": \"拉菲\",\n        \"eldridge\": \"埃尔德里奇\",\n        \"prince of wales\": \"威尔士亲王\",\n        \"sheffield\": \"谢菲尔德\",\n        \"ping hai\": \"平海\",\n        \"ning hai\": \"宁海\",\n        \"formidable\": \"可畏\",\n        \"admiral hipper\": \"希佩尔海军上将\",\n        \"portland\": \"波特兰\",\n        \"cygnet\": \"小天鹅\",\n        \"kent\": \"肯特\",\n        \"hammann\": \"哈曼\",\n        \"mikasa\": \"三笠\",\n        \"st. louis\": \"圣路易斯\",\n        \"san diego\": \"圣地亚哥\",\n        \"long island\": \"长岛\",\n        \"javelin\": \"标枪\",\n        \"nelson\": \"纳尔逊\",\n        \"rodney\": \"罗德尼\",\n        \"enterprise\": \"企业\",\n        \"queen elizabeth\": \"伊丽莎白女王\",\n        \"victorious\": \"胜利\",\n        \"ajax\": \"阿贾克斯\",\n        \"cleveland\": \"克利夫兰\",\n        \"honolulu\": \"火奴鲁鲁\",\n        \"z46\": \"Z46\",\n        \"z23\": \"Z23\",\n        \"tirpitz\": \"提尔比茨\",\n        \"duke of york\": \"约克公爵\",\n        \"bache\": \"贝奇\",\n        \"sirius\": \"天狼星\",\n        \"sims\": \"西姆斯\",\n        \"colorado\": \"科罗拉多\",\n        \"kuubo seiki\": \"空母栖姬\",\n        \"kuubo suiki\": \"空母水鬼\",\n        \"soukou kuuboki\": \"装甲空母姬\",\n        \"senkan seiki\": \"战舰栖姬\",\n        \"hoppou seiki\": \"北方栖姬\",\n        \"nanpou seiki\": \"南方栖鬼\",\n        \"shuusekichi seiki\": \"集积地栖姬\",\n        \"ritou seiki\": \"离岛栖姬\",\n        \"kouwan seiki\": \"港湾栖姬\",\n        \"chuukan seiki\": \"中间栖姬\",\n        \"hikoujouki\": \"飞行场姬\",\n        \"lion\": \"狮\",\n        \"kagero\": \"阳炎\",\n        \"el condor pasa\": \"神鹰\",\n        \"perth\": \"珀斯\",\n        \"renown\": \"声望\",\n        \"chang chun\": \"长春\",\n        \"gotland\": \"哥特兰\",\n        \"grecale\": \"东北风\",\n        \"bremerton\": \"布莱默顿\",\n        \"roon\": \"罗恩\",\n        \"dido\": \"黛朵\",\n        \"baltimore\": \"巴尔的摩\",\n        \"producer\": \"制作人\",\n        \"haruka amami\": \"天海春香\",\n        \"chihaya kisaragi\": \"如月千早\",\n        \"yukiho hagiwara\": \"萩原雪步\",\n        \"yayoi takatsuki\": \"高槻弥生\",\n        \"kasumi takatsuki\": \"高槻霞\",\n        \"ritsuko akizuki\": \"秋月律子\",\n        \"azusa miura\": \"三浦梓\",\n        \"iori minase\": \"水濑伊织\",\n        \"makoto kikuchi\": \"菊地真\",\n        \"ami futami\": \"双海亚美\",\n        \"mami futami\": \"双海真美\",\n        \"miki hoshii\": \"星井美希\",\n        \"hibiki ganaha\": \"我那霸响\",\n        \"takane shijou\": \"四条贵音\",\n        \"kotori otonashi\": \"音无小鸟\",\n        \"ai hidaka\": \"日高爱\",\n        \"mai hidaka\": \"日高舞\",\n        \"eri mizutani\": \"水谷绘理\",\n        \"ryo akizuki\": \"秋月凉\",\n        \"uzuki shimamura\": \"岛村卯月\",\n        \"yukari mizumoto\": \"水本紫\",\n        \"mai fukuyama\": \"福山舞\",\n        \"kanako mimura\": \"三村加奈子\",\n        \"miho kohinata\": \"小日向美穗\",\n        \"chieri ogata\": \"绪方智绘里\",\n        \"kyoko igarashi\": \"五十岚响子\",\n        \"momoka sakurai\": \"樱井桃华\",\n        \"yumeko sakurai\": \"樱井梦子\",\n        \"hasumi nagatomi\": \"长富莲实\",\n        \"chika yokoyama\": \"横山千佳\",\n        \"miku maekawa\": \"前川未来\",\n        \"saya matsubara\": \"松原早耶\",\n        \"yukino aihara\": \"相原雪乃\",\n        \"frederica miyamoto\": \"宫本芙蕾德莉卡\",\n        \"sae kobayakawa\": \"小早川纱枝\",\n        \"kotoka saionji\": \"西园寺琴歌\",\n        \"anzu futaba\": \"双叶杏\",\n        \"satomi sakakibara\": \"榊原里美\",\n        \"sachiko koshimizu\": \"舆水幸子\",\n        \"yuriko ohnishi\": \"大西由里子\",\n        \"nana abe\": \"安部菜菜\",\n        \"nene kurihara\": \"栗原宁宁\",\n        \"koharu koga\": \"古贺小春\",\n        \"akiha ikebukuro\": \"池袋晶叶\",\n        \"yuu ohta\": \"太田优\",\n        \"mayu sakuma\": \"佐久间麻由\",\n        \"mirei hayasaka\": \"早坂美玲\",\n        \"rina fujimoto\": \"藤本里奈\",\n        \"michiru ohara\": \"大原满\",\n        \"hotaru shiragiku\": \"白菊萤\",\n        \"kozue yusa\": \"游佐梢\",\n        \"kurumi ohnuma\": \"大沼胡桃\",\n        \"shiki ichinose\": \"一之濑志希\",\n        \"yuuki otokura\": \"乙仓悠贵\",\n        \"rin shibuya\": \"涩谷凛\",\n        \"sarina matsumoto\": \"松本沙理奈\",\n        \"mizuki kawashima\": \"川岛瑞树\",\n        \"nao kamiya\": \"神谷奈绪\",\n        \"haruna kamijou\": \"上条春菜\",\n        \"hina araki\": \"荒木比奈\",\n        \"ai togo\": \"东乡爱\",\n        \"riina tada\": \"多田李衣菜\",\n        \"seira mizuki\": \"水木圣来\",\n        \"chie sasaki\": \"佐佐木千枝\",\n        \"miyu mifune\": \"三船美优\",\n        \"manami kiba\": \"木场真奈美\",\n        \"hajime fujiwara\": \"藤原肇\",\n        \"helen\": \"海伦\",\n        \"noa takamine\": \"高峰诺亚\",\n        \"kaede takagaki\": \"高垣枫\",\n        \"ranko kanzaki\": \"神崎兰子\",\n        \"karen hojo\": \"北条加莲\",\n        \"honoka ayase\": \"绫濑穗乃香\",\n        \"yukimi sajo\": \"佐城雪美\",\n        \"rumi wakui\": \"和久井留美\",\n        \"kako takafuji\": \"鹰富士茄子\",\n        \"koume shirasaka\": \"白坂小梅\",\n        \"mutsumi ujiie\": \"氏家睦\",\n        \"yume narumiya\": \"成宫由爱\",\n        \"syuko shiomi\": \"盐见周子\",\n        \"minami nitta\": \"新田美波\",\n        \"kanade hayami\": \"速水奏\",\n        \"izumi ohishi\": \"大石泉\",\n        \"chizuru matsuo\": \"松尾千鹤\",\n        \"arisu tachibana\": \"橘爱丽丝\",\n        \"nono morikubo\": \"森久保乃乃\",\n        \"anastasia\": \"安娜斯塔西娅\",\n        \"aki yamato\": \"大和亚季\",\n        \"haru yuuki\": \"结城晴\",\n        \"fumika sagisawa\": \"鹭泽文香\",\n        \"layla\": \"莱拉 | 莱依拉\",\n        \"asuka ninomiya\": \"二宫飞鸟\",\n        \"nanami asari\": \"浅利七海\",\n        \"mio honda\": \"本田未央\",\n        \"aiko takamori\": \"高森蓝子\",\n        \"kaoru ryuzaki\": \"龙崎薰\",\n        \"natsuki kimura\": \"木村夏树\",\n        \"miria akagi\": \"赤城米莉亚\",\n        \"yui ohtsuki\": \"大槻唯\",\n        \"yuki himekawa\": \"姬川友纪\",\n        \"yuzu kitami\": \"喜多见柚\",\n        \"naho ebihara\": \"海老原菜帆\",\n        \"shizuku oikawa\": \"及川雫\",\n        \"reina koseki\": \"小关丽奈\",\n        \"yumi aiba\": \"相叶夕美\",\n        \"tomoka wakabayashi\": \"若林智香\",\n        \"mika jougasaki\": \"城崎美嘉\",\n        \"rika jougasaki\": \"城崎莉嘉\",\n        \"kirari moroboshi\": \"诸星琪拉莉\",\n        \"airi totoki\": \"十时爱梨\",\n        \"natalia\": \"娜塔莉亚\",\n        \"takumi mukai\": \"向井拓海\",\n        \"eve santaclaus\": \"伊芙·珊德克罗丝\",\n        \"nina ichihara\": \"市原仁奈\",\n        \"hinako kita\": \"喜多日菜子\",\n        \"mary cochran\": \"玛丽·柯克兰\",\n        \"ayame hamaguchi\": \"滨口菖蒲\",\n        \"syoko hoshi\": \"星辉子\",\n        \"ako tsuchiya\": \"土屋亚子\",\n        \"sanae katagiri\": \"片桐早苗\",\n        \"yuko hori\": \"堀裕子\",\n        \"kai nishijima\": \"西岛櫂\",\n        \"risa matoba\": \"的场梨沙\",\n        \"tokiko zaizen\": \"财前时子\",\n        \"shin sato\": \"佐藤心\",\n        \"yoshino yorita\": \"依田芳乃\",\n        \"chihiro senkawa\": \"千川千寻\",\n        \"mirai kasuga\": \"春日未来\",\n        \"hinata kinoshita\": \"木下日向\",\n        \"julia\": \"茱莉亚\",\n        \"sayoko takayama\": \"高山纱代子\",\n        \"kotoha tanaka\": \"田中琴叶\",\n        \"tomoka tenkubashi\": \"天空桥朋花\",\n        \"serika hakozaki\": \"箱崎星梨花\",\n        \"arisa matsuda\": \"松田亚利沙\",\n        \"shizuka mogami\": \"最上静香\",\n        \"anna mochizuki\": \"望月杏奈\",\n        \"emily stewart\": \"艾米莉·司徒亚特\",\n        \"tamaki ogami\": \"大神环\",\n        \"reika kitakami\": \"北上丽花\",\n        \"umi kousaka\": \"高坂海美\",\n        \"minako satake\": \"佐竹美奈子\",\n        \"elena shimabara\": \"岛原埃琳娜\",\n        \"subaru nagayoshi\": \"永吉昴\",\n        \"konomi baba\": \"马场木实\",\n        \"noriko fukuda\": \"福田法子\",\n        \"mizuki makabe\": \"真壁瑞希\",\n        \"rio momose\": \"百濑莉绪\",\n        \"nao yokoyama\": \"横山奈绪\",\n        \"tsubasa ibuki\": \"伊吹翼\",\n        \"shiho kitazawa\": \"北泽志保\",\n        \"karen shinomiya\": \"篠宫可怜\",\n        \"momoko suou\": \"周防桃子\",\n        \"matsuri tokugawa\": \"德川茉莉\",\n        \"megumi tokoro\": \"所惠美\",\n        \"fuuka toyokawa\": \"丰川风花\",\n        \"iku nakatani\": \"中谷育\",\n        \"yuriko nanao\": \"七尾百合子\",\n        \"chizuru nikaido\": \"二阶堂千鹤\",\n        \"miya miyao\": \"宫尾美也\",\n        \"roco handa\": \"伴田路子\",\n        \"kaori sakuramori\": \"樱守歌织\",\n        \"tsumugi shiraishi\": \"白石䌷\",\n        \"mishiro\": \"美城常务\",\n        \"touma amagase\": \"天濑冬马\",\n        \"teru tendo\": \"天道辉\",\n        \"minori watanabe\": \"渡边实\",\n        \"shiki iseya\": \"伊濑谷四季\",\n        \"hayato akiyama\": \"秋山隼人\",\n        \"saki mizushima\": \"水岛咲\",\n        \"shiro tachibana\": \"橘志狼\",\n        \"hokuto ijuuin\": \"伊集院北斗\",\n        \"kaoru sakuraba\": \"樱庭薫\",\n        \"rei kagura\": \"神乐丽\",\n        \"kyoji takajo\": \"鹰城恭二\",\n        \"kyosuke aoi\": \"苍井享介\",\n        \"jun fuyumi\": \"冬美旬\",\n        \"natsuki sakaki\": \"榊夏来\",\n        \"nao okamura\": \"冈村直央\",\n        \"shouta mitarai\": \"御手洗翔太\",\n        \"tsubasa kashiwagi\": \"柏木翼\",\n        \"kei tsuzuki\": \"都筑圭\",\n        \"pierre\": \"皮埃尔\",\n        \"yusuke aoi\": \"苍井悠介\",\n        \"haruna wakazato\": \"若里春名\",\n        \"makio uzuki\": \"卯月卷绪\",\n        \"kanon himeno\": \"姬野花音\",\n        \"mano sakuragi\": \"樱木真乃\",\n        \"hiori kazano\": \"风野灯织\",\n        \"meguru hachimiya\": \"八宫缭\",\n        \"mamimi tanaka\": \"田中摩美美\",\n        \"kiriko yukoku\": \"幽谷雾子\",\n        \"kogane tsukioka\": \"月冈恋钟\",\n        \"yuika mitsumine\": \"三峰结华\",\n        \"sakuya shirase\": \"白濑咲耶\",\n        \"amana osaki\": \"大崎甘奈\",\n        \"chiyuki kuwayama\": \"桑山千雪\",\n        \"tenka osaki\": \"大崎甜花\",\n        \"kaho komiya\": \"小宫果穂\",\n        \"chiyoko sonoda\": \"园田智代子\",\n        \"juri saijo\": \"西城树里\",\n        \"rinze morino\": \"杜野凛世\",\n        \"natsuha arisugawa\": \"有栖川夏叶\",\n        \"hazuki nanakusa\": \"七草叶月\",\n        \"nichika nanakusa\": \"七草日花\",\n        \"arisa mochida\": \"持田亚里沙\",\n        \"fuyuko mayuzumi\": \"黛冬优子\",\n        \"mei izumi\": \"和泉爱依\",\n        \"asahi serizawa\": \"芹泽朝阳\",\n        \"akira sunazuka\": \"砂冢明\",\n        \"riamu yumemi\": \"梦见璃亚梦\",\n        \"madoka higuchi\": \"樋口圆香\",\n        \"koito fukumaru\": \"福丸小糸\",\n        \"toru asakura\": \"浅仓透\",\n        \"hinana ichikawa\": \"市川雏菜\",\n        \"rookie trainer\": \"新手训练员\",\n        \"veteran trainer\": \"高手训练员\",\n        \"mario\": \"马里奥\",\n        \"luigi\": \"路易吉\",\n        \"yoshi\": \"耀西\",\n        \"wario\": \"瓦里奥\",\n        \"waluigi\": \"瓦路易吉\",\n        \"bowser\": \"库巴\",\n        \"wendy o. koopa\": \"温蒂库巴\",\n        \"super crown bowser\": \"库巴姬\",\n        \"princess peach\": \"碧奇公主\",\n        \"princess daisy\": \"黛西公主\",\n        \"rosalina\": \"罗塞塔\",\n        \"pauline\": \"波琳\",\n        \"boo\": \"布布\",\n        \"super crown boo\": \"幽灵姬\",\n        \"toad\": \"奇诺比奥\",\n        \"toadette\": \"奇诺比珂\",\n        \"donkey kong\": \"森喜刚\",\n        \"diddy kong\": \"狄狄刚\",\n        \"dixie kong\": \"狄可西刚\",\n        \"applejack\": \"苹果杰克\",\n        \"fluttershy\": \"小蝶\",\n        \"pinkie pie\": \"萍琪·派\",\n        \"rainbow dash\": \"云宝黛茜\",\n        \"rarity\": \"瑞瑞\",\n        \"twilight sparkle\": \"暮光闪闪\",\n        \"princess celestia\": \"塞拉斯蒂娅公主\",\n        \"princess luna\": \"露娜公主\",\n        \"princess cadance\": \"韵律公主\",\n        \"shining armor\": \"银甲闪闪\",\n        \"starlight glimmer\": \"星光熠熠\",\n        \"sunset shimmer\": \"余晖烁烁\",\n        \"apple bloom\": \"小萍花\",\n        \"scootaloo\": \"飞板璐\",\n        \"sweetie belle\": \"甜贝儿\",\n        \"big macintosh\": \"大麦哥\",\n        \"marble pie\": \"玉琪派\",\n        \"trixie\": \"崔克西\",\n        \"spitfire\": \"飞火\",\n        \"octavia\": \"奥塔维雅\",\n        \"vinyl scratch\": \"DJ3号\",\n        \"derpy hooves\": \"小呆\",\n        \"discord\": \"无序\",\n        \"diamond tiara\": \"珠玉冠冠\",\n        \"silver spoon\": \"白银勺勺\",\n        \"princess ember\": \"余焰公主\",\n        \"queen chrysalis\": \"邪茧女王\",\n        \"sonata dusk\": \"索娜塔\",\n        \"aqua\": \"阿库娅\",\n        \"megumin\": \"惠惠\",\n        \"kazuma satou\": \"佐藤和真\",\n        \"darkness\": \"达克妮丝\",\n        \"yunyun\": \"悠悠\",\n        \"wiz\": \"维兹\",\n        \"chris\": \"克莉丝\",\n        \"kokoa hoto\": \"保登心爱\",\n        \"chino kafuu\": \"香风智乃\",\n        \"rize tedeza\": \"天天座理世\",\n        \"chiya ujimatsu\": \"宇治松千夜\",\n        \"sharo kirima\": \"桐间纱路\",\n        \"maya jouga\": \"条河麻耶\",\n        \"megumi natsu\": \"奈津惠\",\n        \"mocha hoto\": \"保登摩卡\",\n        \"midori aoyama\": \"青山翠\",\n        \"kanade amakusa\": \"甘草奏\",\n        \"chocolat\": \"裘可拉\",\n        \"ayame reikadou\": \"丽华堂绚女\",\n        \"oka yuoji\": \"游王子讴歌\",\n        \"furano yukihira\": \"雪平富良野\",\n        \"chiwa harusaki\": \"春咲千和\",\n        \"eita kidou\": \"季堂锐太\",\n        \"masuzu natsukawa\": \"夏川真凉\",\n        \"himeka akishino\": \"秋篠姬香\",\n        \"ai fuyuumi\": \"冬海爱衣\",\n        \"kyousuke kousaka\": \"高坂京介\",\n        \"kirino kousaka\": \"高坂桐乃\",\n        \"ruri gokou\": \"五更琉璃（黑猫）\",\n        \"ayase aragaki\": \"新垣绫濑\",\n        \"saori makishima\": \"槙岛沙织（沙织·巴吉纳）\",\n        \"kanako kurusu\": \"来栖加奈子\",\n        \"bridget evans\": \"布莉姬·伊凡斯\",\n        \"sena akagi\": \"赤城濑菜\",\n        \"kouhei akagi\": \"赤城浩平\",\n        \"manami tamura\": \"田村麻奈实\",\n        \"daisuke kousaka\": \"高坂大介\",\n        \"tamaki gokou\": \"五更珠希\",\n        \"hinata gokou\": \"五更日向\",\n        \"ria hagry\": \"莉亚·哈格丽\",\n        \"azusa nakano\": \"中野梓\",\n        \"jun suzuki\": \"铃木纯\",\n        \"mio akiyama\": \"秋山澪\",\n        \"ritsu tainaka\": \"田井中律\",\n        \"sawako yamanaka\": \"山中佐和子\",\n        \"tsumugi kotobuki\": \"琴吹䌷\",\n        \"ui hirasawa\": \"平泽忧\",\n        \"yui hirasawa\": \"平泽唯\",\n        \"nodoka manabe\": \"真锅和\",\n        \"satoshi tainaka\": \"田井中聪\",\n        \"sumire saitou\": \"齐藤堇\",\n        \"megumi sokabe\": \"曾我部惠\",\n        \"luste teuber\": \"露斯特·特依巴\",\n        \"spiritia rosenberg\": \"斯匹莉缇娅·罗森伯格\",\n        \"yui yuigahama\": \"由比滨结衣\",\n        \"hachiman hikigaya\": \"比企谷八幡\",\n        \"komachi hikigaya\": \"比企谷小町\",\n        \"saki kawasaki\": \"川崎沙希\",\n        \"keika kawasaki\": \"川崎桂花\",\n        \"yoshiteru zaimokuza\": \"材木座义辉\",\n        \"yukino yukinoshita\": \"雪之下雪乃\",\n        \"iroha isshiki\": \"一色彩羽\",\n        \"hayato hayama\": \"叶山隼人\",\n        \"saika totsuka\": \"户冢彩加\",\n        \"haruno yukinoshita\": \"雪之下阳乃\",\n        \"shizuka hiratsuka\": \"平冢静\",\n        \"yuuta togashi\": \"富㭴勇太\",\n        \"yumeha togashi\": \"富㭴梦叶\",\n        \"rikka takanashi\": \"小鸟游六花\",\n        \"kumin tsuyuri\": \"五月七日茴香\",\n        \"shinka nibutani\": \"丹生谷森夏\",\n        \"sanae dekomori\": \"凸守早苗\",\n        \"satone shichimiya\": \"七宫智音\",\n        \"touka takanashi\": \"小鸟游十花\",\n        \"mercy\": \"天使\",\n        \"tracer\": \"猎空\",\n        \"widowmaker\": \"黑百合\",\n        \"mei\": \"美\",\n        \"d.va\": \"D.VA\",\n        \"zarya\": \"查莉娅\",\n        \"genjii\": \"源氏\",\n        \"junkrat\": \"狂鼠\",\n        \"roadhog\": \"路霸\",\n        \"pharah\": \"法老之鹰\",\n        \"soldier 76\": \"士兵：76\",\n        \"symmetra\": \"秩序之光\",\n        \"winston\": \"温斯顿\",\n        \"sombra\": \"黑影\",\n        \"ana\": \"安娜\",\n        \"ashe\": \"艾什\",\n        \"cortana\": \"科塔娜\",\n        \"gordon freeman\": \"戈登·弗里曼\",\n        \"alyx vance\": \"爱丽克斯·凡斯\",\n        \"chell\": \"雪儿\",\n        \"emilia\": \"爱蜜莉雅\",\n        \"rem\": \"雷姆\",\n        \"subaru natsuki\": \"菜月昴\",\n        \"beatrice\": \"碧翠丝\",\n        \"felix argyle\": \"菲利克斯·阿盖尔\",\n        \"felt\": \"菲鲁特\",\n        \"roswaal l. mathers\": \"罗兹瓦尔·L·梅札斯\",\n        \"otto suewen\": \"奥托·苏文\",\n        \"julius euclius\": \"由里乌斯·尤克历乌斯\",\n        \"elsa granhiert\": \"艾尔莎·葛兰西尔特\",\n        \"tomoya aki\": \"安艺伦也\",\n        \"megumi kato\": \"加藤惠\",\n        \"utaha kasumigaoka\": \"霞之丘诗羽\",\n        \"michiru hyodo\": \"冰堂美智留\",\n        \"eriri spencer sawamura\": \"泽村·斯宾塞·英梨梨\",\n        \"izumi hashima\": \"波岛出海\",\n        \"kobato hasegawa\": \"羽濑川小鸠\",\n        \"kodaka hasegawa\": \"羽濑川小鹰\",\n        \"rika shiguma\": \"志熊理科\",\n        \"sena kashiwazaki\": \"柏崎星奈\",\n        \"yozora mikazuki\": \"三日月夜空\",\n        \"yukimura kusunoki\": \"楠幸村\",\n        \"maria takayama\": \"高山玛利亚\",\n        \"ageha\": \"扬羽\",\n        \"aimu\": \"蓝梦\",\n        \"aria\": \"亚璃亚\",\n        \"ashiya\": \"芦屋\",\n        \"asuka\": \"飞鸟\",\n        \"ayame\": \"菖蒲\",\n        \"bashou\": \"芭蕉\",\n        \"chihaya\": \"千早\",\n        \"chiyo\": \"千代\",\n        \"daidouji\": \"大道寺前辈\",\n        \"fuga\": \"风雅\",\n        \"fuma\": \"风魔\",\n        \"ginrei\": \"银岭\",\n        \"haruka\": \"春花\",\n        \"hibari\": \"云雀\",\n        \"hijikata\": \"土方\",\n        \"hikage\": \"日影\",\n        \"homura\": \"焰\",\n        \"ikaruga\": \"斑鸠\",\n        \"imu\": \"忌梦\",\n        \"josui\": \"如水\",\n        \"kaede\": \"枫\",\n        \"kagari\": \"篝\",\n        \"kanon\": \"花音\",\n        \"kanzaki\": \"神咲\",\n        \"kochou\": \"胡蝶\",\n        \"kumi\": \"九魅\",\n        \"kuroudo\": \"藏人\",\n        \"mai\": \"舞\",\n        \"meimei\": \"美莓\",\n        \"minori\": \"美野里\",\n        \"mirai\": \"未来\",\n        \"misato\": \"深里\",\n        \"miyabi\": \"雅绯\",\n        \"motochika\": \"元亲\",\n        \"muramasa\": \"村正\",\n        \"murasaki\": \"紫\",\n        \"naraku\": \"奈乐\",\n        \"ryoubi\": \"两备\",\n        \"ryouna\": \"两奈\",\n        \"sakyou\": \"左京\",\n        \"seimei\": \"清明\",\n        \"siki\": \"四季\",\n        \"shiki\": \"四季\",\n        \"souji\": \"总司\",\n        \"suzune\": \"铃音（凛）\",\n        \"syuri\": \"朱璃\",\n        \"ukyou\": \"右京\",\n        \"ushimaru\": \"牛丸\",\n        \"yagyuu\": \"柳生\",\n        \"yomi\": \"咏\",\n        \"yoshimitsu\": \"吉光\",\n        \"yozakura\": \"夜樱\",\n        \"yugiri\": \"夕雾\",\n        \"yumi\": \"雪泉\",\n        \"yuyaki\": \"夕烧\",\n        \"tohru\": \"托尔\",\n        \"kanna kamui\": \"康娜卡姆依\",\n        \"quetzalcoatl\": \"魁札尔科亚特尔\",\n        \"kobayashi-san\": \"小林\",\n        \"shouta magatsuchi\": \"真土翔太\",\n        \"riko saikawa\": \"才川莉子\",\n        \"elma\": \"艾尔玛\",\n        \"ai-chan\": \"小爱\",\n        \"kouhai-chan\": \"后辈\",\n        \"azusa azuki\": \"小豆梓\",\n        \"youto yokodera\": \"横寺阳人\",\n        \"tsukiko tsutsukakushi\": \"筒隐月子\",\n        \"tsukushi tsutsukakushi\": \"筒隐筑紫\",\n        \"mai maimaki\": \"舞牧麻衣\",\n        \"emanuella porlallora\": \"艾米（艾玛努艾勒·波鲁勒劳拉）\",\n        \"tomoya okazaki\": \"冈崎朋也\",\n        \"fuko ibuki\": \"伊吹风子\",\n        \"kotomi ichinose\": \"一之濑琴美\",\n        \"ryou fujibayashi\": \"藤林椋\",\n        \"kyou fujibayashi\": \"藤林杏\",\n        \"nagisa furukawa\": \"古河渚\",\n        \"tomoyo sakagami\": \"坂上智代\",\n        \"yukine miyazawa\": \"宫泽有纪宁\",\n        \"mei sunohara\": \"春原芽衣\",\n        \"youhei sunohara\": \"春原阳平\",\n        \"misae sagara\": \"相乐美佐枝\",\n        \"sanae furukawa\": \"古河早苗\",\n        \"meiko honma\": \"本间芽衣子\",\n        \"naruko anjou\": \"安城鸣子\",\n        \"chiriko tsurumi\": \"鹤见知利子\",\n        \"jinta yadomi\": \"宿海仁太\",\n        \"atsumu matsuyuki\": \"松雪集\",\n        \"hotaru shidare\": \"枝垂萤\",\n        \"kokonotsu shikada\": \"鹿田九\",\n        \"saya endou\": \"远藤彩\",\n        \"hajime owari\": \"尾张一\",\n        \"aoba suzukaze\": \"凉风青叶\",\n        \"hifumi takimoto\": \"泷本日富美\",\n        \"kou yagami\": \"八神光\",\n        \"rin tooyama\": \"远山伦\",\n        \"hajime shinoda\": \"篠田初\",\n        \"yun iijima\": \"饭岛结音\",\n        \"shizuku hazuki\": \"叶月雫\",\n        \"momiji mochizuki\": \"望月红叶\",\n        \"nene sakura\": \"樱宁宁\",\n        \"umiko ahagon\": \"阿波根海子\",\n        \"yamato christina wako\": \"大和·克莉丝汀·和子\",\n        \"aoi miyamori\": \"宫森葵\",\n        \"ema yasuhara\": \"安原绘麻\",\n        \"midori imai\": \"今井绿\",\n        \"shizuka sakaki\": \"坂木静香\",\n        \"misa toudou\": \"藤堂美沙\",\n        \"misato segawa\": \"濑川美里\",\n        \"erika yano\": \"矢野艾莉卡\",\n        \"rinko ogasawara\": \"小笠原纶子\",\n        \"yuka okitsu\": \"兴津由佳\",\n        \"shun watanabe\": \"渡边隼\",\n        \"ai kunogi\": \"久乃木爱\",\n        \"yumi iguchi\": \"井口祐未\",\n        \"chitose karasuma\": \"乌丸千岁\",\n        \"momoka sono\": \"苑生百花\",\n        \"yae kugayama\": \"久我山八重\",\n        \"alice cartelet\": \"爱丽丝·卡塔雷特\",\n        \"aya komichi\": \"小路绫\",\n        \"karen kujou\": \"九条可怜\",\n        \"shinobu omiya\": \"大宫忍\",\n        \"youko inokuma\": \"猪熊阳子\",\n        \"sakura karasuma\": \"乌丸樱\",\n        \"akari kuzehashi\": \"久世桥朱里\",\n        \"honoka matsubara\": \"松原穗乃花\",\n        \"gabriel tenma white\": \"天真·珈百璃·怀特\",\n        \"vignette tsukinose april\": \"月乃濑·薇奈特·艾普利尔\",\n        \"satanichia kurumizawa mcdowell\": \"胡桃泽·萨塔妮娅·麦克道威尔\",\n        \"raphiel shiraha ainsworth\": \"白羽·菈菲尔·恩兹沃斯\",\n        \"chii\": \"小叽（爱露达）\",\n        \"yumi omura\": \"大村裕美\",\n        \"sumomo\": \"丝茉茉\",\n        \"chitose hibiya\": \"日比谷千岁\",\n        \"hideki motosuwa\": \"本须和秀树\",\n        \"yuzuki\": \"柚姬\",\n        \"minoru kokubunji\": \"国分寺稔\",\n        \"takako shimizu\": \"清水多香子\",\n        \"sylvie\": \"希尔薇\",\n        \"rito yuuki\": \"结城梨斗\",\n        \"ryouko mikado\": \"御门凉子\",\n        \"lala satalin deviluke\": \"菈菈·萨塔琳·戴比路克\",\n        \"haruna sairenji\": \"西连寺春菜\",\n        \"golden darkness\": \"金色暗影\",\n        \"yui kotegawa\": \"古手川唯\",\n        \"mikan yuuki\": \"结城美柑\",\n        \"nemesis\": \"涅墨西斯\",\n        \"saki tenjouin\": \"天条院沙姬\",\n        \"aya fujisaki\": \"藤崎绫\",\n        \"rin kujou\": \"九条凛\",\n        \"mea kurosaki\": \"黑咲芽亚\",\n        \"nana asta deviluke\": \"娜娜·阿斯塔·戴比路克\",\n        \"momo velia deviluke\": \"梦梦·贝莉雅·戴比路克\",\n        \"riko yuusaki\": \"夕崎梨子\",\n        \"sephie michaela deviluke\": \"赛菲·米卡埃拉·戴比路克\",\n        \"tearju lunatique\": \"提亚悠·鲁娜提克\",\n        \"run elsie jewelria\": \"伦·艾尔西·裘利亚\",\n        \"risa momioka\": \"籾冈里纱\",\n        \"mio sawada\": \"泽田未央\",\n        \"oshizu murasame\": \"村雨静\",\n        \"kyouko kirisaki\": \"雾崎恭子\",\n        \"kenichi saruyama\": \"猿山健一\",\n        \"shizu murasame\": \"村雨静\",\n        \"erina nakiri\": \"薙切绘理奈\",\n        \"alice nakiri\": \"薙切爱丽丝\",\n        \"azami nakiri\": \"薙切蓟\",\n        \"ikumi mito\": \"水户郁魅\",\n        \"megumi tadokoro\": \"田所惠\",\n        \"fuyumi mizuhara\": \"水原冬美\",\n        \"souma yukihira\": \"幸平创真\",\n        \"takumi aldini\": \"巧·阿尔迪尼\",\n        \"isami aldini\": \"勇·阿尔迪尼\",\n        \"hisako arato\": \"新户绯沙子\",\n        \"ryou kurokiba\": \"黑木场凉\",\n        \"satoshi isshiki\": \"一色慧\",\n        \"ryouko sakaki\": \"榊凉子\",\n        \"rindou kobayashi\": \"小林龙胆\",\n        \"sagiri izumi\": \"和泉纱雾\",\n        \"elf yamada\": \"山田妖精（艾蜜莉·格兰杰）\",\n        \"masamune izumi\": \"和泉正宗\",\n        \"megumi jinno\": \"神野惠\",\n        \"muramasa senju\": \"千寿村征（梅园花）\",\n        \"tomoe takasago\": \"高砂智惠\",\n        \"super sonico\": \"超级索尼子\",\n        \"super pochaco\": \"超级帕恰子\",\n        \"super taruco\": \"超级桶桶子\",\n        \"ako suminoe\": \"住之江亚香\",\n        \"riko suminoe\": \"住之江理香\",\n        \"keita suminoe\": \"住之江圭太\",\n        \"miharu mikuni\": \"三国美春\",\n        \"agiri goshiki\": \"吴织亚切\",\n        \"sonya\": \"索妮娅\",\n        \"yasuna oribe\": \"折部安奈\",\n        \"kyara botsu\": \"无名子\",\n        \"ika musume\": \"乌贼娘\",\n        \"ayumi tokita\": \"常田鲇美\",\n        \"chizuru aizawa\": \"相泽千鹤\",\n        \"cindy campbell\": \"辛迪·坎贝尔\",\n        \"eiko aizawa\": \"相泽荣子\",\n        \"sanae nagatsuki\": \"长月早苗\",\n        \"takeru aizawa\": \"相泽武\",\n        \"kiyomi sakura\": \"纱仓清美\",\n        \"nagisa saitou\": \"齐藤渚\",\n        \"miku hatsune\": \"初音未来\",\n        \"luka megurine\": \"巡音流歌\",\n        \"len kagamine\": \"镜音连\",\n        \"rin kagamine\": \"镜音铃\",\n        \"haku yowane\": \"弱音白\",\n        \"gumi\": \"GUMI\",\n        \"akari kizuna\": \"绁星灯\",\n        \"yukari yuzuki\": \"结月缘\",\n        \"maki tsurumaki\": \"弦卷真纪\",\n        \"akane kotonoha\": \"琴叶茜\",\n        \"aoi kotonoha\": \"琴叶葵\",\n        \"zunko tohoku\": \"东北俊子\",\n        \"tsudumi suzuki\": \"铃木梓梓弥\",\n        \"sorata kanda\": \"神田空太\",\n        \"mashiro shiina\": \"椎名真白\",\n        \"nanami aoyama\": \"青山七海\",\n        \"misaki kamiigusa\": \"上井草美咲\",\n        \"chihiro sengoku\": \"千石千寻\",\n        \"ryuuji takasu\": \"高须龙儿\",\n        \"taiga aisaka\": \"逢坂大河\",\n        \"minori kushieda\": \"栉枝实乃梨\",\n        \"ami kawashima\": \"川岛亚美\",\n        \"yasuko takasu\": \"高须泰子\",\n        \"maya kihara\": \"木原麻耶\",\n        \"nanako kashii\": \"香椎奈奈子\",\n        \"yuri koigakubo\": \"恋洼百合\",\n        \"yuusaku kitamura\": \"北村佑作\",\n        \"sakura kanou\": \"狩野樱\",\n        \"sumire kanou\": \"狩野堇\",\n        \"akito himenokouji\": \"姬小路秋人\",\n        \"akiko himenokouji\": \"姬小路秋子\",\n        \"anastasia nasuhara\": \"那须原安娜史塔希亚\",\n        \"ginbei haruomi sawatari\": \"猿渡银兵卫春臣\",\n        \"arashi nikaidou\": \"二阶堂岚\",\n        \"arisa takanomiya\": \"鹰乃宫亚里沙\",\n        \"origami tobiichi\": \"鸢一折纸\",\n        \"kurumi tokisaki\": \"时崎狂三\",\n        \"yoshino himekawa\": \"冰芽川四糸乃\",\n        \"kotori itsuka\": \"五河琴里\",\n        \"kaguya yamai\": \"八舞耶俱矢\",\n        \"yuzuru yamai\": \"八舞夕弦\",\n        \"miku izayoi\": \"诱宵美九\",\n        \"tohka yatogami\": \"夜刀神十香\",\n        \"shido itsuka\": \"五河士道\",\n        \"reine murasame\": \"村雨令音\",\n        \"mayuka kondou\": \"近藤茧佳\",\n        \"nao takanashi\": \"高梨奈绪\",\n        \"iroha tsuchiura\": \"土浦彩叶\",\n        \"nyaruko\": \"奈亚子\",\n        \"cthugha\": \"克图格亚\",\n        \"mahiro yasaka\": \"八坂真寻\",\n        \"hastur\": \"哈斯太\",\n        \"konoe tsuruma\": \"鹤真心乃枝\",\n        \"miyabi kannagi\": \"神凪雅\",\n        \"himeko inaba\": \"稻叶姬子\",\n        \"iori nagase\": \"永濑伊织\",\n        \"taichi yaegashi\": \"八重㭴太一\",\n        \"yui kiriyama\": \"桐山唯\",\n        \"yoshifumi aoki\": \"青木义文\",\n        \"raku ichijou\": \"一条乐\",\n        \"kosaki onodera\": \"小野寺小咲\",\n        \"haru onodera\": \"小野寺春\",\n        \"yui kanakura\": \"奏仓羽\",\n        \"marika tachibana\": \"橘万里花\",\n        \"chitoge kirisaki\": \"桐崎千棘\",\n        \"seishirou tsugumi\": \"鸫诚士郎\",\n        \"ruri miyamoto\": \"宫本琉璃\",\n        \"fumino serizawa\": \"芹泽文乃\",\n        \"nozomi kiriya\": \"雾谷希\",\n        \"chise umenomori\": \"梅之森千世\",\n        \"otome tsuzuki\": \"都筑乙女\",\n        \"touma kamijou\": \"上条当麻\",\n        \"mikoto misaka\": \"御坂美琴\",\n        \"misuzu misaka\": \"御坂美铃\",\n        \"aisa himegami\": \"姬神秋沙\",\n        \"mii konori\": \"固法美伟\",\n        \"seiri fukiyose\": \"吹寄制理\",\n        \"kaori kanzaki\": \"神裂火织\",\n        \"komoe tsukuyomi\": \"月咏小萌\",\n        \"misaka-imouto\": \"御坂妹妹\",\n        \"last order\": \"最后之作\",\n        \"index librorum prohibitorum\": \"茵蒂克丝\",\n        \"kuroko shirai\": \"白井黑子\",\n        \"misaki shokuhou\": \"食蜂操祈\",\n        \"mitsuko kongou\": \"婚后光子\",\n        \"kinuho wannai\": \"湾内绢保\",\n        \"maaya awatsuki\": \"泡浮万彬\",\n        \"aiho yomikawa\": \"黄泉川爱穗\",\n        \"tsuzuri tessou\": \"铁装缀里\",\n        \"maika tsuchimikado\": \"土御门舞夏\",\n        \"erii haruue\": \"春上衿衣\",\n        \"ruiko saten\": \"佐天泪子\",\n        \"kazari uiharu\": \"初春饰利\",\n        \"accelerator\": \"一方通行\",\n        \"oriana thomson\": \"欧莉安娜·汤姆森\",\n        \"shizuri mugino\": \"麦野沉利\",\n        \"rikou takitsubo\": \"泷壶理后\",\n        \"saiai kinuhata\": \"绢旗最爱\",\n        \"frenda seivelun\": \"芙兰达·塞维伦\",\n        \"shiage hamazura\": \"滨面仕上\",\n        \"hyouka kazakiri\": \"风斩冰华\",\n        \"harumi kiyama\": \"木山春生\",\n        \"motoharu tsuchimikado\": \"土御门元春\",\n        \"itsuwa\": \"五和\",\n        \"lucia\": \"露琪亚\",\n        \"agnese sanctis\": \"雅妮丝·桑提斯\",\n        \"angelene\": \"安洁莉娜\",\n        \"eiga kanmi\": \"甘味荣华\",\n        \"febrie\": \"菲布理\",\n        \"janie\": \"珍妮\",\n        \"shinobu nunotaba\": \"布束砥信\",\n        \"yumi kusakabe\": \"草壁优美\",\n        \"eru chitanda\": \"千反田爱瑠\",\n        \"houtarou oreki\": \"折木奉太郎\",\n        \"mayaka ibara\": \"伊原摩耶花\",\n        \"fuyumi irisu\": \"入须冬实\",\n        \"satoshi fukube\": \"福部里志\",\n        \"ayako kouchi\": \"河内亚也子\",\n        \"mitsuha miyamizu\": \"宫水三叶\",\n        \"yotsuha miyamizu\": \"宫水四叶\",\n        \"miki okudera\": \"奥寺美纪\",\n        \"taki tachibana\": \"立花泷\",\n        \"akihisa yoshii\": \"吉井明久\",\n        \"akira yoshii\": \"吉井玲\",\n        \"hideyoshi kinoshita\": \"木下秀吉\",\n        \"yuuko kinoshita\": \"木下优子\",\n        \"mizuki himeji\": \"姬路瑞希\",\n        \"minami shimada\": \"岛田美波\",\n        \"hazuki shimada\": \"岛田叶月\",\n        \"yuuji sakamoto\": \"坂本雄二\",\n        \"shouko kirishima\": \"雾岛翔子\",\n        \"aiko kudou\": \"工藤爱子\",\n        \"miharu shimizu\": \"清水美春\",\n        \"judy hopps\": \"兔朱迪\",\n        \"nick wilde\": \"狐尼克\",\n        \"jack savage\": \"野蛮杰克\",\n        \"chief bogo\": \"蛮牛局长\",\n        \"bonnie hopps\": \"兔邦妮\",\n        \"nagi\": \"薙\",\n        \"zange\": \"忏悔\",\n        \"jin mikuriya\": \"御厨仁\",\n        \"tsugumi aoba\": \"青叶鸫\",\n        \"shino ookouchi\": \"大河内紫乃\",\n        \"takako kimura\": \"木村贵子\",\n        \"kochou yoshida\": \"良田胡蝶\",\n        \"minori nakazawa\": \"中泽农\",\n        \"ringo kinoshita\": \"木下林檎\",\n        \"natsumi bekki\": \"户次菜摘\",\n        \"sora takanashi\": \"小鸟游空\",\n        \"miu takanashi\": \"小鸟游美羽\",\n        \"hina takanashi\": \"小鸟游雏\",\n        \"yuuta segawa\": \"濑川佑太\",\n        \"raika oda\": \"织田莱香\",\n        \"miia\": \"米亚\",\n        \"centorea shianus\": \"珊卓蕾亚·夏努斯\",\n        \"papi\": \"帕皮\",\n        \"suu\": \"丝\",\n        \"lala\": \"拉拉\",\n        \"rachnera arachnera\": \"拉克涅拉·阿拉克涅拉\",\n        \"manako\": \"真奈子\",\n        \"meroune lorelei\": \"美洛努·罗雷莱\",\n        \"tionishia\": \"提欧尼西亚\",\n        \"cathyl\": \"卡特尔\",\n        \"kimihito kurusu\": \"来留主公人\",\n        \"yuuki oojima\": \"大岛裕树\",\n        \"satsuki shinonome\": \"东云皋月\",\n        \"miho nishizumi\": \"西住美穗\",\n        \"saori takebe\": \"武部沙织\",\n        \"hana isuzu\": \"五十铃华\",\n        \"yukari akiyama\": \"秋山优花里\",\n        \"mako reizei\": \"冷泉麻子\",\n        \"anzu kadotani\": \"角谷杏\",\n        \"yuzu koyama\": \"小山柚子\",\n        \"momo kawashima\": \"河岛桃\",\n        \"noriko isobe\": \"矶边典子\",\n        \"taeko kondou\": \"近藤妙子\",\n        \"shinobu kawanishi\": \"河西忍\",\n        \"akebi sasaki\": \"佐佐木明日\",\n        \"azusa sawa\": \"泽梓\",\n        \"yuuki utsugi\": \"宇津木优季\",\n        \"saki maruyama\": \"丸山纱希\",\n        \"midoriko sono\": \"园绿子\",\n        \"darjeeling\": \"大吉岭\",\n        \"assam\": \"阿萨姆\",\n        \"orange pekoe\": \"橙黄白毫\",\n        \"rosehip\": \"蔷薇果\",\n        \"rukuriri\": \"鲁克莉莉\",\n        \"kay\": \"凯伊\",\n        \"chiyomi anzai\": \"安斋千代美\",\n        \"carpaccio\": \"卡尔帕乔\",\n        \"pepperoni\": \"佩帕罗妮\",\n        \"katyusha\": \"喀秋莎\",\n        \"nonna\": \"农娜\",\n        \"maho nishizumi\": \"西住真穗\",\n        \"erika itsumi\": \"逸见艾丽卡\",\n        \"mika\": \"米卡\",\n        \"aki\": \"阿基\",\n        \"mikko\": \"米科\",\n        \"kinuyo nishi\": \"西绢代\",\n        \"arisu shimada\": \"岛田爱里寿\",\n        \"azumi\": \"杏美\",\n        \"ami chouno\": \"蝶野亚美\",\n        \"rena andou\": \"安藤丽奈\",\n        \"ruka oshida\": \"押田流歌\",\n        \"murakami\": \"村上\",\n        \"yuri isuzu\": \"五十铃百合\",\n        \"shiho nishizumi\": \"西住志穗\",\n        \"yoshiko akiyama\": \"秋山好子\",\n        \"chiyo shimada\": \"岛田千代\",\n        \"a2\": \"A型二号\",\n        \"2b\": \"二号B型\",\n        \"9s\": \"九号S型\",\n        \"megumi noda\": \"野田惠\",\n        \"shinichi chiaki\": \"千秋真一\",\n        \"saki miyanaga\": \"宫永咲\",\n        \"nodoka haramura\": \"原村和\",\n        \"yuuki kataoka\": \"片冈优希\",\n        \"mako someya\": \"染谷真子\",\n        \"hisa takei\": \"竹井久\",\n        \"kyoutarou suga\": \"须贺京太郎\",\n        \"touka ryuumonbuchi\": \"龙门渊透华\",\n        \"hajime kunihiro\": \"国广一\",\n        \"koromo amae\": \"天江衣\",\n        \"mihoko fukuji\": \"福路美穗子\",\n        \"kana ikeda\": \"池田华菜\",\n        \"miharu yoshitome\": \"吉留未春\",\n        \"sumiyo fukabori\": \"深堀纯代\",\n        \"yumi kajiki\": \"加治木由美\",\n        \"momoko touyoko\": \"东横桃子\",\n        \"satomi kanbara\": \"蒲原智美\",\n        \"shizuno takakamo\": \"高鸭稳乃\",\n        \"ako atarashi\": \"新子憧\",\n        \"kuro matsumi\": \"松实玄\",\n        \"yuu matsumi\": \"松实宥\",\n        \"arata sagimori\": \"鹭森灼\",\n        \"harue akado\": \"赤土晴绘\",\n        \"teru miyanaga\": \"宫永照\",\n        \"sumire hirose\": \"弘世堇\",\n        \"awai oohoshi\": \"大星淡\",\n        \"yuuko mase\": \"真濑由子\",\n        \"hiroe atago\": \"爱宕洋榎\",\n        \"kinue atago\": \"爱宕绢惠\",\n        \"kyouko suehara\": \"末原恭子\",\n        \"toki onjouji\": \"园城寺怜\",\n        \"ryuuka shimizudani\": \"清水谷龙华\",\n        \"sera eguchi\": \"江口夕\",\n        \"hiroko funakubo\": \"船久保浩子\",\n        \"izumi nijou\": \"二条泉\",\n        \"komaki jindai\": \"神代小莳\",\n        \"tomoe karijuku\": \"狩宿巴\",\n        \"haru takimi\": \"泷见春\",\n        \"hatsumi usuzumi\": \"薄墨初美\",\n        \"kasumi iwato\": \"石户霞\",\n        \"shiromi kosegawa\": \"小濑川白望\",\n        \"aislinn wishart\": \"爱丝琳·威夏尔特\",\n        \"sae usuzawa\": \"臼泽塞\",\n        \"mairu shirouzu\": \"白水哩\",\n        \"himeko tsuruta\": \"鹤田姬子\",\n        \"yukiko maya\": \"真屋由晖子\",\n        \"yoshiko kainou\": \"戒能良子\",\n        \"kaban\": \"背包\",\n        \"serval\": \"薮猫\",\n        \"common raccoon\": \"浣熊\",\n        \"fennec\": \"耳廓狐\",\n        \"ezo red fox\": \"北狐\",\n        \"silver fox\": \"银狐\",\n        \"moose\": \"驼鹿\",\n        \"shoebill\": \"鲸头鹳\",\n        \"alpaca suri\": \"苏利羊驼\",\n        \"humboldt penguin\": \"汉波德企鹅\",\n        \"emperor penguin\": \"帝企鹅\",\n        \"royal penguin\": \"皇家企鹅\",\n        \"margay\": \"长尾虎猫\",\n        \"black leopard\": \"黑豹\",\n        \"leopard\": \"豹\",\n        \"south african giraffe\": \"南非长颈鹿\",\n        \"sabre tiger\": \"剑齿虎\",\n        \"japanese crested ibis\": \"朱鹮\",\n        \"sora kasugano\": \"春日野穹\",\n        \"haruka kasugano\": \"春日野悠\",\n        \"juliet starling\": \"朱丽叶·斯塔林\",\n        \"shinichi kudo\": \"工藤新一\",\n        \"ran mouri\": \"毛利兰\",\n        \"conan edogawa\": \"江户川柯南\",\n        \"ai haibara\": \"灰原哀\",\n        \"ayumi yoshida\": \"吉田步美\",\n        \"kazuha toyama\": \"远山和叶\",\n        \"heiji hattori\": \"服部平次\",\n        \"kaito kuroba\": \"黑羽快斗\",\n        \"kogoro mouri\": \"毛利小五郎\",\n        \"rei furuya\": \"降谷零\",\n        \"shuuichi akai\": \"赤井秀一\",\n        \"sonoko suzuki\": \"铃木园子\",\n        \"eri kisaki\": \"妃英理\",\n        \"jodie starling\": \"茱蒂·斯泰琳\",\n        \"miwako sato\": \"佐藤美和子\",\n        \"masumi sera\": \"世良真纯\",\n        \"yamcha\": \"雅木茶\",\n        \"bulma briefs\": \"布尔玛\",\n        \"chi chi\": \"琪琪\",\n        \"son gohan\": \"孙悟饭\",\n        \"son goten\": \"孙悟天\",\n        \"android 16\": \"人造人16号\",\n        \"android 18\": \"人造人18号\",\n        \"android 21\": \"人造人21号\",\n        \"videl\": \"比迪丽\",\n        \"son goku\": \"孙悟空\",\n        \"spopovich\": \"斯波比奇\",\n        \"vegeta\": \"贝吉塔\",\n        \"trunks briefs\": \"特兰克斯\",\n        \"piccolo\": \"比克\",\n        \"goku black\": \"黑悟空\",\n        \"broly\": \"布罗利\",\n        \"erasa\": \"伊蕾莎\",\n        \"majin buu\": \"魔人布欧\",\n        \"master roshi\": \"武天老师\",\n        \"oolong\": \"乌龙\",\n        \"ranfan\": \"兰芳\",\n        \"lunch\": \"兰琪\",\n        \"panchy brief\": \"布里夫太太\",\n        \"kuro kagami\": \"镜黑\",\n        \"mimi usa\": \"宇佐美美\",\n        \"rin kokonoe\": \"九重凛\",\n        \"daisuke aoki\": \"青木大介\",\n        \"hestia\": \"赫斯缇雅\",\n        \"bell cranel\": \"贝尔·克朗尼\",\n        \"tiona hiryute\": \"蒂奥娜·席吕特\",\n        \"tione hiryute\": \"蒂奥涅·席吕特\",\n        \"aiz wallenstein\": \"艾丝·华伦斯坦\",\n        \"eina tulle\": \"埃伊娜·祖尔\",\n        \"freya\": \"芙蕾雅\",\n        \"hephaistos\": \"赫菲斯托丝\",\n        \"liliruca arde\": \"莉莉露卡·厄德\",\n        \"ryuu lion\": \"琉·璃昂\",\n        \"loki\": \"洛基\",\n        \"syr flova\": \"希儿·福罗瓦\",\n        \"homura akemi\": \"晓美焰\",\n        \"madoka kaname\": \"鹿目圆\",\n        \"mami tomoe\": \"巴麻美\",\n        \"sayaka miki\": \"美树沙耶香\",\n        \"kyouko sakura\": \"佐仓杏子\",\n        \"nagisa momoe\": \"百江渚\",\n        \"kaede akino\": \"秋野枫\",\n        \"rena minami\": \"水波玲奈\",\n        \"yachiyo nanami\": \"七海八千代\",\n        \"iroha tamaki\": \"环彩羽\",\n        \"kyubey\": \"丘比\",\n        \"kyousuke kamijou\": \"上条恭介\",\n        \"danua\": \"达奴娅\",\n        \"djeeta\": \"姬塔\",\n        \"eugen\": \"欧根\",\n        \"gran\": \"格兰\",\n        \"io\": \"伊欧\",\n        \"lyria\": \"露莉亚\",\n        \"katalina\": \"卡塔莉娜\",\n        \"narmaya\": \"娜尔梅亚\",\n        \"rosetta\": \"萝赛塔\",\n        \"sturm\": \"斯特姆\",\n        \"vira\": \"维拉\",\n        \"vampy\": \"斑比\",\n        \"sakura kinomoto\": \"木之本樱\",\n        \"touya kinomoto\": \"木之本桃矢\",\n        \"yukito tsukishiro\": \"月城雪兔\",\n        \"tomoyo daidouji\": \"大道寺知世\",\n        \"sonomi daidouji\": \"大道寺园美\",\n        \"syaoran li\": \"李小狼\",\n        \"meiling li\": \"李苺铃\",\n        \"rika sasaki\": \"佐佐木利佳\",\n        \"chiharu mihara\": \"三原千春\",\n        \"naoko yanagisawa\": \"柳泽奈绪子\",\n        \"ruby rose\": \"露比·罗丝\",\n        \"weiss schnee\": \"魏丝·雪倪\",\n        \"blake belladonna\": \"布蕾克·贝拉多娜\",\n        \"yang xiao long\": \"阳小龙\",\n        \"erika chiba\": \"千叶艾莉卡\",\n        \"haruka ono\": \"小野遥\",\n        \"honoka mitsui\": \"光井穗香\",\n        \"mari watanabe\": \"渡边摩利\",\n        \"mayumi saegusa\": \"七草真由美\",\n        \"miyuki shiba\": \"司波深雪\",\n        \"mizuki shibata\": \"柴田美月\",\n        \"sayaka mibu\": \"壬生纱耶香\",\n        \"shizuku kitayama\": \"北山雫\",\n        \"suzune ichihara\": \"市原铃音\",\n        \"tatsuya shiba\": \"司波达也\",\n        \"saber\": \"Saber\",\n        \"archer\": \"Archer\",\n        \"lancer\": \"Lancer\",\n        \"caster\": \"Caster\",\n        \"berserker\": \"Berserker\",\n        \"assassin\": \"Assassin\",\n        \"shirou emiya\": \"卫宫士郎\",\n        \"rin tosaka\": \"远坂凛\",\n        \"kirei kotomine\": \"言峰绮礼\",\n        \"sakura matou\": \"间桐樱\",\n        \"shinji matou\": \"间桐慎二\",\n        \"illyasviel von einzbern\": \"伊莉雅丝菲尔·冯·爱因兹贝伦\",\n        \"saber alter\": \"Saber Alter\",\n        \"taiga fujimura\": \"藤村大河\",\n        \"gilgamesh\": \"吉尔伽美什\",\n        \"diarmuid ua duibhne\": \"迪尔姆德·奥迪那\",\n        \"iskandar\": \"伊斯坎达尔\",\n        \"gilles de rais\": \"吉尔·德·莱斯\",\n        \"lancelot\": \"兰斯洛特\",\n        \"kiritsugu emiya\": \"卫宫切嗣\",\n        \"tokiomi tohsaka\": \"远坂时臣\",\n        \"waver velvet\": \"韦伯·维尔维特\",\n        \"ryuunosuke uryuu\": \"雨生龙之介\",\n        \"kariya matou\": \"间桐雁夜\",\n        \"irisviel von einzbern\": \"爱丽丝菲尔·冯·爱因兹贝伦\",\n        \"caren ortensia\": \"卡莲·奥尔黛西亚\",\n        \"bazett fraga mcremitz\": \"巴洁特·法迦·克米兹\",\n        \"sitonai\": \"志度内\",\n        \"ishtar\": \"伊什塔尔\",\n        \"tamamo no mae\": \"玉藻前\",\n        \"shielder\": \"玛修·基列莱特\",\n        \"saber lily\": \"Saber Lily\",\n        \"artoria pendragon\": \"阿尔托莉雅·潘德拉贡\",\n        \"artoria pendragon alter\": \"阿尔托莉雅·潘德拉贡Alter\",\n        \"souji okita\": \"冲田总司\",\n        \"red saber\": \"尼禄·克劳狄乌斯\",\n        \"ayako mitsuzuri\": \"美缀绫子\",\n        \"kane himuro\": \"冰室钟\",\n        \"kaede makidera\": \"莳寺枫\",\n        \"gudao\": \"咕哒男\",\n        \"gudako\": \"咕哒子\",\n        \"kiyohime\": \"清姬\",\n        \"alexander\": \"亚历山大\",\n        \"scathach\": \"斯卡哈\",\n        \"asterios\": \"阿斯忒里俄斯\",\n        \"orion\": \"俄里翁\",\n        \"artemis\": \"阿耳忒弥斯\",\n        \"altera\": \"阿蒂拉\",\n        \"boudica\": \"布狄卡\",\n        \"mysterious heroine x\": \"谜之女主角X\",\n        \"mysterious heroine x alter\": \"谜之女主角X Alter\",\n        \"olga marie animusphere\": \"奥尔加玛丽·阿尼姆斯菲亚\",\n        \"paul bunyan\": \"保罗·班扬\",\n        \"kiara sessyoin\": \"杀生院祈荒\",\n        \"astolfo\": \"阿斯托尔福（阿福）\",\n        \"protagonist\": \"主人公\",\n        \"minamoto no raikou\": \"源赖光\",\n        \"meltryllis\": \"溶解莉莉丝\",\n        \"passionlip\": \"帕森莉普（热情迷唇）\",\n        \"ushiwakamaru\": \"牛若丸\",\n        \"jack the ripper\": \"开膛手杰克\",\n        \"jeanne alter\": \"贞德Alter\",\n        \"nitocris\": \"尼托克丽丝\",\n        \"alice kuonji\": \"久远寺有珠\",\n        \"aoko aozaki\": \"苍崎青子\",\n        \"touko aozaki\": \"苍崎橙子\",\n        \"leysritt\": \"莉洁莉特\",\n        \"chevalier deon\": \"迪昂·德·鲍蒙\",\n        \"nightingale\": \"南丁格尔 | 夜莺\",\n        \"cornelius alba\": \"科尼利厄斯·阿鲁巴\",\n        \"arcueid brunestud\": \"爱尔奎特·布伦史塔德\",\n        \"ciel\": \"希耶尔\",\n        \"circe\": \"喀耳刻\",\n        \"satsuki yumizuka\": \"弓冢五月\",\n        \"shiki tohno\": \"远野志贵\",\n        \"akiha tohno\": \"远野秋叶\",\n        \"kohaku\": \"琥珀\",\n        \"sion eltnam atlasia\": \"紫苑·艾尔特纳姆·阿特拉西亚\",\n        \"dracula\": \"德古拉\",\n        \"francis drake\": \"弗朗西斯·德雷克\",\n        \"elizabeth bathory\": \"伊丽莎白·巴托里\",\n        \"hakuno kishinami\": \"岸波白野（扎比）\",\n        \"hassan of serenity\": \"静谧之哈桑\",\n        \"medb\": \"梅芙\",\n        \"len\": \"莲\",\n        \"celenike icecolle yggdmillennia\": \"赛蕾妮可·艾斯科·千界树\",\n        \"fiore forvedge yggdmillennia\": \"菲奥蕾·弗尔维吉·千界树\",\n        \"chiron\": \"喀戎\",\n        \"achilles\": \"阿喀琉斯\",\n        \"atalanta\": \"阿塔兰忒\",\n        \"kairi sisigou\": \"狮子劫界离\",\n        \"miyako arima\": \"有间都古\",\n        \"chloe von einzbern\": \"克洛伊·冯·爱因兹贝伦（小黑）\",\n        \"luviagelita edelfelt\": \"露维亚瑟琳塔·艾德费尔特\",\n        \"miyu edelfelt\": \"美游·艾德费尔特\",\n        \"sella\": \"塞拉\",\n        \"euryale\": \"尤瑞艾莉（二姐）\",\n        \"shiki ryougi\": \"两仪式\",\n        \"stheno\": \"斯忒诺\",\n        \"mordred pendragon\": \"莫德雷德·潘德拉贡\",\n        \"queen of sheba\": \"示巴女王\",\n        \"wu zetian\": \"武则天\",\n        \"abigail williams\": \"阿比盖尔·威廉姆斯\",\n        \"hans christian andersen\": \"汉斯·克里斯蒂安·安徒生\",\n        \"hector\": \"赫克特\",\n        \"mochizuki chiyome\": \"望月千代女\",\n        \"osakabehime\": \"刑部姬\",\n        \"sakata kintoki\": \"坂田金时\",\n        \"scheherazade\": \"山鲁佐德\",\n        \"suzuka gozen\": \"铃鹿御前\",\n        \"tomoe gozen\": \"巴御前\",\n        \"xuanzang\": \"玄奘\",\n        \"fujino asagami\": \"浅上藤乃\",\n        \"mikiya kokutou\": \"黑桐干也\",\n        \"azaka kokutou\": \"黑桐鲜花\",\n        \"ibaraki douji\": \"茨木童子\",\n        \"anne bonny\": \"安妮·伯妮\",\n        \"mary read\": \"玛莉·瑞德\",\n        \"brynhildr\": \"布伦希尔德\",\n        \"cleopatra\": \"克里奥帕特拉（艳后）\",\n        \"ereshkigal\": \"埃列什基伽勒（艾蕾）\",\n        \"helena blavatsky\": \"海伦娜·布拉瓦茨基\",\n        \"leonardo da vinci\": \"莱昂纳多·达·芬奇\",\n        \"marie antoinette\": \"玛丽·安托瓦内特（蛋糕）\",\n        \"mata hari\": \"玛塔哈丽（舞娘）\",\n        \"medusa\": \"美杜莎\",\n        \"musashi miyamoto\": \"宫本武藏\",\n        \"nobunaga oda\": \"织田信长\",\n        \"penthesilea\": \"彭忒西勒亚\",\n        \"semiramis\": \"赛米拉米斯\",\n        \"shuten douji\": \"酒吞童子\",\n        \"tiamat\": \"提亚马特\",\n        \"bb\": \"BB\",\n        \"bradamante\": \"布拉达曼特\",\n        \"nero claudius bride\": \"尼禄·克劳狄乌斯〔新娘〕\",\n        \"chacha\": \"恰恰 | 茶茶\",\n        \"lavinia whateley\": \"拉薇妮亚·沃特雷\",\n        \"artoria pendragon rider alter\": \"阿尔托莉雅·潘德拉贡〔Alter〕\",\n        \"katsushika hokusai\": \"葛饰北斋（阿荣）\",\n        \"saint martha\": \"玛尔达\",\n        \"murasaki shikibu\": \"紫式部\",\n        \"kazuto kirigaya\": \"桐谷和人（桐人）\",\n        \"asuna yuuki\": \"结城明日奈（亚丝娜）\",\n        \"sachi\": \"幸\",\n        \"keiko ayano\": \"绫野珪子（西莉卡）\",\n        \"rika shinozaki\": \"筱崎里香（莉兹贝特）\",\n        \"rosalia\": \"罗莎莉雅\",\n        \"sasha\": \"纱夏\",\n        \"yolko\": \"夜子\",\n        \"suguha kirigaya\": \"桐谷直叶\",\n        \"lyfa\": \"莉法\",\n        \"shino asada\": \"朝田诗乃（诗乃）\",\n        \"yuuki konno\": \"绀野木棉季（有纪）\",\n        \"nagata shinichi\": \"长田伸一（雷根）\",\n        \"alicia rue\": \"亚丽莎·露\",\n        \"sakuya\": \"朔夜\",\n        \"kuroyukihime\": \"黑雪姬\",\n        \"haruyuki arita\": \"有田春雪\",\n        \"yuniko kouzuki\": \"上月由仁子\",\n        \"chiyuri kurashima\": \"仓岛千百合\",\n        \"akira himi\": \"冰见晶\",\n        \"fuuko kurasaki\": \"仓崎枫子\",\n        \"takumu mayuzumi\": \"黛拓武\",\n        \"nanoha takamachi\": \"高町奈叶\",\n        \"fate testarossa\": \"菲特·泰斯特罗莎\",\n        \"einhart stratos\": \"艾茵哈特·斯崔特斯\",\n        \"rinne berlinetta\": \"凛音·贝利内塔\",\n        \"vivio takamachi\": \"高町薇薇欧\",\n        \"yuuno scrya\": \"尤诺·斯克莱亚\",\n        \"amy limietta\": \"艾蜜·莉米艾特\",\n        \"erio mondial\": \"艾力奥·曼迪尔\",\n        \"hayate yagami\": \"八神疾风\",\n        \"shamal\": \"莎玛尔\",\n        \"signum\": \"希格纳姆\",\n        \"vita\": \"维塔\",\n        \"reinforce\": \"琳芙斯\",\n        \"fuka reventon\": \"风香·雷文顿\",\n        \"corona timil\": \"珂罗娜·缇米尔\",\n        \"aruf\": \"艾尔芙\",\n        \"zafira\": \"扎斐拉\",\n        \"alisa bannings\": \"爱丽莎·巴尼斯\",\n        \"kyrie florian\": \"琦莉耶·弗洛利安\",\n        \"amitie florian\": \"阿米蒂埃·弗洛利安\",\n        \"precia testarossa\": \"普蕾茜亚·泰斯特罗莎\",\n        \"alicia testarossa\": \"阿丽西亚·泰斯塔罗莎\",\n        \"lindy harlaown\": \"琳蒂·哈拉温\",\n        \"chrono harlaown\": \"克洛诺·哈洛温\",\n        \"caro ru lushe\": \"凯珞·露·露茜\",\n        \"ginga nakajima\": \"银河·中岛\",\n        \"subaru nakajima\": \"昴·中岛\",\n        \"suzuka tsukimura\": \"月村铃鹿\",\n        \"teana lanster\": \"蒂安娜·兰斯达\",\n        \"lutecia alpine\": \"璐缇希雅·阿尔菲诺\",\n        \"uno\": \"乌诺\",\n        \"due\": \"都艾\",\n        \"cinque\": \"琴柯\",\n        \"sein\": \"萨依\",\n        \"sette\": \"塞缇\",\n        \"nove\": \"诺威\",\n        \"dieci\": \"迪艾琦\",\n        \"wendi\": \"温蒂\",\n        \"deed\": \"蒂多\",\n        \"kazuma asougi\": \"亚双义一真\",\n        \"ryuunosuke naruhodou\": \"成步堂龙之介\",\n        \"phoenix wright\": \"成步堂龙一\",\n        \"trucy wright\": \"成步堂美贯\",\n        \"apollo justice\": \"王泥喜法介\",\n        \"maya fey\": \"绫里真宵\",\n        \"mia fey\": \"绫里千寻\",\n        \"pearl fey\": \"绫里春美\",\n        \"athena cykes\": \"希月心音\",\n        \"dick gumshoe\": \"糸锯圭介\",\n        \"ema skye\": \"宝月茜\",\n        \"franziska von karma\": \"狩魔冥\",\n        \"miles edgeworth\": \"御剑怜侍\",\n        \"kristoph gavin\": \"牙琉雾人\",\n        \"klavier gavin\": \"牙琉响也\",\n        \"adrian andrews\": \"华宫雾绪\",\n        \"kay faraday\": \"一条美云\",\n        \"sherlock holmes\": \"夏洛克·福尔摩斯\",\n        \"haruhi suzumiya\": \"凉宫春日\",\n        \"kyon\": \"阿虚\",\n        \"kyon no imouto\": \"虚妹\",\n        \"emiri kimidori\": \"喜绿江美里\",\n        \"mikuru asahina\": \"朝比奈实玖瑠\",\n        \"ryoko asakura\": \"朝仓凉子\",\n        \"tsuruya\": \"鹤屋\",\n        \"yuki nagato\": \"长门有希\",\n        \"itsuki koizumi\": \"古泉一树\",\n        \"kunikida\": \"国木田\",\n        \"taniguchi\": \"谷口\",\n        \"akira yukino\": \"雪乃玲\",\n        \"manaka takane\": \"高岭爱花\",\n        \"nene anegasaki\": \"姐崎宁宁\",\n        \"rinko kobayakawa\": \"小早川凛子\",\n        \"mariana prinsilla\": \"玛莉安娜·普林希拉\",\n        \"miu sagara\": \"相良美宇\",\n        \"kanade tachibana\": \"立华奏\",\n        \"yuri nakamura\": \"仲村由理\",\n        \"yuzuru otonashi\": \"音无结弦\",\n        \"hideki hinata\": \"日向秀树\",\n        \"shiina\": \"椎名\",\n        \"hisako\": \"久子\",\n        \"masami iwasawa\": \"岩泽雅美\",\n        \"miyuki irie\": \"入江美雪\",\n        \"shiori sekine\": \"关根诗织\",\n        \"umaru doma\": \"土间埋\",\n        \"taihei doma\": \"土间大平\",\n        \"kirie motoba\": \"本场切绘\",\n        \"nana ebina\": \"海老名菜菜\",\n        \"sylphynford tachibana\": \"橘·希尔芬福特\",\n        \"takeshi motoba\": \"本场猛（崩巴）\",\n        \"asagi igawa\": \"井河阿莎姬\",\n        \"sakura igawa\": \"井河樱\",\n        \"rinko akiyama\": \"秋山凜子\",\n        \"yukikaze mizuki\": \"水城雪风\",\n        \"shiranui mizuki\": \"水城不知火\",\n        \"lucy ... yamagami\": \"山神露西【以下略】\",\n        \"yutaka hasebe\": \"长谷部丰\",\n        \"tomoki sakurai\": \"樱井智树\",\n        \"ikaros\": \"伊卡洛斯\",\n        \"nymph\": \"妮姆芙\",\n        \"astraea\": \"阿斯特蕾亚\",\n        \"chaos\": \"卡奥斯\",\n        \"sohara mitsuki\": \"见月楚原\",\n        \"hiyori kazane\": \"风音日和\",\n        \"mikako satsukitane\": \"五月田根美香子\",\n        \"blossom\": \"花花\",\n        \"bubbles\": \"泡泡\",\n        \"buttercup\": \"毛毛\",\n        \"cure black\": \"黑天使\",\n        \"cure white\": \"白天使\",\n        \"shiny luminous\": \"夏妮露米纳丝\",\n        \"cure bloom\": \"花天使\",\n        \"cure egret\": \"舞天使\",\n        \"michiru kiryuu\": \"雾生满\",\n        \"kaoru kiryuu\": \"雾生薰\",\n        \"cure dream\": \"梦天使\",\n        \"cure rouge\": \"火天使\",\n        \"cure lemonade\": \"柠檬天使\",\n        \"cure mint\": \"薄荷天使\",\n        \"cure aqua\": \"水天使\",\n        \"milky rose\": \"妙奇露丝\",\n        \"cure peach\": \"桃天使\",\n        \"cure berry\": \"莓天使\",\n        \"cure pine\": \"凤梨天使\",\n        \"eas\": \"伊丝\",\n        \"cure passion\": \"百香果天使\",\n        \"cure blossom\": \"花蕾天使\",\n        \"cure marine\": \"海洋天使\",\n        \"cure sunshine\": \"阳光天使\",\n        \"cure moonlight\": \"月光天使\",\n        \"cure flower\": \"花朵天使\",\n        \"cure ange\": \"圣洁天使\",\n        \"cure amour\": \"爱神天使\",\n        \"cure etoile\": \"星辰天使\",\n        \"cure macherie\": \"挚爱天使\",\n        \"kotori nono\": \"野乃小鸟\",\n        \"cure yell\": \"喝采天使\",\n        \"dark precure\": \"暗之美少女\",\n        \"mizuki hanasaki\": \"花咲美月\",\n        \"momoka kurumi\": \"来海桃香\",\n        \"sakura kurumi\": \"来海樱\",\n        \"tsubaki myoudouin\": \"明堂院椿\",\n        \"cure melody\": \"旋律天使\",\n        \"cure rhythm\": \"节奏天使\",\n        \"siren\": \"赛莲\",\n        \"cure beat\": \"节拍天使\",\n        \"cure muse\": \"缪斯天使\",\n        \"maria houjou\": \"北条真理亚\",\n        \"misora minamino\": \"南野美空\",\n        \"cure happy\": \"快乐天使\",\n        \"cure sunny\": \"晴朗天使\",\n        \"cure peace\": \"和平天使\",\n        \"cure march\": \"旋风天使\",\n        \"cure beauty\": \"美丽天使\",\n        \"ikuyo hoshizora\": \"星空育代\",\n        \"masako hino\": \"日野正子\",\n        \"chiharu kise\": \"黄濑千春\",\n        \"tomoko midorikawa\": \"绿川伦子\",\n        \"shizuko aoki\": \"青木静子\",\n        \"wolfrun\": \"狼伦\",\n        \"akaooni\": \"赤鬼\",\n        \"bad end happy\": \"悲剧快乐天使\",\n        \"bad end sunny\": \"悲剧晴朗天使\",\n        \"bad end peace\": \"悲剧和平天使\",\n        \"bad end march\": \"悲剧旋风天使\",\n        \"bad end beauty\": \"悲剧美丽天使\",\n        \"cure heart\": \"爱心天使\",\n        \"cure diamond\": \"钻石天使\",\n        \"cure rosetta\": \"幸运草天使\",\n        \"cure sword\": \"圣剑天使\",\n        \"cure ace\": \"王牌天使\",\n        \"regina\": \"蕾吉娜\",\n        \"ryoko hishikawa\": \"菱川亮子\",\n        \"cure lovely\": \"可爱天使\",\n        \"cure princess\": \"公主天使\",\n        \"cure honey\": \"蜂蜜天使\",\n        \"cure fortune\": \"命运天使\",\n        \"maria hikawa\": \"冰川麻理亚\",\n        \"cure flora\": \"花神天使\",\n        \"cure mermaid\": \"人鱼天使\",\n        \"cure twinkle\": \"闪亮天使\",\n        \"towa akagi\": \"红城永久\",\n        \"cure scarlet\": \"赤红天使\",\n        \"cure miracle\": \"奇迹天使\",\n        \"cure magical\": \"魔法天使\",\n        \"cure felice\": \"幸福天使\",\n        \"cure whip\": \"奶油天使\",\n        \"cure custard\": \"奶黄天使\",\n        \"cure gelato\": \"冰淇淋天使\",\n        \"cure macaron\": \"马卡龙天使\",\n        \"cure chocolat\": \"巧克力天使\",\n        \"cure parfait\": \"芭菲天使\",\n        \"nobue itou\": \"伊藤伸惠\",\n        \"chika itou\": \"伊藤千佳\",\n        \"miu matsuoka\": \"松冈美羽\",\n        \"matsuri sakuragi\": \"樱木茉莉\",\n        \"ana coppola\": \"安娜·柯普拉\",\n        \"izetta\": \"伊泽塔\",\n        \"ortfine fredericka von eylstadt\": \"奥特菲涅·弗雷德里克·冯·埃尔施塔特\",\n        \"bianca\": \"毕安卡\",\n        \"lotte\": \"萝特\",\n        \"koyomi araragi\": \"阿良良木历\",\n        \"karen araragi\": \"阿良良木火怜\",\n        \"tsukihi araragi\": \"阿良良木月火\",\n        \"kiss-shot acerola-orion heart-under-blade\": \"姬丝秀忒·雅赛劳拉莉昂·刃下心\",\n        \"shinobu oshino\": \"忍野忍\",\n        \"ougi oshino\": \"忍野扇\",\n        \"meme oshino\": \"忍野咩咩\",\n        \"nadeko sengoku\": \"千石抚子\",\n        \"hitagi senjougahara\": \"战场原黑仪\",\n        \"tsubasa hanekawa\": \"羽川翼\",\n        \"suruga kanbaru\": \"神原骏河\",\n        \"mayoi hachikuji\": \"八九寺真宵\",\n        \"deishuu kaiki\": \"贝木泥舟\",\n        \"yotsugi ononoki\": \"斧乃木余接\",\n        \"seiya kanie\": \"可儿江西也\",\n        \"isuzu sento\": \"千斗五十铃\",\n        \"latifa fleuranza\": \"拉媞珐·芙尔兰札\",\n        \"salama\": \"萨拉玛\",\n        \"sylphy\": \"西尔菲\",\n        \"muse\": \"缪斯\",\n        \"kobory\": \"柯波莉\",\n        \"eiko adachi\": \"安达映子\",\n        \"soujirou izumi\": \"泉宗次郎\",\n        \"kanata izumi\": \"泉彼方\",\n        \"konata izumi\": \"泉此方\",\n        \"miki hiiragi\": \"柊美纪\",\n        \"kagami hiiragi\": \"柊镜\",\n        \"tsukasa hiiragi\": \"柊司\",\n        \"miyuki takara\": \"高良美幸\",\n        \"misao kusakabe\": \"日下部美纱绪\",\n        \"ayano minegishi\": \"峰岸绫乃\",\n        \"yutaka kobayakawa\": \"小早川优\",\n        \"minami iwasaki\": \"岩崎南\",\n        \"hiyori tamura\": \"田村日和\",\n        \"patricia martin\": \"帕特莉西亚‧马汀\",\n        \"izumi wakase\": \"若濑和泉\",\n        \"hikaru sakuraba\": \"樱庭光\",\n        \"fuyuki amahara\": \"天原冬纪\",\n        \"yukari takara\": \"高良由香里\",\n        \"subaru hasegawa\": \"长谷川昴\",\n        \"tomoka minato\": \"凑智花\",\n        \"maho misawa\": \"三泽真帆\",\n        \"saki nagatsuka\": \"永冢纱季\",\n        \"hinata hakamada\": \"袴田日向\",\n        \"airi kashii\": \"香椎爱莉\",\n        \"mimi balguerie\": \"米米·巴尔格里\",\n        \"kagetsu hakamada\": \"袴田花月\",\n        \"tsubaki takenaka\": \"竹中椿\",\n        \"hiiragi takenaka\": \"竹中柊\",\n        \"aoi ogiyama\": \"荻山葵\",\n        \"masami fujii\": \"藤井雅美\",\n        \"natsuhi takenaka\": \"竹中夏阳\",\n        \"mihoshi takamura\": \"篁美星\",\n        \"hijiri kuina\": \"久井奈圣\",\n        \"kaori minato\": \"凑花织\",\n        \"nayu hasegawa\": \"长谷川七夕\",\n        \"kamui\": \"卡姆依\",\n        \"takumi\": \"拓海\",\n        \"charlotte\": \"夏洛特 | 夏洛蒂\",\n        \"ryoma\": \"龙马\",\n        \"orochi\": \"远吕智\",\n        \"elise\": \"爱丽丝\",\n        \"flannel\": \"弗拉内尔\",\n        \"camilla\": \"卡米拉\",\n        \"felicia\": \"菲莉西亚\",\n        \"effie\": \"艾尔菲\",\n        \"flora\": \"芙洛拉\",\n        \"hinoka\": \"日乃香\",\n        \"tharja\": \"萨利娅\",\n        \"sakura\": \"樱\",\n        \"joker\": \"小丑\",\n        \"rinkah\": \"燐火\",\n        \"tiki\": \"芝琪\",\n        \"caeda\": \"希妲\",\n        \"catria\": \"卡秋娅\",\n        \"cordelia\": \"缇亚莫\",\n        \"lyndis\": \"琳蒂斯\",\n        \"nowi\": \"诺诺\",\n        \"tuxedo mask\": \"大礼服假面\",\n        \"sailor moon\": \"水手月亮\",\n        \"sailor chibi moon\": \"水手小月亮\",\n        \"sailor mercury\": \"水手水星\",\n        \"sailor mars\": \"水手火星\",\n        \"sailor jupiter\": \"水手木星\",\n        \"sailor venus\": \"水手金星\",\n        \"sailor saturn\": \"水手土星\",\n        \"sailor neptune\": \"水手海王星\",\n        \"sailor uranus\": \"水手天王星\",\n        \"sailor pluto\": \"水手冥王星\",\n        \"kenji tsukino\": \"月野谦之\",\n        \"ikuko tsukino\": \"月野育子\",\n        \"shingo tsukino\": \"月野进悟\",\n        \"naru osaka\": \"大阪奈留\",\n        \"gurio umino\": \"海野栗雄\",\n        \"motoki furuhata\": \"古幡元基\",\n        \"yuuichirou kumada\": \"熊田雄一郎\",\n        \"cammy white\": \"嘉米·怀特\",\n        \"chun-li\": \"春丽\",\n        \"rainbow mika\": \"七川美华\",\n        \"juri han\": \"韩蛛俐\",\n        \"karin kanzuki\": \"神月卡琳\",\n        \"menat\": \"米纳特\",\n        \"kolin\": \"科琳\",\n        \"sakura kasugano\": \"春日野樱\",\n        \"nanase mizugami\": \"水神七濑\",\n        \"zangief\": \"桑吉尔夫\",\n        \"balrog\": \"巴洛克\",\n        \"akuma\": \"豪鬼\",\n        \"blanka\": \"布兰卡\",\n        \"edmond honda\": \"埃德蒙·本田\",\n        \"guile\": \"古烈\",\n        \"ken masters\": \"肯·马斯达斯\",\n        \"ryu\": \"隆\",\n        \"sagat\": \"沙盖特\",\n        \"urien\": \"尤里安\",\n        \"vega\": \"维加\",\n        \"m. bison\": \"拜森\",\n        \"ingrid\": \"英格丽德\",\n        \"laura matsuda\": \"萝拉·松田\",\n        \"sean matsuda\": \"肖恩·松田\",\n        \"popuko\": \"POP子\",\n        \"pipimi\": \"PIPI美\",\n        \"haruka takayama\": \"高山春香\",\n        \"yuu sonoda\": \"园田优\",\n        \"mitsuki sonoda\": \"园田美月\",\n        \"kotone noda\": \"野田琴音\",\n        \"kasumi toyama\": \"户山香澄\",\n        \"tae hanazono\": \"花园多惠\",\n        \"rimi ushigome\": \"牛込里美\",\n        \"saaya yamabuki\": \"山吹沙绫\",\n        \"arisa ichigaya\": \"市谷有咲\",\n        \"yukina minato\": \"凑友希那\",\n        \"sayo hikawa\": \"冰川纱夜\",\n        \"lisa imai\": \"今井莉莎\",\n        \"ako udagawa\": \"宇田川亚子\",\n        \"rinko shirokane\": \"白金燐子\",\n        \"ran mitake\": \"美竹兰\",\n        \"moca aoba\": \"青叶摩卡\",\n        \"himari uehara\": \"上原绯玛丽\",\n        \"tomoe udagawa\": \"宇田川巴\",\n        \"tsugumi hazawa\": \"羽泽鸫\",\n        \"aya maruyama\": \"丸山彩\",\n        \"hina hikawa\": \"冰川日菜\",\n        \"chisato shirasagi\": \"白鹭千圣\",\n        \"maya yamato\": \"大和麻弥\",\n        \"eve wakamiya\": \"若宫伊芙\",\n        \"kokoro tsurumaki\": \"弦卷心\",\n        \"kaoru seta\": \"濑田薰\",\n        \"kanon matsubara\": \"松原花音\",\n        \"misaki okusawa\": \"奥泽美咲\",\n        \"rei wakana\": \"和奏瑞依（LAYER）\",\n        \"rokka asahi\": \"朝日六花（LOCK）\",\n        \"masuki satou\": \"佐藤益木（MASKING）\",\n        \"reona nyubara\": \"鳰原令王那（PAREO）\",\n        \"chiyu tamade\": \"珠手知由（CHU²）\",\n        \"mashiro kurata\": \"仓田真白\",\n        \"nanami hiromachi\": \"广町七深\",\n        \"tsukushi futaba\": \"二叶筑紫\",\n        \"marina tsukishima\": \"月岛麻里奈\",\n        \"kokomi shiina\": \"椎名心实\",\n        \"akane sakurai\": \"樱井明音\",\n        \"fumio murakami\": \"村上文绪\",\n        \"chloe lemaire\": \"克洛伊·勒梅尔\",\n        \"momoko asahina\": \"朝比奈桃子\",\n        \"haruka kazemachi\": \"风町阳歌\",\n        \"mutsumi shigino\": \"鴫野睦\",\n        \"erena mochizuki\": \"望月艾蕾娜\",\n        \"aika tenkuubashi\": \"天空桥爱佳\",\n        \"hakua shiodome\": \"汐留白亚\",\n        \"reiko arisugawa\": \"有栖川丽子\",\n        \"akane segawa\": \"濑川茜\",\n        \"ako tamaki\": \"玉置亚子\",\n        \"hideki nishimura\": \"西村英骑\",\n        \"nanako akiyama\": \"秋山奈奈子\",\n        \"yui saitou\": \"齐藤结衣\",\n        \"nozomi kaminashi\": \"神无希\",\n        \"sayaka miyata\": \"宫田纱耶香\",\n        \"non toyoguchi\": \"丰口浓\",\n        \"fourth raikage\": \"四代目雷影\",\n        \"sakura haruno\": \"春野樱\",\n        \"sasuke uchiha\": \"宇智波佐助\",\n        \"tsunade\": \"纲手\",\n        \"anko mitarashi\": \"御手洗红豆\",\n        \"ino yamanaka\": \"山中井野\",\n        \"kurotsuchi\": \"黑土\",\n        \"sarada uchiha\": \"宇智波佐良娜\",\n        \"tayuya\": \"多由也\",\n        \"temari\": \"手鞠\",\n        \"naruto uzumaki\": \"漩涡鸣人\",\n        \"minato namikaze\": \"波风水门\",\n        \"hinata hyuga\": \"日向雏田\",\n        \"kushina uzumaki\": \"漩涡奇奈\",\n        \"kakashi hatake\": \"旗木卡卡西\",\n        \"shikamaru nara\": \"奈良鹿丸\",\n        \"hashirama senju\": \"千手柱间\",\n        \"madara uchiha\": \"宇智波斑\",\n        \"itachi uchiha\": \"宇智波鼬\",\n        \"boruto uzumaki\": \"漩涡博人\",\n        \"himawari uzumaki\": \"漩涡向日葵\",\n        \"cinque izumi\": \"真红·和泉\",\n        \"millhiore firianno biscotti\": \"米希奥蕾·菲利安诺·比斯科迪\",\n        \"leonmitchelli galette des rois\": \"蕾昂米修莉·加雷特·德·罗瓦\",\n        \"gaul galette des rois\": \"高尔·迦雷特·德·罗瓦\",\n        \"yukikaze panettone\": \"雪风·帕尼托尼\",\n        \"rebecca anderson\": \"蕾蓓卡·安德森\",\n        \"noir vinocacao\": \"诺瓦鲁·可可酒\",\n        \"eclair martinozzi\": \"艾克蕾尔·马尔迪诺基\",\n        \"ricotta elmar\": \"利歌塔·埃玛\",\n        \"nanami takatsuki\": \"高槻七海\",\n        \"brioche darquien\": \"布丽奥修·达尔基昂\",\n        \"couvert eschenbach pastillage\": \"库贝尔·艾申巴赫·帕斯提亚修\",\n        \"percy gaudi\": \"帕西·高迪\",\n        \"vert farbreton\": \"贝尔·法布林塔\",\n        \"violle amaretto\": \"毕欧蕾·亚玛雷特\",\n        \"jaune clafouti\": \"乔奴·克拉芙缇\",\n        \"adelaide grand marnier\": \"阿德莱德·格兰玛尼亚\",\n        \"sharu\": \"夏露\",\n        \"kanata\": \"彼方\",\n        \"eika\": \"艾卡\",\n        \"kizuna ai\": \"绊爱\",\n        \"kaguya luna\": \"辉夜月\",\n        \"mirai akari\": \"Mirai Akari\",\n        \"nojaoji\": \"Mikoko\",\n        \"kira yamato\": \"基拉·大和\",\n        \"miriallia haw\": \"米丽雅莉亚·哈乌\",\n        \"natarle badgiruel\": \"娜塔尔·巴基露露\",\n        \"murrue ramius\": \"玛琉·拉米亚斯\",\n        \"stella loussier\": \"史黛拉·露西耶\",\n        \"meer campbell\": \"米娅·坎贝尔\",\n        \"meyrin hawke\": \"美玲·霍克\",\n        \"lunamaria hawke\": \"露娜玛丽亚·霍克\",\n        \"flay allster\": \"芙蕾·阿尔斯塔\",\n        \"cagalli yula athha\": \"卡嘉莉·尤拉·阿斯哈\",\n        \"lacus clyne\": \"拉克丝·克莱茵\",\n        \"haruhiko ichijou\": \"一条晴彦\",\n        \"mai kawakami\": \"川神舞\",\n        \"reina izumi\": \"和泉玲奈\",\n        \"koito minase\": \"水无濑小糸\",\n        \"doraemon\": \"哆啦A梦\",\n        \"nobita nobi\": \"野比大雄\",\n        \"shizuka minamoto\": \"源静香\",\n        \"suneo honekawa\": \"骨川小夫\",\n        \"takeshi gouda\": \"刚田武（胖虎）\",\n        \"tamako nobi\": \"野比玉子\",\n        \"dorami\": \"哆啦美\",\n        \"hidetoshi dekisugi\": \"出木杉英才\",\n        \"daiwa scarlet\": \"大和赤骥\",\n        \"gold ship\": \"黄金船\",\n        \"hishi amazon\": \"菱亚马逊\",\n        \"mejiro mcqueen\": \"目白麦昆\",\n        \"silence suzuka\": \"无声铃鹿\",\n        \"special week\": \"特别周\",\n        \"tokai teio\": \"东海帝王\",\n        \"taiki shuttle\": \"大树快车\",\n        \"neptune\": \"涅普迪努\",\n        \"noire\": \"诺瓦尔\",\n        \"blanc\": \"布兰\",\n        \"vert\": \"贝露\",\n        \"peashy\": \"皮榭\",\n        \"plutia\": \"普露露特\",\n        \"uzume\": \"天王星涡芽\",\n        \"nepgear\": \"涅普姬雅\",\n        \"uni\": \"优尼\",\n        \"rom\": \"萝姆\",\n        \"purple heart\": \"绀紫之心\",\n        \"black heart\": \"圣黑之心\",\n        \"white heart\": \"纯白之心\",\n        \"green heart\": \"翠绿之心\",\n        \"compa\": \"康帕\",\n        \"cave\": \"Cave\",\n        \"histoire\": \"伊丝特瓦尔\",\n        \"yuu otosaka\": \"乙坂有宇\",\n        \"nao tomori\": \"友利奈绪\",\n        \"misa kurobane\": \"西森柚咲\",\n        \"ayumi otosaka\": \"乙坂步未\",\n        \"ichika nakano\": \"中野一花\",\n        \"nino nakano\": \"中野二乃\",\n        \"miku nakano\": \"中野三玖\",\n        \"yotsuba nakano\": \"中野四叶\",\n        \"itsuki nakano\": \"中野五月\",\n        \"tokino sora\": \"时乃空\",\n        \"roboco\": \"萝卜子\",\n        \"sakura miko\": \"樱巫女\",\n        \"hoshimachi suisei\": \"星街彗星\",\n        \"yozora mel\": \"夜空梅露\",\n        \"aki rosenthal\": \"亚绮·罗森塔尔\",\n        \"akai haato\": \"赤井心\",\n        \"shirakami fubuki\": \"白上吹雪\",\n        \"natsuiro matsuri\": \"夏色祭\",\n        \"minato aqua\": \"凑阿库娅\",\n        \"murasaki shion\": \"紫咲诗音\",\n        \"nakiri ayame\": \"百鬼绫目\",\n        \"yuzuki choco\": \"癒月巧可\",\n        \"oozora subaru\": \"大空昴\",\n        \"ookami mio\": \"大神澪\",\n        \"inugami korone\": \"戌神沁音\",\n        \"nekomata okayu\": \"猫又小粥\",\n        \"usada pekora\": \"兔田佩克拉\",\n        \"uruha rushia\": \"润羽露西娅\",\n        \"shiranui flare\": \"不知火芙蕾雅\",\n        \"shirogane noel\": \"白银诺艾尔\",\n        \"houshou marine\": \"宝钟玛琳\",\n        \"amane kanata\": \"天音彼方\",\n        \"kiryu coco\": \"桐生可可\",\n        \"tsunomaki watame\": \"角卷绵芽\",\n        \"tokoyami towa\": \"常暗永远\",\n        \"himemori luna\": \"姬森璐娜\",\n        \"mumei\": \"无名\",\n        \"ayane\": \"绫音\",\n        \"mai shiranui\": \"不知火舞\",\n        \"naotora ii\": \"井伊直虎\",\n        \"lu lingqi\": \"吕玲绮\",\n        \"zhurong\": \"祝融\",\n        \"sun shang xiang\": \"孙尚香\",\n        \"nene\": \"宁宁\",\n        \"inahime\": \"稻姬\",\n        \"sima yi\": \"司马懿\",\n        \"wang yuanji\": \"王元姬\",\n        \"yue ying\": \"黄月英\",\n        \"zhang chunhua\": \"张春华\",\n        \"zhuge liang\": \"诸葛亮\",\n        \"ranma saotome\": \"早乙女乱马\",\n        \"angela\": \"安吉拉\",\n        \"riesz\": \"莉斯\",\n        \"eucliwood hellscythe\": \"优克莉伍德·海尔赛兹\",\n        \"hinako shijou\": \"四条雏子\",\n        \"yuri sakazaki\": \"坂崎百合\",\n        \"michelle k. davis\": \"米歇尔·K·戴维斯\",\n        \"chihiro ogino\": \"荻野千寻\",\n        \"tessie\": \"泰茜\",\n        \"leia rolando\": \"蕾娅·罗兰德\",\n        \"nami\": \"娜美\",\n        \"tashigi\": \"达斯琪\",\n        \"wang liu mei\": \"王留美\",\n        \"sage\": \"贤者\",\n        \"merchant\": \"商人\",\n        \"hero\": \"勇者\",\n        \"wizard\": \"魔法师\",\n        \"cleric\": \"僧侣\",\n        \"warrior\": \"战士\",\n        \"asuka langley soryu\": \"惣流·明日香·兰格雷\",\n        \"lucina\": \"露琪娜\",\n        \"cynthia\": \"竹兰 | 辛西娅\",\n        \"hikari horaki\": \"洞木光\",\n        \"rei ayanami\": \"绫波丽\",\n        \"milly\": \"米蕾尤\",\n        \"kusuha mizuha\": \"水羽楠叶\",\n        \"seolla schweizer\": \"塞奥拉·修拜亚\",\n        \"fujiko mine\": \"峰不二子\",\n        \"mirai andou\": \"安藤美雷\",\n        \"himea saito\": \"赛托希梅亚\",\n        \"fuu hououji\": \"凤凰寺风\",\n        \"hikaru shindo\": \"进藤光 | 狮堂光\",\n        \"umi ryuuzaki\": \"龙崎海\",\n        \"ai asato\": \"麻里爱\",\n        \"reiko katherine akimoto\": \"秋本丽子\",\n        \"hina\": \"日奈 | 雏\",\n        \"matoi giboshi\": \"拟宝珠缠\",\n        \"lemon giboshi\": \"拟宝珠柠檬\",\n        \"iroha\": \"伊吕波\",\n        \"arle nadja\": \"阿露露\",\n        \"tifa lockhart\": \"蒂法·洛克哈特\",\n        \"aerith gainsborough\": \"艾瑞丝·盖恩斯巴勒\",\n        \"yuffie kisaragi\": \"尤菲·如月\",\n        \"fumie hashimoto\": \"桥本文惠\",\n        \"yuuko amasawa\": \"天泽勇子\",\n        \"yuuko okonogi\": \"小此木京子\",\n        \"elphelt valentine\": \"艾露菲鲁特·华伦泰\",\n        \"jam kuradoberi\": \"藏土缘纱梦\",\n        \"ramlethal valentine\": \"拉姆蕾萨尔·华伦泰\",\n        \"alisa ilinichina amiella\": \"亚莉莎·伊莉妮提娜·阿米耶拉\",\n        \"lara croft\": \"劳拉·克罗夫特\",\n        \"naoto shirogane\": \"白钟直斗\",\n        \"hajime ichinose\": \"一之濑初\",\n        \"rabi en rose\": \"拉比安露斯\",\n        \"lei fang\": \"雷芳\",\n        \"menace\": \"美纳斯\",\n        \"tina armstrong\": \"蒂娜·阿姆斯特朗\",\n        \"anri misugi\": \"美杉杏莉\",\n        \"makoto hozumi\": \"穗积真琴\",\n        \"misao shinohara\": \"筱原美纱绪\",\n        \"sasami iwakura\": \"岩仓砂沙美\",\n        \"maam\": \"玛姆\",\n        \"momo yaoyorozu\": \"八百万百\",\n        \"ochako uraraka\": \"丽日御茶子\",\n        \"tsuyu asui\": \"蛙吹梅雨\",\n        \"izana shinatose\": \"科户濑伊札那\",\n        \"nagate tanikaze\": \"谷风长道\",\n        \"elpeo ple\": \"艾露比·普露\",\n        \"haman karn\": \"哈曼·卡恩\",\n        \"leina ashta\": \"莉娜·亚西塔\",\n        \"ple two\": \"普露兹\",\n        \"kurisu makise\": \"牧濑红莉栖\",\n        \"maribel\": \"玛丽贝尔\",\n        \"precia zan zenosakis\": \"普蕾茜娅·泽诺萨奇斯\",\n        \"ruka urushibara\": \"漆原琉华\",\n        \"yui takamura\": \"篁唯依\",\n        \"nico robin\": \"妮可·罗宾\",\n        \"saint shalulia\": \"夏露莉雅宫\",\n        \"snow white\": \"白雪公主\",\n        \"little red riding hood\": \"小红帽\",\n        \"saaya agata\": \"安形纱绫\",\n        \"mamori anezaki\": \"姊崎真守\",\n        \"sena kobayakawa\": \"小早川濑那\",\n        \"latooni suvota\": \"拉托妮·苏波塔\",\n        \"shine hausen\": \"夏茵·豪森\",\n        \"stella bremer\": \"史黛拉·布瑞梅尔\",\n        \"bianca whitaker\": \"碧安卡·惠特克\",\n        \"crea dolosera\": \"克蕾雅·多萝赛娅\",\n        \"mikono suzushiro\": \"御子乃·铃白\",\n        \"suomi konepi\": \"须绪美·科妮皮\",\n        \"shinji ikari\": \"碇真嗣\",\n        \"reika shimohira\": \"下平玲花\",\n        \"katina tarask\": \"卡琪娜·塔拉斯克\",\n        \"leona garstein\": \"雷欧娜·嘉施泰因\",\n        \"poison\": \"毒药\",\n        \"jessica albert\": \"杰西卡·阿尔芭\",\n        \"jigoku no fubuki\": \"地狱的吹雪\",\n        \"senritsu no tatsumaki\": \"战栗的龙卷\",\n        \"tights brief\": \"塔依丝\",\n        \"hugo\": \"雨果\",\n        \"nel zelpher\": \"奈露\",\n        \"sadi-chan\": \"小萨蒂\",\n        \"mina ashido\": \"芦户三奈\",\n        \"rebecca\": \"蕾贝卡\",\n        \"amazon\": \"亚马逊\",\n        \"sorceress\": \"女巫\",\n        \"serena\": \"莎莉娜 | 瑟妮娅 | 塞瑞娜\",\n        \"shauna\": \"莎娜\",\n        \"kiruko otonashi\": \"音无斩子\",\n        \"boa hancock\": \"波雅·汉库克\",\n        \"monkey d. luffy\": \"蒙奇·D·路飞\",\n        \"elf\": \"精灵\",\n        \"neko musume\": \"猫娘\",\n        \"kaoru matsubara\": \"松原薰\",\n        \"miyako gotokuji\": \"豪得寺美弥子\",\n        \"momoko akatsutsumi\": \"赤提和美子\",\n        \"kougyoku ren\": \"练红玉\",\n        \"masrur\": \"马斯鲁尔\",\n        \"morgiana\": \"摩尔迦娜\",\n        \"sharrkan\": \"迦尔鲁卡\",\n        \"sinbad\": \"辛巴德\",\n        \"yamuraiha\": \"雅姆莱哈\",\n        \"kurumi kumamakura\": \"熊枕久瑠美\",\n        \"priscilla barielle\": \"普莉希拉·跋利耶尔\",\n        \"roomi\": \"萝米\",\n        \"martial artist\": \"武斗家\",\n        \"thief\": \"盗贼\",\n        \"nera briscoletti\": \"芙萝菈\",\n        \"crimson viper\": \"深红毒蛇\",\n        \"blue mary\": \"布鲁玛丽\",\n        \"king\": \"琼\",\n        \"dark magician girl\": \"黑魔术少女\",\n        \"silent magician\": \"沉默魔术师\",\n        \"marcille donato\": \"玛露西露\",\n        \"fumina hoshino\": \"星野文奈\",\n        \"angela balzac\": \"安吉拉·巴尔扎克\",\n        \"yanagi takayama\": \"高山柳\",\n        \"nako oshimizu\": \"押水菜子\",\n        \"sawa okita\": \"冲田纱羽\",\n        \"bloodberry\": \"红莓\",\n        \"cherry\": \"樱桃\",\n        \"sakuya tachibana\": \"橘咲夜\",\n        \"kimi aoi\": \"葵·喜美\",\n        \"tori aoi\": \"葵·托利\",\n        \"akira yamamoto\": \"山本玲\",\n        \"kaoru niimi\": \"新见熏\",\n        \"makoto harada\": \"原田真琴\",\n        \"mikage kiryuu\": \"桐生美影\",\n        \"melda deitz\": \"梅尔达·狄兹\",\n        \"yuki mori\": \"森雪\",\n        \"ainz ooal gown\": \"安兹·乌尔·恭\",\n        \"albedo\": \"雅儿贝德 | 阿贝多\",\n        \"aura bella fiora\": \"亚乌菈·贝拉·菲欧拉\",\n        \"clementine\": \"克莱门汀\",\n        \"mare bello fiore\": \"马雷·贝罗·菲欧雷\",\n        \"shalltear bloodfallen\": \"夏提雅·布拉德弗伦\",\n        \"ai\": \"爱\",\n        \"ai kagano\": \"加贺野爱\",\n        \"mayu\": \"美格\",\n        \"rin\": \"凛\",\n        \"farrah\": \"法拉\",\n        \"zooey\": \"佐伊\",\n        \"natsu dragneel\": \"纳兹·多拉格尼尔\",\n        \"kirara\": \"绮良良\",\n        \"tamaki kousaka\": \"向坂环\",\n        \"sellma\": \"罗克珊努\",\n        \"ruida\": \"莉卡\",\n        \"mar\": \"梅亚\",\n        \"vice\": \"薇思\",\n        \"misato katsuragi\": \"葛城美里\",\n        \"mari illustrious makinami\": \"真希波·真理·伊拉丝多莉亚斯\",\n        \"angewomon\": \"天女兽\",\n        \"kazemon\": \"彩虹兽\",\n        \"ladydevimon\": \"妖女兽\",\n        \"lilamon\": \"丁香兽\",\n        \"lilymon\": \"百合兽\",\n        \"renamon\": \"妖狐兽\",\n        \"sakuyamon\": \"沙古牙兽\",\n        \"zephyrmon\": \"风神兽\",\n        \"martina\": \"玛尔缇娜\",\n        \"sancho\": \"桑丘\",\n        \"barron trump\": \"巴伦·特朗普\",\n        \"donald trump\": \"唐纳德·特朗普\",\n        \"bill clinton\": \"比尔·克林顿\",\n        \"hillary clinton\": \"希拉里·克林顿\",\n        \"vladimir putin\": \"弗拉基米尔·普京\",\n        \"barack obama\": \"巴拉克·奥巴马\",\n        \"taro aso\": \"麻生太郎\",\n        \"abraham lincoln\": \"亚伯拉罕·林肯\",\n        \"george w. bush\": \"乔治·沃克·布什\",\n        \"osama bin laden\": \"奥萨马·本·拉登\",\n        \"adolf hitler\": \"阿道夫·希特勒\",\n        \"anne frank\": \"安妮·弗兰克\",\n        \"lusamine\": \"露莎米奈\",\n        \"angelise ikaruga misurugi\": \"安琪丽莎·斑鸠·米斯尔奇\",\n        \"lelouch vi britannia\": \"鲁路修·vi·布里塔尼亚\",\n        \"c.c.\": \"C.C.\",\n        \"charlotte dunois\": \"夏洛特·德诺阿\",\n        \"nena trinity\": \"妮娜·崔尼帝\",\n        \"louise francoise le blanc de la valliere\": \"露易丝\",\n        \"saito hiraga\": \"平贺才人\",\n        \"shana\": \"夏娜\",\n        \"zero two\": \"02\",\n        \"ichigo\": \"莓\",\n        \"strelizia\": \"鹤望兰号\",\n        \"hiro\": \"广\",\n        \"alice liddell\": \"爱丽丝·李道尔\",\n        \"cinderella\": \"辛德瑞拉\",\n        \"noa himesaka\": \"姬坂乃爱\",\n        \"miyako hoshino\": \"星野宫子\",\n        \"hana shirosaki\": \"白咲花\",\n        \"hinata hoshino\": \"星野日向\",\n        \"may\": \"小遥\",\n        \"dawn\": \"小光\",\n        \"kyaru\": \"凯露\",\n        \"mai sakurajima\": \"樱岛麻衣\",\n        \"ai mizuno\": \"水野爱\",\n        \"yuuma kuga\": \"空闲游真\",\n        \"kokkoro\": \"可可萝\",\n        \"holo\": \"赫萝\",\n        \"marie rose\": \"玛丽·萝丝\",\n        \"helena douglas\": \"海莲娜\",\n        \"sylvanas windrunner\": \"希尔瓦娜斯·风行者\",\n        \"nessa\": \"露璃娜\",\n        \"sonia\": \"索妮亚\",\n        \"mallow\": \"玛奥\",\n        \"melony\": \"美蓉\",\n        \"kama\": \"迦摩\",\n        \"yu mei-ren\": \"虞美人\",\n        \"beni-enma\": \"红阎魔\",\n        \"carmilla\": \"卡米拉\",\n        \"valkyrie\": \"瓦尔基里\",\n        \"chiyo shirayuki\": \"白雪千夜\",\n        \"chitose kurosaki\": \"黑埼千岁\",\n        \"kiyomi saejima\": \"冴岛清美\",\n        \"cure milky\": \"羽衣拉拉\",\n        \"rinko iori\": \"伊织凛子\",\n        \"sei iori\": \"伊织诚\",\n        \"bea\": \"彩豆\",\n        \"kudryavka noumi\": \"能美·库特莉亚芙卡\",\n        \"yuuko shionji\": \"紫苑寺有子\",\n        \"narumi fujishima\": \"藤岛鸣海\",\n        \"sister cleaire\": \"修女克蕾雅\",\n        \"momo chiyoda\": \"千代田桃\",\n        \"yuko yoshida\": \"吉田优子\",\n        \"reines el-melloi archisorte\": \"莱妮丝·埃尔梅罗·阿奇佐尔缇\",\n        \"rindou mikoto\": \"龙胆尊\",\n        \"hotaru ichijou\": \"一条萤\",\n        \"komari koshigaya\": \"越谷小鞠\",\n        \"maria balthasar\": \"玛利亚·巴尔塔札尔\",\n        \"emeralda kasim\": \"艾美拉达·卡西姆\",\n        \"ai hinatsuru\": \"雏鹤爱\",\n        \"ginko sora\": \"空银子\",\n        \"chariot\": \"战轮妖精\",\n        \"strength\": \"力量\",\n        \"kirika akatsuki\": \"晓切歌\",\n        \"asuha chigusa\": \"千种明日叶\",\n        \"kasumi chigusa\": \"千种霞\",\n        \"ange katrina\": \"安洁·卡特莉娜\",\n        \"cagliostro\": \"卡莉奥斯特萝\",\n        \"kyouka hikawa\": \"冰川镜华\",\n        \"retoree\": \"莱托莉\",\n        \"cyan hijirikawa\": \"希安（圣川诗杏）\",\n        \"saren sasaki\": \"佐佐木咲恋\",\n        \"niyon\": \"妮欧\",\n        \"yuel\": \"尤艾尔\",\n        \"societte\": \"苏丝雅\",\n        \"kanau kongou\": \"金刚叶\",\n        \"yuuko aioi\": \"相生祐子\",\n        \"mio naganohara\": \"长野原美绪\",\n        \"mai minakami\": \"水上麻衣\",\n        \"nano shinonome\": \"东云名乃\",\n        \"hakase shinonome\": \"东云博士\",\n        \"kobayashi\": \"小林\",\n        \"ririchiyo shirakiin\": \"白鬼院凛凛蝶\",\n        \"sana inui\": \"乾纱凪\",\n        \"nanachi\": \"娜娜奇\",\n        \"nursery rhyme\": \"童谣\",\n        \"hasuki komai\": \"狛井莲季\",\n        \"juliet persia\": \"朱丽叶·佩尔西亚\",\n        \"romio inuzuka\": \"犬冢露壬雄\",\n        \"himawari furutani\": \"古谷向日葵\",\n        \"sakurako ohmuro\": \"大室樱子\",\n        \"raphtalia\": \"拉芙塔莉雅\",\n        \"filo\": \"菲洛\",\n        \"altina orion\": \"亚尔缇娜·奥莱恩\",\n        \"amiya\": \"阿米娅\",\n        \"regu\": \"雷古\",\n        \"riko\": \"莉可\",\n        \"six\": \"希斯\",\n        \"maple\": \"梅普露 | 枫\",\n        \"nezuko kamado\": \"灶门祢豆子\",\n        \"reina kousaka\": \"高坂丽奈\",\n        \"kumiko oumae\": \"黄前久美子\",\n        \"ririka kenzaki\": \"剑崎梨梨花\",\n        \"kanade hisaishi\": \"久石奏\",\n        \"mizore yoroizuka\": \"铠冢霙\",\n        \"nozomi kasaki\": \"伞木希美\",\n        \"yuuko yoshikawa\": \"吉川优子\",\n        \"natsuki nakagawa\": \"中川夏纪\",\n        \"sapphire kawashima\": \"川岛绿辉\",\n        \"kaori nakaseko\": \"中世古香织\",\n        \"hazuki katou\": \"加藤叶月\",\n        \"haruka ogasawara\": \"小笠原晴香\",\n        \"asuka tanaka\": \"田中明日香\",\n        \"raina kitamura\": \"喜多村来南\",\n        \"mikino oka\": \"冈美贵乃\",\n        \"izumi akazawa\": \"赤泽泉美\",\n        \"noboru taki\": \"泷升\",\n        \"masahiro hashimoto\": \"桥本真博\",\n        \"riko nagase\": \"长濑梨子\",\n        \"takuya gotou\": \"后藤卓也\",\n        \"shuuichi tsukamoto\": \"塚本秀一\",\n        \"akiko yoshizawa\": \"吉泽明子\",\n        \"satomi niiyama\": \"新山聪美\",\n        \"fuutarou uesugi\": \"上杉风太郎\",\n        \"kanao tsuyuri\": \"栗花落香奈乎\",\n        \"shinobu kochou\": \"蝴蝶忍\",\n        \"giyuu tomioka\": \"富冈义勇\",\n        \"mitsuri kanroji\": \"甘露寺蜜璃\",\n        \"zenitsu agatsuma\": \"我妻善逸\",\n        \"tanjirou kamado\": \"灶门炭治郎\",\n        \"kyojuro rengoku\": \"炼狱杏寿郎\",\n        \"obanai iguro\": \"伊黑小芭内\",\n        \"aoi kanzaki\": \"神崎葵\",\n        \"sabito\": \"锖兔\",\n        \"tengen uzui\": \"宇髄天元\",\n        \"hodaka morishima\": \"森岛帆高\",\n        \"chiaki minami\": \"南千秋\",\n        \"haruka minami\": \"南夏奈\",\n        \"kana minami\": \"南春香\",\n        \"mako\": \"真\",\n        \"yuka uchida\": \"内田由加\",\n        \"kaede azusagawa\": \"梓川枫\",\n        \"rio futaba\": \"双叶理央\",\n        \"sakuta azusagawa\": \"梓川咲太\",\n        \"tomoe koga\": \"古贺朋绘\",\n        \"coquelicot\": \"蔻库莉可\",\n        \"erica fontaine\": \"艾莉卡·芳汀\",\n        \"glycine bleumer\": \"库莉西奴·布鲁马\",\n        \"hanabi kitaoji\": \"北大路花火\",\n        \"ichiro ogami\": \"大神一郎\",\n        \"lobelia carlini\": \"罗贝莉娅·卡尔里尼\",\n        \"nodoka toyohama\": \"丰滨和香\",\n        \"shouko makinohara\": \"牧之原翔子\",\n        \"iris chateaubriand\": \"伊莉斯·夏特布里安\",\n        \"sakura shinguji\": \"真宫寺樱\",\n        \"kohran li\": \"李红兰\",\n        \"sumire kanzaki\": \"神崎堇\",\n        \"ci caprice\": \"茜·卡普利斯\",\n        \"mell raison\": \"梅尔·雷森\",\n        \"orihime soletta\": \"索蕾塔·织姬\",\n        \"reni milchstrasse\": \"雷尼·米尔西修特拉瑟\",\n        \"maria tachibana\": \"玛丽亚·橘\",\n        \"kanna kirishima\": \"桐岛神奈\",\n        \"tsubaki takamura\": \"高村椿\",\n        \"ayame fujieda\": \"藤枝菖蒲\",\n        \"cloud strife\": \"克劳德·史特莱夫\",\n        \"kaede fujieda\": \"藤枝枫\",\n        \"diana caprice\": \"黛安娜·卡普利斯\",\n        \"ratchet altair\": \"拉琪特·奥泰尔\",\n        \"shinjiro taiga\": \"大河新次郎\",\n        \"subaru kujou\": \"九条昴\",\n        \"wakana shinguji\": \"真宫寺若菜\",\n        \"carino soletta\": \"卡莉诺·素蕾塔\",\n        \"margueritte chateaubriand\": \"玛格丽特·夏特布里安\",\n        \"yuri sakakibara\": \"榊原由里\",\n        \"gemini sunrise\": \"洁蜜妮·桑莱兹\",\n        \"anthy himemiya\": \"姬宫安茜\",\n        \"utena tenjou\": \"天上欧蒂娜\",\n        \"ai hayasaka\": \"早坂爱\",\n        \"kaguya shinomiya\": \"四宫辉夜\",\n        \"miyuki shirogane\": \"白银御行\",\n        \"chika fujiwara\": \"藤原千花\",\n        \"soushi miketsukami\": \"御狐神双炽\",\n        \"maya tendo\": \"天堂真矢\",\n        \"seto miyako\": \"濑户美夜子\",\n        \"pecorine\": \"佩可莉姆\",\n        \"harumi fujiyoshi\": \"藤吉晴美\",\n        \"chiri kitsu\": \"木津千里\",\n        \"kaere kimura\": \"木村卡愛拉\",\n        \"nozomu itoshiki\": \"糸色望\",\n        \"veight\": \"斑特\",\n        \"wicke\": \"碧珂\",\n        \"astarotte ygvar\": \"亚斯塔萝黛·尤各瓦尔\",\n        \"asuha touhara\": \"塔原明日叶\",\n        \"isadora finnsdottir\": \"伊莎朵拉·方斯德托\",\n        \"ingrid sorveig sorgrims\": \"伊格丽德·索维克·索尔格利吾斯\",\n        \"yumiko miura\": \"三浦优美子\",\n        \"chiyo sakura\": \"佐仓千代\",\n        \"umetarou nozaki\": \"野崎梅太郎\",\n        \"akari kazemiya\": \"风宫茜里\",\n        \"ilya ornstein\": \"伊莉雅·奥恩斯坦\",\n        \"miyako izumo\": \"出云宫子\",\n        \"shinobu kamiki\": \"上喜忍\",\n        \"vikala\": \"碧卡拉\",\n        \"hayate hisakawa\": \"久川飒\",\n        \"nagi hisakawa\": \"久川凪\",\n        \"shika kuroi\": \"黑井诗花\",\n        \"nadeshiko kagamihara\": \"各务原抚子\",\n        \"rin shima\": \"志摩凛\",\n        \"chiaki oogaki\": \"大垣千明\",\n        \"aoi inuyama\": \"犬山葵\",\n        \"ena saitou\": \"齐藤惠那\",\n        \"sugumi kanagata\": \"金潟すぐみ\",\n        \"yasuri araime\": \"新居目安里\",\n        \"raiya kaeruzaka\": \"蛙坂来弥\",\n        \"rita henschel\": \"リタ・ヘンシェル\",\n        \"serina niiya\": \"新谷芹菜\",\n        \"shirley oakley\": \"シャーリー・オークレイ\",\n        \"shitara kaneshiya\": \"兼志谷シタラ\",\n        \"rin himukai\": \"日向リン\",\n        \"giorno giovanna\": \"乔鲁诺·乔巴拿\",\n        \"belzerg stylish sword iris\": \"贝尔泽古·斯黛莉休·索德·爱丽丝\",\n        \"hibiki tsukahara\": \"冢原响\",\n        \"junichi tachibana\": \"橘纯一\",\n        \"mafuyu kirisu\": \"桐须真冬\",\n        \"nariyuki yuiga\": \"唯我成幸\",\n        \"alice zuberg\": \"爱丽丝·滋贝鲁库\",\n        \"selka zuberg\": \"赛鲁卡·滋贝鲁库\",\n        \"haruhiro\": \"哈尔希洛\",\n        \"yume\": \"梦儿\",\n        \"shihoru\": \"席赫露\",\n        \"ranta\": \"蓝德\",\n        \"moguzo\": \"莫古索\",\n        \"merry\": \"梅莉\",\n        \"tamamo cat\": \"玉藻猫\",\n        \"kiritan tohoku\": \"东北切蒲英\",\n        \"rikka takarada\": \"宝多六花\",\n        \"anastasia nikolaevna romanova\": \"阿纳斯塔西娅·尼古拉耶芙娜·罗曼诺娃\",\n        \"miko iino\": \"伊井野弥子\",\n        \"yuu ishigami\": \"石上优\",\n        \"sasaki saku\": \"笹木咲\",\n        \"arulumaya\": \"阿露露梅娅\",\n        \"cain\": \"该隐\",\n        \"mahira\": \"玛琪拉\",\n        \"melissabelle\": \"梅丽莎贝尔\",\n        \"pholia\": \"芙莉亚\",\n        \"sandalphon\": \"圣德芬\",\n        \"akari tsujino\": \"辻野朱里\",\n        \"aru honshou\": \"本庄阿鲁\",\n        \"junko konno\": \"绀野纯子\",\n        \"saki nikaidou\": \"二阶堂咲\",\n        \"yuugiri\": \"夕雾\",\n        \"lily hoshikawa\": \"星川莉莉\",\n        \"koutarou tatsumi\": \"巽幸太郎\",\n        \"sakura minamoto\": \"源樱\",\n        \"tae yamada\": \"山田多惠\",\n        \"ayano sugiura\": \"杉浦绫乃\",\n        \"akari akaza\": \"赤座灯里\",\n        \"kyouko toshinou\": \"岁纳京子\",\n        \"reisalin stout\": \"莱莎琳·斯托特\",\n        \"kudou chitose\": \"久远千岁\",\n        \"higuchi kaede\": \"樋口枫\",\n        \"tsukino mito\": \"月之美兔\",\n        \"yui kusano\": \"草野优衣\",\n        \"kanon daiba\": \"台场夏音\",\n        \"marnie\": \"玛俐\",\n        \"taokaka\": \"桃卡卡\",\n        \"medusa lily\": \"美杜莎(Lancer)\",\n        \"salome\": \"莎乐美\",\n        \"zeta\": \"泽塔\",\n        \"beatrix\": \"贝阿朵丽丝\",\n        \"hoshikawa sara\": \"星川莎拉\",\n        \"honma himawari\": \"本间向日葵🌻\",\n        \"kakyoin chieri\": \"花京院樱桃\",\n        \"lize helesta\": \"莉泽·赫露艾斯塔\",\n        \"saionji mary\": \"西园寺メアリ\",\n        \"suou patra\": \"周防帕特拉\",\n        \"shiina yuika\": \"椎名唯华\",\n        \"shizuka rin\": \"静凛\",\n        \"natori sana\": \"名取纱那\",\n        \"yuzuki roa\": \"梦月萝娅\",\n        \"warabeda meiji\": \"童田明治\",\n        \"souya ichika\": \"宗谷Ichika\",\n        \"raihan\": \"奇巴纳\",\n        \"victor\": \"小胜\",\n        \"hop\": \"赫普\",\n        \"gloria\": \"小优\",\n        \"allister\": \"欧尼奥\",\n        \"klara\": \"克拉拉\",\n        \"dola\": \"多拉\",\n        \"moon\": \"美月\",\n        \"rosa\": \"鸣依\",\n        \"ars almal\": \"阿露丝·阿尔玛\",\n        \"elesa\": \"小菊儿\",\n        \"selene\": \"美月\",\n        \"lillie\": \"莉莉艾\",\n        \"honoka\": \"穗香\",\n        \"hex maniac\": \"灵异迷\",\n        \"hypno\": \"引梦貘人\",\n        \"lana\": \"水莲\",\n        \"lanas mom\": \"水莲的妈妈\",\n        \"kiawe\": \"卡奇\",\n        \"elio\": \"朗日\",\n        \"pikachu\": \"皮卡丘\",\n        \"slowpoke\": \"呆呆兽\",\n        \"izuna hatsuse\": \"初濑伊纲\",\n        \"shiro\": \"白\",\n        \"stephanie\": \"史蒂芬妮\",\n        \"stephanie dola\": \"史蒂芬妮·多拉\",\n        \"jibril\": \"吉普莉尔\",\n        \"sora\": \"空\",\n        \"chizuru ichinose\": \"一之濑千鹤\",\n        \"kazuya kinoshita\": \"木之下和也\",\n        \"sukoya kana\": \"健屋花那\",\n        \"makaino ririmu\": \"魔界之莉莉姆\",\n        \"emma august\": \"艾玛★奥加斯特\",\n        \"hakase fuyuki\": \"叶加濑冬雪\",\n        \"izumo kasumi\": \"出云霞\",\n        \"ushimi ichigo\": \"宇志海莓\",\n        \"yuhi riri\": \"夕阳莉莉\",\n        \"suzuka utako\": \"铃鹿诗子\",\n        \"mononobe alice\": \"物述有栖\",\n        \"moira\": \"摩伊拉\",\n        \"ienaga mugi\": \"家长麦\",\n        \"aki suzuya\": \"铃谷秋\",\n        \"yashiro kizuku\": \"社筑\",\n        \"uduki kou\": \"卯月光\",\n        \"todoroki kyoko\": \"轰京子\",\n        \"suzuki masaru\": \"铃木胜\",\n        \"ryushen\": \"绿仙\",\n        \"morinaka kazaki\": \"森中花咲\",\n        \"kuzuha\": \"葛叶\",\n        \"kenmochi toya\": \"剑持刀也\",\n        \"hanabatake chaika\": \"花畑嘉依卡\",\n        \"fumino tamaki\": \"文野环\",\n        \"elu\": \"艾露\",\n        \"akabane youko\": \"赤羽叶子\",\n        \"aduchi momo\": \"安土桃\",\n        \"yamiyono moruru\": \"暗夜乃莫露露\",\n        \"fuyuki hinata\": \"日向冬树\",\n        \"natsumi hinata\": \"日向夏美\",\n        \"aki hinata\": \"日向秋\",\n        \"cheshire\": \"柴郡\",\n        \"savage\": \"暴行\",\n        \"type 95\": \"95式\",\n        \"aki shiina\": \"椎名亚树\",\n        \"nana sunohara\": \"春原菜菜\",\n        \"ayaka sunohara\": \"春原彩花\",\n        \"yang guifei\": \"杨贵妃\",\n        \"akane shinjou\": \"新条茜\",\n        \"mirai kuriyama\": \"栗山未来\",\n        \"akihito kanbara\": \"神原秋人\",\n        \"ichika orimura\": \"织斑一夏\",\n        \"chifuyu orimura\": \"织斑千冬\",\n        \"gray\": \"格蕾\",\n        \"koyanskaya\": \"高扬斯卡娅\",\n        \"mineva lao zabi\": \"密涅瓦·劳·扎比（汤小美）\",\n        \"marida cruz\": \"玛莉妲·库鲁斯\",\n        \"jeanne alter lily\": \"贞德·Alter·Santa·Lily\",\n        \"mizuki usami\": \"宇佐美瑞希\",\n        \"subaru uchimaki\": \"内卷昴\",\n        \"sayla mass\": \"塞拉·玛斯\",\n        \"daisy mo\": \"墨小菊\",\n        \"violet wen\": \"文芷\",\n        \"sunny chih\": \"迟菓\",\n        \"sarah kerrigan\": \"莎拉·凯瑞甘\",\n        \"ozymandias\": \"奥斯曼狄斯\",\n        \"paimon\": \"派蒙\",\n        \"hilbert\": \"斗也\",\n        \"hilda\": \"希尔达 | 斗子\",\n        \"skyla\": \"风露\",\n        \"elisa\": \"秋子\",\n        \"misty\": \"小霞\",\n        \"alena\": \"安莉娜\",\n        \"reimi saionji\": \"蕾米\",\n        \"maika sakuranomiya\": \"樱之宫莓香\",\n        \"kaho hinata\": \"日向夏帆\",\n        \"mafuyu hoshikawa\": \"星川麻冬\",\n        \"miu amano\": \"天野美雨\",\n        \"hideri kanzaki\": \"神崎日照\",\n        \"claudine saijo\": \"西条克洛迪娜\",\n        \"deutschland\": \"德意志\",\n        \"admiral graf spee\": \"斯佩伯爵海军上将\",\n        \"dunkerque\": \"敦刻尔克\",\n        \"shirayuki tomoe\": \"白雪巴\",\n        \"yui akamatsu\": \"赤松结衣\",\n        \"sat-chan\": \"小幸\",\n        \"kotoha\": \"青山琴叶\",\n        \"ringo oohoshi\": \"大星林檎\",\n        \"shinobu sarutobi\": \"猿飞忍\",\n        \"keine kanzaki\": \"神崎桂音\",\n        \"aoi ichijou\": \"一条葵\",\n        \"lyrule\": \"莉露露\",\n        \"naofumi iwatani\": \"岩谷尚文（盾之勇者）\",\n        \"melty q melromarc\": \"梅蒂·Q·梅洛马格\",\n        \"mirellia q melromarc\": \"米蕾莉亚·Q·梅洛马格\",\n        \"malty melromarc\": \"麦蒂·S·梅洛玛格\",\n        \"motoyasu kitamura\": \"北村元康（枪之勇者）\",\n        \"hana uzaki\": \"宇崎花\",\n        \"tsuki uzaki\": \"宇崎月\",\n        \"shinichi sakurai\": \"樱井真一\",\n        \"ryoko yoshida\": \"吉田良子\",\n        \"sieg\": \"齐格\",\n        \"hajime nagumo\": \"南云始\",\n        \"yue\": \"月\",\n        \"shea haulia\": \"希娅·哈乌利亚\",\n        \"kaori shirasaki\": \"白崎香织\",\n        \"hanako honda\": \"本田华子\",\n        \"olivia\": \"奥莉薇\",\n        \"kasumi nomura\": \"野村香纯\",\n        \"merribit stapleton\": \"梅莉毕德･斯泰普尔顿\",\n        \"tanya von degurechaff\": \"谭雅·提古雷查夫\",\n        \"viktoriya ivanovna serebryakov\": \"维夏\",\n        \"takamiya rion\": \"鹰宫莉音\",\n        \"ruka sarashina\": \"更科瑠夏\",\n        \"sumi sakurasawa\": \"樱泽墨\",\n        \"mami nanami\": \"七海麻美\",\n        \"frankenstein\": \"弗兰肯斯坦（肯娘）\",\n        \"nina maehara\": \"前原仁菜\",\n        \"uruka takemoto\": \"武元润香\",\n        \"fumino furuhashi\": \"古桥文乃\",\n        \"rizu ogata\": \"绪方理珠\",\n        \"asumi kominami\": \"小美浪爱澄\",\n        \"echidna\": \"艾姬多娜\",\n        \"haruka oozora\": \"大空遥\",\n        \"kanata higa\": \"比嘉彼方\",\n        \"narumi tooi\": \"远井成美\",\n        \"ayasa tachibana\": \"立花彩纱\",\n        \"leaf\": \"叶子\",\n        \"diablo\": \"迪亚布罗（坂本拓真）\",\n        \"rem galleu\": \"蕾姆·嘉蕾邬\",\n        \"shera l. greenwood\": \"雪拉·L·古林伍德\",\n        \"alicia crystella\": \"艾莉西亚·库里斯特拉\",\n        \"edelgard\": \"艾德尔卡特\",\n        \"krebskulm\": \"库尔姆\",\n        \"chocola\": \"巧克力\",\n        \"cinnamon\": \"桂\",\n        \"coconut\": \"椰子\",\n        \"vanilla\": \"香草\",\n        \"shinku nikaidou\": \"二阶堂真红\",\n        \"shiori kashiwazaki\": \"柏崎栞\",\n        \"link\": \"林克\",\n        \"wonder woman\": \"神奇女侠\",\n        \"she-ra\": \"希瑞\",\n        \"rapunzel\": \"长发公主\",\n        \"hulk\": \"浩克\",\n        \"star girl\": \"逐星女\",\n        \"harley quinn\": \"哈莉·奎茵\",\n        \"zatanna zatara\": \"扎塔娜·扎塔拉\",\n        \"starfire\": \"星火\",\n        \"supergirl\": \"超级少女\",\n        \"superwoman\": \"超级女侠\",\n        \"batwoman\": \"蝙蝠女侠\",\n        \"batgirl\": \"蝙蝠少女\",\n        \"barbara gordon\": \"芭芭拉·戈登\",\n        \"blackfire\": \"黑火\",\n        \"bruce wayne\": \"布鲁斯·韦恩\",\n        \"jinx\": \"金克斯\",\n        \"lex luthor\": \"莱克斯·卢瑟\",\n        \"poison ivy\": \"毒藤女\",\n        \"raven\": \"渡鸦\",\n        \"terra\": \"泰拉\",\n        \"black canary\": \"黑金丝雀\",\n        \"cheetah\": \"豹女\",\n        \"giganta\": \"巨化女\",\n        \"lois lane\": \"露易丝·莱恩\",\n        \"miss martian\": \"火星少女\",\n        \"power girl\": \"神力女孩\",\n        \"talia al ghul\": \"塔利亚·艾尔·古尔\",\n        \"vixen\": \"雌狐\",\n        \"le malin\": \"恶毒\",\n        \"suzuki hina\": \"铃木雏\",\n        \"tanaka hime\": \"田中姬\",\n        \"nobukatsu oda\": \"织田信胜\",\n        \"okita souji alter\": \"冲田总司Alter\",\n        \"frostnova\": \"霜星\",\n        \"achikita chinami\": \"うさぎ工房\",\n        \"athena asamiya\": \"麻宫雅典娜\",\n        \"da ji\": \"妲己\",\n        \"da qiao\": \"大乔\",\n        \"dong zhuo\": \"董卓\",\n        \"sun ce\": \"孙策\",\n        \"xiao qiao\": \"小乔\",\n        \"zhao yun\": \"赵云\",\n        \"dakki\": \"妲己\",\n        \"oichi\": \"阿市\",\n        \"itou life\": \"伊东life\",\n        \"rangiku matsumoto\": \"松本乱菊\",\n        \"shining\": \"闪灵\",\n        \"jill valentine\": \"吉尔·瓦伦蒂安\",\n        \"exusiai\": \"能天使\",\n        \"kaworu nagisa\": \"渚薰\",\n        \"hatsune kashiwazaki\": \"柏崎初音\",\n        \"mdr\": \"MDR\",\n        \"keqing\": \"刻晴\",\n        \"atsuko kagari\": \"篝敦子\",\n        \"diana cavendish\": \"戴安娜·卡文迪什\",\n        \"eriko kuraishi\": \"仓石惠理子\",\n        \"monkshood\": \"乌头\",\n        \"makoto kowata\": \"木幡真琴\",\n        \"elaina\": \"伊蕾娜\",\n        \"ganyu\": \"甘雨\",\n        \"jean gunnhildr\": \"琴·古恩希尔德\",\n        \"jean\": \"琴\",\n        \"midori fuse\": \"布施翠\",\n        \"roxy migurdia\": \"洛琪希·米格路迪亚\",\n        \"ghislaine dedoldia\": \"基列奴·泰德路迪亚\",\n        \"eris boreas greyrat\": \"艾莉丝·伯雷亚斯·格雷拉特\",\n        \"aya fujisawa\": \"菖蒲（藤泽彩）\",\n        \"musse egret\": \"妙婕·伊格瑞特\",\n        \"alisa reinford\": \"亚莉莎·莱恩福尔特\",\n        \"fie claussell\": \"菲·克劳赛尔\",\n        \"alfin reise arnor\": \"艾尔芬·莱泽·亚诺尔\",\n        \"chen hui-chieh\": \"陈晖洁\",\n        \"hermione granger\": \"赫敏·格兰杰\",\n        \"shizuru hoshino\": \"星野静流\",\n        \"mifuyu ogami\": \"大神美冬\",\n        \"tamaki miyasaka\": \"宫坂珠希\",\n        \"yuuki\": \"佑树\",\n        \"yaya\": \"夜夜\",\n        \"parvati\": \"帕尔瓦蒂\",\n        \"okada izou\": \"冈田以藏\",\n        \"scathach skadi\": \"斯卡哈·斯卡蒂\",\n        \"caenis\": \"凯妮斯\",\n        \"artoria caster\": \"阿尔托莉雅·卡斯特\",\n        \"atlanta\": \"亚特兰大\",\n        \"kadoc zemlupus\": \"卡多克·泽姆露普斯\",\n        \"qin liangyu\": \"秦良玉\",\n        \"swire\": \"诗怀雅\",\n        \"hayase nagatoro\": \"长瀞早濑\",\n        \"texas\": \"德克萨斯\",\n        \"yuuta hibiki\": \"响裕太\",\n        \"emma\": \"艾玛\",\n        \"norman\": \"诺曼\",\n        \"ray\": \"雷\",\n        \"gilda\": \"吉尔达\",\n        \"nat\": \"奈特\",\n        \"anna\": \"安娜\",\n        \"thoma\": \"托马\",\n        \"phil\": \"菲尔\",\n        \"isabella\": \"伊莎贝拉\",\n        \"mujika\": \"穆希卡\",\n        \"sonju\": \"宋杰\",\n        \"lucas\": \"卢卡斯\",\n        \"yugo\": \"尤格\",\n        \"cecily cambell\": \"瑟希莉·坎贝尔\",\n        \"skadi\": \"斯卡蒂\",\n        \"suzuhara lulu\": \"铃原露露\",\n        \"otogibara era\": \"御伽原江良\",\n        \"yorumi rena\": \"夜见蕾娜\",\n        \"yamagami karuta\": \"山神歌流多\",\n        \"asuka hina\": \"飞鸟雏\",\n        \"hina sorasaki\": \"空崎日奈\",\n        \"rimuru tempest\": \"利姆鲁·特恩佩斯特\",\n        \"milim nava\": \"米莉姆·纳瓦\",\n        \"kotoko iwanaga\": \"岩永琴子\",\n        \"meme touwa\": \"藤和女女\",\n        \"makoto niwa\": \"丹羽真\",\n        \"erio touwa\": \"藤和艾莉欧\",\n        \"langa hasegawa\": \"驰河兰加\",\n        \"reki kyan\": \"喜屋武历\",\n        \"myne\": \"梅茵\",\n        \"ferdinand\": \"斐迪南\",\n        \"misato aikawa\": \"爱川美里\",\n        \"mitama yakumo\": \"八云御魂\",\n        \"momoko togame\": \"十咎桃子\",\n        \"aurelia le guin\": \"奥蕾莉亚·勒瑰恩\",\n        \"celine millstein\": \"瑟蕾奴·米尔斯汀\",\n        \"elie macdowell\": \"艾莉·麦克道尔\",\n        \"kea bannings\": \"琪雅·班宁斯\",\n        \"lapis rosenberg\": \"拉碧丝·罗赞贝尔克\",\n        \"nadia rayne\": \"娜狄雅·莱恩\",\n        \"noel seeker\": \"诺艾尔·希卡\",\n        \"rixia mao\": \"莉夏·毛\",\n        \"tio plato\": \"缇欧·普拉托\",\n        \"vita clotilde\": \"薇塔·克洛提德\",\n        \"duvalie\": \"杜巴莉\",\n        \"elise schwarzer\": \"爱丽榭·舒华泽\",\n        \"juna crawford\": \"悠娜·克劳弗德\",\n        \"renne bright\": \"玲·布莱特\",\n        \"emma millstein\": \"艾玛·米尔斯汀\",\n        \"laura s. arseid\": \"劳拉·S·亚尔赛德\",\n        \"shirley orlando\": \"谢莉·奥兰多\",\n        \"tita russel\": \"提妲·拉赛尔\",\n        \"towa herschel\": \"托娃·赫歇尔\",\n        \"claire rieveldt\": \"克蕾雅·利维特\",\n        \"sara valestein\": \"莎拉·巴雷斯坦\",\n        \"estelle bright\": \"艾丝蒂尔·布莱特\",\n        \"klose rinz\": \"科洛丝·琳希\",\n        \"chika misumi\": \"三角千歌\",\n        \"tsumugi mayumiya\": \"茧宫纺希\",\n        \"nozomi sakurai\": \"樱井望\",\n        \"zhongli\": \"钟离\",\n        \"ningguang\": \"凝光\",\n        \"lappland\": \"拉普兰德\",\n        \"amber\": \"安柏\",\n        \"beidou\": \"北斗\",\n        \"hilichurl\": \"丘丘人\",\n        \"lumine\": \"荧\",\n        \"hu tao\": \"胡桃\",\n        \"kallen stadtfeld\": \"卡莲·休坦菲尔特\",\n        \"suzaku kururugi\": \"枢木朱雀\",\n        \"nunnally vi britannia\": \"娜娜莉·vi·布里塔尼亚\",\n        \"kou\": \"蔻\",\n        \"yu takasaki\": \"高咲侑\",\n        \"shioriko mifune\": \"三船栞子\",\n        \"olga discordia\": \"奥利卡·迪斯克伦蒂亚\",\n        \"mamako oosuki\": \"大好真真子\",\n        \"masato oosuki\": \"大好真人\",\n        \"flare arlgrande jioral\": \"芙列雅·艾尔格兰帝·吉欧拉尔\",\n        \"andira\": \"安琪拉\",\n        \"hacka doll no.3\": \"骇客娃娃3号\",\n        \"hacka doll no.1\": \"骇客娃娃1号\",\n        \"hacka doll no.2\": \"骇客娃娃2号\",\n        \"hacka doll no.4\": \"骇客娃娃4号\",\n        \"shinshuu maru\": \"神州丸\",\n        \"akira amatsume\": \"天女目瑛\",\n        \"nao yorihime\": \"依媛奈绪\",\n        \"batman\": \"蝙蝠侠\",\n        \"galo thymos\": \"加洛·提莫斯\",\n        \"lio fotia\": \"里奥·福蒂亚\",\n        \"qiqi\": \"七七\",\n        \"mujina\": \"貉\",\n        \"yume minami\": \"南梦芽\",\n        \"yomogi asanaka\": \"麻中蓬\",\n        \"anne takamaki\": \"高卷杏\",\n        \"hathaway noa\": \"哈撒韦·诺亚\",\n        \"amuro ray\": \"阿姆罗·雷\",\n        \"char aznable\": \"夏亚·阿兹纳布\",\n        \"quess paraya\": \"葵司\",\n        \"alcina dimitrescu\": \"阿契娜·蒂米特雷斯库\",\n        \"akali\": \"阿卡丽\",\n        \"misae nohara\": \"野原美伢\",\n        \"shinnosuke nohara\": \"野原新之助\",\n        \"hiroshi nohara\": \"野原广志\",\n        \"musae koyama\": \"小山梦冴\",\n        \"mineko kazama\": \"风间峰子\",\n        \"south dakota\": \"南达科他\",\n        \"mona megistus\": \"莫娜·梅姬斯图斯\",\n        \"aether\": \"空\",\n        \"fischl\": \"菲谢尔\",\n        \"eula lawrence\": \"优菈·劳伦斯\",\n        \"barbara pegg\": \"芭芭拉\",\n        \"chongyun\": \"重云\",\n        \"xingqiu\": \"行秋\",\n        \"lisa minci\": \"丽莎·敏兹\",\n        \"noelle\": \"诺艾尔\",\n        \"sucrose\": \"砂糖\",\n        \"diona\": \"迪奥娜\",\n        \"rosaria\": \"罗莎莉亚\",\n        \"klee\": \"可莉\",\n        \"xinyan\": \"辛焱\",\n        \"venti\": \"温迪\",\n        \"xiao\": \"魈\",\n        \"razor\": \"雷泽\",\n        \"suzuran\": \"铃兰\",\n        \"hana midorikawa\": \"绿川花\",\n        \"meiko shiraki\": \"白木芽衣子\",\n        \"luz noceda\": \"露丝·诺西达\",\n        \"toph bei fong\": \"北方·托芙\",\n        \"robin\": \"罗宾\",\n        \"eugeo\": \"尤吉欧\",\n        \"quinella\": \"葵妮拉\",\n        \"makima\": \"玛奇玛\",\n        \"denji\": \"电次\",\n        \"angel devil\": \"天使恶魔\",\n        \"yanfei\": \"烟绯\",\n        \"gawr gura\": \"噶呜·古拉\",\n        \"enoch\": \"伊诺库\",\n        \"veronica\": \"维罗妮卡\",\n        \"murasaki yatsu\": \"八津紫\",\n        \"lucifer\": \"路西法\",\n        \"miyu yamano\": \"共月庭\",\n        \"watashi\": \"我\",\n        \"hina amano\": \"天野阳菜\",\n        \"enderman\": \"末影人\",\n        \"creeper\": \"苦力怕\",\n        \"piglin\": \"猪灵\",\n        \"misa amane\": \"弥海砂\",\n        \"l lawliet\": \"艾尔·罗莱特（L）\",\n        \"light yagami\": \"夜神月\",\n        \"akira toya\": \"塔矢亮\",\n        \"akari fujisaki\": \"藤崎明\",\n        \"tetsuo kaga\": \"加贺铁男\",\n        \"asumi nase\": \"奈濑明日美\",\n        \"mitsuko shindo\": \"进藤美津子\",\n        \"yuki mitani\": \"三谷祐辉\",\n        \"kimihiro tsutsui\": \"筒井公宏\",\n        \"yoko ritona\": \"优子\",\n        \"nia teppelin\": \"尼娅\",\n        \"simon\": \"西蒙\",\n        \"kamina\": \"卡米那\",\n        \"merlin\": \"梅林\",\n        \"akira kogami\": \"小神晶\",\n        \"minoru shiraishi\": \"白石稔\",\n        \"ilulu\": \"伊露露\",\n        \"perseus\": \"英仙座\",\n        \"kitasan black\": \"北部玄驹\",\n        \"haru urara\": \"春丽（春乌拉拉）\",\n        \"mayano top gun\": \"摩耶重炮\",\n        \"rice shower\": \"米浴\",\n        \"satono diamond\": \"里见光钻\",\n        \"fuji kiseki\": \"富士奇迹\",\n        \"maruzensky\": \"丸善斯基\",\n        \"mihono bourbon\": \"美浦波旁\",\n        \"mejiro ardan\": \"目白阿尔丹\",\n        \"gold city\": \"黄金城市\",\n        \"meisho doto\": \"名将怒涛\",\n        \"king halo\": \"圣王光环\",\n        \"nice nature\": \"优秀素质\",\n        \"narita taishin\": \"成田大进\",\n        \"tazuna hayakawa\": \"骏川手纲\",\n        \"agnes tachyon\": \"爱丽速子\",\n        \"manhattan cafe\": \"曼城茶座\",\n        \"grass wonder\": \"草上飞\",\n        \"himiko toga\": \"渡我被身子\",\n        \"black rock shooter\": \"黑岩射手\",\n        \"mio kisaki\": \"希咲美樱\",\n        \"lisa eostre\": \"丽莎·埃奥斯托雷\",\n        \"bertille althusser\": \"贝尔缇优·阿鲁奇赛尔\",\n        \"takahiro mizuno\": \"水野贵弘\",\n        \"shinonome\": \"东云\",\n        \"noel marres ascot\": \"诺埃尔·穆利斯·阿斯科特\",\n        \"celia cumani aintree\": \"苏利亚·库玛尼·安特里\",\n        \"ayako hiiragi\": \"柊木绫子\",\n        \"kayneth archibald el-melloi\": \"肯尼斯·埃尔梅罗·阿奇博尔德\",\n        \"romani archaman\": \"罗玛尼·阿其曼\",\n        \"sadako yamamura\": \"山村贞子\",\n        \"ryuuko matoi\": \"缠流子\",\n        \"satsuki kiryuuin\": \"鬼龙院皋月\",\n        \"mako mankanshoku\": \"满舰饰真子\",\n        \"nonon jakuzure\": \"蛇崩乃音\",\n        \"uzu sanageyama\": \"猿投山涡\",\n        \"ragyo kiryuuin\": \"鬼龙院罗晓\",\n        \"nui harime\": \"针目缝\",\n        \"ira gamagoori\": \"蟆郡苛\",\n        \"houka inumuta\": \"犬牟田宝火\",\n        \"aikuro mikisugi\": \"美木杉爱九郎\",\n        \"tsumugu kinagase\": \"黄长濑䌷\",\n        \"kiki\": \"琪琪\",\n        \"saki watanabe\": \"渡边早季\",\n        \"yui funami\": \"船见结衣\",\n        \"chitose ikeda\": \"池田千岁\",\n        \"chinatsu yoshikawa\": \"吉川千夏\",\n        \"nasa yuzaki\": \"由崎星空\",\n        \"tsukasa yuzaki\": \"由崎司（月读司）\",\n        \"ringo-chan\": \"小苹果\",\n        \"yassan\": \"文学少女\",\n        \"yuno gasai\": \"我妻由乃\",\n        \"reisuke houjou\": \"丰穰礼佑\",\n        \"tsubaki kasugano\": \"春日野椿\",\n        \"minene uryuu\": \"雨流美弥弥\",\n        \"yukiteru amano\": \"天野雪辉\",\n        \"motoko kusanagi\": \"草薙素子\",\n        \"mayuri shiina\": \"椎名真由理\",\n        \"rintarou okabe\": \"冈部伦太郎\",\n        \"suzuha amane\": \"阿万音铃羽\",\n        \"moeka kiryuu\": \"桐生萌郁\",\n        \"faris nyannyan\": \"菲利斯·喵喵\",\n        \"anzu\": \"杏子\",\n        \"hitomi mishima\": \"三岛瞳\",\n        \"komekko\": \"米米\",\n        \"airi akizuki\": \"秋月爱莉\",\n        \"kouzou akizuki\": \"秋月孝三\",\n        \"marina akizuki\": \"秋月真理奈\",\n        \"sana kuranaka\": \"仓中纱奈\",\n        \"airi akitsuki\": \"秋月爱莉\",\n        \"amu hinamori\": \"日奈森亚梦\",\n        \"utau hoshina\": \"月咏歌呗\",\n        \"rima mashiro\": \"真城璃茉\",\n        \"ikuto tsukiyomi\": \"月咏几斗\",\n        \"nadeshiko fujisaki\": \"藤咲抚子\",\n        \"akane tsunemori\": \"常守朱\",\n        \"shino amakusa\": \"天草篠\",\n        \"aria shichijou\": \"七条天空\",\n        \"suzu hagimura\": \"萩村铃\",\n        \"uomi\": \"鱼见千寻\",\n        \"takatoshi tsuda\": \"津田隆利\",\n        \"renge miyauchi\": \"宫内莲华\",\n        \"natsumi koshigaya\": \"越谷夏海\",\n        \"yaichi kuzuryuu\": \"九头龙八一\",\n        \"ai yashajin\": \"夜叉神天衣\",\n        \"inuyama tamaki\": \"犬山玉姬\",\n        \"aliza\": \"阿莉莎\",\n        \"sarasa\": \"萨拉萨\",\n        \"hallessena\": \"哈蕾泽娜\",\n        \"izmir\": \"伊休米尔\",\n        \"razia\": \"拉丝缇娜\",\n        \"magisa\": \"玛姬莎\",\n        \"anna hiiragi\": \"柊杏奈\",\n        \"shirley fenette\": \"夏莉·菲内特\",\n        \"milly ashford\": \"米蕾·阿什弗德\",\n        \"anya alstreim\": \"阿妮亚·阿鲁斯特莱依姆\",\n        \"kaguya sumeragi\": \"皇神乐耶\",\n        \"krillin\": \"克林\",\n        \"rudeus greyrat\": \"鲁迪乌斯·格雷拉特\",\n        \"sylphiette\": \"希露菲叶特\",\n        \"zamasu\": \"扎马斯\",\n        \"kokoro\": \"心\",\n        \"christie\": \"克丽丝蒂\",\n        \"mila\": \"米拉\",\n        \"hitomi\": \"瞳\",\n        \"raiden shogun\": \"雷电将军\",\n        \"musubi\": \"结\",\n        \"shut\": \"夏特\",\n        \"princess jasmine\": \"茉莉公主\",\n        \"aladdin\": \"阿拉丁\",\n        \"ariel\": \"爱丽儿\",\n        \"platelet\": \"血小板\",\n        \"ayaka kamisato\": \"神里绫华\",\n        \"shounagon sei\": \"清少纳言\",\n        \"ritsuko akagi\": \"赤木律子\",\n        \"yui ikari\": \"碇唯\",\n        \"gendo ikari\": \"碇源堂\",\n        \"kensou sie\": \"椎拳崇\",\n        \"andy bogard\": \"安迪·博加德\",\n        \"azuma\": \"吾妻\",\n        \"gorgon\": \"戈尔贡\",\n        \"repulse\": \"反击\",\n        \"north carolina\": \"北卡罗来纳\",\n        \"washington\": \"华盛顿\",\n        \"essex\": \"埃塞克斯\",\n        \"indianapolis\": \"印第安纳波利斯\",\n        \"albacore\": \"大青花鱼\",\n        \"new jersey\": \"新泽西\",\n        \"jean bart\": \"让·巴尔\",\n        \"kokomi sangonomiya\": \"珊瑚宫心海\",\n        \"kashino\": \"樫野\",\n        \"chapayev\": \"恰巴耶夫\",\n        \"saint louis\": \"路易九世\",\n        \"yume nijino\": \"虹野梦\",\n        \"laura sakuraba\": \"樱庭劳拉\",\n        \"mahiru kasumi\": \"香澄真昼\",\n        \"koharu nanakura\": \"七仓小春\",\n        \"ako saotome\": \"早乙女亚子\",\n        \"misogi hodaka\": \"穗高未奏希\",\n        \"yuni shingyouji\": \"真行寺由仁\",\n        \"takagi\": \"高木同学\",\n        \"stella unibell\": \"史黛拉·尤尼贝尔\",\n        \"hotaru futaba\": \"双叶萤\",\n        \"keke tang\": \"唐可可\",\n        \"kasumi yoshizawa\": \"芳泽霞\",\n        \"sae niijima\": \"新岛冴\",\n        \"akira kurusu\": \"来栖晓\",\n        \"futaba sakura\": \"佐仓双叶\",\n        \"haru okumura\": \"奥村春\",\n        \"makoto niijima\": \"新岛真\",\n        \"sadayo kawakami\": \"川上贞代\",\n        \"tae takemi\": \"武见妙\",\n        \"chihaya mifune\": \"御船千早\",\n        \"hifumi togo\": \"东乡一二三\",\n        \"yae miko\": \"八重神子\",\n        \"yoimiya naganohara\": \"宵宫\",\n        \"kei yuuki\": \"结城萤\",\n        \"tadayasu sawaki\": \"泽木直保\",\n        \"sortiliena serlut\": \"索尔狄丽娜·赛路尔特\",\n        \"ronye arabel\": \"罗妮耶·亚拉贝尔\",\n        \"tamami wakiyama\": \"胁山珠美\",\n        \"mimi akane\": \"茜美美\",\n        \"ashley graham\": \"阿什莉·格拉汉姆\",\n        \"mutsuki asagi\": \"浅黄睦月\",\n        \"ryo matsunaga\": \"松永凉\",\n        \"xiangling\": \"香菱\",\n        \"tomimi\": \"特米米\",\n        \"eunectes\": \"森蚺\",\n        \"shouko komi\": \"古见硝子\",\n        \"hitohito tadano\": \"只野仁人\",\n        \"itto arataki\": \"荒泷一斗\",\n        \"princess zelda\": \"塞尔达公主\",\n        \"ren hazuki\": \"叶月恋\",\n        \"sumire heanna\": \"平安名堇\",\n        \"lanzhu zhong\": \"钟岚珠\",\n        \"kanon shibuya\": \"涩谷香音\",\n        \"chisato arashi\": \"岚千砂都\",\n        \"mia taylor\": \"米娅·泰勒\",\n        \"kiana kaslana\": \"琪亚娜·卡斯兰娜\",\n        \"sakura yae\": \"八重樱\",\n        \"hornet\": \"大黄蜂\",\n        \"sara kujou\": \"九条裟罗\",\n        \"smart falcon\": \"醒目飞鹰\",\n        \"asuna ichinose\": \"一之濑明日奈\",\n        \"akane murokasa\": \"室笠茜\",\n        \"karin kakudate\": \"角楯花凛\",\n        \"gray wolf\": \"灰狼\",\n        \"brown bear\": \"棕熊\",\n        \"golden snub-nosed monkey\": \"金丝猴\",\n        \"african wild dog\": \"非洲野犬\",\n        \"kusunoki sio\": \"楠栞桜\",\n        \"sara\": \"莎拉\",\n        \"metera\": \"美黛拉\",\n        \"sutera\": \"斯黛拉\",\n        \"chieru kazama\": \"风间千爱瑠\",\n        \"hanako kuroe\": \"黑江花子\",\n        \"kasumi kirihara\": \"雾原霞\",\n        \"makoto aki\": \"安艺真琴\",\n        \"christina morgan\": \"克莉丝提娜·摩根\",\n        \"mythra\": \"光\",\n        \"pyra\": \"焰\",\n        \"cucouroux\": \"库库鲁\",\n        \"jessica\": \"杰西卡\",\n        \"jasmine\": \"茉莉\",\n        \"karva\": \"卡鲁巴\",\n        \"korwa\": \"可露瓦\",\n        \"noriko takaya\": \"高屋法子\",\n        \"kazumi amano\": \"天野和美\",\n        \"jung freud\": \"荣格·佛洛依德\",\n        \"aru rikuhachima\": \"陆八魔亚瑠\",\n        \"hifumi ajitani\": \"阿慈谷日富美\",\n        \"azusa shirasu\": \"白洲梓\",\n        \"hanako urawa\": \"浦和花子\",\n        \"koharu shimoe\": \"下江小春\",\n        \"sheffy\": \"雪菲\",\n        \"miko yotsuya\": \"四谷见子\",\n        \"hana yurikawa\": \"百合川华\",\n        \"yuria niguredou\": \"二暮堂尤利娅\",\n        \"shenhe\": \"申鹤\",\n        \"futaba marui\": \"丸井双叶\",\n        \"mitsuba marui\": \"丸井三叶\",\n        \"hitoha marui\": \"丸井一叶\",\n        \"kanna akizuki\": \"明月栞那\",\n        \"natsume shiki\": \"四季夏目\",\n        \"nozomi sumizome\": \"墨染希\",\n        \"mei hiuchidani\": \"火打谷爱衣\",\n        \"suzune shioyama\": \"汐山凉音\",\n        \"wakana gojou\": \"五条新菜\",\n        \"marin kitagawa\": \"喜多川海梦\",\n        \"akeno himejima\": \"姬岛朱乃\",\n        \"asia argento\": \"爱莎·阿尔杰特\",\n        \"koneko toujou\": \"塔城小猫\",\n        \"rias gremory\": \"莉雅丝·吉蒙里\",\n        \"amamiya kokoro\": \"天宫心\",\n        \"signora\": \"「女士」罗莎琳\",\n        \"trish una\": \"特里休·乌纳\",\n        \"kei shirogane\": \"白银圭\",\n        \"suigintou\": \"水银灯\",\n        \"kirakishou\": \"雪华绮晶\",\n        \"kanaria\": \"金丝雀\",\n        \"suiseiseki\": \"翠星石\",\n        \"shinku\": \"真红\",\n        \"hina ichigo\": \"雏莓\",\n        \"souseiseki\": \"苍星石\",\n        \"hood\": \"胡德\",\n        \"mrs. yuigahama\": \"由比滨妈妈\",\n        \"mudrock\": \"泥岩\",\n        \"nian\": \"年\",\n        \"soraka\": \"索拉卡\",\n        \"doctor\": \"博士\",\n        \"dusk\": \"夕\",\n        \"sabrina\": \"娜姿\",\n        \"nagao kagetora\": \"长尾景虎\",\n        \"shirabe tsukuyomi\": \"月读调\",\n        \"chris yukine\": \"雪音克莉丝\",\n        \"hibiki tachibana\": \"立花响\",\n        \"miku kohinata\": \"小日向未来\",\n        \"gardevoir\": \"沙奈朵\",\n        \"celestine lucullus\": \"塞蕾斯汀·卢库勒斯\",\n        \"lucario\": \"路卡利欧\",\n        \"eren jaeger\": \"艾伦·耶格尔\",\n        \"mikasa ackerman\": \"三笠·阿克曼\",\n        \"armin arlert\": \"阿明·阿诺德\",\n        \"clarisse\": \"克拉莉丝\",\n        \"hilda boreas greyrat\": \"希尔达·伯雷亚斯·格雷拉特\",\n        \"zenith greyrat\": \"塞妮丝·格雷拉特\",\n        \"lilia greyrat\": \"莉莉雅·格雷拉特\",\n        \"hakunon\": \"白野（扎比子）\",\n        \"yoshikage kira\": \"吉良吉影\",\n        \"fuka toyokawa\": \"丰川风花\",\n        \"kana yabuki\": \"矢吹可奈\",\n        \"ayumu maihama\": \"舞浜歩\",\n        \"sekai kamiki\": \"神木世海\",\n        \"kaoruko sazaki\": \"佐崎薰子\",\n        \"izuku midoriya\": \"绿谷出久\",\n        \"mitsuki bakugou\": \"爆豪光己\",\n        \"prushka\": \"普鲁修卡\",\n        \"hakui koyori\": \"博衣小夜璃\",\n        \"satoko houjou\": \"北条沙都子\",\n        \"siesta\": \"谢丝塔\",\n        \"rebecca bluegarden\": \"蕾贝卡·布鲁加甸\",\n        \"aria von reiji asuna\": \"岭司\",\n        \"kokawa asuka\": \"甲河明日香\",\n        \"mutio\": \"妙迪奥\",\n        \"yotsuba koiwai\": \"小岩井四叶\",\n        \"torako\": \"虎子\",\n        \"naruko yokoshima\": \"横岛鸣子\",\n        \"aoi hinami\": \"日南葵\",\n        \"feena fam earthlight\": \"菲娜·法姆·阿修莱特\",\n        \"akiko minase\": \"水濑秋子\",\n        \"yuuichi aizawa\": \"水濑名雪\",\n        \"itako tohoku\": \"东北伊达子\",\n        \"una otomachi\": \"音街鳗\",\n        \"kokona aoba\": \"青羽心夏\",\n        \"sayu\": \"早柚\",\n        \"takanashi kiara\": \"小鸟游琪亚拉\",\n        \"yumeko jabami\": \"蛇喰梦子\",\n        \"reed\": \"苇草\",\n        \"ui kozeki\": \"古关忧\",\n        \"battler ushiromiya\": \"右代宫战人\",\n        \"sideroca\": \"铸铁\",\n        \"utage\": \"宴\",\n        \"siege\": \"推进之王\",\n        \"barghest\": \"巴格斯特（犬魔）\",\n        \"yellow heart\": \"黄色之心\",\n        \"orange heart\": \"橙色之心\",\n        \"kotonoha katsura\": \"桂言叶\",\n        \"kokoro katsura\": \"桂心\",\n        \"sekai saionji\": \"西园寺世界\",\n        \"makoto itou\": \"伊藤诚\",\n        \"violet evergarden\": \"薇尔莉特·伊芙加登\",\n        \"lelei la lelena\": \"蕾莱·拉·列娜\",\n        \"youji itami\": \"伊丹耀司\",\n        \"pina co lada\": \"平娜·戈·兰达\",\n        \"rory mercury\": \"萝莉·麦丘利\",\n        \"yao haa dushi\": \"姚·汉·蒂修\",\n        \"tuka luna marceau\": \"杜嘉·露娜·马尔席\",\n        \"jeanne\": \"贞德\",\n        \"bayonetta\": \"贝优妮塔\",\n        \"elinalise dragonroad\": \"艾莉娜丽洁·杜拉冈罗德\",\n        \"neneko\": \"鈴樹ねね\",\n        \"mona\": \"莫娜\",\n        \"komichi akebi\": \"明日小路\",\n        \"alisa southerncross\": \"爱莉莎·南十字星\",\n        \"shishiro botan\": \"狮白牡丹\",\n        \"bennett\": \"班尼特\",\n        \"ruri hoshino\": \"星野·琉璃\",\n        \"lanling wang\": \"兰陵王\",\n        \"andrew gilbert mills\": \"安德鲁·基尔巴特·米尔斯\",\n        \"shizuku kuroe\": \"黑江雫\",\n        \"ellen baker\": \"艾伦·贝可\",\n        \"shizune\": \"静音\",\n        \"kurenai yuhi\": \"夕日红\",\n        \"mei terumi\": \"照美冥\",\n        \"ai ohto\": \"大户爱\",\n        \"kurumi ebisuzawa\": \"惠飞须泽胡桃\",\n        \"rita rossweisse\": \"丽塔·洛丝薇瑟\",\n        \"yor forger\": \"约尔·福杰\",\n        \"misaki tobisawa\": \"鸢泽美咲\",\n        \"morgan le fay\": \"摩根勒菲\",\n        \"nishizono chigusa\": \"西园千草\",\n        \"sherry birkin\": \"雪莉·柏金\",\n        \"ratna petit\": \"拉特娜·葡蒂\",\n        \"shigure ui\": \"时雨羽衣\",\n        \"suo sango\": \"周央珊瑚\",\n        \"lakshmibai\": \"拉克什米·芭伊\",\n        \"inui toko\": \"戌亥とこ\",\n        \"krul tepes\": \"克鲁鲁·采佩西\",\n        \"mutsumi otohime\": \"乙姬睦美\",\n        \"shinobu maehara\": \"前原忍\",\n        \"naru narusegawa\": \"成濑川奈留\",\n        \"meidri\": \"梅朵莉\",\n        \"crimvael\": \"克莉姆\",\n        \"samus aran\": \"萨姆斯·亚兰\",\n        \"otome saotome\": \"早乙女乙女\",\n        \"melusine\": \"美露莘\",\n        \"baobhan sith\": \"芭万·希\",\n        \"suomi\": \"索米\",\n        \"guilmon\": \"基尔兽\",\n        \"impmon\": \"小妖兽\",\n        \"nonomi izayoi\": \"十六夜野宫\",\n        \"yuuma toutetsu\": \"饕餮尤魔\",\n        \"miyuki kobayakawa\": \"小早川美幸\",\n        \"natsumi tsujimoto\": \"辻本夏实\",\n        \"yoriko nikaido\": \"二阶堂赖子\",\n        \"kyousuke natsume\": \"枣恭介\",\n        \"rin natsume\": \"枣铃\",\n        \"kobeni yonomori\": \"夜之森小红\",\n        \"sheryl nome\": \"雪露·诺姆\",\n        \"iori shiromi\": \"银镜伊织\",\n        \"barbara\": \"芭芭菈\",\n        \"enji todoroki\": \"轰炎司\",\n        \"nagisa minase\": \"水濑渚\",\n        \"lum\": \"拉姆\",\n        \"raiden\": \"雷电\",\n        \"tien shinhan\": \"天津饭\",\n        \"theresa apocalypse\": \"德丽莎·阿波卡利斯\",\n        \"rozaliya olenyeva\": \"萝莎莉娅·阿琳\",\n        \"liliya olenyeva\": \"莉莉娅·阿琳\",\n        \"torte\": \"托蒂\",\n        \"nausicaa\": \"娜乌西卡\",\n        \"belle\": \"贝儿\",\n        \"shun sunohara\": \"春原瞬\",\n        \"surtr\": \"史尔特尔\",\n        \"mostima\": \"莫斯提马\",\n        \"tensai ikkyuu\": \"一级天灾\",\n        \"daruku hoshino\": \"星野达鲁克\",\n        \"nanana ryuugajou\": \"龙娘七七七\",\n        \"nanami arihara\": \"在原七海\",\n        \"mai kawasumi\": \"川澄舞\",\n        \"yelan\": \"夜兰\",\n        \"baki hanma\": \"范马刃牙\",\n        \"mana inuyama\": \"犬山真名\",\n        \"megumi\": \"惠美\",\n        \"rumi\": \"留美\",\n        \"mare s. ephemeral\": \"梅娅·S·艾菲梅拉尔\",\n        \"loid forger\": \"劳埃德·福杰\",\n        \"anna yamada\": \"山田杏奈\",\n        \"kyoutarou ichikawa\": \"市川京太郎\",\n        \"pramanix\": \"初雪\",\n        \"medaka kurokami\": \"黑神目泷\",\n        \"miss crane\": \"鹤小姐\",\n        \"mordred\": \"莫德雷德\",\n        \"mikaela hyakuya\": \"百夜米迦尔\",\n        \"laplus darknesss\": \"拉普拉斯·达克尼斯\",\n        \"mori calliope\": \"森美声\",\n        \"ninomae inanis\": \"一伊那尔栖\",\n        \"sakamata chloe\": \"沙花叉库洛艾\",\n        \"kazama iroha\": \"风真伊吕波\",\n        \"weedy\": \"温蒂\",\n        \"makino yagami\": \"八神牧野\",\n        \"lu bu\": \"吕布\",\n        \"namiko\": \"奈美子\",\n        \"hass\": \"莲\",\n        \"kazuha kaedehara\": \"枫原万叶\",\n        \"scaramouche\": \"「散兵」（国崩）\",\n        \"himiko\": \"卑弥呼\",\n        \"zenobia\": \"芝诺比娅\",\n        \"paris\": \"帕里斯\",\n        \"captain nemo\": \"尼莫船长\",\n        \"sukuna\": \"两面宿傩\",\n        \"yuuji itadori\": \"虎杖悠仁\",\n        \"megumi fushiguro\": \"伏黑惠\",\n        \"caitlyn\": \"凯特琳\",\n        \"nikaido\": \"二阶堂\",\n        \"reno\": \"里诺\",\n        \"aegir\": \"埃吉尔\",\n        \"shinano\": \"信浓\",\n        \"foxhound\": \"狐提\",\n        \"pamiat merkuria\": \"水星纪念\",\n        \"nurnberg\": \"纽伦堡\",\n        \"nicholas\": \"尼古拉斯\",\n        \"icarus\": \"伊卡洛斯\",\n        \"palutena\": \"帕露蒂娜\",\n        \"pit\": \"皮特\",\n        \"bozes co palesti\": \"波赛斯·戈·芭蕾丝蒂\",\n        \"noi\": \"能井\",\n        \"scirocco\": \"东南风\",\n        \"miyuki kujou\": \"九条美雪\",\n        \"specter\": \"幽灵鲨\",\n        \"aether foundation employee\": \"以太基金会员工\",\n        \"hiling\": \"希琳\",\n        \"yoshino kousaka\": \"高坂佳乃\",\n        \"kuzuha togashi\": \"富㭴樟叶\",\n        \"ichigo hoshimiya\": \"星宫莓\",\n        \"aoi kiriya\": \"雾矢葵\",\n        \"yurika toudou\": \"藤堂百合香\",\n        \"kirara hanazono\": \"花园绮罗\",\n        \"orihime mitsuishi\": \"光石织姬\",\n        \"noeru otoshiro\": \"音城诺艾儿\",\n        \"raki kiseki\": \"姬石来希\",\n        \"ringo hoshimiya\": \"星宫苹果\",\n        \"tsubasa kisaragi\": \"如月翼\",\n        \"seira otoshiro\": \"音城塞拉\",\n        \"alicia charlotte\": \"艾丽西亚·夏洛特\",\n        \"aine yuuki\": \"友希爱音\",\n        \"asahi kasumi\": \"香澄朝阳\",\n        \"yozora kasumi\": \"香澄夜空\",\n        \"sumire hikami\": \"冰上堇\",\n        \"akari oozora\": \"大空明\",\n        \"risa shirakaba\": \"白桦丽莎\",\n        \"nono daichi\": \"大地乃野\",\n        \"sora kazesawa\": \"风泽空\",\n        \"kii saegusa\": \"冴草纪伊\",\n        \"mio minato\": \"凑美绪\",\n        \"rin kurosawa\": \"黑泽凛\",\n        \"ran shibuki\": \"紫吹兰\",\n        \"juri kurebayashi\": \"红林珠璃\",\n        \"hinaki shinjou\": \"新条雏姬\",\n        \"madoka amahane\": \"天羽圆香\",\n        \"hime shiratori\": \"白鸟姬\",\n        \"sussurro\": \"苏苏洛\",\n        \"alice tendou\": \"天童爱丽丝\",\n        \"hanabi hyuga\": \"日向花火\",\n        \"chisato hasegawa\": \"长谷川千里\",\n        \"anko kitashirakawa\": \"北白川馅子\",\n        \"seraphine\": \"萨勒芬妮\",\n        \"erich von rerugen\": \"埃里希·冯·雷鲁根\",\n        \"luciela r. sourcream\": \"露西艾拉·R·索克莉姆\",\n        \"eris\": \"厄里斯\",\n        \"luna\": \"露娜\",\n        \"yamato no kami yasusada\": \"大和守安定\",\n        \"takane lui\": \"鹰岭露依\",\n        \"charlotte e. yeager\": \"夏洛特·E·叶格\",\n        \"erica hartmann\": \"艾莉卡·哈特曼\",\n        \"gertrud barkhorn\": \"歌尔特露特·巴克霍隆\",\n        \"lynette bishop\": \"莉涅特·毕晓普\",\n        \"minna-dietlinde wilcke\": \"明娜·迪特林德·威尔克\",\n        \"sanya v. litvyak\": \"萨妮娅·V·利特维亚克\",\n        \"yoshika miyafuji\": \"宫藤芳佳\",\n        \"yoruichi shihoin\": \"四枫院夜一\",\n        \"tia halibel\": \"蒂雅·赫丽贝尔\",\n        \"muzan kibutsuji\": \"鬼舞辻无惨\",\n        \"karna\": \"迦尔纳\",\n        \"victorique de blois\": \"维多利加\",\n        \"kazuya kujou\": \"久城一弥\",\n        \"matsurika shinouji\": \"汐王寺茉莉花\",\n        \"sayu ogiwara\": \"荻原沙优\",\n        \"airi gotou\": \"后藤爱依梨\",\n        \"dark elven forest ranger\": \"dark elven forest ranger\",\n        \"kie kamado\": \"灶门葵枝\",\n        \"watson amelia\": \"阿米莉亚·华生\",\n        \"edmond dantes\": \"爱德蒙·唐泰斯（岩窟王）\",\n        \"ariane glenys maple\": \"阿里安\",\n        \"yukihana lamy\": \"雪花菈米\",\n        \"scarlet witch\": \"绯红女巫\",\n        \"wanda maximoff\": \"旺达\",\n        \"camie utsushimi\": \"现见凯米\",\n        \"tsubame koyasu\": \"子安燕\",\n        \"akari acura\": \"阿卡莉·亚裘拉\",\n        \"chaika trabant\": \"嘉依卡·托勒庞特\",\n        \"david\": \"大卫\",\n        \"toru acura\": \"托鲁·亚裘拉\",\n        \"chaika bogdan\": \"嘉依卡·布芙丹\",\n        \"hyakumantenbara salome\": \"壹百满天原莎乐美\",\n        \"miruki amauri\": \"甘瓜牛奶\",\n        \"ouro kronii\": \"奥罗·克洛尼\",\n        \"katsuki bakugou\": \"爆豪胜己\",\n        \"kyouko takizawa\": \"泷泽京子\",\n        \"black prince\": \"黑太子\",\n        \"tomoko kuroki\": \"黑木智子\",\n        \"yukari miyako\": \"都由香里\",\n        \"clare\": \"克蕾雅\",\n        \"raki\": \"拉基\",\n        \"teresa\": \"泰蕾莎\",\n        \"samira\": \"莎弥拉\",\n        \"katarina du couteau\": \"卡特琳娜·杜·克卡奥\",\n        \"kaltsit\": \"凯尔希\",\n        \"maho hiyajo\": \"比屋定真帆\",\n        \"venom\": \"毒液\",\n        \"katarina claes\": \"卡塔莉娜·库莱耶思\",\n        \"maria campbell\": \"玛丽亚·坎贝尔\",\n        \"diluc ragnvindr\": \"迪卢克·莱艮芬德\",\n        \"kaeya alberich\": \"凯亚·亚尔伯里奇\",\n        \"anya forger\": \"阿尼亚·福杰\",\n        \"morrigan aensland\": \"莫莉卡·安斯兰特\",\n        \"becky blackbell\": \"贝琪·布莱克贝尔\",\n        \"warfarin\": \"华法琳\",\n        \"platinum\": \"白金\",\n        \"rise kujikawa\": \"久慈川理世\",\n        \"yuu narukami\": \"鸣上悠\",\n        \"itaru hashida\": \"桥田至\",\n        \"tenten\": \"天天\",\n        \"hoshiguma\": \"星熊\",\n        \"flamebringer\": \"炎客\",\n        \"matterhorn\": \"角峰\",\n        \"silverash\": \"银灰\",\n        \"ptilopsis\": \"白面鸮\",\n        \"blemishine\": \"瑕光\",\n        \"whislash\": \"鞭刃\",\n        \"dobermann\": \"杜宾\",\n        \"nearl\": \"临光\",\n        \"blue poison\": \"蓝毒\",\n        \"skyfire\": \"天火\",\n        \"bison\": \"拜松\",\n        \"croissant\": \"可颂\",\n        \"arcanine\": \"风速狗\",\n        \"akari\": \"小照\",\n        \"irida\": \"珠贝\",\n        \"palina\": \"瓜娜\",\n        \"ambriel\": \"安比尔\",\n        \"feater\": \"食铁兽\",\n        \"closure\": \"可露希尔\",\n        \"melantha\": \"玫兰莎\",\n        \"perfumer\": \"调香师\",\n        \"grani\": \"格拉尼\",\n        \"angelina ajimu\": \"安心院安洁莉娜\",\n        \"ceobe\": \"刻俄柏\",\n        \"franka\": \"芙兰卡\",\n        \"liskarm\": \"雷蛇\",\n        \"blaze\": \"煌\",\n        \"shamare\": \"巫恋\",\n        \"popukar\": \"泡普卡\",\n        \"schwarz\": \"黑\",\n        \"rosmontis\": \"迷迭香\",\n        \"eyjafjalla\": \"艾雅法拉\",\n        \"deepcolor\": \"深海色\",\n        \"ayerscarpe\": \"断崖\",\n        \"leonhardt\": \"莱恩哈特\",\n        \"asbestos\": \"石棉\",\n        \"magallan\": \"麦哲伦\",\n        \"podenco\": \"波登可\",\n        \"kroos\": \"克洛丝\",\n        \"gavial\": \"嘉维尔\",\n        \"vigna\": \"红豆\",\n        \"glaucus\": \"格劳克斯\",\n        \"vermeil\": \"红云 | 维尔梅\",\n        \"ansel\": \"安赛尔\",\n        \"ceylon\": \"锡兰\",\n        \"sicily von claude\": \"西希莉·冯·克洛德\",\n        \"beeswax\": \"蜜蜡\",\n        \"youtouhime\": \"妖刀姬\",\n        \"ivy valentine\": \"艾薇\",\n        \"taki\": \"多喜\",\n        \"yuzu hanaoka\": \"花冈柚子\",\n        \"iroha natsume\": \"枣伊吕波\",\n        \"sasara kusugawa\": \"久寿川莎莎菈\",\n        \"maako asagiri\": \"朝雾麻亚子\",\n        \"amane\": \"亚麻音\",\n        \"setsu\": \"雪\",\n        \"mian\": \"魅杏\",\n        \"yuuka hayase\": \"早濑优香\",\n        \"azusa hanai\": \"花井梓\",\n        \"maria momoe\": \"百枝麻里亚\",\n        \"kraft lawrence\": \"克拉福·罗伦斯\",\n        \"orihime inoue\": \"井上织姬\",\n        \"elysia\": \"爱莉希雅\",\n        \"kayoko onikata\": \"鬼方佳世子\",\n        \"aoi tosaka\": \"远坂葵\",\n        \"sothis\": \"苏谛斯\",\n        \"shamir nevrand\": \"萨米亚·涅芙兰特\",\n        \"edelgard von hresvelg\": \"艾黛尔贾特·冯·弗雷斯贝尔古\",\n        \"rhea\": \"蕾雅\",\n        \"byleth eisner\": \"贝雷丝·艾斯纳\",\n        \"hoshino takanashi\": \"小鸟游星野\",\n        \"miyu kasumizawa\": \"霞泽美游\",\n        \"midori saiba\": \"才羽绿\",\n        \"momoi saiba\": \"才羽桃井\",\n        \"kaede isami\": \"勇美枫\",\n        \"mari iochi\": \"伊落玛丽\",\n        \"izuna kuda\": \"久田泉奈\",\n        \"fuuka aikiyo\": \"爱清枫香\",\n        \"haruna kurodate\": \"黑馆羽留奈\",\n        \"chinatsu hinomiya\": \"火宫千夏\",\n        \"shiroko sunaookami\": \"砂狼白子\",\n        \"neru mikamo\": \"美甘宁瑠\",\n        \"tsubaki kasuga\": \"春日椿\",\n        \"mika misono\": \"圣园未花\",\n        \"ako amau\": \"天雨亚子\",\n        \"natsu yutori\": \"柚鸟夏\",\n        \"kagome higurashi\": \"日暮戈薇\",\n        \"inuyasha\": \"犬夜叉\",\n        \"hitomi shizuki\": \"志筑仁美\",\n        \"nakoruru\": \"娜可露露\",\n        \"tomo yamanobe\": \"山边灯\",\n        \"calamity jane\": \"灾星简\",\n        \"charlotte corday\": \"夏洛特·科黛\",\n        \"ibuki douji\": \"伊吹童子\",\n        \"ranpha\": \"兰法\",\n        \"geo stelar\": \"星河昴\",\n        \"luna platz\": \"白金露娜\",\n        \"yugito nii\": \"二位柚木门\",\n        \"kanade yoisaki\": \"宵崎奏\",\n        \"mafuyu asahina\": \"朝比奈真冬\",\n        \"kanu unchou\": \"关羽云长\",\n        \"housen ryofu\": \"吕布奉先\",\n        \"shimei ryomou\": \"吕蒙子明\",\n        \"hakufu sonsaku\": \"孙策伯符\",\n        \"gentoku ryuubi\": \"刘备玄德\",\n        \"ekitoku chouhi\": \"张飞益德\",\n        \"myousai kakouen\": \"夏侯渊妙才\",\n        \"yojo bashoku\": \"马谡幼常\",\n        \"shiryuu chouun\": \"赵云子龙\",\n        \"chuukou kyocho\": \"许诸仲康\",\n        \"hakugen rikuson\": \"陆逊伯言\",\n        \"chuutatsu shibai\": \"司马懿仲达\",\n        \"shikou soujin\": \"曹仁子孝\",\n        \"mouyuu\": \"孟优\",\n        \"takezou shinmen\": \"新免武藏\",\n        \"chousen\": \"貂蝉\",\n        \"benkei musashibo\": \"武藏坊弁庆\",\n        \"genpou saji\": \"左慈元放\",\n        \"bunwa kaku\": \"贾诩文和\",\n        \"ukitsu\": \"于吉\",\n        \"shifu choushou\": \"张昭子布\",\n        \"koshaji\": \"胡车儿\",\n        \"moukaku\": \"孟获\",\n        \"kotetsu\": \"虎彻\",\n        \"arezu\": \"火夏\",\n        \"phineas flynn\": \"飞哥·福林\",\n        \"ferb fletcher\": \"小佛‧富雷察\",\n        \"miko kurokawa\": \"黒川みこ\",\n        \"rimururu\": \"莉姆露露\",\n        \"yoichi nasu no suketaka\": \"那须与一\",\n        \"bridget\": \"布里奇特\",\n        \"princess marie ange\": \"マリー・アンジュ 王女\",\n        \"sakura kagamihara\": \"各务原樱\",\n        \"frederica irving\": \"フレドリカ・アーヴィング\",\n        \"junko enoshima\": \"江之岛盾子\",\n        \"chisato nishikigi\": \"锦木千束\",\n        \"takina inoue\": \"井之上泷奈\",\n        \"rihoko amaha\": \"天羽梨穂子\",\n        \"masane amaha\": \"天羽雅音\",\n        \"ayaka tachikawa\": \"立川绚香\",\n        \"aomi yanagisako\": \"柳迫碧美\",\n        \"airi\": \"爱莉\",\n        \"melona\": \"美萝娜\",\n        \"merlin prototype\": \"梅林prototype\",\n        \"shuna\": \"朱菜\",\n        \"lenalee lee\": \"利娜莉·李\",\n        \"natsuru senou\": \"濑能名津流\",\n        \"shizuku sangou\": \"三乡雫\",\n        \"akane mishima\": \"美岛红音\",\n        \"minoru mineta\": \"峰田实\",\n        \"natalia luzu kimlasca-lanvaldear\": \"娜塔莉亚·卢慈·基姆拉斯卡·兰帕尔迪亚\",\n        \"eleonora viltaria\": \"艾蕾欧诺拉·维尔塔利亚\",\n        \"limalisha\": \"莉姆亚莉夏\",\n        \"ludmila lourie\": \"琉德米拉·露利叶\",\n        \"sofya obertas\": \"苏菲亚·欧贝达斯\",\n        \"tigrevurmud vorn\": \"堤格尔维尔穆德·冯伦\",\n        \"kobeni higashiyama\": \"东山小红\",\n        \"hildegarde\": \"希尔迪嘉露塔\",\n        \"aoi kunieda\": \"邦枝葵\",\n        \"sajuna inui\": \"乾纱寿叶\",\n        \"toushirou hitsugaya\": \"日番谷冬狮郎\",\n        \"soi fon\": \"碎蜂\",\n        \"guan yinping\": \"关银屏\",\n        \"xing cai\": \"张星彩\",\n        \"zhen ji\": \"甄姬\",\n        \"moriko morioka\": \"盛冈森子\",\n        \"yuuta sakurai\": \"樱井优太\",\n        \"lily\": \"莉莉\",\n        \"hinata kuraue\": \"仓上日向\",\n        \"aoi yukimura\": \"雪村葵\",\n        \"furen e lustario\": \"芙莲·E·露丝塔莉欧\",\n        \"nui sociere\": \"纽伊·索西艾瑞\",\n        \"yachiru kusajishi\": \"草鹿八千流\",\n        \"kagura nana\": \"神乐七奈\",\n        \"arlecchino\": \"「仆人」阿蕾奇诺\",\n        \"platinum the trinity\": \"白金·崔妮蒂\",\n        \"marta lualdi\": \"玛尔塔·路亚蒂\",\n        \"asuka katou\": \"加藤明日香\",\n        \"august von parseval\": \"奥古斯特·冯·帕塞瓦尔\",\n        \"shinn asuka\": \"真·飞鸟\",\n        \"yuzuki seo\": \"濑尾结月\",\n        \"saki yoshida\": \"吉田咲\",\n        \"nahida\": \"纳西妲\",\n        \"mitsuru kirijo\": \"桐条美鹤\",\n        \"kaguya otonashi\": \"音无辉夜\",\n        \"kaoru tanamachi\": \"棚町薰\",\n        \"nilou\": \"妮露\",\n        \"princess elsa\": \"艾莎公主\",\n        \"kristoff bjorgman\": \"克斯托夫\",\n        \"athrun zala\": \"阿斯兰·萨拉\",\n        \"rey za burrel\": \"雷·札·巴雷尔\",\n        \"mako hitachi\": \"常陆茉子\",\n        \"yoshino tomotake\": \"朝武芳乃\",\n        \"lena liechtenauer\": \"蕾娜·列支敦瑙尔\",\n        \"tamaki tamada\": \"玉田环\",\n        \"shizuko hosomi\": \"细见静子\",\n        \"yagen toushirou\": \"药研藤四郎\",\n        \"shinano toushirou\": \"信浓藤四郎\",\n        \"gotou toushirou\": \"后藤藤四郎\",\n        \"atsushi toushirou\": \"厚藤四郎\",\n        \"saniwa\": \"审神者\",\n        \"houchou toushirou\": \"包丁藤四郎\",\n        \"shokudaikiri mitsutada\": \"烛台切光忠\",\n        \"horikawa kunihiro\": \"堀川国广\",\n        \"vajra\": \"瓦姬拉\",\n        \"tighnari\": \"提纳里\",\n        \"hinata wakaba\": \"若葉日向\",\n        \"chihiro kagami\": \"各务千寻\",\n        \"perrine h. clostermann\": \"佩琳·H·克洛斯特曼\",\n        \"bronya zaychik\": \"布洛妮娅·扎伊切克\",\n        \"danzou katou\": \"加藤段藏\",\n        \"fubuki nemugaki\": \"合欢垣吹雪\",\n        \"serika kuromi\": \"黑见芹香\",\n        \"ayane okusora\": \"奥空绫音\",\n        \"mikan hinatsuki\": \"阳夏木蜜柑\",\n        \"sword maiden\": \"剑之圣女\",\n        \"chigusa kisaragi\": \"如月千种\",\n        \"dobrynya nikitich\": \"多布雷尼亚·尼基季奇\",\n        \"aratsuka ogami\": \"荒塚オガミ\",\n        \"nishikata\": \"西片\",\n        \"nezha\": \"哪吒\",\n        \"carol malus dienheim\": \"卡萝·马尔斯·狄恩海姆\",\n        \"dori\": \"多莉\",\n        \"rikka morizono\": \"森园立夏\",\n        \"aponia\": \"阿波尼亚\",\n        \"carole pepper\": \"卡萝尔·佩珀\",\n        \"rean schwarzer\": \"黎恩·舒华泽\",\n        \"millium orion\": \"米莉亚姆·奥莱恩\",\n        \"candace\": \"坎蒂丝\",\n        \"mei raiden\": \"雷电芽衣\",\n        \"durandal\": \"幽兰黛尔\",\n        \"himeko murata\": \"无量塔姬子\",\n        \"seele vollerei\": \"希儿·芙乐艾\",\n        \"cecilia schariac\": \"塞西莉亚·沙尼亚特\",\n        \"shinobu kuki\": \"久岐忍\",\n        \"springfield\": \"春田\",\n        \"natasha cioara\": \"娜塔莎·希奥拉（渡鸦）\",\n        \"fu hua\": \"符华\",\n        \"timido cute\": \"缇米朵·丘忒\",\n        \"mobius\": \"梅比乌斯\",\n        \"heizou shikanoin\": \"鹿野院平藏\",\n        \"columbina\": \"「少女」哥伦比娅\",\n        \"tartaglia\": \"「公子」达达利亚\",\n        \"gorou\": \"五郎\",\n        \"kallen kaslana\": \"卡莲·卡斯兰娜\",\n        \"yun jin\": \"云堇\",\n        \"kloe rinz\": \"科洛丝·琳希\",\n        \"anelace elfead\": \"亚妮拉丝·艾尔菲德\",\n        \"scherazard harvey\": \"雪拉扎德·哈维\",\n        \"shizuna rem misurugi\": \"静名·雷姆·御折木\",\n        \"ragna the bloodedge\": \"拉格纳·布莱德艾奇\",\n        \"noel vermillion\": \"诺爱儿·梵蜜莉欧\",\n        \"es\": \"Es\",\n        \"kajun faycott\": \"花隼·法伊科特\",\n        \"mai natsume\": \"麻衣·枣\",\n        \"makoto nanaya\": \"诚·七夜\",\n        \"ayato kamisato\": \"神里绫人\",\n        \"tsubaki yayoi\": \"椿·弥生\",\n        \"lambda-11\": \"Λ-No.11-\",\n        \"mu-12\": \"μ-No.12-\",\n        \"nu-13\": \"ν-No.13-\",\n        \"jin kisaragi\": \"琴恩·如月\",\n        \"erice utsumi\": \"宇津见绘里濑\",\n        \"emiya alter\": \"卫宫Alter\",\n        \"shinoa hiiragi\": \"柊筱娅\",\n        \"fatui electro cicin mage\": \"雷萤术士\",\n        \"fatui cryo cicin mage\": \"冰萤术士\",\n        \"mirror maiden\": \"藏镜仕女\",\n        \"sirin\": \"西琳\",\n        \"dehya\": \"迪希雅\",\n        \"noa ushio\": \"生盐诺亚\",\n        \"kokona sunohara\": \"春原心奈\",\n        \"hasumi hanekawa\": \"羽川莲见\",\n        \"hibiki nekozuka\": \"猫冢响\",\n        \"arona\": \"阿罗娜\",\n        \"saki sorai\": \"空井咲\",\n        \"collei\": \"柯莱\",\n        \"lavenza\": \"拉雯妲\",\n        \"von lycaon\": \"冯·莱卡恩\",\n        \"cyborg\": \"赛博格\",\n        \"april\": \"四月\",\n        \"eevee\": \"伊布\",\n        \"sylveon\": \"仙子伊布\",\n        \"vaporeon\": \"水伊布\",\n        \"jolteon\": \"雷伊布\",\n        \"flareon\": \"火伊布\",\n        \"espeon\": \"太阳伊布\",\n        \"umbreon\": \"月亮伊布\",\n        \"leafeon\": \"叶伊布\",\n        \"glaceon\": \"冰伊布\",\n        \"piplup\": \"波加曼\",\n        \"turtwig\": \"草苗龟\",\n        \"meowth\": \"喵喵\",\n        \"cinderace\": \"闪焰王牌\",\n        \"lopunny\": \"长耳兔\",\n        \"absol\": \"阿勃梭鲁\",\n        \"banette\": \"诅咒娃娃\",\n        \"braixen\": \"长尾火狐\",\n        \"bulbasaur\": \"妙蛙种子\",\n        \"delphox\": \"妖火红狐\",\n        \"ditto\": \"百变怪\",\n        \"greninja\": \"甲贺忍蛙\",\n        \"kirlia\": \"奇鲁莉安\",\n        \"lugia\": \"洛奇亚\",\n        \"mawile\": \"大嘴娃\",\n        \"nidoqueen\": \"尼多后\",\n        \"primarina\": \"西狮海壬\",\n        \"reshiram\": \"莱希拉姆\",\n        \"salazzle\": \"焰后蜥\",\n        \"samurott\": \"大剑鬼\",\n        \"scorbunny\": \"炎兔儿\",\n        \"zekrom\": \"捷克罗姆\",\n        \"zeraora\": \"捷拉奥拉\",\n        \"iono\": \"奇树\",\n        \"maho himemiya\": \"姬宫真步\",\n        \"ahri\": \"阿狸\",\n        \"lillia\": \"莉莉娅\",\n        \"thresh\": \"锤石\",\n        \"sophia nishikinomiya\": \"苏菲亚·锦之宫\",\n        \"anna nishikinomiya\": \"安娜·锦之宫\",\n        \"moona hoshinova\": \"Moona Hoshinova\",\n        \"miya chinen\": \"知念实也\",\n        \"koushi sugawara\": \"菅原孝支\",\n        \"shoyo hinata\": \"日向翔阳\",\n        \"taiga kagami\": \"火神大我\",\n        \"tetsuya kuroko\": \"黑子哲也\",\n        \"daiki aomine\": \"青峰大辉\",\n        \"haruka nanase\": \"七濑遥\",\n        \"rin matsuoka\": \"松冈凛\",\n        \"yuki\": \"雪\",\n        \"louise\": \"露易兹\",\n        \"ellen\": \"爱莲\",\n        \"kana anaberal\": \"卡娜·安娜贝拉尔\",\n        \"misaki kagome\": \"笼目深沙希\",\n        \"momo hinamori\": \"雏森桃\",\n        \"chen hai\": \"镇海\",\n        \"leeloo minai lekatariba-lamina-tchai ekbat de sebat\": \"Leeloo\",\n        \"hasshaku-sama\": \"八尺大人\",\n        \"ushio kofune\": \"小舟潮\",\n        \"moe kazekura\": \"风仓萌绘\",\n        \"eiko tsukimi\": \"月见英子\",\n        \"hitori gotou\": \"后藤一里\",\n        \"tsukuyo oono\": \"大野筑夜\",\n        \"mikoto aketa\": \"緋田美琴\",\n        \"nazuna nanakusa\": \"七草荠\",\n        \"revy\": \"莱薇\",\n        \"natsumi kurobe\": \"黑部夏美\",\n        \"assaultron\": \"突袭者机器人\",\n        \"satoru gojo\": \"五条悟\",\n        \"aki hayakawa\": \"早川秋\",\n        \"annie leonhart\": \"阿尼·利昂纳德\",\n        \"nekomiya hinata\": \"猫宫日向\",\n        \"himeno ayanokoji\": \"绫小路姫乃\",\n        \"seia yurizono\": \"百合园圣娅\",\n        \"hanae asagao\": \"朝颜花绘\",\n        \"saori joumae\": \"锭前纱织\",\n        \"nijika ijichi\": \"伊地知虹夏\",\n        \"ryou yamada\": \"山田凉\",\n        \"ikuyo kita\": \"喜多郁代\",\n        \"mewtwo\": \"超梦\",\n        \"shion\": \"紫苑\",\n        \"nemu manaka\": \"真中合欢\",\n        \"rinne byakuya\": \"白夜凛音\",\n        \"hanabi yasuraoka\": \"安乐冈花火\",\n        \"nayuta kani\": \"可儿那由多\",\n        \"maou\": \"魔王（红玉之瞳）\",\n        \"tabitha helene orleans de gallia\": \"塔巴萨\",\n        \"suguru geto\": \"夏油杰\",\n        \"selvaria bles\": \"塞贝莉雅·布雷斯\",\n        \"arisa eloise beau-regard\": \"亚里砂·艾洛伊丝·博勒加德\",\n        \"wakamo kosaka\": \"狐坂若藻\",\n        \"high elf archer\": \"妖精弓手\",\n        \"big bad wolf\": \"大灰狼\",\n        \"nemona\": \"妮莫\",\n        \"little red riding hoods grandmother\": \"小红帽的外婆\",\n        \"alhaitham\": \"艾尔海森\",\n        \"layla prismriver\": \"蕾拉·普莉兹姆利巴\",\n        \"chise waraku\": \"和乐千世\",\n        \"kaho kuwakami\": \"桑上果穗\",\n        \"ume\": \"梅\",\n        \"chisaki mibu\": \"壬生千咲\",\n        \"mayu shikibe\": \"式部茉优\",\n        \"maria marta cunhel guloso\": \"玛璐塔小姐\",\n        \"jenny wakeman\": \"XJ9\",\n        \"aria holmes kanzaki\": \"神崎·H·亚里亚\",\n        \"akari mamiya\": \"间宫明里\",\n        \"kaname tohyama\": \"远山金女\",\n        \"kinji tohyama\": \"远山金次\",\n        \"riko mine\": \"峰理子\",\n        \"shirayuki hotogi\": \"星伽白雪\",\n        \"the woodsman\": \"小红帽中的猎人\",\n        \"henrietta de tristain\": \"安丽埃塔\",\n        \"princess devilotte de deathsatan ix\": \"戴比萝特·德·迪斯撒旦九世\",\n        \"fianna ray ordesia\": \"菲雅娜·雷·奥地西亚\",\n        \"lady labrynth of the silver castle\": \"白银城的迷宫主·拉比丽斯\",\n        \"suletta mercury\": \"斯莱塔·墨丘利\",\n        \"miorine rembran\": \"米奥莉奈·伦布兰\",\n        \"nana daiba\": \"大场奈奈\",\n        \"minegumo\": \"峰云\",\n        \"princess star butterfly\": \"星蝶公主\",\n        \"kazusa kyouyama\": \"杏山和纱\",\n        \"mahiru shiina\": \"椎名真昼\",\n        \"margot knight\": \"玛戈特·奈特\",\n        \"malga naruze\": \"玛伽·成濑\",\n        \"evangeline a.k. mcdowell\": \"依文洁琳·安塔娜西亚·凯蒂·麦道威尔\",\n        \"momosuzu nene\": \"桃铃音音\",\n        \"omaru polka\": \"尾丸波尔卡\",\n        \"karnatia seri anabald\": \"大岛叶多\",\n        \"wang yi\": \"王异\",\n        \"hachiroku\": \"八六\",\n        \"yggdrasil\": \"尤格多拉希尔\",\n        \"otome arisugawa\": \"有栖川乙女\",\n        \"luo tianyi\": \"洛天依\",\n        \"sensei\": \"老师\",\n        \"azuma seren\": \"东雪莲\",\n        \"yaoyao\": \"瑶瑶\",\n        \"monika\": \"莫妮卡\",\n        \"tania\": \"塔妮雅\",\n        \"barret wallace\": \"巴雷特·华莱士\",\n        \"ameth\": \"爱梅斯\",\n        \"aoi futaba\": \"双叶碧\",\n        \"roselia\": \"绯之罗赛莉亚\",\n        \"goldenglow\": \"澄闪\",\n        \"sara valestin\": \"莎拉·巴雷斯坦\",\n        \"cure cosmo\": \"尤妮（宇宙天使）\",\n        \"cure selene\": \"香久矢圆香（月神天使）\",\n        \"demeter\": \"狄蜜特\",\n        \"haruka yuzuhara\": \"柚原春夏\",\n        \"matsuri kazamaki\": \"风卷祭里\",\n        \"suzu kanade\": \"花奏铃\",\n        \"mahiro oyama\": \"绪山真寻\",\n        \"seiun sky\": \"青云天空\",\n        \"curren chan\": \"真机伶\",\n        \"symboli rudolf\": \"鲁道夫象征\",\n        \"admire vega\": \"爱慕织姬\",\n        \"yorha commander\": \"寄葉指揮官\",\n        \"cidala\": \"辛妲拉\",\n        \"super creek\": \"超级溪流\",\n        \"cecilia alcott\": \"塞西莉娅·奥尔卡特\",\n        \"ling yin huang\": \"凰铃音\",\n        \"laura bodewig\": \"拉芙拉·布迪威伊\",\n        \"yuu koito\": \"小糸侑\",\n        \"touko nanami\": \"七海灯子\",\n        \"houki shinonono\": \"篠之之帚\",\n        \"mizuki nakahara\": \"中原瑞希\",\n        \"senji muramasa\": \"千子村正\",\n        \"hinagiku katsura\": \"桂雏菊\",\n        \"isumi saginomiya\": \"鹭之宫伊澄\",\n        \"nagi sanzenin\": \"三千院凪\",\n        \"marie\": \"玛丽\",\n        \"fuyutsuki\": \"冬月\",\n        \"tsukasa ayatsuji\": \"绚辻词\",\n        \"ai nanasaki\": \"七咲逢\",\n        \"haruka morishima\": \"森岛遥\",\n        \"miya tachibana\": \"橘美也\",\n        \"sae nakata\": \"中多纱江\",\n        \"rihoko sakurai\": \"樱井梨穗子\",\n        \"yukiko amagi\": \"天城雪子\",\n        \"hatsumi sega\": \"濑贺初美\",\n        \"fujisaki yua\": \"藤崎由爱\",\n        \"dante\": \"但丁\",\n        \"vergil\": \"维吉尔\",\n        \"hanbei takenaka\": \"竹中半兵卫\",\n        \"kanae kochou\": \"胡蝶香奈惠\",\n        \"sanemi shinazugawa\": \"不死川实弥\",\n        \"ryuuge kisaki\": \"龙华妃咲\",\n        \"mashiro shizuyama\": \"静山真白\",\n        \"tsurugi kensaki\": \"剑先鹤城\",\n        \"acerola\": \"阿塞萝拉\",\n        \"kou minamoto\": \"源光\",\n        \"damian desmond\": \"达米安·德斯蒙\",\n        \"cat noir\": \"黑猫诺儿\",\n        \"killua zoldyck\": \"奇犽·揍敌客\",\n        \"mirai kamiki\": \"神木未来\",\n        \"megumi amatsuka\": \"天使惠\",\n        \"mao amatsuka\": \"天使真央\",\n        \"akane isshiki\": \"一色茜\",\n        \"lyza\": \"莱萨\",\n        \"ozen\": \"奥森\",\n        \"marulk\": \"马璐璐库\",\n        \"mother spider demon\": \"蜘蛛鬼·母亲\",\n        \"kanako urashima\": \"浦岛可奈子\",\n        \"mihari oyama\": \"绪山美波里\",\n        \"white len\": \"白莲\",\n        \"momiji hozuki\": \"穗月椛\",\n        \"kaede hozuki\": \"穗月枫\",\n        \"kafka\": \"卡芙卡 | 卡夫卡\",\n        \"ookanehira\": \"大包平\",\n        \"uguisumaru\": \"莺丸\",\n        \"sovetskaya rossiya\": \"苏维埃罗西亚\",\n        \"faruzan\": \"珐露珊\",\n        \"plana\": \"普拉娜\",\n        \"rio tsukatsuki\": \"调月莉音\",\n        \"kikuri hiroi\": \"广井菊里\",\n        \"gintoki sakata\": \"坂田银时\",\n        \"toshiro hijikata\": \"土方十四郎\",\n        \"kazamori sasa\": \"佐佐风守\",\n        \"kozuki momonosuke\": \"光月桃之助\",\n        \"kanna ogata\": \"尾刃康娜\",\n        \"nero\": \"尼禄\",\n        \"deadpool\": \"死侍\",\n        \"lady\": \"蕾蒂\",\n        \"trish\": \"翠西\",\n        \"alexis rhodes\": \"天上院明日香\",\n        \"cyno\": \"赛诺\",\n        \"alexia midgar\": \"阿莱克西亚·米德嘉尔\",\n        \"wednesday addams\": \"星期三·亚当斯\",\n        \"miyako shikimori\": \"式守都\",\n        \"fuuka yamagishi\": \"山岸风花\",\n        \"yukari takeba\": \"岳羽由加莉\",\n        \"aigis\": \"埃癸斯\",\n        \"celia claire\": \"瑟莉亚·库列尔\",\n        \"hinata tachibana\": \"橘日向\",\n        \"conte di cavour\": \"加富尔伯爵\",\n        \"dhole\": \"豺\",\n        \"senjuro rengoku\": \"炼狱千寿郎\",\n        \"female protagonist\": \"汐见琴音\",\n        \"makoto yuuki\": \"结城理\",\n        \"asuka kurashina\": \"仓科明日香\",\n        \"ulrich von hutten\": \"乌尔里希·冯·胡滕\",\n        \"joey\": \"乔伊\",\n        \"feng min\": \"凤敏\",\n        \"friedrich der grosse\": \"腓特烈大帝\",\n        \"mio naruse\": \"成濑澪\",\n        \"maria naruse\": \"成濑万理亚\",\n        \"frederica baumann\": \"法兰黛莉卡·鲍曼\",\n        \"ai hoshino\": \"星野爱\",\n        \"toki asuma\": \"飞鸟马时\",\n        \"carol olston\": \"卡洛儿·奥尔斯顿\",\n        \"shiroko terror\": \"白子*恐怖\",\n        \"dia viekone\": \"蒂雅·维科尼\",\n        \"ezio auditore\": \"艾吉奥·奥迪托雷\",\n        \"sofia sartor\": \"索菲亚·萨尔托\",\n        \"tang wutong\": \"唐舞桐\",\n        \"maryland\": \"马里兰\",\n        \"shinyou\": \"神鹰\",\n        \"yawata maru\": \"八幡丸 | 云鹰\",\n        \"kishinami\": \"岸波\",\n        \"jingei\": \"迅鲸\",\n        \"chougei\": \"长鲸\",\n        \"cyllene\": \"星月\",\n        \"queen draco\": \"妖妃德拉科\",\n        \"march 7th\": \"三月七\",\n        \"himari akeboshi\": \"明星日鞠\",\n        \"asta\": \"艾丝妲 | 亚斯塔\",\n        \"garou\": \"饿狼\",\n        \"himeko\": \"姬子\",\n        \"herta\": \"黑塔\",\n        \"stelle\": \"星\",\n        \"clara\": \"克拉拉\",\n        \"nene ayachi\": \"绫地宁宁\",\n        \"neeko\": \"妮蔻\",\n        \"nidalee\": \"奈德丽\",\n        \"vex\": \"薇古丝\",\n        \"yuu nishinoya\": \"西谷夕\",\n        \"asahi azumane\": \"东峰旭\",\n        \"zoe\": \"佐伊\",\n        \"annie\": \"安妮\",\n        \"yanagi uzaki\": \"宇崎柳\",\n        \"baiken\": \"梅喧\",\n        \"asuka kazama\": \"风间飞鸟\",\n        \"lili rochefort\": \"莉莉·罗舍福尔\",\n        \"shizuko kawawa\": \"河和静子\",\n        \"akira kiyosumi\": \"清澄晶\",\n        \"kanji sasahara\": \"笹原完士\",\n        \"chika ogiue\": \"荻上千佳\",\n        \"saki kasukabe\": \"春日部咲\",\n        \"kanako ohno\": \"大野加奈子\",\n        \"makoto kousaka\": \"高坂真琴\",\n        \"kenjirou hato\": \"波户贤二郎\",\n        \"rika yoshitake\": \"吉武莉华\",\n        \"harunobu madarame\": \"斑目晴信\",\n        \"rea sanka\": \"散华礼弥\",\n        \"mero furuya\": \"降谷萌路\",\n        \"judge\": \"法官\",\n        \"himawari shinomiya\": \"四宫向日葵\",\n        \"wakaba saegusa\": \"三枝若叶\",\n        \"rei kuroki\": \"黑骑蕾\",\n        \"tomoko hoshina\": \"保科智子\",\n        \"lemmy miyauchi\": \"宫内蕾咪\",\n        \"serika kurusugawa\": \"来栖川芹香\",\n        \"akari kamigishi\": \"神岸明\",\n        \"ayaka kurusugawa\": \"来栖川绫香\",\n        \"shiho nagaoka\": \"长冈志保\",\n        \"hiroyuki fujita\": \"藤田浩之\",\n        \"aoi matsubara\": \"松原葵\",\n        \"koyomi mizuhara\": \"水原历\",\n        \"osaka\": \"大阪\",\n        \"sakaki\": \"榊\",\n        \"tomo takino\": \"泷野智\",\n        \"chiyo mihama\": \"美滨千代\",\n        \"riza wildman\": \"丽莎·瓦德曼\",\n        \"hiro hiyorimi\": \"日和见日郎\",\n        \"lillianne von phoenix\": \"莉莉安奴·冯·菲尼克斯\",\n        \"sylvia von phoenix\": \"茜维亚·冯·菲尼克斯\",\n        \"reiri kamura\": \"嘉村令里\",\n        \"taeko minazuki\": \"水无月妙子\",\n        \"amemiya nazuna\": \"飴宮なずな\",\n        \"winter schnee\": \"温特·雪倪\",\n        \"ruby hoshino\": \"露比（星野瑠美衣）\",\n        \"roka maniwa\": \"马庭芦花\",\n        \"lysithea von cordelia\": \"莉丝缇亚·冯·科迪利亚\",\n        \"tamako kitashirakawa\": \"北白川玉子\",\n        \"ui tamaki\": \"环羽衣\",\n        \"shigure mayoi\": \"间宵时雨\",\n        \"inori ichinose\": \"一之濑祈梨\",\n        \"natsumi hodaka\": \"帆高夏海\",\n        \"hina tsurugi\": \"鹤木阳渚\",\n        \"gwen stacy\": \"格温·斯黛西\",\n        \"reisa uzawa\": \"宇泽玲纱\",\n        \"power\": \"帕瓦\",\n        \"hirofumi yoshida\": \"吉田宽文\",\n        \"silver wolf\": \"银狼\",\n        \"moka akashiya\": \"赤夜萌香\",\n        \"kurumu kurono\": \"黑乃胡梦\",\n        \"mizore shirayuki\": \"白雪霙\",\n        \"nagisa kirifuji\": \"桐藤渚\",\n        \"fu xuan\": \"符玄\",\n        \"qingque\": \"青雀\",\n        \"sin mal\": \"杏·玛尔\",\n        \"bailu\": \"白露\",\n        \"tingyun\": \"停云\",\n        \"bronya rand\": \"布洛妮娅·兰德\",\n        \"shuuko komi\": \"古见秀子\",\n        \"kana arima\": \"有马加奈\",\n        \"mina majikina\": \"真镜名美奈\",\n        \"nyotengu\": \"女天狗\",\n        \"yuzuriha\": \"杠\",\n        \"velvet\": \"薇尔贝特\",\n        \"lucyna kushinada\": \"露西\",\n        \"w\": \"W\",\n        \"senko\": \"仙狐\",\n        \"johnny silverhand\": \"强尼·银手\",\n        \"david martinez\": \"大卫·马丁内斯\",\n        \"gwendolyn\": \"关德琳\",\n        \"oswald\": \"奥兹华德\",\n        \"mabel rayveil\": \"梅贝露·蕾贝露\",\n        \"akane kurokawa\": \"黑川茜\",\n        \"perona\": \"佩罗娜\",\n        \"suzume iwato\": \"岩户铃芽\",\n        \"souta munakata\": \"宗像草太\",\n        \"tsundere elf\": \"翠\",\n        \"sumika fujimiya\": \"藤宫澄夏\",\n        \"yousuke shibazaki\": \"岛㟢阳介\",\n        \"alicia edelsia\": \"艾丽西亚·伊德露西亚\",\n        \"purah\": \"普尔亚\",\n        \"touko fukawa\": \"腐川冬子\",\n        \"haru\": \"春\",\n        \"rio kastle\": \"神代璃绪\",\n        \"elizabeth liones\": \"伊丽莎白·里昂妮丝\",\n        \"yanqing\": \"彦卿\",\n        \"seika ijichi\": \"伊地知星歌\",\n        \"rika furude\": \"古手梨花\",\n        \"junko akashi\": \"赤司淳子\",\n        \"black widow\": \"黑寡妇\",\n        \"midna\": \"米多娜\",\n        \"arisu sakayanagi\": \"坂柳有栖\",\n        \"griseo\": \"格蕾修\",\n        \"melina\": \"梅琳娜\",\n        \"hinoa\": \"火芽\",\n        \"implacable\": \"怨仇\",\n        \"asuma sarutobi\": \"猿飞阿斯玛\",\n        \"mizuki akiyama\": \"晓山瑞希\",\n        \"ena shinonome\": \"东云绘名\",\n        \"airi momoi\": \"桃井爱莉\",\n        \"akito shinonome\": \"东云彰人\",\n        \"an shiraishi\": \"白石杏\",\n        \"emu otori\": \"凤笑梦\",\n        \"haruka kiritani\": \"桐谷遥\",\n        \"honami mochizuki\": \"望月穗波\",\n        \"ichika hoshino\": \"星乃一歌\",\n        \"kohane azusawa\": \"小豆泽心羽\",\n        \"minori hanasato\": \"花里实乃理\",\n        \"nene kusanagi\": \"草薙宁宁\",\n        \"rui kamishiro\": \"神代类\",\n        \"saki tenma\": \"天马咲希\",\n        \"shiho hinomori\": \"日野森志步\",\n        \"shizuku hinomori\": \"日野森雫\",\n        \"toya aoyagi\": \"青柳冬弥\",\n        \"tsukasa tenma\": \"天马司\",\n        \"kouta oyamada\": \"小山田耕太\",\n        \"chizuru minamoto\": \"源千鹤\",\n        \"nozomu ezomori\": \"犹守望\",\n        \"anisphia wynn palettia\": \"艾妮丝菲亚·温·帕雷提亚\",\n        \"euphyllia magenta\": \"尤菲莉亚·玛赞塔\",\n        \"gobuta\": \"哥布塔\",\n        \"hakos baelz\": \"哈珂斯·贝尔丝\",\n        \"saitama\": \"琦玉\",\n        \"rukia kuchiki\": \"朽木露琪亚\",\n        \"dori sangemah bay\": \"多莉·桑歌玛哈巴依\",\n        \"baizhu\": \"白术\",\n        \"lewis\": \"刘易斯\",\n        \"kagura mea\": \"神乐Mea\",\n        \"gabriel\": \"加百列\",\n        \"europa\": \"欧罗巴\",\n        \"neneka utsushimi\": \"现士实似似花\",\n        \"penny\": \"牡丹\",\n        \"arslan\": \"亚尔斯兰\",\n        \"tobio kageyama\": \"影山飞雄\",\n        \"kirari momobami\": \"桃喰绮罗莉\",\n        \"twin turbo\": \"双涡轮\",\n        \"kishirika kishirisu\": \"奇希莉卡·奇希里斯\",\n        \"urushi yaotome\": \"八乙女漆\",\n        \"anne\": \"安\",\n        \"grea\": \"古蕾雅\",\n        \"sakurako utazumi\": \"歌住樱子\",\n        \"miyako tsukiyuki\": \"月雪宫子\",\n        \"koyuki kurosaki\": \"黑崎小雪\",\n        \"atsuko hakari\": \"秤亚津子\",\n        \"saya yakushi\": \"药子纱绫\",\n        \"kaya shiranui\": \"不知火花耶\",\n        \"mine aomori\": \"苍森美弥\",\n        \"mina konoe\": \"近卫弥奈\",\n        \"marina ikekura\": \"池仓玛丽娜\",\n        \"eimi izumimoto\": \"和泉元艾米\",\n        \"megu shimokura\": \"下仓惠\",\n        \"serina sumi\": \"鹫见芹娜\",\n        \"ayumu iwabitsu\": \"岩柜步梦\",\n        \"rin nanagami\": \"七神凛\",\n        \"aoi oki\": \"扇喜葵\",\n        \"rumi akeshiro\": \"朱城瑠美\",\n        \"michiru chidori\": \"千鸟满\",\n        \"reijo kayama\": \"鹿山丽情\",\n        \"maki konuri\": \"小涂真纪\",\n        \"misaki imashino\": \"戒野美咲\",\n        \"mimori mizuha\": \"水羽三森\",\n        \"haruka igusa\": \"伊草遥香\",\n        \"kirino nakatsukasa\": \"中务桐乃\",\n        \"yoshimi ibaragi\": \"伊原木好美\",\n        \"hiyori tsuchinaga\": \"槌永日和\",\n        \"cherino renkawa\": \"连河切里诺\",\n        \"kei tsukishima\": \"月岛萤\",\n        \"izzy izumi\": \"泉光子郎\",\n        \"tai kamiya\": \"八神太一\",\n        \"agumon\": \"亚古兽\",\n        \"hatoba tsugu\": \"鸠羽伦\",\n        \"autumn blaze\": \"秋烨\",\n        \"lyra heartstrings\": \"天琴心弦\",\n        \"lopiniatre\": \"倔强\",\n        \"luca ikaruga\": \"斑鸠路加\",\n        \"hare omagari\": \"小钩晴\",\n        \"karen aijo\": \"爱城华恋\",\n        \"sawako kuronuma\": \"黑沼爽子\",\n        \"izumi shishidou\": \"狮子堂泉\",\n        \"lynette\": \"琳妮特\",\n        \"focalors\": \"芙宁娜\",\n        \"mizuki\": \"水月\",\n        \"ayame kajou\": \"华城绫女\",\n        \"kirche augusta frederica von anhalt zerbst\": \"丘鲁克·奥古斯都·菲列特利加·封·安哈尔特·泽鲁普斯特\",\n        \"london\": \"伦敦\",\n        \"enlilta reesehyde bertrand\": \"贝尔托兰\",\n        \"momiji akiizumi\": \"秋泉红叶\",\n        \"howe\": \"豪\",\n        \"aki shino\": \"志野亚贵\",\n        \"kotama otose\": \"音濑小玉\",\n        \"minoto\": \"水芸\",\n        \"matikanefukukitaru\": \"待兼福来\",\n        \"hiyori harusaki\": \"春咲日和莉\",\n        \"rei shijo\": \"士条怜\",\n        \"tomo aizawa\": \"相泽智\",\n        \"junichirou kubota\": \"久保田淳一郎\",\n        \"misuzu gundou\": \"群堂美铃\",\n        \"minato senkawa\": \"千川凑\",\n        \"yuuta sakurada\": \"樱田悠太\",\n        \"saria\": \"塞雷娅\",\n        \"saga\": \"嵯峨\",\n        \"bagpipe\": \"风笛\",\n        \"hoolheyak\": \"霍尔海雅\",\n        \"dorothy\": \"多萝西\",\n        \"daki\": \"堕姬\",\n        \"professor juniper\": \"红豆杉博士\",\n        \"hirato\": \"平户\",\n        \"dancer of the boreal valley\": \"冷冽谷的舞娘\",\n        \"ayumi momozono\": \"桃园步美\",\n        \"shirayuki mishiro\": \"白雪深白\",\n        \"killer bee\": \"奇拉比\",\n        \"jiraiya\": \"自来也\",\n        \"ares\": \"阿瑞斯\",\n        \"hippolyta\": \"希波吕忒\",\n        \"ms. marvel\": \"惊奇女士\",\n        \"io hasekura\": \"支仓伊绪\",\n        \"tuscaloosa\": \"塔斯卡卢萨\",\n        \"heywood l.e.\": \"海伍德·L·E\",\n        \"ranger\": \"突击者\",\n        \"janus\": \"雅努斯\",\n        \"ornn\": \"奥恩\",\n        \"chong yue\": \"重岳\",\n        \"ethan\": \"伊桑\",\n        \"ren yamashiro\": \"山城恋\",\n        \"sena himuro\": \"冰室濑名\",\n        \"amane tanikaze\": \"谷风天音\",\n        \"sairi mikuni\": \"三国彩里\",\n        \"kaede kinoshita\": \"木下枫\",\n        \"chika shiraishi\": \"白石千花\",\n        \"tomoya mashiro\": \"真白友也\",\n        \"constanze amalie von braunschbank-albrechtsberger\": \"康斯坦策·阿玛莉·冯·布朗施班克·阿尔布雷希茨贝格\",\n        \"kaori kyan\": \"喜屋武香织\",\n        \"janna\": \"迦娜\",\n        \"fuyu fuiba\": \"风衣叶冬优\",\n        \"jia ran\": \"嘉然\",\n        \"navia\": \"娜维娅\",\n        \"clorinde\": \"克洛琳德\",\n        \"neuvillette\": \"那维莱特\",\n        \"lyney\": \"林尼\",\n        \"yukiko kudo\": \"工藤有希子\",\n        \"myrtle\": \"桃金娘\",\n        \"ganondorf\": \"加侬多夫\",\n        \"maidena ange\": \"梅蒂娜·安洁\",\n        \"noma rune\": \"诺玛·卢恩\",\n        \"toxico dannar\": \"毒毒子·达纳\",\n        \"enome north\": \"艾诺梅·诺斯\",\n        \"marina katsuragi\": \"葛城真理奈\",\n        \"executioner\": \"行裁者\",\n        \"scarecrow\": \"稻草人\",\n        \"hk416\": \"HK416\",\n        \"dsr-50\": \"DSR-50\",\n        \"ots-14\": \"OTs-14\",\n        \"p90\": \"P90\",\n        \"wa2000\": \"WA2000\",\n        \"pa-15\": \"PA-15\",\n        \"agent\": \"代理人\",\n        \"welrod mkii\": \"维尔德MkⅡ\",\n        \"ak-12\": \"AK-12\",\n        \"an-94\": \"AN-94\",\n        \"kalina\": \"格琳娜\",\n        \"ump45\": \"UMP45\",\n        \"vsk-94\": \"VSK-94\",\n        \"g11\": \"G11\",\n        \"desert eagle\": \"沙漠之鹰\",\n        \"ump9\": \"UMP9\",\n        \"tar-21\": \"TAR-21\",\n        \"aa-12\": \"AA-12\",\n        \"mk23\": \"Mk23\",\n        \"ouroboros\": \"衔尾蛇\",\n        \"intruder\": \"干扰者\",\n        \"gager\": \"计量官\",\n        \"architect\": \"建筑师\",\n        \"alchemist\": \"炼金术士\",\n        \"hunter\": \"猎手\",\n        \"dreamer\": \"梦想家\",\n        \"destroyer\": \"破坏者\",\n        \"beak\": \"喙\",\n        \"k2\": \"K2\",\n        \"g3\": \"G3\",\n        \"g36\": \"G36\",\n        \"g36c\": \"G36C\",\n        \"eliza\": \"伊莱莎\",\n        \"m1911\": \"M1911\",\n        \"m99\": \"M99\",\n        \"m950a\": \"M950A\",\n        \"p38\": \"P38\",\n        \"ppk\": \"PPK\",\n        \"p08\": \"P08\",\n        \"mauser c96\": \"C96\",\n        \"m37\": \"M37\",\n        \"mac-10\": \"MAC-10\",\n        \"ppsh-41\": \"PPSh-41\",\n        \"pps-43\": \"PPS-43\",\n        \"pp-90\": \"PP-90\",\n        \"thunder\": \"雷电\",\n        \"negev\": \"内格夫\",\n        \"st ar-15\": \"ST AR-15\",\n        \"m4a1\": \"M4A1\",\n        \"m4 sopmod ii\": \"M4 SOPMODII\",\n        \"m16a1\": \"M16A1\",\n        \"ak-15\": \"AK-15\",\n        \"rpk-16\": \"RPK-16\",\n        \"nagant revolver\": \"纳甘左轮\",\n        \"colt revolver\": \"柯尔特左轮\",\n        \"super-shorty\": \"超级肖蒂\",\n        \"python\": \"蟒蛇\",\n        \"m9\": \"M9\",\n        \"tokarev\": \"托卡列夫\",\n        \"stechkin\": \"斯捷奇金\",\n        \"makarov\": \"马卡洛夫\",\n        \"type 92\": \"92式\",\n        \"glock 17\": \"格洛克17\",\n        \"thompson\": \"汤姆森\",\n        \"m3\": \"M3\",\n        \"kriss vector\": \"维克托\",\n        \"vector\": \"维克托\",\n        \"mp40\": \"MP40\",\n        \"mp5\": \"MP5\",\n        \"ro635\": \"RO635\",\n        \"skorpion\": \"蝎式\",\n        \"mp7\": \"MP7\",\n        \"sten mkii\": \"司登MkⅡ\",\n        \"beretta model 38\": \"伯莱塔38型\",\n        \"micro uzi\": \"微型乌兹\",\n        \"m45\": \"m45\",\n        \"m1 garand\": \"M1加兰德\",\n        \"9a-91\": \"9A-91\",\n        \"ameli\": \"阿梅利\",\n        \"m200\": \"M200\",\n        \"kar98k\": \"Kar98k\",\n        \"ots-12\": \"OTs-12\",\n        \"tmp\": \"TMP\",\n        \"fn five-seven\": \"FN-57\",\n        \"sr-3mp\": \"SR-3MP\",\n        \"k5\": \"K5\",\n        \"rfb\": \"RFB\",\n        \"art556\": \"ART556\",\n        \"florence\": \"芙洛伦 | 芙罗伦斯\",\n        \"webley\": \"韦伯利\",\n        \"ifrit\": \"伊芙利特\",\n        \"kabane kusaka\": \"日下夏羽\",\n        \"sigewinne\": \"希格雯\",\n        \"mitsuki nase\": \"名瀬美月\",\n        \"izumi nase\": \"名濑泉\",\n        \"kaito kirishima\": \"雾岛海人\",\n        \"ichika takatsuki\": \"贵月一花\",\n        \"magdeburg\": \"马格德堡\",\n        \"kaveh\": \"卡维\",\n        \"tea gardner\": \"真崎杏子\",\n        \"laphicet\": \"莱菲瑟特\",\n        \"eleanor hume\": \"艾蕾诺亚·修姆\",\n        \"magillanica lou mayvin\": \"玛琪露\",\n        \"topaz\": \"托帕\",\n        \"jingliu\": \"镜流\",\n        \"dan heng\": \"丹恒\",\n        \"caelus\": \"穹\",\n        \"pozemka\": \"鸿雪\",\n        \"kotori toyomi\": \"丰见亚都梨\",\n        \"frieren\": \"芙莉莲\",\n        \"joshua bright\": \"约修亚·布莱特\",\n        \"courier\": \"讯使\",\n        \"thorns\": \"棘刺\",\n        \"issei hyoudou\": \"兵藤一诚\",\n        \"chizuru shiina\": \"椎名千鹤\",\n        \"miss fortune\": \"厄运小姐\",\n        \"riven\": \"锐雯\",\n        \"zac\": \"扎克\",\n        \"xenovia quarta\": \"洁诺薇亚·夸塔\",\n        \"crow armbrust\": \"克洛·安布斯特\",\n        \"yshtola rhul\": \"雅·修特拉·路尔\",\n        \"fine motion\": \"美妙姿势\",\n        \"air groove\": \"气槽\",\n        \"matikane tannhauser\": \"待兼诗歌剧\",\n        \"ash ketchum\": \"小智\",\n        \"jirachi\": \"基拉祈\",\n        \"mew\": \"梦幻\",\n        \"billy the kid\": \"比利·奇德\",\n        \"lloyd bannings\": \"罗伊德·班宁斯\",\n        \"agnes claudel\": \"亚妮艾丝·克劳蒂尔\",\n        \"lorelei\": \"科拿\",\n        \"fern\": \"菲伦\",\n        \"cure sky\": \"索拉・哈雷瓦塔尔\",\n        \"chiyari tenkajin\": \"天火人血枪\",\n        \"ai sugimoto\": \"杉本爱\",\n        \"nobara kugisaki\": \"钉崎野蔷薇\",\n        \"maki zenin\": \"禅院真希\",\n        \"usagi saionji\": \"西园寺兔\",\n        \"principal minami\": \"南日和子\",\n        \"sumi takane\": \"高岭珠深\",\n        \"illumi zoldyck\": \"伊路米·揍敌客\",\n        \"charybdis\": \"卡律布狄斯\",\n        \"elbe\": \"易北\",\n        \"anchorage\": \"安克雷奇\",\n        \"jade\": \"亚德\",\n        \"scylla\": \"斯库拉\",\n        \"algerie\": \"阿尔及利亚\",\n        \"erika\": \"莉佳\",\n        \"juliana\": \"小青\",\n        \"ishizu ishtar\": \"伊西丝·伊修达尔\",\n        \"mai valentine\": \"孔雀舞\",\n        \"serenity wheeler\": \"川井静香\",\n        \"aki izayoi\": \"十六夜秋\",\n        \"aoi zaizen\": \"财前葵\",\n        \"emma bessho\": \"别所惠麻\",\n        \"kotori mizuki\": \"观月小鸟\",\n        \"anna kouzuki\": \"神月安奈\",\n        \"sherry leblanc\": \"雪莉·卢布朗\",\n        \"mina simington\": \"狭雾深影\",\n        \"romin kirishima\": \"雾岛露明\",\n        \"yuzu hiiragi\": \"柊柚子\",\n        \"sera\": \"塞拉\",\n        \"chloe\": \"小春\",\n        \"stella vermillion\": \"史黛菈·法米利昂\",\n        \"ikki kurogane\": \"黑铁一辉\",\n        \"bort\": \"圆粒金刚石\",\n        \"cinnabar\": \"辰砂\",\n        \"phosphophyllite\": \"磷叶石\",\n        \"euclase\": \"蓝柱石\",\n        \"asana mutsuba\": \"六叶麻奈\",\n        \"yuuka gouha\": \"哥哈游佳\",\n        \"haruka kamijo\": \"上城大华／泰格\",\n        \"tatsuhisa kamijo\": \"上城龙久\",\n        \"yuga ohdo\": \"王道游我\",\n        \"rossweisse\": \"罗丝薇瑟\",\n        \"villetta nu\": \"维蕾塔·努\",\n        \"kaname ohgi\": \"扇要\",\n        \"ruri\": \"黑咲琉璃\",\n        \"cornelia li britannia\": \"柯内莉亚·li·布里塔尼亚\",\n        \"monica kruszewski\": \"莫妮卡·库鲁席夫斯基\",\n        \"jessie rasberry\": \"杰西\",\n        \"tamaki\": \"环\",\n        \"nagisa\": \"凪咲\",\n        \"nanami\": \"娜娜米\",\n        \"misaki\": \"海咲\",\n        \"sayuri\": \"小百合\",\n        \"helena\": \"海伦娜\",\n        \"momiji\": \"红叶\",\n        \"nico\": \"NiCO\",\n        \"monica\": \"莫妮卡\",\n        \"fiona\": \"菲欧娜\",\n        \"cai wenji\": \"蔡文姬\",\n        \"diao chan\": \"貂蝉\",\n        \"lian shi\": \"步练师\",\n        \"aciddrop\": \"酸糖\",\n        \"claudia\": \"Claudia\",\n        \"kozue otomune\": \"乙宗梢\",\n        \"tsuzuri yugiri\": \"夕雾缀理\",\n        \"futari gotou\": \"后藤二里\",\n        \"frostleaf\": \"霜叶\",\n        \"highmore\": \"海沫\",\n        \"mei misaki\": \"见崎鸣\",\n        \"kenma kozume\": \"孤爪研磨\",\n        \"tadashi yamaguchi\": \"山口忠\",\n        \"leon s. kennedy\": \"里昂·斯科特·肯尼迪\",\n        \"sayaka igarashi\": \"五十岚清华\",\n        \"kiba inuzuka\": \"犬冢牙\",\n        \"aang\": \"安昂\",\n        \"kyouko kirigiri\": \"雾切响子\",\n        \"astral\": \"星光体\",\n        \"yuma tsukumo\": \"九十九游马\",\n        \"kite tenjo\": \"天城快斗\",\n        \"droite\": \"德鲁瓦（右臂）\",\n        \"mizar\": \"米扎艾尔\",\n        \"dumon\": \"德鲁贝\",\n        \"ariados\": \"阿利多斯\",\n        \"latias\": \"拉帝亚斯\",\n        \"endministrator\": \"管理员\",\n        \"perlica\": \"佩丽卡\",\n        \"absinthe\": \"苦艾\",\n        \"misha necron\": \"米夏·涅库罗\",\n        \"sentouki - roze\": \"闪刀姬-露世\",\n        \"kooh\": \"酷儿\",\n        \"aaya saitou\": \"齐藤亚绫\",\n        \"kiiko kawakami\": \"川上纪衣子\",\n        \"princess gradriel de valendia\": \"海拉加德的公主\",\n        \"olivier mira armstrong\": \"奥利维亚·米拉·阿姆斯特朗\",\n        \"aqua hoshino\": \"阿库亚（星野爱久爱海）\",\n        \"miyako saitou\": \"齐藤京子\",\n        \"airi kurimura\": \"栗村爱莉\",\n        \"rentarou aijou\": \"爱城恋太郎\",\n        \"karane inda\": \"院田唐音\",\n        \"hakari hanazono\": \"花园羽香里\",\n        \"mayling shen\": \"沈美玲\",\n        \"akari wanibuchi\": \"鳄渊亚伽里\",\n        \"kikyou kiryuu\": \"桐生桔梗\",\n        \"fuwawa abyssgard\": \"软软·阿比斯加德\",\n        \"mococo abyssgard\": \"茸茸·阿比斯加德\",\n        \"hijiri mochizuki\": \"望月圣\",\n        \"eila ilmatar juutilainen\": \"艾拉·伊尔玛塔尔·尤蒂莱南\",\n        \"yuuhi oudou\": \"王道游飞\",\n        \"tell kawai\": \"合羽井英\",\n        \"kouko kaga\": \"加贺香子\",\n        \"lisanna strauss\": \"丽莎娜·斯特劳斯\",\n        \"mia luna tearmoon\": \"米雅·卢娜·堤亚穆\",\n        \"ruan mei\": \"阮·梅\",\n        \"li sushang\": \"李素裳 | 素裳\",\n        \"prometheus\": \"普罗米修斯\",\n        \"lisesharte atismata\": \"莉姿夏尔蒂·亚提司玛特\",\n        \"dantoudai no aura\": \"阿乌拉\",\n        \"ayano yuugiri\": \"夕桐绫乃\",\n        \"rose oriana\": \"萝丝·奥里亚纳\",\n        \"vladilena milize\": \"芙拉蒂蕾娜·米利杰\",\n        \"sharon\": \"莎郎 | 莎朗·荷莉格蕾尔\",\n        \"warlock\": \"术士\",\n        \"tamaki kotatsu\": \"環古達\",\n        \"brigitte lindholm\": \"布丽吉塔\",\n        \"tatsuya kaname\": \"鹿目达也\",\n        \"kamille bidan\": \"卡缪·比丹\",\n        \"delta\": \"德尔塔\",\n        \"kyouko yuuki\": \"结城京子\",\n        \"maomao\": \"猫猫\",\n        \"chris redfield\": \"克里斯·雷德菲尔德\",\n        \"kazuma ikezawa\": \"池泽佳主马\",\n        \"kenji koiso\": \"小矶健二\",\n        \"yuki sanada\": \"真田雪\",\n        \"natsuki usami\": \"宇佐美夏树\",\n        \"galleon\": \"伽莱翁\",\n        \"asa mitaka\": \"三鹰朝\",\n        \"sayaka murano\": \"村野沙耶香\",\n        \"kaho hinoshita\": \"日野下花帆\",\n        \"gravel\": \"砾\",\n        \"ant-man\": \"蚁人\",\n        \"utena hiiragi\": \"柊舞缇娜\",\n        \"chevreuse\": \"夏沃蕾\",\n        \"huohuo\": \"藿藿\",\n        \"lynx landau\": \"玲可\",\n        \"pelageya sergeyevna\": \"佩拉格娅·谢尔盖耶夫娜\",\n        \"hook\": \"虎克\",\n        \"yukong\": \"驭空\",\n        \"guinaifen\": \"桂乃芬\",\n        \"rumi usagiyama\": \"兔山留美\",\n        \"ryuko tatsuma\": \"龙间龙子\",\n        \"itsuka kendou\": \"拳藤一佳\",\n        \"nejire hado\": \"波动螺卷\",\n        \"setsuna tokage\": \"取荫切奈\",\n        \"lady nagant\": \"筒美火伊那\",\n        \"kyoka jiro\": \"耳郎响香\",\n        \"tooru hagakure\": \"叶隐透\",\n        \"ibara shiozaki\": \"塩崎茨\",\n        \"kinoko komori\": \"小森希乃子\",\n        \"pony tsunotori\": \"角取波尼\",\n        \"reiko yanagi\": \"柳玲子\",\n        \"yui kodai\": \"小大唯\",\n        \"mount lady\": \"岳山优\",\n        \"moe kamiji\": \"上路萌\",\n        \"mei hatsume\": \"发目明\",\n        \"mashirao ojiro\": \"尾白猿夫\",\n        \"nemuri kayama\": \"香山睡\",\n        \"chiori\": \"千织\",\n        \"shuro yabuki\": \"箭吹棕榈\",\n        \"blade\": \"刃\",\n        \"astesia\": \"星极\",\n        \"ichika nakamasa\": \"仲正一花\",\n        \"nodoka amami\": \"天见和香\",\n        \"shadow the hedgehog\": \"夏特\",\n        \"iris\": \"艾莉丝\",\n        \"momoka yuragi\": \"由良木桃香\",\n        \"yukari kadenokouji\": \"勘解由小路紫\",\n        \"yakumo aramaki\": \"荒牧八云\",\n        \"kasumi kinugawa\": \"鬼怒川霞\",\n        \"niya amachi\": \"天地妮娅\",\n        \"fiammetta\": \"菲亚梅塔\",\n        \"shu\": \"黍\",\n        \"hahari hanazono\": \"花园羽羽里\",\n        \"naoto hachiouji\": \"八王子直人\",\n        \"xianyun\": \"闲云（留云借风真君）\",\n        \"aizawa ema\": \"蓝泽艾玛\",\n        \"kurumi noah\": \"胡桃诺娅\",\n        \"atsushi murasakibara\": \"紫原敦\",\n        \"junna hoshimi\": \"星见纯那\",\n        \"hikari kagura\": \"神乐光\",\n        \"futaba isurugi\": \"石动双叶\",\n        \"kaoruko hanayagi\": \"花柳香子\",\n        \"mahiru tsuyuzaki\": \"露崎真昼\",\n        \"shizuka yoshimoto\": \"好本静\",\n        \"anastasia hoshin\": \"安娜塔西亚·合辛\",\n        \"stark\": \"休塔尔克\",\n        \"aiba uiha\": \"相羽初叶\",\n        \"sherlock shellingford\": \"夏洛克·雪莉福德\",\n        \"sodachi oikura\": \"老仓育\",\n        \"smolder\": \"斯莫得\",\n        \"touka satomi\": \"里见灯花\",\n        \"firefly\": \"流萤\",\n        \"black swan\": \"黑天鹅\",\n        \"gaming yip\": \"嘉明\",\n        \"dunyarzad homayani\": \"迪娜泽黛\",\n        \"sparkle\": \"花火\",\n        \"senadina\": \"希娜狄雅\",\n        \"satoshi mizukami\": \"水上敏志\",\n        \"secelia dote\": \"塞西莉亚·多特\",\n        \"gon freecss\": \"杰·富力士\",\n        \"meteion\": \"梅蒂恩\",\n        \"emil sinclair\": \"辛克莱\",\n        \"yi sang\": \"李箱\",\n        \"gary oak\": \"小茂\",\n        \"red\": \"赤红\",\n        \"coralie 6626 planck\": \"科拉莉·6626·普朗克\",\n        \"ami nonomura\": \"野野村亚美\",\n        \"indomitable\": \"不挠\",\n        \"kurumi tsuchimikado\": \"土御门胡桃\",\n        \"ada wong\": \"艾达·王\",\n        \"yamato takeru\": \"日本武尊(Fate)\",\n        \"wriothesley\": \"莱欧斯利\",\n        \"rin uehara\": \"上原燐\",\n        \"himeno\": \"姬野\",\n        \"tomori takamatsu\": \"高松灯\"\n    },\n    \"group\": {\n        \"1\": \"1\",\n        \"13\": \"13\",\n        \"27\": \"27\",\n        \"38\": \"38\",\n        \"86\": \"86\",\n        \"110\": \"110\",\n        \"183\": \"183\",\n        \"203\": \"ニイマルサン\",\n        \"333\": \"333\",\n        \"471\": \"四七一\",\n        \"530\": \"530\",\n        \"560\": \"560\",\n        \"1122\": \"1122\",\n        \"1787\": \"1787\",\n        \"2961\": \"2961\",\n        \"2990\": \"2990\",\n        \"4040\": \"4040\",\n        \"8716\": \"8716\",\n        \"1000000000\": \"1000000000\",\n        \"clockup\": \"CLOCKUP\",\n        \"guilty\": \"Guilty\",\n        \"guilty plus\": \"Guilty+\",\n        \"guilty ex\": \"Guilty eX\",\n        \"nanawind\": \"NanaWind\",\n        \"orc soft\": \"ORCSOFT\",\n        \"praline\": \"Praline\",\n        \"sakuragame\": \"SakuraGame\",\n        \"frill\": \"Frill\",\n        \"triangle\": \"Triangle\",\n        \"mana\": \"mana\",\n        \"sprite\": \"sprite\",\n        \"fairys\": \"fairys\",\n        \"escude\": \"エスクード\",\n        \"campus\": \"Campus\",\n        \"interheart\": \"INTERHEART\",\n        \"darknesspot\": \"DarknessPot\",\n        \"nihon bussan\": \"日本物产\",\n        \"sphinx\": \"SPHINX\",\n        \"bishop\": \"BISHOP\",\n        \"tanuki soft\": \"たぬきそふと\",\n        \"baseson\": \"BaseSon\",\n        \"miel\": \"Miel\",\n        \"may-be soft\": \"May-Be SOFT\",\n        \"squeez\": \"SQUEEZ\",\n        \"milk factory\": \"みるふぁく\",\n        \"alicesoft\": \"ALICESOFT\",\n        \"omega star\": \"ωstar\",\n        \"norn\": \"Norn\",\n        \"aries\": \"Aries\",\n        \"ensemble\": \"ensemble\",\n        \"ensemble sweet\": \"ensemble SWEET\",\n        \"caramel box\": \"CARAMEL-BOX\",\n        \"rootnuko\": \"√nuko\",\n        \"c drive\": \"C:drive.\",\n        \"d drive\": \"D:drive.\",\n        \"grand cross\": \"GRAND†CROSS\",\n        \"skyfish\": \"SkyFish\",\n        \"skyfish poco\": \"SkyFish poco\",\n        \"chelseasoft\": \"Chelseasoft\",\n        \"sphere\": \"Sphere\",\n        \"hook\": \"HOOKSOFT\",\n        \"smee\": \"SMEE\",\n        \"asa project\": \"ASa Project\",\n        \"rosebleu\": \"Rosebleu\",\n        \"clochette\": \"Clochette\",\n        \"honey soft\": \"HONEY SOFT\",\n        \"appetite\": \"アパタイト\",\n        \"pakopako soft\": \"ぱこぱこそふと\",\n        \"neko neko soft\": \"猫猫软件\",\n        \"abhar\": \"ABHAR\",\n        \"abhar tronc\": \"ABHAR Tronc\",\n        \"incarose\": \"インカローズ\",\n        \"nutaku\": \"Nutaku\",\n        \"etude\": \"etude\",\n        \"eufonie\": \"eufonie\",\n        \"eushully\": \"Eushully\",\n        \"waffle\": \"Waffle\",\n        \"navel\": \"Navel\",\n        \"tryset\": \"TRYSET\",\n        \"seal-tutu\": \"seal-tutu\",\n        \"softhouse chara\": \"Softhouse Chara\",\n        \"softhouse-seal\": \"softhouse-seal\",\n        \"devil-seal\": \"Devil-seal\",\n        \"softhouse-seal grandee\": \"softhouse-seal GRANDEE\",\n        \"reverse\": \"Re:verse\",\n        \"samoyed smile\": \"SAMOYED SMILE\",\n        \"moonstone\": \"MOONSTONE\",\n        \"moonstone cherry\": \"MOONSTONE Cherry\",\n        \"moonstone honey\": \"MOONSTONE Honey\",\n        \"yuzu soft\": \"柚子社\",\n        \"lump of sugar\": \"Lump of Sugar\",\n        \"quince soft\": \"QUINCE SOFT\",\n        \"aquaplus\": \"AQUAPLUS\",\n        \"leaf\": \"Leaf🍃\",\n        \"key\": \"🔑Key\",\n        \"alcot\": \"ALcot\",\n        \"alcot honey comb\": \"ALcot Honey Comb\",\n        \"august\": \"AUGUST\",\n        \"feng\": \"feng\",\n        \"frontwing\": \"FrontWing\",\n        \"atelier d\": \"Atelier D\",\n        \"atelier kaguya\": \"Atelier KAGUYA\",\n        \"atelier kaguya honky-tonk pumpkin\": \"Atelier KAGUYA Honky-Tonk Pumpkin\",\n        \"atelier kaguya team gassa-q\": \"Atelier KAGUYA TEAM Gassa-Q\",\n        \"atelier kaguya team heartbeat\": \"Atelier KAGUYA TEAM HEARTBEAT\",\n        \"atelier kaguya berkshire yorkshire\": \"Atelier KAGUYA Berkshire Yorkshire\",\n        \"atelier sakura roshutsu yuugi\": \"樱花工作室 露出＊游戏\",\n        \"atelier sakura konmai studio\": \"樱花工作室 こんまいすたじお\",\n        \"atelier sakura darkness\": \"樱花工作室 DARKNESS\",\n        \"atelier sakura team.ntr\": \"樱花工作室 Team.NTR\",\n        \"atelier sakura mount position\": \"樱花工作室 Mount Position\",\n        \"atelier sakura extra\": \"樱花工作室 eXtra\",\n        \"abel software\": \"AbelSoftware\",\n        \"type-moon\": \"🌙TYPE-MOON\",\n        \"nitroplus\": \"Nitro+\",\n        \"5pb\": \"5pb.\",\n        \"aniseed\": \"AniSeed\",\n        \"candysoft\": \"Candy Soft\",\n        \"ricotta\": \"Ricotta\",\n        \"whirlpool\": \"Whirlpool\",\n        \"giga\": \"戏画\",\n        \"milksoft\": \"牛奶软件\",\n        \"cygames\": \"Cygames\",\n        \"keroq\": \"ケロQ\",\n        \"akatsuki works hibiki\": \"hibiki works\",\n        \"fairytale\": \"fairytale\",\n        \"falcom\": \"Falcom\",\n        \"softstar\": \"大宇资讯\",\n        \"dmm.com\": \"DMM.com\",\n        \"kadokawa\": \"KADOKAWA\",\n        \"winged cloud\": \"Winged Cloud\",\n        \"tech gian\": \"TECH GIAN\",\n        \"electromagneticwave\": \"ElectromagneticWave\",\n        \"usotsukiya\": \"嘘つき屋\",\n        \"archetype\": \"ARCHETYPE\",\n        \"afterschool of the 5th year\": \"5年目の放课后\",\n        \"tsf no f\": \"TSF的F\",\n        \"number2\": \"Number2\",\n        \"plant\": \"PLANT\",\n        \"opaque\": \"Opaque\",\n        \"shiroganeya\": \"しろがね屋\",\n        \"horizontal world\": \"Horizontal World\",\n        \"mousou deguchi\": \"妄想出口\",\n        \"venom\": \"VENOM\",\n        \"tsuchinoko kyoukai\": \"ツシノコ協会\",\n        \"sekine\": \"咳寝\",\n        \"ippongui\": \"一本杭\",\n        \"aomidoro\": \"アオミドロ\",\n        \"otukimi koubo\": \"おつきみ工房\",\n        \"monsieur\": \"MonsieuR\",\n        \"orange peels\": \"オレンジピールズ\",\n        \"wata 120 percent\": \"120%棉\",\n        \"watsukiya\": \"わつき屋\",\n        \"sotikoti\": \"ソチコチ\",\n        \"320bpm\": \"320BPM\",\n        \"intoku.info\": \"いんとくいんふぉ\",\n        \"47sp\": \"47sp.\",\n        \"shibayukiya\": \"芝雪屋\",\n        \"news\": \"NEWS\",\n        \"shimajiya\": \"しまじや\",\n        \"canvas garden\": \"CANVAS+GARDEN\",\n        \"mc\": \"MC\",\n        \"animachine\": \"アニマルマシーン\",\n        \"ailail\": \"あいるあいる\",\n        \"moe hime rengou\": \"萌姬连合\",\n        \"digital lover\": \"Digital Lover\",\n        \"mone keshi gum\": \"MONEけしごむ\",\n        \"nama cream biyori\": \"生クリームびより\",\n        \"clesta\": \"クレスタ\",\n        \"onasuga 99-yen\": \"おナスが99円\",\n        \"karomix\": \"KAROMIX\",\n        \"shoot the moon\": \"シュート・ザ・ムーン\",\n        \"kansai gyogyou kyoudou kumiai\": \"关西渔业协同组合\",\n        \"rainwaterserver\": \"RainWaterServer\",\n        \"lily lily rose\": \"Lily Lily Rose\",\n        \"himura nyuugyou\": \"比村乳业\",\n        \"raijinkai\": \"雷神会\",\n        \"miyamaya\": \"深山屋\",\n        \"onna kishi no shiro\": \"女騎士の城\",\n        \"yonsai books\": \"四才ブックス\",\n        \"pastel wing\": \"PASTEL WING\",\n        \"ajisaidenden\": \"アジサイデンデン\",\n        \"attendance number 26\": \"出席番号26\",\n        \"yu-yu-tei\": \"悠々亭\",\n        \"circle ohigetan\": \"サークル尾髭丹\",\n        \"mahou rikigaku\": \"魔法力学\",\n        \"minimum game koubou\": \"ミニマムゲーム工房\",\n        \"santa star festa\": \"Santa☆Festa!\",\n        \"byousatsu tanukidan\": \"秒杀狸团\",\n        \"seven days holiday\": \"セブンデイズホリディ\",\n        \"uchuu bunko\": \"宇宙文库\",\n        \"nakayohi mogudan\": \"なかよひモグダン\",\n        \"suteuka no koya\": \"すてうかの小屋\",\n        \"at ism\": \"@ism\",\n        \"twinbox\": \"TwinBox\",\n        \"ame nochi yuki\": \"あめ のち ゆき\",\n        \"mataro\": \"魔太郎\",\n        \"otonano do-wa\": \"大人の寓話\",\n        \"tsukuru no mori kabushikigaisha\": \"ツクルノモリ株式会社\",\n        \"asanoya\": \"浅野屋\",\n        \"neko works\": \"NEKO WORKs\",\n        \"goshujinsama no omochabako\": \"御主人様の玩具箱\",\n        \"rairaku jinja\": \"磊落神社\",\n        \"mani mania\": \"マニまにあ\",\n        \"kongari tokei\": \"こんがり時計\",\n        \"circle kame\": \"さーくる亀\",\n        \"sugiura-ke\": \"杉浦家\",\n        \"atelier-g\": \"Atelier-G\",\n        \"atelier tiv\": \"Atelier Tiv\",\n        \"atelier lunette\": \"Atelier Lunette\",\n        \"atelier gh\": \"Atelier G/H\",\n        \"atelier botan\": \"あとりえ牡丹\",\n        \"atelier kinta\": \"あとりえKINTA\",\n        \"atelier miyabi\": \"あとりえ雅\",\n        \"atelier knee stroke\": \"あとりえ にーすとろーく\",\n        \"atelier pachira\": \"アトリエパキラ\",\n        \"atelier pinpoint\": \"アトリエ ピン・ポイント\",\n        \"atelier hachifukuan\": \"アトリエ八福庵\",\n        \"atelier gons\": \"アトリエ GONS\",\n        \"atelier maruwa\": \"アトリエ丸和\",\n        \"atelier ms\": \"Atelier Ms\",\n        \"kinokonabe-hinanjo\": \"きのこなべ避難所\",\n        \"s-size\": \"Sサイズ\",\n        \"mugen at works\": \"むげん@WORKS\",\n        \"hyogetsu\": \"冰月\",\n        \"garakuta shoujo\": \"がらくた少女\",\n        \"mosquito man\": \"モスキートマン\",\n        \"metal\": \"METAL\",\n        \"watanabe tou\": \"渡边党\",\n        \"suzuna jct\": \"SUZUNA JCT\",\n        \"amagami dou\": \"あまがみ堂\",\n        \"bitch bokujou\": \"Bitch牧场\",\n        \"antyuumosaku\": \"暗中模索\",\n        \"kurumaya\": \"車ヤ\",\n        \"shiitake en\": \"しいたけ園\",\n        \"makutsutei\": \"魔窟亭\",\n        \"studio pal\": \"STUDIO PAL\",\n        \"frac\": \"FRAC\",\n        \"karaageyasan\": \"からあげ屋さん\",\n        \"meltdown comet\": \"MeltdoWN COmet\",\n        \"karakishi youhei-dan\": \"からきし傭兵団 真雅\",\n        \"blusterlight\": \"BlusterLight\",\n        \"24 page\": \"24ぺーじ\",\n        \"holy water club\": \"ほーりーうぉーたー倶楽部\",\n        \"black currant\": \"ブラックカラント\",\n        \"ankoku soshiki\": \"暗黑组织\",\n        \"sweet heart\": \"Sweet HEART\",\n        \"zenmai kourogi\": \"ぜんまいこうろぎ\",\n        \"tsuki no hikari keikaku\": \"月ノヒカリ計画\",\n        \"aozora\": \"青尾空\",\n        \"shoujo kishidan\": \"少女骑士团\",\n        \"shimoyakedou\": \"しもやけ堂\",\n        \"jun and yuri\": \"Jun&Yuri\",\n        \"haiiro koubou\": \"灰色工房\",\n        \"chocolate latte\": \"ショコラテ\",\n        \"chi-ra-rhyzhm\": \"ちらりずむ\",\n        \"osamuya\": \"オサム屋\",\n        \"sleeve\": \"SLeeVe\",\n        \"paranoia cat\": \"PARANOIA CAT\",\n        \"kobuta no yakata\": \"子豚の館\",\n        \"crazy9\": \"Crazy9\",\n        \"essentia\": \"ESSENTIA\",\n        \"redrop\": \"ReDrop\",\n        \"shirando\": \"炽鸾堂\",\n        \"special star week\": \"Special☆Week\",\n        \"n and r\": \"N&R\",\n        \"8chomeno-ohanayasan\": \"8丁目のお花屋さん\",\n        \"kabu fujisawa minato shinsenkan\": \"㈱藤沢みなと新鮮館\",\n        \"uran-factory\": \"URAN-FACTORY\",\n        \"hiyoko no gekijoh\": \"ひよこの劇場\",\n        \"yakiyama line\": \"YAKIYAMA LINE\",\n        \"gallop dyna\": \"ぎゃろっぷだいな\",\n        \"trick and treat\": \"TRICK&TREAT\",\n        \"shirokumaya\": \"しろくま屋\",\n        \"nanairo no neribukuro\": \"七色のねりぶくろ\",\n        \"ucyunekogundan\": \"宇宙猫军团\",\n        \"mokoke\": \"もこ家\",\n        \"p-kan\": \"p-馆\",\n        \"inst\": \"Inst\",\n        \"plum\": \"PLUM\",\n        \"kaze no gotoku\": \"風のごとく!\",\n        \"haitoku sensei\": \"はいとく先生\",\n        \"angyadow\": \"行脚堂\",\n        \"noraneko-no-tama\": \"ノラネコノタマ\",\n        \"hizadati zekkouchou\": \"ひざだち絶好調\",\n        \"sakananekobeya\": \"鱼猫部屋\",\n        \"white drop\": \"ホワイトドロップ\",\n        \"dieselmine\": \"ディーゼルマイン\",\n        \"ojou no yokushitsu\": \"お嬢の浴室\",\n        \"nagiyamasugi\": \"ナギヤマスギ\",\n        \"awatake\": \"あわたけ\",\n        \"gasobook\": \"GASOBooK!!\",\n        \"shiohama workshop\": \"SHIOHAMA WORKSHOP\",\n        \"irotenya\": \"色点屋\",\n        \"watakubi\": \"わたくび\",\n        \"kirikiri\": \"きりきり\",\n        \"kohagura.\": \"こはぐら。\",\n        \"gambler club\": \"ギャンブラー倶楽部\",\n        \"usagi no oyatsu\": \"ぅさぎのぉゃっ\",\n        \"hakke deneijyo\": \"八卦电影城\",\n        \"kuma aji tounyuu.\": \"くま味豆乳。\",\n        \"tamaranchi\": \"たまらんち\",\n        \"lucky chance\": \"Lucky Chance!\",\n        \"chicken chicken machine\": \"チキチキ☆マシーン\",\n        \"ice coffin\": \"ICE COFFIN\",\n        \"teriyaki nikuman\": \"てりやきにくまん\",\n        \"chijoku an\": \"耻辱庵\",\n        \"otajai\": \"オタじゃい\",\n        \"hades\": \"ハーデス\",\n        \"kurawanya\": \"くろわん屋\",\n        \"54burger\": \"54BURGER\",\n        \"yadokugaeru\": \"ヤドクガエル\",\n        \"butagoya\": \"ぶた小屋\",\n        \"momo ego\": \"ももエゴ\",\n        \"wada mountain\": \"和田マウンテン\",\n        \"area14\": \"エリア14\",\n        \"komorikiri.\": \"こもりきり。\",\n        \"circle eden\": \"Circle Eden\",\n        \"fukutsuu okosu\": \"腹痛起こす\",\n        \"aodouhu\": \"青豆腐\",\n        \"team lucky\": \"チーム☆ラッキー\",\n        \"deep rising\": \"DEEP RISING\",\n        \"past gadget\": \"Past Gadget\",\n        \"gekidoku shoujo\": \"剧毒少女\",\n        \"chinjao girl.\": \"チンジャオ娘。\",\n        \"kawaraya honpo\": \"瓦屋本舗\",\n        \"float shippu\": \"フロート湿布\",\n        \"yusaritsukata\": \"ゆうさりつかた\",\n        \"tamago no kara\": \"タマゴノカラ\",\n        \"drow4\": \"Drow4\",\n        \"deastim\": \"であすちーむ\",\n        \"optworks\": \"OPTWORKS\",\n        \"nikujirushi\": \"にくじるし\",\n        \"great canyon\": \"グレートキャニオン\",\n        \"amp\": \"AMP\",\n        \"peanutsland\": \"ピーナッツランド\",\n        \"black fly\": \"BLACK FLY\",\n        \"acid club\": \"ACID CLUB\",\n        \"syunkan saidaihusoku\": \"瞬间最大风速\",\n        \"sakurairo\": \"さくらいろ\",\n        \"yan-yam\": \"Yan-Yam\",\n        \"zuzuzu\": \"ズズズ\",\n        \"pictokun\": \"Pictokun\",\n        \"yo-metdo\": \"妖灭堂\",\n        \"red crown\": \"RED CROWN\",\n        \"f.a\": \"F・A\",\n        \"reverse noise\": \"Reverse Noise\",\n        \"pink\": \"PINK\",\n        \"lemonmaiden\": \"LemonMaiden\",\n        \"manjudou\": \"曼珠堂\",\n        \"asshuku koubou\": \"压缩工房\",\n        \"moreriikusu\": \"モレリークス\",\n        \"magono-tei\": \"まごの亭\",\n        \"pumpernickel\": \"PUMPERNICKEL\",\n        \"rosetta stone\": \"ろぜったすとーん\",\n        \"pigafetta\": \"ぴがふぇった\",\n        \"f taku\": \"F宅\",\n        \"ezokuroten\": \"エゾクロテン\",\n        \"itou life\": \"伊東ライフ\",\n        \"spiral brain\": \"スパイラルブレーン\",\n        \"tuzi laoda\": \"兔子老大\",\n        \"iriomote\": \"IRIOMOTE\",\n        \"kamogawaya\": \"鸭川屋\",\n        \"23.4do\": \"23.4ド\",\n        \"doza village\": \"DOZA Village\",\n        \"p.d.creations\": \"P.D.creations\",\n        \"tear drop\": \"Tear Drop\",\n        \"434notfound\": \"434 Not Found\",\n        \"hikiwari nattou\": \"ひきわり納豆\",\n        \"hirahira\": \"ひらひら\",\n        \"yasakaninomagatama\": \"八坂琼曲玉\",\n        \"kansen shoujo\": \"甘泉少女\",\n        \"yuzuponz\": \"ゆずぽん酢\",\n        \"hamurabi-dou\": \"いちお屋\",\n        \"wasabi\": \"WASABI\",\n        \"abura batake bokujyo.\": \"あぶら畑牧場。\",\n        \"poetto\": \"POETTO\",\n        \"infinity drive\": \"INFINITY DRIVE\",\n        \"warabimochi\": \"ワラビモチー\",\n        \"fusionz\": \"Fusionz\",\n        \"munchengraph\": \"MünchenGraph\",\n        \"okashi tai\": \"おかし隊\",\n        \"morigotatsu\": \"モリゴタツ\",\n        \"funi funi lab\": \"フニフニラボ\",\n        \"nantara kantara\": \"ナンタラカンタラ\",\n        \"juuryoku shiki youheki\": \"重力式拥壁\",\n        \"cannabis\": \"カンナビス\",\n        \"archives\": \"アーカイブ\",\n        \"notone\": \"NOTONE\",\n        \"small marron\": \"Small Marron\",\n        \"palepink\": \"PalePink!\",\n        \"kokatsubatake\": \"こかつ畑\",\n        \"nise-jyuusyofutei\": \"伪住所不定\",\n        \"rpg company 2\": \"RPGカンパニー2\",\n        \"royal bitch\": \"ろいやるびっち\",\n        \"einsatz\": \"Einsatz\",\n        \"majimeya\": \"真面目屋\",\n        \"almarosso\": \"アルマロッソ\",\n        \"jitaku vacation\": \"自宅vacation\",\n        \"avalanche\": \"あばらんち\",\n        \"suzu no oka\": \"鈴の丘\",\n        \"gegera standard\": \"GEGERA STANDARD\",\n        \"studio mizuyokan\": \"スタジオみずよーかん\",\n        \"a ashgrey mix\": \"A AshGrey Mix\",\n        \"m.o seisakujo\": \"M.O制作所\",\n        \"orange bullet\": \"ORANGE BULLET\",\n        \"circle taihei-tengoku\": \"サーカル太平天国\",\n        \"kankituteien\": \"柑橘庭园\",\n        \"orukaniumu haigou a-jou\": \"おるかにうむ配合A錠\",\n        \"star-dreamer tei\": \"星梦亭\",\n        \"hexivision\": \"HEXIVISION\",\n        \"naruho-dou\": \"NARUHO堂\",\n        \"index410\": \"INDEX:410\",\n        \"mzfist\": \"MZの拳\",\n        \"twilight dusk\": \"TWILIGHT DUSK\",\n        \"kamikadou\": \"かみか堂\",\n        \"oboro and tempo gensui dou\": \"胧&天蓬元帅堂\",\n        \"kanden shoujo chuuihou\": \"感电少女注意报\",\n        \"niku ringo\": \"肉りんご\",\n        \"wareme\": \"割れ目\",\n        \"hakuginmokusei\": \"白銀木犀\",\n        \"meshikutteneru.\": \"飯食って寝る。\",\n        \"little hamlet\": \"りとる☆はむれっと\",\n        \"tarehamu\": \"たれハム\",\n        \"black dog\": \"BLACK DOG\",\n        \"shimesaba\": \"しめさば\",\n        \"forestrest\": \"ForestRest\",\n        \"norioikeru\": \"のりおいける!\",\n        \"himawari no tane\": \"ひまわりのたね\",\n        \"jieitai\": \"JIEITAI\",\n        \"honey qp\": \"Honey QP\",\n        \"ayuest\": \"AYUEST\",\n        \"inbou no teikoku\": \"阴谋的帝国\",\n        \"gate of xiii\": \"Gate of XIII\",\n        \"neko masshigura\": \"ねこまっしぐら\",\n        \"rorie-do\": \"ろり絵堂\",\n        \"inumiso\": \"イヌミソ\",\n        \"natsutama\": \"なつたま\",\n        \"wakuwaku doubutsuen\": \"わくわく動物園\",\n        \"shikishima guntool\": \"敷岛赝具\",\n        \"kaname\": \"要\",\n        \"studio vanguard\": \"STUDIO VANGUARD\",\n        \"gerupin\": \"ゲルピン\",\n        \"knockout\": \"KNOCKOUT\",\n        \"atamanurui mix-er\": \"アタマヌルイMIX-eR\",\n        \"mecchori\": \"めっちょり\",\n        \"titokara 2nd branch\": \"千岁乌山第2出张所\",\n        \"fakestar\": \"FAKESTAR\",\n        \"nikomi omurice\": \"煮込みオムライス\",\n        \"inaka no yasaiya\": \"田舎の野菜屋\",\n        \"nacchuushou\": \"夏中症\",\n        \"applesauce\": \"Applesauce\",\n        \"aquadrop\": \"アクアドロップ\",\n        \"ttt\": \"TTT\",\n        \"abyukyo koubou\": \"あびゅうきょ工房\",\n        \"asatsuki dou\": \"朝月堂\",\n        \"serizawa-room\": \"芹泽室\",\n        \"suzuya\": \"凉屋\",\n        \"cradle\": \"Cradle\",\n        \"puffsleeve\": \"Puffsleeve\",\n        \"nitro\": \"NITRO\",\n        \"girls empire\": \"娘。帝國\",\n        \"ameshoo\": \"あめしょー\",\n        \"yumesaki annai kairanban\": \"夢先案内回覧版\",\n        \"aihara hanten\": \"相原饭店\",\n        \"full high kick\": \"ふるはいきっく\",\n        \"punipuni doumei\": \"ぷにぷに同盟\",\n        \"sokomono suisou\": \"底物水槽\",\n        \"shiratamaco\": \"しらたまこ\",\n        \"oreteki18kin\": \"俺的十八禁\",\n        \"dl mate\": \"DLメイト\",\n        \"kaminagi-tei\": \"神凪邸\",\n        \"execio\": \"エクセシオ\",\n        \"seza team\": \"せざちーむ\",\n        \"shihachirou\": \"四八楼\",\n        \"maccha aji\": \"抹茶味\",\n        \"wireframe\": \"WIREFRAME\",\n        \"maho-shinsengumi\": \"魔法新撰组\",\n        \"caramel crunch\": \"CARAMEL CRUNCH!\",\n        \"ncp\": \"NCP\",\n        \"choujikuu yousai kachuusha\": \"超時空要塞カチューシャ\",\n        \"nanmin festival\": \"難民ふぇすてぃばる\",\n        \"ririo gatto\": \"りーりおがーと\",\n        \"activemover\": \"ActiveMover\",\n        \"mizuchirimen\": \"ミズチリメン\",\n        \"happy water\": \"HAPPY WATER\",\n        \"naragyogyo kumiai\": \"なら漁業組合\",\n        \"shichiten battou\": \"七天罚讨\",\n        \"drop dead\": \"DROP DEAD!!\",\n        \"erect touch\": \"ERECT TOUCH\",\n        \"melanchol\": \"メランコル\",\n        \"meisho hanten\": \"めーしょー飯店\",\n        \"rushe museum\": \"Rushe Museum\",\n        \"ame usagi\": \"あめうさぎ\",\n        \"sottilo nero\": \"ソッティーロネーロ\",\n        \"hollowplus\": \"HOLLOWPLUS\",\n        \"iminic\": \"IMINIC\",\n        \"oshaban\": \"オシャバン\",\n        \"diogenes club\": \"ディオゲネスクラブ\",\n        \"puchi village\": \"ぷち★びれっじ\",\n        \"mirrorworld\": \"MirrorWorld\",\n        \"kenkokotsu\": \"KENKOKOTSU\",\n        \"hakujira uminekodan\": \"はくじら海猫団\",\n        \"missing paradise\": \"ミッシングパラダイス\",\n        \"try and hougen futari shakai\": \"TRY&方言二人社会\",\n        \"mute cafe\": \"MUTE Cafe\",\n        \"taishou romanesque\": \"大正ロマネスク\",\n        \"gangontou\": \"巌魂薹\",\n        \"kaokuba\": \"家屋場\",\n        \"yukikagerou\": \"雪陽炎\",\n        \"akumenari\": \"アクメナリ!\",\n        \"hot mikan\": \"ほっとみかん\",\n        \"g-panda\": \"Gぱんだ\",\n        \"high tech pen case\": \"ハイテクペンケース\",\n        \"strawberry milk studio\": \"Strawberry Milk Studio\",\n        \"lolita crusaders\": \"ロリータクルセイダーズ\",\n        \"buaifamu\": \"ぶあいふぁむ\",\n        \"takenoko gohan\": \"筍御饭\",\n        \"shinenkan\": \"新炎馆\",\n        \"studio himawari\": \"スタジオ☆ひまわり\",\n        \"tohgoo\": \"冬宫\",\n        \"makino jimusho\": \"マキノ事務所\",\n        \"turtle.fish.paint\": \"龟鱼派\",\n        \"bear hand\": \"熊掌社\",\n        \"star f\": \"★F\",\n        \"service heaven\": \"サービスヘブン\",\n        \"spiritoso\": \"Spiritoso\",\n        \"kurobinega\": \"クロビネガ\",\n        \"nokishita no nekoya\": \"軒下の猫屋\",\n        \"denmoe\": \"电萌\",\n        \"mocomocodo\": \"もこモコ堂\",\n        \"werk\": \"Werk\",\n        \"nicutoka tabete mitanainaa\": \"肉とか食べてみたいなぁ・・・\",\n        \"gamushara\": \"我武者ら!\",\n        \"sandan\": \"SANDAN\",\n        \"newton no ringo\": \"ニュートンの林檎\",\n        \"kinako no yama\": \"きなこの山\",\n        \"hanamo oukoku\": \"はなも王国\",\n        \"gokiburi teishoku\": \"ゴキブリ定食\",\n        \"yumeyoubi\": \"ゆめようび\",\n        \"studio ren\": \"STUDIO REN\",\n        \"koterabyte\": \"コテラバイト\",\n        \"shiroi kuroi\": \"シロイクロイ\",\n        \"maidoll\": \"MAIDOLL\",\n        \"chromatic room\": \"CHROMATIC ROOM\",\n        \"piyokorota\": \"ぴよころた\",\n        \"d-raw 2\": \"Draw Two\",\n        \"konnyaku nabe\": \"蒟蒻锅\",\n        \"onkin yuugi\": \"音筋游戏\",\n        \"radiostar\": \"RADIOSTAR\",\n        \"jackpot 64\": \"ジャックポット64\",\n        \"panzers\": \"パンツァーズ\",\n        \"kanten jigenryuu\": \"寒天示現流\",\n        \"nazunaya honpo\": \"荠屋本铺\",\n        \"usubeniya\": \"うすべに屋\",\n        \"akusei-shinseibutsu\": \"恶性真性物\",\n        \"night fuckers\": \"夜★FUCKERS\",\n        \"puppukupu\": \"ぷっぷくぷー\",\n        \"sago-jou\": \"沙悟荘\",\n        \"hi-per pinch\": \"ハイパーピンチ\",\n        \"reis room\": \"REI's ROOM\",\n        \"hasemi box\": \"Hasemi box\",\n        \"kaki no tane\": \"夏季のタネ\",\n        \"aruku denpatou no kai\": \"歩く電波塔の会\",\n        \"lolitachannel\": \"LolitaChannel\",\n        \"asakaze no shizuku\": \"朝風の雫\",\n        \"youki m.k.c.\": \"优希M.K.C.\",\n        \"poco natsu\": \"ぽこなつ\",\n        \"hoppe shokudou\": \"ほっぺ食堂\",\n        \"hinemosuan\": \"终日庵\",\n        \"moon ruler\": \"むうんるうらあ\",\n        \"shin hijiridou honpo\": \"真・圣堂☆本铺\",\n        \"toyatei\": \"とやてい\",\n        \"otona shuppan\": \"おとな出版\",\n        \"atsuya kougyou\": \"笃屋工业\",\n        \"bonjin\": \"梵人\",\n        \"mimipull\": \"MIMIPULL\",\n        \"rojiura manhole\": \"ロジウラマンホール\",\n        \"uribatakebokujou\": \"うり畑牧場\",\n        \"zenra yashiki\": \"全裸屋敷\",\n        \"beniiro kaitenkikou\": \"红色回转机构\",\n        \"gff\": \"GFF\",\n        \"waffle doumeiken\": \"ワッフル同盟犬\",\n        \"raid slash\": \"RAID SLASH\",\n        \"colomonyu\": \"ころもにゅ\",\n        \"umidori\": \"うみどり\",\n        \"l-gauge sha\": \"Lゲージ社\",\n        \"kodomo ginkou\": \"こどもぎんこう\",\n        \"kowareta radio\": \"コワレ田ラジ男\",\n        \"hatakewotagayasudake\": \"畑を耕すだけ\",\n        \"kuro no omikuji\": \"黒ノ御神籤\",\n        \"hakuchou no ouji\": \"白鳥の王子\",\n        \"kinokotei\": \"きのこ亭\",\n        \"kinokodomo\": \"きのこども\",\n        \"kohakutei\": \"琥珀亭\",\n        \"izanagi\": \"いざなぎ\",\n        \"inuteikoku\": \"犬帝国\",\n        \"yamamoto\": \"山本同人\",\n        \"private garden\": \"Private Garden\",\n        \"gs studio\": \"G's studio\",\n        \"axz\": \"AXZ\",\n        \"chagashi saiban\": \"茶菓子裁判\",\n        \"chesha neko no yakata\": \"チェシャ猫の館\",\n        \"shokuan\": \"触安\",\n        \"aomizuan\": \"青水庵\",\n        \"royal mountain\": \"ロイヤルマウンテン\",\n        \"radical dream\": \"Radical Dream\",\n        \"hellabunna\": \"へらぶな\",\n        \"zakkin kougyou\": \"杂菌工业\",\n        \"metaneko\": \"メタネコ\",\n        \"midsummer madness\": \"MIDSUMMER MADNESS\",\n        \"ebibinbintei\": \"えびびんびん亭\",\n        \"katamari-ya\": \"かたまり屋\",\n        \"amenosorashido\": \"あめのそらしど\",\n        \"o-mars\": \"O-Mars\",\n        \"moonphase\": \"MoonPhase\",\n        \"open book\": \"OPEN BOOK\",\n        \"kodomo beer\": \"こどもびーる\",\n        \"dramatic sharp\": \"Dramatic#\",\n        \"rtd\": \"RTD\",\n        \"hacchake yarou a team\": \"はっちゃけ野郎Aチーム\",\n        \"dieppe factory darkside\": \"DIEPPE FACTORY Darkside\",\n        \"booblian\": \"Booblian\",\n        \"korokoro udon\": \"コロコロうどん\",\n        \"ende der welt\": \"Ende der Welt\",\n        \"aeba no mori\": \"喘葉の森\",\n        \"hakka ame\": \"薄荷饴\",\n        \"kinengusa\": \"禁烟草\",\n        \"shinkai kissa\": \"深海喫茶\",\n        \"megane shoujo\": \"メガネ少女\",\n        \"extended part\": \"拡張パーツ\",\n        \"you you you\": \"YOU!YOU!YOU!\",\n        \"yuubin basha\": \"邮便马车\",\n        \"m.macabre\": \"M.MACABRE\",\n        \"ohkura bekkan\": \"大藏别馆\",\n        \"the dungeon in yarn\": \"The Dungeon In Yarn\",\n        \"white datura\": \"White Datura\",\n        \"hanekaze\": \"HANEKAZE\",\n        \"stardust cradle\": \"すたーだすとくれいどる\",\n        \"unagiyasan\": \"うなぎやさん\",\n        \"hana zakuro\": \"花柘榴\",\n        \"smith koumuten\": \"スミス工務店\",\n        \"tiny feather\": \"Tiny Feather\",\n        \"low thrust\": \"ロウスラスト\",\n        \"yashiya\": \"やし屋\",\n        \"enhance heart\": \"EnHANCE HEART\",\n        \"slice slime\": \"slice slime\",\n        \"fountains square\": \"Fountain's Square\",\n        \"kodoku intelligence\": \"孤独intelligence\",\n        \"comet\": \"かみっと\",\n        \"bicolor\": \"Bicolor\",\n        \"deans pro office\": \"帝恩PRO事务所\",\n        \"mizutaniya\": \"水谷屋\",\n        \"arysuivery\": \"ありぃすいべりぃ\",\n        \"nekojarasare\": \"猫じゃらされ\",\n        \"puchiota rakugaki\": \"ぷちオタ落描き\",\n        \"activa\": \"ACTIVA\",\n        \"atsuatsu muchimuchi\": \"アツアツムチムチ\",\n        \"kuro lili no heya\": \"黒りりの部屋\",\n        \"rip at lip\": \"Rip@Lip\",\n        \"marinesapphire\": \"海苍玉\",\n        \"liche\": \"Liche\",\n        \"seven deadly sins\": \"Seven deadly sins\",\n        \"mikan dou\": \"みかん堂\",\n        \"kotonosha\": \"琴乃舎\",\n        \"yume-zakura\": \"ゆめざくら\",\n        \"micro house\": \"みくろハウス\",\n        \"rapidrabbit\": \"RapidRabbit\",\n        \"melt soft\": \"めるとソフト\",\n        \"asahiage\": \"あさひあげ\",\n        \"muchakai\": \"梦茶会\",\n        \"gechunchi\": \"ゲッチュんち\",\n        \"seventh heaven maxion\": \"セブンスヘブンMAXION\",\n        \"caramel macchiato\": \"Caramel Macchiato\",\n        \"dokudoku meron\": \"どくどくめろん\",\n        \"buwu 26 celsius\": \"部屋26℃\",\n        \"htsk\": \"HTSK\",\n        \"eucalyptus house\": \"ユーカリハウス\",\n        \"akiba maou\": \"秋叶魔王\",\n        \"nagiya honpo\": \"なぎや本舗\",\n        \"lu yan suo\": \"炉研所\",\n        \"nippon h manga kyoukai\": \"日本H漫画协会\",\n        \"urakata honpo\": \"里方本铺\",\n        \"ando six gates\": \"Ando Six Gates\",\n        \"tamagou\": \"多摩豪\",\n        \"haruharutei\": \"春叶流亭\",\n        \"nizyuugokuhiya\": \"二十极秘屋\",\n        \"pokachutei\": \"ぽかちゅ亭\",\n        \"w.label\": \"W.label\",\n        \"mutekei-fire\": \"むてけいファイヤー\",\n        \"qp flapper\": \"QP:flapper\",\n        \"momo no tsubomi\": \"モモのつぼみ\",\n        \"zenra restaurant\": \"全裸レストラン\",\n        \"kabushikigaisha toranoana\": \"株式会社虎の穴\",\n        \"lezmoe\": \"レズ萌え!\",\n        \"yuriru-rarika\": \"ユリルラリカ\",\n        \"kuroquis\": \"クロッキー!!\",\n        \"tmzf no circle\": \"TMZFのサークル\",\n        \"miniature magic\": \"みにちゅあまじっく\",\n        \"tinker bell\": \"てぃんかーべる\",\n        \"just-k\": \"JUST-K\",\n        \"justice-flame\": \"JUSTICE-FLAME\",\n        \"yakumi benishouga\": \"药味红生姜\",\n        \"nekonokone\": \"ねこのこね\",\n        \"hiroshikidou\": \"宏式堂\",\n        \"shiftalton\": \"ShiftAltOn\",\n        \"masamune kokichi\": \"マサムネコキチ\",\n        \"redlight\": \"REDLIGHT\",\n        \"komachiya\": \"小町屋\",\n        \"cu-little2\": \"Cu-little2\",\n        \"furaipan daimaou\": \"ふらいぱん大魔王\",\n        \"wicked heart\": \"WICKED HEART\",\n        \"peach candy\": \"Peach Candy\",\n        \"live house\": \"LIVE HOUSE\",\n        \"sujoyu and co.\": \"酢醤油&Co.\",\n        \"dksha\": \"DKsha\",\n        \"re barna\": \"re:barna\",\n        \"furanokumarin\": \"ふらのくまりん\",\n        \"rm-rf-\": \"RM-RF-*\",\n        \"yakumi sarai\": \"薬味さらい\",\n        \"assemblink\": \"アセンブリンク\",\n        \"yorando\": \"洋兰堂\",\n        \"fdsp\": \"FDSP\",\n        \"nyankone\": \"にゃんこね\",\n        \"handsome aniki\": \"ハンサム兄貴\",\n        \"grenade\": \"ぐれねーど\",\n        \"vivid thunder\": \"びびっどサンダー\",\n        \"ryu-seki-do\": \"流石堂\",\n        \"hiyotama goten\": \"ひよたま御殿\",\n        \"seqmed\": \"SEQMED\",\n        \"ichinichi sanjou\": \"一日三锭\",\n        \"kesshoku mikan\": \"血色蜜柑\",\n        \"kakkuu mogura\": \"滑空モグラ\",\n        \"ties\": \"TIES\",\n        \"public bath\": \"Public bath\",\n        \"nagai hamu\": \"長井ハム\",\n        \"maltese\": \"まるちぃず\",\n        \"goromenz\": \"ゴロメンツ\",\n        \"stemun\": \"すてむん\",\n        \"rosapersica\": \"Rosapersica\",\n        \"kudoki dancer\": \"くどきダンサー\",\n        \"athome shuka\": \"アットホーム酒家\",\n        \"111 touban\": \"111当番\",\n        \"iro wa nioe do\": \"色は匂えど\",\n        \"joudan janai yo\": \"冗談じゃないよっっ!\",\n        \"poyopacho\": \"ぽよぱちょ\",\n        \"guilty hearts\": \"GUILTY HEARTS\",\n        \"ortensia\": \"おるてんしあ\",\n        \"expot\": \"EXPOT\",\n        \"shouchuu mac\": \"烧酎MAC\",\n        \"golden zombie\": \"金珠狼\",\n        \"melty pot\": \"Melty Pot\",\n        \"airbox\": \"AIR BOX\",\n        \"suwateria\": \"すわてりあ\",\n        \"ichigosize\": \"いちごさいず\",\n        \"bakutaso switch\": \"爆タソスイッチ\",\n        \"miyuuhodoh\": \"美游穗堂\",\n        \"7cm\": \"7センチ\",\n        \"nisemididoronokai\": \"偽MIDI泥の会\",\n        \"veronica no ha\": \"ヴェロニカの歯\",\n        \"jet-black baselarde\": \"漆黒のバゼラード\",\n        \"juicebox koujou\": \"ジュースボックス工場\",\n        \"yukinohana\": \"ユキノハナ\",\n        \"sa ku\": \"sa_ku\",\n        \"rurunoya\": \"るるノ屋\",\n        \"all delete\": \"ALL DELETE\",\n        \"sigma-arts\": \"Σ-Arts\",\n        \"fanatic fetish\": \"Fanatic Fetish\",\n        \"count2.4\": \"Count2.4\",\n        \"lily\": \"Lily\",\n        \"studio empty\": \"Studio Empty\",\n        \"fuurainin\": \"风来人\",\n        \"dasshifunnyuu\": \"脱脂粉乳\",\n        \"hidamari hwy\": \"ひだまりHWY\",\n        \"insert\": \"INSERT\",\n        \"mbl\": \"MBL\",\n        \"french letter\": \"French letter\",\n        \"sweettaboo\": \"SWEETTABOO\",\n        \"mikezoutei\": \"三毛藏亭\",\n        \"kochou no yume\": \"胡蝶夢\",\n        \"hanekura ginma\": \"羽倉ぎんま\",\n        \"suzunone strike\": \"スズノネストライク\",\n        \"bloody okojo\": \"Bloody Okojo\",\n        \"sunset beach\": \"サンセットビーチ\",\n        \"alicecreation\": \"AliceCreation\",\n        \"shirokurousa\": \"しろくろうさ\",\n        \"rehabilitation\": \"リハビリテーション\",\n        \"fools art gallery\": \"FOOL's ART GALLERY\",\n        \"galaxist\": \"GALAXIST\",\n        \"setoran\": \"せとらん\",\n        \"global one\": \"グローバルワン\",\n        \"sagittarius\": \"サジタリアス\",\n        \"rolling star\": \"ローリングスター\",\n        \"milk pudding\": \"MILK PUDDING\",\n        \"circle are\": \"サークルARE\",\n        \"kazan no you\": \"火山の楊\",\n        \"hard chrome\": \"ハードクローム\",\n        \"pochi-goya.\": \"ぽち小屋。\",\n        \"hikawado\": \"火川堂\",\n        \"mof-mof\": \"mof-mof\",\n        \"aneko no techo\": \"あねこの手帖\",\n        \"circle heron\": \"サークルヘロン\",\n        \"youkai tamanokoshi\": \"ようかい玉の輿\",\n        \"waffle sand\": \"わっふるさんど\",\n        \"monotrust\": \"モノトラスト\",\n        \"fuwamoko honpo\": \"ふわもこ本舗\",\n        \"i-raf-you\": \"I-Raf-you\",\n        \"urahyakkiyakou\": \"里百鬼夜行\",\n        \"boundary of dream\": \"夢の境界\",\n        \"innocent chapel\": \"INNOCENT CHAPEL\",\n        \"studio fow\": \"Studio-FOW\",\n        \"happouvijin\": \"八方微人\",\n        \"squeeze\": \"SQUEEZE!!\",\n        \"squeeze candy heaven\": \"squeezecandyheaven\",\n        \"polinky hiroba\": \"ポリンキー広場\",\n        \"v-slash\": \"V-SLASH\",\n        \"tanima club\": \"谷间俱乐部\",\n        \"paper hearts\": \"PAPER HEARTS\",\n        \"gekikara koushinryou\": \"激辛香辛料\",\n        \"pha-la-dogs\": \"ぱらどっくす。\",\n        \"yojouhan shobou\": \"四叠半书房\",\n        \"maron maron\": \"まろん☆まろん\",\n        \"yukijirushi nyuugyou\": \"逝印乳业\",\n        \"suimitsutou koubou\": \"水密桃工房\",\n        \"netekuras\": \"ネテクラス\",\n        \"hachimitsu syoujo\": \"蜂蜜少女\",\n        \"miyako dokei\": \"みやこ時計\",\n        \"air pocket\": \"Air Pocket\",\n        \"teitetsu kishidan\": \"蹄铁骑士团\",\n        \"yowamidori\": \"よわみどり\",\n        \"koi tenshi doumei\": \"恋☆天使同盟\",\n        \"ayamaji nuji\": \"誤じ脱ぢ\",\n        \"p.d chump\": \"P.D Chump\",\n        \"naya\": \"纳屋\",\n        \"depression\": \"でぱれーしょん\",\n        \"yanasegawabeya\": \"柳瀬川部屋\",\n        \"ponkotsu works\": \"ぽんこつわーくす\",\n        \"amezaiku\": \"雨细工\",\n        \"niboshi\": \"煮干\",\n        \"niboniboshi\": \"にぼ煮干\",\n        \"daisuki beachkun\": \"大好き!!ビーチクン\",\n        \"mirake\": \"MiraKE\",\n        \"yodakapan\": \"ヨダカパン\",\n        \"mimoneland\": \"ミモネランド\",\n        \"doronko yuuyake\": \"どろんこ夕焼\",\n        \"panic room\": \"パニックルーム!\",\n        \"studio aruta\": \"スタジオあるた\",\n        \"haruharudo\": \"はるはる堂\",\n        \"tamanokoshi\": \"たまのこし\",\n        \"minamihamaya\": \"南浜屋\",\n        \"lolipop complete\": \"ロリポップ コンプリート\",\n        \"studio wallaby\": \"スタジオ・ワラビー\",\n        \"castlism\": \"Castlism\",\n        \"mtsp\": \"MTSP\",\n        \"bijutsubu\": \"美术部\",\n        \"yowatari kouba\": \"よわたり工場\",\n        \"staccato squirrel\": \"Staccato・Squirrel\",\n        \"sakuradou\": \"樱堂\",\n        \"candy club\": \"Candy Club\",\n        \"apple amza\": \"APPLE Amza\",\n        \"rorinoutage\": \"ロリの宴\",\n        \"comex\": \"COMEX\",\n        \"marimo-ya\": \"まりも屋\",\n        \"moonglow\": \"MoonGlow\",\n        \"aikanheiwa.\": \"愛館平和。\",\n        \"yokoshimaya\": \"邪屋。\",\n        \"seiryoukei inryousui\": \"清涼系飲料水\",\n        \"mugenkidou a\": \"无限轨道A\",\n        \"penetrate\": \"Penetrate\",\n        \"astral\": \"Astral\",\n        \"choki no kamisama\": \"チョキの神さま\",\n        \"wanwandoh\": \"わんわん堂\",\n        \"f slash t\": \"F/T\",\n        \"kenja time\": \"けんじゃたいむ\",\n        \"turuvege.\": \"つるべじ。\",\n        \"seven colors drop\": \"なないろどろっぷ\",\n        \"foundation slash 1\": \"Foundation／1\",\n        \"happy birthday\": \"Happy Birthday\",\n        \"initial-g\": \"イニシャルG\",\n        \"j.o.n.g.\": \"ジョング\",\n        \"hitomishiri\": \"ひとみしり\",\n        \"mieow\": \"Mieow\",\n        \"kariya\": \"刈屋\",\n        \"kichiku koubou\": \"鬼畜工房\",\n        \"zettai shoujo\": \"绝对少女\",\n        \"circle roman hikou\": \"サークル浪漫飛行\",\n        \"asstaro-san\": \"アスタローサン\",\n        \"kurowasabi\": \"くろわさび\",\n        \"kabayakiya\": \"蒲烧屋\",\n        \"datenshi no ana\": \"墮天使の坑\",\n        \"mix fry\": \"みっくすふらい\",\n        \"kokonokaya\": \"九日屋\",\n        \"orangemaru\": \"OrangeMaru\",\n        \"ishikawa pro\": \"石川プロ\",\n        \"neyukidou\": \"根雪堂\",\n        \"o.n art works\": \"O.N Art Works\",\n        \"an-arc\": \"アンアーク\",\n        \"anmichu dou\": \"あんみちゅ堂\",\n        \"melodeathweep\": \"めろですうぃーぷ\",\n        \"absolute\": \"Absolute\",\n        \"mizone doubutsuen\": \"みぞね動物園\",\n        \"studio honeyblade\": \"STUDIO HONEYBLADE\",\n        \"furukadou\": \"古ヶ堂\",\n        \"dam koubou\": \"だむ工房\",\n        \"heart of green\": \"はーとおぶぐりーん\",\n        \"dogyear\": \"DOGYEAR\",\n        \"kagiyama baking co ltd\": \"鍵山製パン株式会社\",\n        \"shittoden\": \"嫉妬殿\",\n        \"sea-s\": \"SEA-S\",\n        \"stray hermit\": \"ストレイハーミット\",\n        \"fox grave\": \"FOX GRAVE\",\n        \"muoto lab\": \"むおとラボ\",\n        \"momoiro kageboushi\": \"桜色影法師\",\n        \"sennen teikoku\": \"千年帝国\",\n        \"tataraba\": \"たたらば\",\n        \"koniro club\": \"紺色くらぶ\",\n        \"west one\": \"WEST ONE\",\n        \"kotsu\": \"KOTSU\",\n        \"suzume nest\": \"すずめねすと\",\n        \"slash\": \"SLASH\",\n        \"yukimi biyori\": \"雪见日和\",\n        \"hinata to keidai to ennichi\": \"ひなたと境内と縁日\",\n        \"matsuri gensou\": \"祭り幻想\",\n        \"homuraya\": \"ほむら屋★プレアデス\",\n        \"heavy bunny addiction\": \"H.B.A\",\n        \"mata ashita.\": \"また明日。\",\n        \"muses garden\": \"MUSES GARDEN\",\n        \"nekomataya\": \"猫又屋\",\n        \"oving\": \"OVing\",\n        \"ditama kikaku\": \"ぢたま企画\",\n        \"crespirit\": \"CreSpirit\",\n        \"modae tei\": \"闷亭\",\n        \"oyama dennou giken\": \"小山电脑技研\",\n        \"lux soft\": \"ルクスソフト\",\n        \"gunsryu\": \"GUNsRYU\",\n        \"happy core\": \"HAPPY CORE\",\n        \"dai-kotetsu dan\": \"ダイコテツ団\",\n        \"tora machine\": \"虎マシーン\",\n        \"z.a.p.\": \"Z.A.P.\",\n        \"aozora shoujo\": \"青空少女\",\n        \"morimi-ya\": \"森见屋\",\n        \"upa24\": \"UPA24\",\n        \"twilight road\": \"Twilight Road\",\n        \"nine four air\": \"Nine Four Air\",\n        \"yogurt prince\": \"ヨーグルトプリンス\",\n        \"ukkaridou\": \"うっかり堂\",\n        \"sawwei005\": \"Sawwei005\",\n        \"fujiya honten\": \"藤屋本店\",\n        \"nijigen shoujo\": \"虹元少女\",\n        \"muskel bild\": \"Muskel☆Bild\",\n        \"takebouzu\": \"竹坊主\",\n        \"egyptsobaya\": \"エジプトそば屋\",\n        \"dm-fc\": \"DM-FC\",\n        \"awareness\": \"Awareness\",\n        \"peromex\": \"ぺろめっくす\",\n        \"jouji mujoh\": \"常时无常\",\n        \"shinjugai\": \"真珠贝\",\n        \"sui-sui-laboratory\": \"萃酔研究所\",\n        \"ashita ganbaru.\": \"明日がんばる。\",\n        \"kidoya\": \"きどや\",\n        \"chimichanga\": \"ちみチャンガ\",\n        \"fukinshin\": \"布巾心\",\n        \"cleari tei\": \"くれり亭\",\n        \"ash wing\": \"Ash Wing\",\n        \"kousyoudou\": \"咬伤堂\",\n        \"leimkissa\": \"LeimkissA\",\n        \"paschara-mode\": \"ぱっきゃらもーど\",\n        \"e61 geinou pro\": \"E61芸能プロ\",\n        \"nijiiro zakura\": \"にじいろ桜\",\n        \"tri-moon\": \"TRI-MOON!\",\n        \"algolagnia\": \"アルゴラグニア\",\n        \"arestica\": \"ARESTICA\",\n        \"hapoi-dokoro\": \"はぽい処\",\n        \"route1\": \"ROUTE1\",\n        \"chural-an\": \"ちゅらる庵\",\n        \"monaka udon\": \"もなかうどん\",\n        \"kingyo origin\": \"金魚オリジン\",\n        \"yudokuya\": \"友毒屋\",\n        \"sandworks\": \"SANDWORKS\",\n        \"sorairokibun\": \"空色気分\",\n        \"stella\": \"Stella\",\n        \"yuunagi gaibutai\": \"夕凪外部隊\",\n        \"lionoil\": \"らいおんおいる\",\n        \"arekusa thunder\": \"アレクササンダー\",\n        \"seaside\": \"SEA SIDE\",\n        \"sakyuya\": \"砂丘屋\",\n        \"ph-bu\": \"PH部\",\n        \"kyurettokyuretto\": \"^^\",\n        \"panda cotta\": \"Panda Cotta\",\n        \"tsujimo ga machi ni yattekita\": \"つじもが町に殺ってきた!!!\",\n        \"bindume syojo.\": \"瓶诘少女。\",\n        \"pinsize inc.\": \"PINSIZE Inc.\",\n        \"hakka-ya\": \"薄荷屋\",\n        \"akai shougeki\": \"緋い笑撃\",\n        \"goma saba\": \"ごまさば\",\n        \"binkan de nani ga warui\": \"びんかんでなにがわるい\",\n        \"minagi zakura\": \"みなぎざくら\",\n        \"root 12-hedron\": \"ルート十二面体\",\n        \"gunjyou zensen\": \"群青前线\",\n        \"yanagiba dai\": \"柳叶台\",\n        \"wasanbon\": \"わさんぼん\",\n        \"pk gristle\": \"PKグリッスル\",\n        \"rintoneko\": \"りんとねこ\",\n        \"seiitsukyou\": \"性一教\",\n        \"canvas\": \"カンバス\",\n        \"weee\": \"Weee\",\n        \"ichigo pants\": \"いちごぱんつ\",\n        \"uramonoya\": \"うらもの屋\",\n        \"yukinkousagi\": \"ゆきんこうさぎ\",\n        \"swat\": \"SwaT\",\n        \"sandai yokkyuu\": \"さんだいよっきゅう\",\n        \"ameya.\": \"饴屋。\",\n        \"yumemiru shiro\": \"ゆめみる白\",\n        \"peach garden\": \"桃【Peach Garden】园\",\n        \"rubi-sama wo agameru kai\": \"るび様を崇める会\",\n        \"akikaze asparagus\": \"秋風アスパラガス\",\n        \"ranpakudou\": \"卵白堂\",\n        \"decoppachi\": \"DECOッパチ\",\n        \"z-vector\": \"Z-VECTOR\",\n        \"himeshibori\": \"ヒメシボリ\",\n        \"milkybox\": \"MilkyBox\",\n        \"sushipuri\": \"スシプリ\",\n        \"ruman-dou\": \"るまん堂\",\n        \"kaientai\": \"絵援隊\",\n        \"atugi de 5\": \"厚木で5時\",\n        \"sol-fa-soft\": \"sol-fa-soft\",\n        \"right away\": \"Right away\",\n        \"pianiishimo\": \"ピアニッシモ\",\n        \"ijimaya\": \"イジマヤ\",\n        \"inariya\": \"稻荷屋\",\n        \"triple head\": \"とりぷるへっど\",\n        \"tamaya\": \"珠屋\",\n        \"nigatsu umare\": \"二月生まれ\",\n        \"ninja yashiki\": \"忍者屋敷\",\n        \"nekoshin\": \"NEKOSHIN\",\n        \"momo9\": \"ももきゅー\",\n        \"hidebou house\": \"ヒデボウハウス\",\n        \"kawazoko\": \"KAWAZOKO\",\n        \"sexual khorosho\": \"セクシャルハラショー\",\n        \"urayoroduya\": \"里万屋\",\n        \"lost rarities\": \"LOST RARITIES\",\n        \"gesshoku\": \"月蚀\",\n        \"misuterutein\": \"みすてるていん\",\n        \"namacyoko\": \"生チョコ\",\n        \"payanikov\": \"ぱやニコフ\",\n        \"3dt\": \"3DT\",\n        \"extreme ponkotsu\": \"エクストリームポンコツ\",\n        \"gorilla bouzu\": \"ゴリラ坊主\",\n        \"mutant\": \"Mutant\",\n        \"junginboshi\": \"纯银星\",\n        \"h2o aquarium\": \"H2O Aquarium\",\n        \"kurousagi project\": \"黒兎プロジェクト\",\n        \"kekemotsu\": \"ケケモツ\",\n        \"yom shoten\": \"よむ書店\",\n        \"tsukemayuge\": \"つけまゆげ\",\n        \"omochi\": \"おもち\",\n        \"horsetail\": \"ほーすている\",\n        \"nukesaku\": \"拔作\",\n        \"ichi-kan\": \"いちかん。\",\n        \"karashi mentaiko\": \"からしめんたい子\",\n        \"nextpreview\": \"NextPreview\",\n        \"saga planets\": \"Saga Planets\",\n        \"banana koubou\": \"ばな奈工房\",\n        \"mujitan\": \"むじたん\",\n        \"aka no hana\": \"赤のハナ\",\n        \"caustica\": \"コースティカ\",\n        \"denen shoujo\": \"田园少女\",\n        \"dressing plus party\": \"Dressing+Party\",\n        \"butakoma 300g\": \"ぶたコマ300g\",\n        \"white lily\": \"White Lily\",\n        \"oeuvre bijutsukan\": \"ウーブル美術館\",\n        \"kyoumen aquarium\": \"鏡面アクアリウム\",\n        \"mamemaru shoten\": \"豆丸书店\",\n        \"joibo no juunin\": \"ジョイボの住人\",\n        \"metagraft\": \"MetaGraft\",\n        \"festa.\": \"ふぇすた。\",\n        \"slash yen\": \"/￥\",\n        \"pastas estab\": \"PASTA'S ESTAB\",\n        \"rinjuu circus\": \"临终马戏团\",\n        \"ue ni aru mikan\": \"うえにあるみかん\",\n        \"ruu kikaku\": \"龙企画\",\n        \"hoshizora sutekki\": \"星空ステッキ\",\n        \"come through\": \"Come Through\",\n        \"wancho-ke\": \"わんちょ家\",\n        \"kajishima onsen\": \"梶岛温泉\",\n        \"kuroneko-kan\": \"クロネコ缶\",\n        \"cook milk\": \"くっくみるく\",\n        \"kudamono monogatari\": \"果物物语\",\n        \"romance no neko ookami musume\": \"ろまんすの猫狼娘\",\n        \"nanairo otogizoushi\": \"七色御伽草子\",\n        \"buruman\": \"BURUMAN\",\n        \"nyaito senyou\": \"にゃいと専用\",\n        \"pinata party\": \"ぴにゃたぱ～てぃ\",\n        \"hatena-box\": \"HATENA-BOX\",\n        \"black smile\": \"BLACK SMILE\",\n        \"ph\": \"PH\",\n        \"aane\": \"あーね\",\n        \"tsuki no uragawa\": \"ツキノウラガワ\",\n        \"manekineko\": \"まねきねこ\",\n        \"mayoriyo\": \"MayoRiyo\",\n        \"moe shoujo ryouiki\": \"萌少女领域\",\n        \"sakakiya\": \"榊屋\",\n        \"unstoppable plus\": \"Unstoppable+\",\n        \"the nation of head scissors\": \"The Nation of Head Scissors\",\n        \"airy socks\": \"エアリーソックス\",\n        \"sheepfold\": \"羊小屋\",\n        \"aroma gaeru\": \"あろまガエル\",\n        \"arion canvas\": \"Arion Canvas\",\n        \"a color summoner\": \"アカラサマナ\",\n        \"marimo\": \"MARIMO\",\n        \"alem-gakan\": \"アレム画館\",\n        \"re.lay\": \"莉零\",\n        \"milk force\": \"ミルクフォース\",\n        \"kuureishiki zunou\": \"空冷式头脑\",\n        \"matsurija\": \"祭社\",\n        \"asgo\": \"ASGO\",\n        \"yobigakka\": \"预备学科\",\n        \"locker room\": \"LockerRoom\",\n        \"pettan doujou\": \"ペッタン道場\",\n        \"art book chipika\": \"Art Book Chipika\",\n        \"alemateorema\": \"アレマテオレマ\",\n        \"otokojuku\": \"おとこじゅく\",\n        \"kitsune-goya\": \"きつね小屋\",\n        \"kuroni\": \"クロニ\",\n        \"seventh engine\": \"せぶんすえんじん\",\n        \"n-cyak-m-mu-\": \"んーちゃかむーむー\",\n        \"purple salamander\": \"パープルサラマンダー\",\n        \"yume yori suteki na\": \"夢よりすてきな\",\n        \"alice no takarabako\": \"ありすの宝箱\",\n        \"akumu no takuhaibin\": \"Nightmare Express-悪夢の宅配便-\",\n        \"san se fang\": \"三色坊\",\n        \"uninigumi\": \"うにに組\",\n        \"otomekibun\": \"乙女気分\",\n        \"gasshuukoku netamekoru\": \"合众国ネタメコル\",\n        \"shallot coco\": \"シャルロット・ココ\",\n        \"orange restaurant\": \"オレンジレストラン\",\n        \"astro creep\": \"ASTRO CREEP\",\n        \"gin no hoshitei\": \"銀の星亭\",\n        \"yorokobi no kuni\": \"ヨロコビの国\",\n        \"babel\": \"BABEL\",\n        \"o-g-g\": \"O・G・G\",\n        \"ikebukuro dpc\": \"池袋DPC\",\n        \"ningyou gishou\": \"人形技厂\",\n        \"saiga dou\": \"SAIGA堂\",\n        \"k-drive\": \"K-Drive\",\n        \"larchange\": \"L'ARCHANGE\",\n        \"nyuu koubou\": \"にゅう工房\",\n        \"freehand tamashii\": \"フリーハンド魂\",\n        \"tabuchi-san chi\": \"たぶちさんち\",\n        \"2d creative\": \"2Dクリエイティブ\",\n        \"higuma-ya\": \"ひぐま屋\",\n        \"clearmana plum\": \"クリアマナ・プラム\",\n        \"hanjuku iriko dashi\": \"半熟いりこ出汁\",\n        \"pururun estate\": \"プルルンエステ\",\n        \"heatwave\": \"HEATWAVE\",\n        \"nerco\": \"NERCO\",\n        \"zensuu hakai kensa\": \"全数破坏检査\",\n        \"ng010\": \"NG010\",\n        \"silver meteor\": \"SILVER METEOR\",\n        \"houmitsudou\": \"方密堂\",\n        \"tennenseki\": \"天然石\",\n        \"artienne\": \"アルティエーヌ\",\n        \"under the honey shine\": \"Under The Honey Shine\",\n        \"infinity-force\": \"INFINITY-FORCE\",\n        \"akane makes revolution\": \"A・M・R\",\n        \"gujira 4 gou\": \"ぐじら4号\",\n        \"shimapan\": \"しまぱん\",\n        \"candy paddle\": \"candy paddle\",\n        \"daihonei\": \"大本营\",\n        \"condiment moderately\": \"コンディメントは8分目\",\n        \"digital accel works\": \"Digital Accel Works\",\n        \"masaoyan\": \"まさお屋ン\",\n        \"skirthike\": \"Skirthike\",\n        \"mitarashi dango\": \"みたらし団GO\",\n        \"cartagra\": \"骨牌仓\",\n        \"fomalhaut\": \"FOMALHAUT\",\n        \"ring castle\": \"Ring Castle\",\n        \"takatakaya\": \"たか々屋\",\n        \"unagigoya\": \"うなぎ小屋\",\n        \"celtrance\": \"CELTRANCE\",\n        \"amazoness\": \"アマゾネス\",\n        \"hitotsukami\": \"ヒトツカミ\",\n        \"kossorikakuredokoro\": \"こっそり隠れ処\",\n        \"sweet milk shake\": \"すいーとみるくしぇいく\",\n        \"jabarand\": \"ジャバランド\",\n        \"kuromutu\": \"くろむつ\",\n        \"hoyoyodou\": \"ほよよ堂\",\n        \"wlho\": \"WLHO\",\n        \"mamiretei\": \"まみれ亭\",\n        \"osouzaiya-san\": \"お総菜屋さん\",\n        \"gensuifu\": \"幻醉腐\",\n        \"zooya\": \"ZOOYA!\",\n        \"nanashi no rakugakijo\": \"名無しの落書き所\",\n        \"m-ya\": \"M屋\",\n        \"blue bean\": \"ぶるーびーん\",\n        \"dr.vermilion\": \"Dr.VERMILION\",\n        \"kinqhassin\": \"紧急发进\",\n        \"yagisaki ginza\": \"八木崎银座\",\n        \"p.l.t.works\": \"P.L.T.works\",\n        \"galaxy monooki\": \"ギャラクシー物置\",\n        \"arikawadou\": \"有川堂\",\n        \"akatsuki souken\": \"晓创圈\",\n        \"ikaring\": \"乌贼轮\",\n        \"marvelous grace\": \"Marvelous Grace\",\n        \"muchi muchi seven\": \"ムチムチ7\",\n        \"yuruyuru gts\": \"ゆるゆるGTS\",\n        \"dangerous thoughts\": \"DANGEROUS THOUGHTS\",\n        \"itaba tatamiten\": \"板场叠店\",\n        \"pinvise\": \"pinvise\",\n        \"cobanzame\": \"こばんざめ\",\n        \"p shoukai\": \"P商会\",\n        \"indexacg\": \"IndexACG\",\n        \"yuriai kojinshi kai\": \"悠理爱个人志会\",\n        \"lachenalia\": \"Lachenalia\",\n        \"apricot plus\": \"apricot+\",\n        \"studio huan\": \"STUDIOふあん\",\n        \"machi no onikuya-san\": \"まちのおにくやさん\",\n        \"mnst\": \"MNST\",\n        \"aohige kaizokudan\": \"青髯海贼团\",\n        \"sanbyaku rokujuu do\": \"-三百六十度-\",\n        \"armadillo\": \"Armadillo\",\n        \"spec.c\": \"spec.C\",\n        \"dragon kitchen\": \"Dragon Kitchen\",\n        \"shirukke no ooi zakuro\": \"汁っけの多い柘榴\",\n        \"chocolate cube\": \"CHOCOLATE CUBE\",\n        \"furafura toxin\": \"ふらふらトキシン\",\n        \"cat garden\": \"CAT GARDEN\",\n        \"kuroneko smith\": \"黒猫スミス\",\n        \"rukonosu\": \"龙虎乃巢\",\n        \"samoyedest\": \"サモエデスト\",\n        \"yuunabe shinkouchuu\": \"夕锅进行中\",\n        \"royal milk\": \"Royalみるく\",\n        \"nanohanatea\": \"なのはなtea*\",\n        \"sound sticker\": \"サウンドステッカー\",\n        \"gainamon\": \"がいなもん\",\n        \"loflat\": \"LOFLAT\",\n        \"chococornet\": \"チョココロネ\",\n        \"wnb\": \"WNB\",\n        \"custom size\": \"カスタムサイズ\",\n        \"flicker10\": \"Flicker10\",\n        \"arkhetelos\": \"あるけてろす\",\n        \"juggernaut\": \"じゃがぁの～と\",\n        \"aki no mikaku\": \"あきのみかく\",\n        \"ukatsu de wa nai\": \"うかつではない\",\n        \"ennui\": \"ENNUI\",\n        \"orange channel\": \"ORANGE☆CHANNEL\",\n        \"eternal land\": \"ETERNAL LAND\",\n        \"timtim machine\": \"TIMTIMマシン\",\n        \"artistic time\": \"Artistic Time\",\n        \"niliu chahui\": \"逆流茶会\",\n        \"seikei doujin\": \"正经同人\",\n        \"b.b.t.t.\": \"B.B.T.T.\",\n        \"kumak.com\": \"KUMAK.COM\",\n        \"neruneru\": \"ねるねる\",\n        \"bomb shelter\": \"核弹避难室\",\n        \"shokakuya\": \"少年觉醒夜\",\n        \"toadstool factory\": \"有害蕈类集会所\",\n        \"elane workshop\": \"エルアネ工房\",\n        \"fukuroutei\": \"福笼亭\",\n        \"zvizva-dan\": \"ズビズバ団\",\n        \"uruujima\": \"うるう島\",\n        \"chilled house\": \"CHILLED HOUSE\",\n        \"jack to nicholson\": \"ジャックとニコルソン\",\n        \"shoujo kakei\": \"少女架刑\",\n        \"looptheloop\": \"LOOPTHELOOP!\",\n        \"tsukimi dango\": \"月见团子\",\n        \"paradiddle\": \"パラディドル\",\n        \"mousouzoku no soukutsu\": \"妄想族の巣窟\",\n        \"fuji sengendou\": \"富士浅间堂\",\n        \"negative gang\": \"ネガティブギャング\",\n        \"aloe-nano\": \"Aloe-nano\",\n        \"genshi bangou 47\": \"原子番号47\",\n        \"milky been\": \"Milky Been!\",\n        \"mebae anime\": \"めばえあにめ\",\n        \"alison airlines\": \"ALISON航空\",\n        \"boku to kimi to kakuu sekai to\": \"僕と君と架空世界と\",\n        \"gantai critical\": \"眼帯クリティカル\",\n        \"a-walks\": \"A-WALKs\",\n        \"minuetworks\": \"MinuetWorks\",\n        \"enokiya\": \"榎屋\",\n        \"bindume no kairou\": \"ビン詰めの回廊\",\n        \"mitsuroh\": \"MITSUROH\",\n        \"milk protein\": \"ミルクプロテイン\",\n        \"aokihoshi\": \"AOKIHOSHI\",\n        \"brain dead\": \"ぶれいんでっど\",\n        \"p.p\": \"P:P\",\n        \"loverevo\": \"ラブレボ\",\n        \"po buyuu\": \"PO武勇\",\n        \"zensoku rider\": \"漸速ライダー\",\n        \"windarteam\": \"风艺WindArTeam\",\n        \"curl up\": \"CURL UP\",\n        \"gensou stomach\": \"幻想ストマック\",\n        \"88 gou\": \"88号\",\n        \"ofuton de suyaa\": \"おふとんでスヤァ\",\n        \"fatalpulse\": \"Fatalpulse\",\n        \"oneone1\": \"ONEONE1\",\n        \"marchen box\": \"メルヘンBOX\",\n        \"pokopii\": \"ぽこぴー\",\n        \"hikaru no kobeya\": \"ひかるの小部屋\",\n        \"kiyokawa zaidan\": \"虚川财团\",\n        \"aardvark\": \"Aardvark\",\n        \"no osaka no life\": \"NO OSAKA NO LIFE\",\n        \"peace maker\": \"PEACE MAKER\",\n        \"solid line\": \"Solid Line\",\n        \"makeinu\": \"負け犬\",\n        \"lucky doggy\": \"LUCKY DOGGY\",\n        \"daraku jiko chousa iinkai\": \"堕落事故调查委员会\",\n        \"umi no sachi\": \"うみのさち\",\n        \"yuunagiya\": \"夕凪屋\",\n        \"aimaitei\": \"愛昧亭\",\n        \"ohmiya tsukasa\": \"大宫司\",\n        \"mikekodou\": \"みけこ堂\",\n        \"hekichaen\": \"碧茶园\",\n        \"amatoro bow\": \"甘とろ棒\",\n        \"ruciedo\": \"るしえ堂\",\n        \"jingai makyou\": \"ジンガイマキョウ\",\n        \"steam d\": \"すち～む・D\",\n        \"65535th avenue\": \"65535あべぬー。\",\n        \"makuu gundan\": \"魔空军团\",\n        \"kinokomushin\": \"きのこむ神\",\n        \"ichibariki\": \"一马力\",\n        \"okotan pekoe\": \"おこたんぺこ\",\n        \"we are coming\": \"We are COMING!\",\n        \"sanutei\": \"さぬ亭\",\n        \"tanic ya\": \"タニシ屋\",\n        \"wild flower\": \"WILD FLOWER\",\n        \"brave heart petit\": \"BRAVE HEART petit\",\n        \"chocolate synapse\": \"Chocolate Synapse\",\n        \"boku wa maso desu\": \"僕はマゾです\",\n        \"stanky\": \"STANKY\",\n        \"wizs studio\": \"Wiz's Studio\",\n        \"alkaloid\": \"アルカロイド\",\n        \"d slash l\": \"D/L\",\n        \"kirastar\": \"KiraStar\",\n        \"kokyu no heya\": \"コキュの部屋\",\n        \"askray\": \"AskRay\",\n        \"burstbomb.t\": \"BurstBomb.T\",\n        \"usa daioh\": \"ウサ大王\",\n        \"kaitsushin\": \"海通信\",\n        \"muramuramura\": \"村々村\",\n        \"mumu\": \"夢々\",\n        \"henreikai\": \"片励会\",\n        \"super flat lolinitron\": \"超平板小娘电视台\",\n        \"ashurame gajoh\": \"阿修罗女画帖\",\n        \"kyokushou shoujo\": \"极少少女\",\n        \"luft forst\": \"Luft Forst\",\n        \"gesewa na hanashi\": \"下世話な話\",\n        \"yatsufusa no kobeya\": \"八房の小部屋\",\n        \"ponpharse\": \"ぽんふぁーず\",\n        \"hihumiya\": \"一二三矢\",\n        \"saragi\": \"蛇穴\",\n        \"c2.inc\": \"C2.Inc\",\n        \"km1chome\": \"健町一丁目\",\n        \"atelier dr.heads\": \"アトリエDr.HEAD'S\",\n        \"datsuryoku kenkyuukai\": \"脱力研究会\",\n        \"mebius no wa\": \"Mebiusの環\",\n        \"zenra qq\": \"全裸QQ\",\n        \"ironimu\": \"イロニム\",\n        \"ahobaka\": \"AHOBAKA\",\n        \"corori\": \"CORORI\",\n        \"berosuya\": \"べろす屋\",\n        \"blank check\": \"ぶらんく☆ちぇっく\",\n        \"tonkotsu\": \"とんこつ\",\n        \"necocoya\": \"ねここや\",\n        \"ss-brain\": \"SS-BRAIN\",\n        \"fleur 9 pri\": \"ふるるきゅぷり\",\n        \"jyujiro\": \"十字路\",\n        \"oricomplex\": \"ORICOMPLEX\",\n        \"ohtado\": \"おおた堂\",\n        \"labomagi\": \"らぼまじ!\",\n        \"natsu otome\": \"ナツオトメ\",\n        \"nyanyahouse\": \"NyaNyaHouse\",\n        \"elephant jelly\": \"エレファントゼリー\",\n        \"shounen zoom\": \"少年ズーム\",\n        \"nemuneko\": \"寝梦猫\",\n        \"heart manju mania\": \"はぁと饅頭マニア\",\n        \"dadada coffee\": \"だだだ珈琲\",\n        \"sorairo inn\": \"空色イン\",\n        \"ecchi na taikendan kokuhaku toukou otoko jyuku\": \"エッチな体験談告白投稿男塾\",\n        \"kuramochi zukan\": \"仓持图鉴\",\n        \"uran no yakata\": \"雨兰の馆\",\n        \"tears39\": \"Tears39\",\n        \"milkberry\": \"milkberry\",\n        \"gyoniku\": \"鱼肉\",\n        \"studio c-take\": \"Studio C-TAKE\",\n        \"saru no koshikake\": \"サルノコシカケ\",\n        \"jall boint\": \"ジョールボイント\",\n        \"wadamemo\": \"wadamemo\",\n        \"nanka no atama\": \"何かのあたま!\",\n        \"scratch jikkou iinkai\": \"スクラッチ実行委員会\",\n        \"gn\": \"GN\",\n        \"anko ni gohan\": \"あんこに御飯\",\n        \"hyappo hissatsu\": \"百步必杀\",\n        \"ajiichi\": \"味市\",\n        \"aozoramichi\": \"苍空道\",\n        \"calm atmosphere\": \"カルムアトモスフィア\",\n        \"hikakuteki simple na panty\": \"比較的シンプルなパンティ\",\n        \"hachimitsu romance\": \"蜂蜜ロマンス\",\n        \"trouble makers\": \"Trouble Makers\",\n        \"p-collection\": \"P-Collection\",\n        \"nekotoraya\": \"猫虎屋\",\n        \"wulazula\": \"うらずら\",\n        \"shotaian\": \"所带庵\",\n        \"pirozhki teikoku\": \"ピロシキ帝国\",\n        \"c.rs nest\": \"C.R's NEST\",\n        \"cat expert\": \"きゃっといいえっくす\",\n        \"soundz of bell\": \"Soundz of Bell\",\n        \"achiki no megane\": \"あちきのめがね\",\n        \"blackbox\": \"BlackBox\",\n        \"basutei shower\": \"バス停シャワー\",\n        \"hakueki shobou\": \"白液书房\",\n        \"iromiiro\": \"いろみいろ\",\n        \"uroboros\": \"UROBOROS\",\n        \"marked-two\": \"Marked-two\",\n        \"surume no oka\": \"するめの丘\",\n        \"moezilla-gumi\": \"もえじら組\",\n        \"hisagoya\": \"瓢屋\",\n        \"yohsyuan\": \"杨州庵\",\n        \"bundosuikou\": \"文土水口\",\n        \"potato house\": \"POTATO HOUSE\",\n        \"sabaku x syoujyo\": \"砂漠×少女\",\n        \"hougakuya\": \"方角屋\",\n        \"koro chan fan club\": \"コロちゃんファンクラブ\",\n        \"4hands\": \"4HANDS\",\n        \"takachihoscramble\": \"高千穂スクランブル\",\n        \"doku tonkotsu niku dorei\": \"毒とんこつ肉ドレイ\",\n        \"moon night kitten\": \"月夜のこねこ\",\n        \"american kenpou\": \"アメリカン拳法\",\n        \"erondon hearts\": \"ERONDON HEARTS\",\n        \"shd\": \"SHD\",\n        \"purin kai yoghurt\": \"プリン海ヨーグルト\",\n        \"shouyu no sato\": \"醤油の里\",\n        \"amatou\": \"あまとう | 甘党\",\n        \"sennin no atelier\": \"仙人のアトリエ\",\n        \"magicalflight\": \"MagicalFlight\",\n        \"inucream\": \"いぬくりぃむ\",\n        \"dangan minorz\": \"ダンガンマイナーズ\",\n        \"wohana gokoro\": \"ヲ花心\",\n        \"jack-pot\": \"JACK-POT\",\n        \"gamu-syara\": \"饿武者罗\",\n        \"jinsukeya\": \"甚助屋\",\n        \"mushoku santaro\": \"无色三太郎\",\n        \"team nekojishi\": \"Team Nekojishi\",\n        \"angelbox\": \"ANGELBOX\",\n        \"mokusei zaijuu\": \"木星在住\",\n        \"nekonomizoshiru\": \"猫のみぞ汁\",\n        \"da hootch\": \"DA HOOTCH\",\n        \"hooliganism\": \"集团暴力\",\n        \"eroquis\": \"EROQUIS!\",\n        \"18master\": \"18マスター\",\n        \"date in vitro\": \"Date in vitro\",\n        \"yamanotesen\": \"山手线\",\n        \"lovewn outpost\": \"Lovewn Outpost\",\n        \"kitsune no shippo momitai\": \"狐の尻尾揉みたい\",\n        \"othukimi\": \"オツキミ\",\n        \"mesu gorilla.\": \"メスゴリラ。\",\n        \"samurai ikka\": \"さむらい一家\",\n        \"akutagawa toranosuke\": \"芥川虎之介\",\n        \"seventh zest\": \"seventh zest\",\n        \"niku drill\": \"肉ドリル\",\n        \"mugu\": \"MUGU\",\n        \"kaleido circus\": \"Kaleido Circus\",\n        \"marimofu extension\": \"まりもふえくすてんしょん\",\n        \"piripun\": \"ぴりぷん\",\n        \"g-nose\": \"G-Nose\",\n        \"hokyuun\": \"ほきゅーん\",\n        \"studio boxer\": \"スタジオぼくさぁ\",\n        \"chibikko kingdom\": \"CHIBIKKO KINGDOM\",\n        \"granada sky\": \"グラナダの空\",\n        \"baraneko yougashi-ten\": \"薔薇猫洋菓子店\",\n        \"puu no puupuupuu\": \"ぷぅのぷぅぷぅぷぅ\",\n        \"dokusai switch\": \"独裁スイッチ\",\n        \"junshain inoue\": \"准社员井上\",\n        \"mad order\": \"MAD ORDER\",\n        \"ochikonium\": \"おちこにうむ\",\n        \"arusenchioratatema\": \"アルセンチオラタテマ\",\n        \"fonchau\": \"蜂巢\",\n        \"abalone soft\": \"Abalone Soft\",\n        \"randou house\": \"乱道ハウス\",\n        \"chocolate chuudoku\": \"チョコレイト中毒\",\n        \"blue section\": \"Blue Section\",\n        \"aoin no junreibi\": \"アオインの巡礼日\",\n        \"akutensoushin\": \"恶转奏进\",\n        \"phylactery\": \"PHYLACTERY\",\n        \"hassystant\": \"ハシスタント\",\n        \"rabbit\": \"＊rabbit\",\n        \"kakukonoka\": \"かくこのか\",\n        \"arterial heart\": \"ARTERIALHEART\",\n        \"moriq\": \"moriQ\",\n        \"mofurentei\": \"もふれん亭\",\n        \"sonna kanji de heiankyou\": \"そんな感じで平安京\",\n        \"night springs\": \"ナイトスプリングス\",\n        \"aki to haru no yume\": \"秋と春の夢\",\n        \"tomatohouse-905s room\": \"tomatohouse-905's room\",\n        \"dai 6 kichi\": \"第6基地\",\n        \"movefromoneplacetoheaven\": \"MoveFromOnePlacetoHeaven\",\n        \"workholic\": \"わーくほりっく\",\n        \"astro qube.\": \"AstroQube.\",\n        \"pikorin\": \"ぴこりん!\",\n        \"ngmyu\": \"んみゅ\",\n        \"gintou seika\": \"银糖制菓\",\n        \"damage yuka r\": \"ダメージ床R\",\n        \"ruibosucha\": \"るいぼす茶\",\n        \"kuroisuisei\": \"黒い彗星\",\n        \"se bone\": \"背・骨\",\n        \"tugumix\": \"TUGUMIX\",\n        \"tfc kikaku to yukaina nakamatachi\": \"TFC企画とゆかいな仲間たち\",\n        \"yumemigachi campus\": \"夢想キャンパス\",\n        \"a.o.i\": \"A・O・I\",\n        \"yamanashi musume.\": \"やまなし娘。\",\n        \"zetsubou shiromuji\": \"絶望しろむじ\",\n        \"tottoko mtarou\": \"とっとこMたろう\",\n        \"sad.co\": \"sad.co\",\n        \"an an shokudou\": \"あん♪あん♪食堂\",\n        \"hurupontei\": \"ふるぽん亭\",\n        \"samidaregiri\": \"五月雨斬り\",\n        \"harigane shinshi doumei\": \"针金绅士同盟\",\n        \"dessert time\": \"Dessert Time\",\n        \"fuka fuka\": \"不可不可\",\n        \"suzuki dogezaemon\": \"铃木土下座卫门\",\n        \"anrakugai\": \"安乐街\",\n        \"nurumayu\": \"ぬるま湯\",\n        \"urasekai 2\": \"里世界2\",\n        \"yanyanyo\": \"やんやんよ\",\n        \"fuzukikai\": \"文月会\",\n        \"wanwan bakufu\": \"わんわん幕府\",\n        \"yamitsuki honpo\": \"やみつき本舗\",\n        \"studio kfc\": \"Studio KFC\",\n        \"atelier maso\": \"アトリエマゾ\",\n        \"hachigo\": \"ハチゴ\",\n        \"miyakoochi partisan\": \"都落ちPartisan\",\n        \"efuya\": \"エフ屋\",\n        \"inbuland\": \"iNBULAND\",\n        \"tsukikaze machi\": \"月风町\",\n        \"kuro zuishou\": \"黑水晶\",\n        \"shinyanchi\": \"シンヤんち\",\n        \"gyuunyuu nomiba\": \"牛乳飲み場\",\n        \"kurumi namiki\": \"くるみ並木\",\n        \"kazemichiya\": \"风道屋\",\n        \"su-mi-tan\": \"粟米汤\",\n        \"amuai okashi seisakusho\": \"あむぁいおかし製作所\",\n        \"mofmof\": \"もふもふ\",\n        \"katsu tights\": \"カツタイツ\",\n        \"ainomugen\": \"あいの無限\",\n        \"nuko majin\": \"ぬこ魔神\",\n        \"uni no tane\": \"うにの種\",\n        \"gunjou robot\": \"群青ロボット\",\n        \"hyper dropkick\": \"はいぱーどろっぷきっく\",\n        \"shanghai hanten\": \"上海饭店\",\n        \"hyakki yakou\": \"百鬼夜行\",\n        \"ame ramune\": \"アメラムネ\",\n        \"project kaguya\": \"PROJECT KAGUYA\",\n        \"futayami koubou\": \"双暗工房\",\n        \"mappa namatta\": \"マッパなまった\",\n        \"yumeiro snowgazer\": \"夢色スノーゲイザー\",\n        \"nijutteya\": \"弐十手屋\",\n        \"maguro coffee\": \"まぐろ珈琲\",\n        \"shoujo gesshoku\": \"少女月蝕\",\n        \"kokuto koukuu\": \"黒兎航空\",\n        \"manshin soui\": \"満身創痍\",\n        \"soukousen\": \"創攻線\",\n        \"neko gosho\": \"猫御所\",\n        \"harunatsuakifuyu\": \"春夏秋冬\",\n        \"yoshino\": \"吉野\",\n        \"murakami suigun no yakata\": \"村上水軍の館\",\n        \"takanaedoko\": \"高苗床\",\n        \"ichijikushirabe shiki\": \"九調四季\",\n        \"aoirokanata\": \"蒼色彼方\",\n        \"kurokudo-ya\": \"黒クド屋\",\n        \"iorigumi\": \"庵組\",\n        \"kedama gyuunyuu\": \"毛玉牛乳\",\n        \"gyuunyuuya-san\": \"牛乳屋さん\",\n        \"senpenbankashiki\": \"千变万化式\",\n        \"amakuchi syoujo\": \"あまくち少女\",\n        \"akutoku doumei\": \"悪徳同盟\",\n        \"andorogynous\": \"ANDOROGYNOUS\",\n        \"kikurage-ya\": \"きくらげ屋\",\n        \"shis\": \"SHIS\",\n        \"tomoshibiya koubou\": \"灯夜工房\",\n        \"kakuzato-ichi\": \"核座头市\",\n        \"poppenheim\": \"ぽっぺんはいむ\",\n        \"chitei no nikuya\": \"地底の肉屋\",\n        \"manaita\": \"まないた\",\n        \"mizore nabe\": \"みぞれ鍋\",\n        \"onefes jikkou iinkai\": \"オネフェス実行委員会\",\n        \"isuwie-ya\": \"イスィ屋\",\n        \"yabitsutouge\": \"弥美津峠\",\n        \"chotto dake aruyo.\": \"チョットだけアルヨ。\",\n        \"shiro no ehonya-san\": \"しろの絵本屋さん\",\n        \"neutron city\": \"Neutron city\",\n        \"h-gabmenters\": \"H-gabmenters\",\n        \"shichimen soka\": \"七面楚歌\",\n        \"shin nanka tou\": \"新なんか党\",\n        \"tefutefu.\": \"てふてふ。\",\n        \"menkui\": \"めんくい\",\n        \"amamineko cafe\": \"あまみねこカフェ\",\n        \"maron koubou\": \"マロン工房\",\n        \"nekomonido\": \"ネコモニ堂\",\n        \"nikuniku italian\": \"にくにくイタリアン\",\n        \"darkside room\": \"だーくさいどるーむ\",\n        \"chimee house\": \"ちみはうす\",\n        \"h at break\": \"H@BREAK\",\n        \"saigado\": \"彩画堂\",\n        \"yuuendou\": \"遊猿堂\",\n        \"kouchaya\": \"红茶屋\",\n        \"testa kitchen\": \"てすた厨房\",\n        \"kireinabuta\": \"キレイナブタ\",\n        \"saihate-kukan\": \"最果て空間\",\n        \"seki sabato\": \"関サバト\",\n        \"garyuuya\": \"我龍屋\",\n        \"corona 314\": \"コロナ314\",\n        \"yume to kyouki no chomolung oukoku\": \"夢と狂気のチョモラン王国\",\n        \"lazy star lazy\": \"Lazy★Lazy\",\n        \"70 nenshiki yuukyuu kikan\": \"70年式悠久機関\",\n        \"amazake hatosyo-ten\": \"甘酒鳩商店\",\n        \"batten kariba\": \"X仮歯\",\n        \"mosquitone.\": \"もすきーと音。\",\n        \"hachibusaki\": \"八分咲\",\n        \"kouen tanpaku q\": \"交援蛋白Q\",\n        \"egao de bouryoku\": \"笑顔で暴力\",\n        \"beta houkai\": \"β崩壊\",\n        \"chuuou bunritai\": \"中央分離隊\",\n        \"neko wa manma ga utsukushii\": \"ねこはまんまがうつくしい\",\n        \"nekomarudow.\": \"猫丸堂\",\n        \"honoji\": \"Honoji\",\n        \"watagashi\": \"わた菓子\",\n        \"morphine\": \"モルピネ\",\n        \"amahara teikoku\": \"天原帝国\",\n        \"rocket chousashitsu\": \"ロケット調査室\",\n        \"esora note\": \"エソラnote\",\n        \"ozitan yasan\": \"おじたん屋さん\",\n        \"nechorapoddo\": \"ねちょらぽっど\",\n        \"luminocity\": \"ルミノシティ\",\n        \"gakushokutei\": \"学食亭\",\n        \"nagisa no yoko\": \"渚のヨーコ\",\n        \"ruiketsuan\": \"泪穴庵\",\n        \"ribi dou\": \"RIBI堂\",\n        \"anmonkan\": \"暗梦馆\",\n        \"dairoku kadan\": \"第六花坛\",\n        \"salt choc\": \"塩ちょこ\",\n        \"sawayaka tokunou milk\": \"爽やか特濃みるく\",\n        \"armament calcium\": \"武装カルシウム\",\n        \"sharaku-dou\": \"写楽堂\",\n        \"shoujo renka\": \"少女恋歌\",\n        \"yakiniku tabetai\": \"焼肉食べたい\",\n        \"shiitake nouen\": \"しいたけ農園\",\n        \"almond-nabe\": \"アーモンド鍋\",\n        \"hizaue 5cm\": \"膝上5センチメートル\",\n        \"ponponpain\": \"ぽんぽんぺいん\",\n        \"grinp\": \"GRINP\",\n        \"lost rage\": \"Lost Rage\",\n        \"yahai\": \"矢ハイ\",\n        \"mohumohu chaya\": \"もふもふ茶屋\",\n        \"kirororo\": \"KirororO\",\n        \"zinfandel\": \"ZINFANDEL\",\n        \"fumituki\": \"踏月\",\n        \"mimipuru\": \"みみぷる\",\n        \"yc-tv\": \"YC－TV\",\n        \"strangechameleon\": \"ストカメ\",\n        \"eseneko tale\": \"えせねこてーる\",\n        \"tensaizoku\": \"天災族\",\n        \"zenoside\": \"ぜのさいど\",\n        \"kata k-shiki\": \"型K式\",\n        \"yume no shima\": \"ユメノシマ\",\n        \"dot eito\": \"ドットエイト\",\n        \"ao\": \"青\",\n        \"w-18\": \"W-⑱\",\n        \"poprication\": \"poprication\",\n        \"seemu\": \"seemu。\",\n        \"mix-edge\": \"MIX-EDGE\",\n        \"muni koubou\": \"むに工房\",\n        \"marota teikoku\": \"麻吕太帝国\",\n        \"tenkirin\": \"天气轮\",\n        \"gust\": \"GUST\",\n        \"tsurikichi doumei\": \"釣りキチ同盟\",\n        \"ran-ya\": \"蘭屋\",\n        \"neko-bus tei\": \"ねこバス停\",\n        \"loli ace\": \"ロリエース\",\n        \"dynamo\": \"DYNAMO\",\n        \"clash house\": \"くらっしゅハウス\",\n        \"rainbow vanilla\": \"Rainbow Vanilla\",\n        \"kuma no ana\": \"熊の穴\",\n        \"flourish\": \"flourish\",\n        \"cocoa holic\": \"ココアホリック\",\n        \"retro\": \"RETRO\",\n        \"tekomenchi\": \"てこめんち\",\n        \"nattou misoshiru\": \"納豆味噌汁\",\n        \"kurimomo\": \"くりもも\",\n        \"garimpeiro\": \"Garimpeiro\",\n        \"naturefour\": \"風林火山\",\n        \"usagigo\": \"うさぎ号\",\n        \"cube\": \"CUBE\",\n        \"stella candy\": \"Stella Candy\",\n        \"zip\": \"Zip\",\n        \"moe moe cafe\": \"モエモエカフェ\",\n        \"hitenkei\": \"HitenKei\",\n        \"muzin syoujo\": \"無人少女\",\n        \"hasuneya\": \"はすねや\",\n        \"chilly polka\": \"Chilly polka\",\n        \"morimiyakan\": \"森宫缶\",\n        \"ninokoya\": \"にのこや\",\n        \"mocha2popcorn\": \"mocha*2popcorn\",\n        \"kuronisiki\": \"黒錦\",\n        \"awayukitist\": \"あわ雪チスト\",\n        \"ugc\": \"UGC\",\n        \"akapenguin\": \"アカペンギン\",\n        \"coin toss\": \"こいんとす\",\n        \"haikibutsu\": \"廃棄物\",\n        \"betemius\": \"BETEMIUS\",\n        \"nihon kemomimi suishou iinkai\": \"日本ケモ耳推奨委員会\",\n        \"ayakase-ke no neko\": \"綾枷家の猫\",\n        \"mignon works\": \"MIGNON WORKS\",\n        \"ichijiku yogurt\": \"いちじくよーぐると\",\n        \"egoistic honey\": \"Egoistic Honey\",\n        \"amamiya\": \"甘味屋\",\n        \"curry berg dish\": \"カリーバーグディッシュ\",\n        \"tamanegiya\": \"玉葱屋\",\n        \"casis-kabosu\": \"カシスかぼす\",\n        \"studio a\": \"studio A\",\n        \"shougentei\": \"翔玄亭\",\n        \"d.n.a.lab.\": \"D・N・A.Lab.\",\n        \"kinokonomi\": \"きのこのみ\",\n        \"pigpanpan\": \"PigPanPan\",\n        \"yomairi sensei\": \"よまいり先生\",\n        \"koniro kajitsu\": \"紺色果実\",\n        \"pandora box\": \"ぱんどらぼっくす\",\n        \"jekyll and hyde\": \"Jekyll and Hyde\",\n        \"roentgen\": \"Roentgen\",\n        \"puchimaple\": \"ぷちめいぷる\",\n        \"aratoya\": \"あらと屋\",\n        \"mapler\": \"MAPLER\",\n        \"yuribatake bokujou\": \"百合畑牧場\",\n        \"monyamonya\": \"モニャモニャ\",\n        \"tatakai no kiseki\": \"戦いの軌跡\",\n        \"arcadia\": \"ARCADIA\",\n        \"sorairo nyannyan\": \"空色にゃんにゃん\",\n        \"ichigo crown\": \"Ichigo Crown\",\n        \"side effects\": \"SIDE EFFECTS\",\n        \"t2 art works\": \"T2 ART WORKS\",\n        \"yokkora pencil\": \"よっこらペンシル\",\n        \"marumieya\": \"まる美絵屋\",\n        \"indico lite\": \"Indico lite\",\n        \"haraheridou\": \"はらヘリ堂\",\n        \"hitsuji kikaku\": \"ヒツジ企画\",\n        \"hiyashi yaki teishoku\": \"冷やし焼き定食\",\n        \"burittohiroba\": \"burittohiroba\",\n        \"pypyworks\": \"PYPYworks\",\n        \"lilith lauda laboratory\": \"リリスラウダ研究所\",\n        \"slime kikaku\": \"スライム企画\",\n        \"mukousharan\": \"無口遮欄\",\n        \"l5ex\": \"L5EX\",\n        \"socha-ya\": \"そちゃ屋\",\n        \"mermerry\": \"メルメリー\",\n        \"doyagaobyo\": \"どや顔病\",\n        \"studio hitoribocchi\": \"スタジオひとりぼっち\",\n        \"kyokutou koumuten\": \"极东工务店\",\n        \"takemasaya\": \"たけまさ屋\",\n        \"novelize\": \"NOVELIZE\",\n        \"konohanaku\": \"此花区\",\n        \"hisyoku no tansansui\": \"緋色の炭酸水\",\n        \"comoyoko\": \"コモヨコ\",\n        \"witchs marionette\": \"witch's marionette\",\n        \"key trash\": \"KEY TRASH\",\n        \"alchemy\": \"あるけみい\",\n        \"a.l.l\": \"A・L・L\",\n        \"hiyakake gohan\": \"ひやかけごはん\",\n        \"expander welder\": \"エキスパンダー溶接\",\n        \"makarontaitei\": \"まかろん大帝\",\n        \"hoshi to matango\": \"ほしとマタンゴ\",\n        \"resort ukami\": \"リゾートうかみ\",\n        \"hatishiro\": \"はちしろ\",\n        \"yureru keikoutou\": \"揺れる蛍光灯\",\n        \"rump\": \"RUMP\",\n        \"soratomoe\": \"ソラトモエ\",\n        \"death para\": \"ですぱら\",\n        \"hachiouji kaipan totsugeki kiheitai\": \"八王子海パン突撃騎兵隊\",\n        \"sand\": \"sand\",\n        \"usagigoya.\": \"うさぎごや。\",\n        \"genmaicha\": \"玄米茶\",\n        \"skk\": \"SKK\",\n        \"ins-mode\": \"INS-mode\",\n        \"mellowmind\": \"めろうまいんど\",\n        \"40denier\": \"40デニール\",\n        \"utsura uraraka\": \"うつらうららか\",\n        \"pannomimi\": \"ぱんのみみ\",\n        \"sweet avenue\": \"Sweet Avenue\",\n        \"atelier stars\": \"あとりえスターズ\",\n        \"wildstyle\": \"wildstyle\",\n        \"monofille\": \"モノフィーユ\",\n        \"cassiopeia\": \"CASSIOPEIA\",\n        \"keepon\": \"keepON\",\n        \"yojigen kaidenpa\": \"四次元怪電波\",\n        \"saikutsu kichi\": \"採掘基地\",\n        \"7th semicolon mint\": \"7th;Mint\",\n        \"hitsuji no gohan\": \"ひつじのごはん\",\n        \"tokyoboogienight\": \"桃京武戯夜\",\n        \"taco\": \"TACO\",\n        \"pirokobo\": \"ピロコボ\",\n        \"fujitsubo-machine\": \"富士壺機械\",\n        \"kokusai tenjijou uramon\": \"国際展示場裏門\",\n        \"daifuku\": \"大福\",\n        \"misaki\": \"三崎\",\n        \"umenomi gahou\": \"梅の実画報\",\n        \"akari blast\": \"Akari blast!\",\n        \"rokata aruki\": \"縁側珈琲\",\n        \"idonchi\": \"いどんち\",\n        \"sanbaizu\": \"三杯酢\",\n        \"j.d.world\": \"J.D.World\",\n        \"0000\": \"0000\",\n        \"lovelyplace\": \"LOVELYPLACE\",\n        \"studio hatake\": \"STUDIO畑\",\n        \"seitokaishitsu\": \"生徒会室\",\n        \"kuma no tooru michi\": \"くまのとおるみち\",\n        \"kindou shoujo\": \"金瞳少女\",\n        \"yukimi-fuumi\": \"ゆきみ風味\",\n        \"cotesdenoix\": \"CotesDeNoix\",\n        \"from nuts\": \"From nuts\",\n        \"upagoya\": \"うぱ小屋\",\n        \"muraimura\": \"村井村\",\n        \"apple effect\": \"Apple Effect\",\n        \"sukoburuyama\": \"すこぶるやま\",\n        \"otabe dynamites\": \"おたべ★ダイナマイツ\",\n        \"milk bar\": \"MILK BAR\",\n        \"chikuwa no wakka\": \"ちくわのわっか\",\n        \"nekoyashiki\": \"猫屋敷\",\n        \"cheeseyeast\": \"チーズ酵母\",\n        \"neko tanteidan peach\": \"ネコ☆探偵団\",\n        \"water drop\": \"うぉーたーどろっぷ\",\n        \"honey butter3g\": \"はちみつバター3g\",\n        \"ichibocchi\": \"ゐちぼっち\",\n        \"low temp\": \"low*temp\",\n        \"against\": \"against\",\n        \"jigizagi\": \"ジギザギ\",\n        \"pochi\": \"POCHI\",\n        \"dragon panda\": \"DRAGON PANDA\",\n        \"trip spider\": \"TRIP SPIDER\",\n        \"smile studio\": \"すまいるすたじお\",\n        \"nimunoya\": \"にむの屋\",\n        \"studio big-x\": \"スタジオBIG-X\",\n        \"uzumaki hiyoko\": \"うずまき☆ひよこ\",\n        \"shinshi kouryuuku\": \"紳士交流区\",\n        \"yugen no suda\": \"有限の須田\",\n        \"daidabi\": \"ダイダビ\",\n        \"selvage fisheries\": \"セルビッチ水産\",\n        \"take out\": \"Take Out\",\n        \"necomicle\": \"necömicle\",\n        \"omlet\": \"OMLET\",\n        \"kohipotion\": \"KOHIPOTION\",\n        \"allegro mistic\": \"Allegro Mistic\",\n        \"aho-cross\": \"AHO-CROSS\",\n        \"nekosu no sumika\": \"ねこすのすみか\",\n        \"izumiya\": \"いずみ屋\",\n        \"middly\": \"MIDDLY\",\n        \"0846net\": \"オヤシロネット\",\n        \"fuzichaku\": \"不時着\",\n        \"studio snow man\": \"Studio Snow Man\",\n        \"goldengoblins\": \"GoldenGoblins\",\n        \"kitaku jikan\": \"归宅时间\",\n        \"tanima ginkou\": \"谷间银行\",\n        \"nagaredamaya\": \"流弹屋\",\n        \"dschinghis khan no tamanegi wa ore no yome\": \"ジンギスカンの玉葱は俺の嫁\",\n        \"usagi boss\": \"兔子老大\",\n        \"popochichi\": \"ぽぽちち\",\n        \"g.y.more.l\": \"G.Y.MORE.L\",\n        \"nyoudou juunisei\": \"尿道十二世\",\n        \"hobukuro\": \"ほおぶくろっ!\",\n        \"yasai no kuni\": \"野菜の国\",\n        \"ikkizuka\": \"いっきづか\",\n        \"komadori nouen\": \"こまどり農園\",\n        \"kuma-tan flash\": \"くまたんFlash!\",\n        \"ryuu no kinyoubi\": \"龍の金曜日\",\n        \"kuusoubune\": \"空想舟\",\n        \"perorimeshi.\": \"ぺろり飯。\",\n        \"coupe pain ginga\": \"こっぺぱん銀河\",\n        \"kimi no tomodachi.\": \"君の友達。\",\n        \"mugendai\": \"無限大\",\n        \"sanshikisumire\": \"さんしきすみれ\",\n        \"beruennea\": \"ベルエンネーア\",\n        \"orange tile\": \"オレンジタイル\",\n        \"laminaria\": \"LAMINARIA\",\n        \"nanbou hitogakushiki\": \"南方ヒトガクシキ\",\n        \"narumiya\": \"成宮\",\n        \"circle-fiore\": \"サークルフィオレ\",\n        \"popopo\": \"ぽぽぽ\",\n        \"toushitu catapult\": \"糖質過多ぱると\",\n        \"ojopie sentimental\": \"おじょぱいセンチメンタル\",\n        \"dokutoku no m\": \"独特のM\",\n        \"watari laboratory\": \"渡里laboratory\",\n        \"wappururun\": \"わっぷるるん\",\n        \"anzen chitai\": \"安全地带\",\n        \"loli seiyouken\": \"萝莉西洋剑\",\n        \"shimizuan\": \"清水庵\",\n        \"sakusei kenkyuujo\": \"搾精研究所\",\n        \"in the sky\": \"In The Sky\",\n        \"happy aroma\": \"Happy Aroma\",\n        \"molamola\": \"Molamola\",\n        \"masochist high\": \"マゾヒスト・ハイ\",\n        \"onsoku\": \"おんそく\",\n        \"ringoen\": \"RINGOEN\",\n        \"koibito wa kuroi neko\": \"コイビトハクロイネコ\",\n        \"hz-box\": \"Hz-box\",\n        \"waterfall\": \"Waterfall\",\n        \"amamori weekly\": \"あまもりウィークリー\",\n        \"signalmass\": \"SignalMass\",\n        \"suoiretsym\": \"スアリテスミ\",\n        \"rireba\": \"リレバ\",\n        \"crerpsucre\": \"CrerpSucre\",\n        \"indo no kyuuden\": \"いんどの宮殿!\",\n        \"kacchuu musume\": \"甲冑娘\",\n        \"110-groove\": \"110-GROOVE\",\n        \"yuuki kagoubutsu\": \"有機化合物\",\n        \"a gokuburi\": \"A極振り\",\n        \"sendouya\": \"千堂屋\",\n        \"kokusan jk\": \"国产JK\",\n        \"istanbul high sox\": \"イスタンブール・ハイソックス\",\n        \"chika 7cm\": \"地下7cm\",\n        \"secret society m\": \"秘密结社M\",\n        \"kawaraya-koubou\": \"瓦屋工房\",\n        \"kamishiki\": \"かみしき\",\n        \"popocket\": \"ぽぽケット\",\n        \"tanu choco\": \"たぬチョコ\",\n        \"taketate kakeya\": \"竹立掛屋\",\n        \"rico-ba\": \"Rico-ba\",\n        \"futotta obasan\": \"太ったおばさん\",\n        \"mainichi kenkou seikatsu\": \"毎日健康生活\",\n        \"noramani\": \"のらまに\",\n        \"w no honnou\": \"Wの本能\",\n        \"tokyo prominence tomato\": \"东京プロミネンストマト\",\n        \"gainax\": \"GAINAX\",\n        \"sister mytory\": \"Sister Mytory\",\n        \"yubisaki studio\": \"ユビサキスタジオ\",\n        \"wata punch\": \"WATA★PUNCH\",\n        \"poyopoyosky\": \"ぽよぽよスカイ\",\n        \"world of pure\": \"ワールドオブピュア\",\n        \"hakusen\": \"はくせん\",\n        \"pietoro\": \"ピエトロ\",\n        \"doukyara doukoukai\": \"同キャラ同好会\",\n        \"yosutebito na mangakaki\": \"世捨人な漫画描き\",\n        \"bakunyu fullnerson\": \"爆乳フルネルソン\",\n        \"kyockchokyock\": \"きょくちょ局\",\n        \"satoh katoh\": \"砂糖加糖\",\n        \"condaya\": \"今田屋\",\n        \"tennen koubo pan koubou\": \"天然酵母パン工房\",\n        \"hiyoko sabure\": \"ひよこサブレ\",\n        \"ashitamooyasumi\": \"あしたもおやすみ!\",\n        \"crown\": \"CROWN\",\n        \"island of horizon\": \"Island of Horizon\",\n        \"elriz\": \"ELRIZ\",\n        \"yakiniku teikoku\": \"焼肉帝国\",\n        \"gouache blue\": \"GOUACHE BLUE\",\n        \"duralumin love\": \"ジュラルミンラブ\",\n        \"ganryuu island\": \"巌流アイランド\",\n        \"ryoushi koubou\": \"量子工房\",\n        \"sprelidia\": \"sprelidia\",\n        \"iaidou\": \"居合堂\",\n        \"waterwheel\": \"waterwheel\",\n        \"kitaguni moyashi seizousho\": \"北国もやし製造所\",\n        \"god ryokutya\": \"GOD緑茶\",\n        \"t.4.p\": \"T.4.P\",\n        \"jagabata\": \"じゃがバター\",\n        \"ryuuseidou honpo\": \"龍正堂本舗\",\n        \"tonzura douchuu\": \"とんずら道中\",\n        \"kuromahou kenkyuujo\": \"黒魔法研究所\",\n        \"hotel negresco\": \"Hotel Negresco\",\n        \"kuzunoha\": \"屑乃葉\",\n        \"moni\": \"moni\",\n        \"greennight\": \"GreeNNight\",\n        \"unsympathetic\": \"疎ましいくらいな\",\n        \"meisaiya\": \"meisaiya\",\n        \"tegone spike\": \"てごねスパイク\",\n        \"amasyrup\": \"amasyrup\",\n        \"maybenavy\": \"MaybeNavy\",\n        \"nounai kanojo\": \"脑内彼女\",\n        \"jinsei yokosuberi.\": \"人生横滑り。\",\n        \"sanshoku nattou meshi\": \"三食納豆飯\",\n        \"shiguredoki\": \"しぐれどき\",\n        \"hirusuta\": \"昼星\",\n        \"shikaniku kohan\": \"しかにく湖畔\",\n        \"ua daisakusen\": \"U・A大作戦\",\n        \"white parabellum\": \"white parabellum\",\n        \"pecora room\": \"pecora room\",\n        \"lonely church\": \"Lonely Church\",\n        \"nekotyabatake\": \"猫茶畑\",\n        \"practice\": \"practice\",\n        \"sakuranoiro\": \"サクラノイロ\",\n        \"lunatic maiden\": \"Lunatic*Maiden\",\n        \"freelance\": \"FREELANCE\",\n        \"nekono oyashiro\": \"ねこのおやしろ\",\n        \"croix crown\": \"croix crown\",\n        \"chronolog\": \"CHRONOLOG\",\n        \"fururi.\": \"ふるり。\",\n        \"amamitu hakushi\": \"甘蜜博士\",\n        \"masaru dot com\": \"マサルドットコム\",\n        \"irodori\": \"IRODORI\",\n        \"kamaboko koubou\": \"カマボコ工房\",\n        \"shiki be careful\": \"四季注意\",\n        \"yamakon-ya\": \"山绀屋\",\n        \"botugo\": \"没后\",\n        \"calm white\": \"カームホワイト\",\n        \"curtaincall\": \"CurtainCαll\",\n        \"rainboy\": \"RainBoy\",\n        \"nekocat\": \"NekoCat\",\n        \"dicebomb\": \"DiceBomb\",\n        \"tetrapot\": \"TETRAPOT\",\n        \"tabgraphics\": \"tabgraphics\",\n        \"akari koubou\": \"灯工房\",\n        \"kajou sesshu\": \"過剰摂取\",\n        \"mousou bijutsubu\": \"妄想美術部\",\n        \"yuruyakatou\": \"ゆるやか島\",\n        \"p.a. works\": \"P.A.Works\",\n        \"commamion\": \"狐狸恩\",\n        \"gantai shoujo chudoku\": \"眼帯少女中毒\",\n        \"alice syndrome\": \"アリスシンドローム\",\n        \"pale light\": \"PALE LIGHT\",\n        \"saboten saibaijo\": \"サボテン栽培所\",\n        \"tsundere is love\": \"Tsundere is Love\",\n        \"irodoriya\": \"彩屋\",\n        \"kinakomochi\": \"木なこもち\",\n        \"gelatin\": \"Gelatin*\",\n        \"kusakabeworks\": \"KusakabeWorks\",\n        \"maho-bin\": \"まほ～びん\",\n        \"near harmonica\": \"ニアハモニカ\",\n        \"kankitsu shoujo\": \"柑橘少女\",\n        \"chickelata\": \"チキラータ\",\n        \"shida bokujou\": \"羊歯牧場\",\n        \"chiffonxx\": \"Chiffonxx\",\n        \"floralia\": \"Floralia\",\n        \"happy color festival\": \"HAPPY COLOR FESTIVAL!\",\n        \"sembyokibu\": \"扇猫喜舞\",\n        \"weapon container\": \"武器櫃\",\n        \"shinsekai set\": \"シンセカイセット\",\n        \"ruinon\": \"RUINON\",\n        \"yamada shoukai\": \"山田商会\",\n        \"takemoto seisaku iinkai\": \"竹本製作委員会\",\n        \"umemoto seisaku iinkai\": \"梅本制作委員会\",\n        \"kotei gainen\": \"固定概念\",\n        \"akausagi\": \"赤兔\",\n        \"haru koubou\": \"春工房\",\n        \"rin yuu\": \"Rin☆Yuu\",\n        \"citron no mori\": \"しとろんの杜\",\n        \"mugen jirai\": \"无限地雷\",\n        \"pion\": \"Pion\",\n        \"kuragamo\": \"蔵鴨\",\n        \"kaguya hime koubou\": \"火愚夜姫工房\",\n        \"ikujinashi no fetishist\": \"いくじなしのフェティシスト\",\n        \"fuzuii undou\": \"不随意運動\",\n        \"circle tokomaya\": \"サークルとこまや\",\n        \"barumishu\": \"ばーるみしゅ\",\n        \"megami no flask\": \"女神のフラスコ\",\n        \"hiiro no kenkyuushitsu\": \"灯色の研究室\",\n        \"sukiyaki club\": \"すきやきクラブ\",\n        \"kasoku edge\": \"かそくえっぢ\",\n        \"doku denpa jushin-chuu\": \"毒電波受信中\",\n        \"ebi manga teikoku\": \"えびまんが帝国\",\n        \"180milli cannon\": \"180ミリキャノン\",\n        \"zetsubou teisyoku\": \"ぜつぼう定食\",\n        \"milk engine\": \"Milk Engine\",\n        \"romantic sintai-kensa.\": \"ロマンティック身体検査\",\n        \"white guardian\": \"White Guardian\",\n        \"creayus\": \"CREAYUS\",\n        \"chabashira chainsaw\": \"チャバシラチェーンソー\",\n        \"renai mangaka\": \"恋爱漫画家\",\n        \"hakuto-can\": \"白桃缶\",\n        \"kemono ekaki no kousoku 2\": \"ケモノ絵描きの光速2\",\n        \"niji no magellan\": \"にじのまぜらん\",\n        \"nyanko batake\": \"猫畑\",\n        \"tsukimi dojin\": \"月見道神\",\n        \"sakanaya\": \"魚屋\",\n        \"tonyu bokujo\": \"豆乳牧場\",\n        \"kanai\": \"仮名居\",\n        \"tateyoko issen\": \"縦横一線\",\n        \"ohoshisamadou\": \"おほしさま堂\",\n        \"pure plastic\": \"純情プラスチック\",\n        \"otaku beam\": \"オタクビーム\",\n        \"gin no ame\": \"銀のあめ\",\n        \"mochipeach\": \"MochiPeach\",\n        \"tokunocin\": \"tokunocin\",\n        \"viking\": \"バイキング\",\n        \"caslton\": \"キャッスルトン\",\n        \"ntroom.\": \"NTroom.\",\n        \"shiropro\": \"しろぷろ\",\n        \"bizen dorobune koubou\": \"備前泥舟工房\",\n        \"kitsune no yomeiri\": \"きつねのよめいり\",\n        \"shinsei lolishota\": \"新生ロリショタ\",\n        \"bakuretsu fusen\": \"爆裂风船\",\n        \"natsume benkei\": \"夏目ベンケイ\",\n        \"la-go-on\": \"LA-GO-ON\",\n        \"takahashisan\": \"たかはしさん\",\n        \"kiracnadays\": \"KiracnaDays\",\n        \"nagomi\": \"和\",\n        \"dekoboko hurricane\": \"凸凹ハリケーン\",\n        \"amaineiro\": \"あまいねいろ\",\n        \"gentsuki okiba\": \"ゲンツキオキバ\",\n        \"mashira dou\": \"ましら堂\",\n        \"nijitsuya kenkyuujo\": \"虹艶研究所\",\n        \"samurai ninja greentea\": \"サムライ忍者GREENTEA\",\n        \"alicesyndrome\": \"AliceSyndrome*\",\n        \"uousaohkoku\": \"鱼ウサ王国\",\n        \"konoshiro shinko\": \"コノシロしんこ\",\n        \"kansai orange\": \"关西オレンジ\",\n        \"imomuya honpo\": \"いもむや本舗\",\n        \"ryuukakusan nodoame\": \"龙角散喉糖\",\n        \"okadatei\": \"おかだ亭\",\n        \"niramikko koujou\": \"にらみっ子工場\",\n        \"kaeri no kai 2\": \"帰りの会2\",\n        \"4h\": \"4H\",\n        \"kaitoushinshidan\": \"怪盗绅士团\",\n        \"pastyle\": \"pastyle\",\n        \"chocolate sheep\": \"Chocolate Sheep\",\n        \"hokkyoku tairiku\": \"北極大陸\",\n        \"fuguriya\": \"ふぐり屋\",\n        \"inran shounen\": \"淫乱少年\",\n        \"rokumonsen\": \"ろくもんせん\",\n        \"tenkaichi babys\": \"天下一Babys\",\n        \"beniya\": \"红屋\",\n        \"sashichigai-dan\": \"挿し違い団\",\n        \"yasai batake\": \"諏訪やさい\",\n        \"ichimi-zanmai\": \"一味三昧\",\n        \"sugar berry syrup\": \"Sugar＊Berry＊Syrup\",\n        \"kousei\": \"コウセイ\",\n        \"sugarringo\": \"SUGARRINGO\",\n        \"hajimeryu\": \"はじめりゅう\",\n        \"neovertex\": \"NEOVERTEX\",\n        \"mizuiro no bara\": \"水色のバラ\",\n        \"trinket\": \"TrinkeT\",\n        \"letra\": \"LETRA\",\n        \"kitazawa sangyo\": \"北沢産業\",\n        \"chocolate land\": \"ちょこれーとらんど\",\n        \"zebrasmise\": \"zebrasmise\",\n        \"kakurenbo\": \"かくれんぼ\",\n        \"chericot rozel\": \"Chericot*Rozel\",\n        \"pockyfactory\": \"PockyFactory\",\n        \"pixel phantom\": \"Pixel Phantom\",\n        \"afurokuma honten\": \"アフロくま本店\",\n        \"sashimi necoya\": \"さしみねこ屋\",\n        \"rurudot\": \"rurudot\",\n        \"nanashimushi land\": \"ななし虫らんど\",\n        \"chaos no genri\": \"カオスの原理\",\n        \"black sousai studio\": \"BLACK SOUSAI STUDIO\",\n        \"haechaimu\": \"ハエチャイム\",\n        \"jagaimo kenkyuujo\": \"じゃがいも研究所\",\n        \"madoromi andon\": \"まどろみ行灯\",\n        \"hakoniwa-kairou\": \"はこにわかいろう\",\n        \"akitake zensen\": \"秋茸前线\",\n        \"octopus jelly\": \"Octopus Jelly\",\n        \"kaden ryohanten seijin corner\": \"荷電量販店成人コーナー\",\n        \"black note\": \"ブラックノート\",\n        \"sentimentcolor\": \"SentimentColor\",\n        \"komowa\": \"こも輪\",\n        \"baby lop\": \"Baby Lop\",\n        \"mersugar\": \"Mersugar\",\n        \"nagatsuki\": \"NAGATSUKI\",\n        \"tayanumaya\": \"田屋沼屋\",\n        \"bottle ship bottler\": \"ボトルシップボトラー\",\n        \"saz\": \"SAZ\",\n        \"clowns\": \"Clowns'\",\n        \"toumei dolce\": \"透明ドルチェ\",\n        \"peroppoi tokoro\": \"ぺろっぽい処\",\n        \"earrings bom factory\": \"イヤリング爆弾工場\",\n        \"ororiya enpitsudo\": \"オロリヤ鉛筆堂\",\n        \"l.g.c.\": \"L.G.C.\",\n        \"midorineko\": \"みどりねこ\",\n        \"q-model\": \"Q-MODEL\",\n        \"cherish\": \"*Cherish*\",\n        \"allows\": \"Allows\",\n        \"pico martel\": \"Pico Martel\",\n        \"osenbei no mori\": \"おせんべいの森\",\n        \"sakura saku saku\": \"佐倉さくさく\",\n        \"calorie and cholesterols\": \"カロリー&Cholesterols\",\n        \"stapspats\": \"Stapspats\",\n        \"letitia no ohirune\": \"レティーシャのお昼寝\",\n        \"rokumarusou\": \"ろくまる荘\",\n        \"yamo7\": \"ヤモセブン\",\n        \"ginga-kei pride\": \"银河系PRIDE\",\n        \"suiikazuchi\": \"スイイカズチ\",\n        \"atelier hinata\": \"あとりえひなた\",\n        \"tortoiseshell\": \"トーティシェル\",\n        \"shinoya\": \"篠屋\",\n        \"ink complex\": \"Ink Complex\",\n        \"supe\": \"すぺ\",\n        \"akaneiro\": \"紅音色\",\n        \"hakukoukai\": \"白蛟会\",\n        \"marshmallow balloon\": \"マシュマロ風船\",\n        \"zombie to yukaina nakamatachi\": \"ぞんびと愉快な仲間たち\",\n        \"anmitsuyomogitei\": \"あんみつよもぎ亭\",\n        \"golden complex\": \"金色complex\",\n        \"kannko bokujyo\": \"缶子牧場\",\n        \"sencyairo\": \"sencyairo\",\n        \"himeya\": \"姫屋\",\n        \"doanobu\": \"どあのぶ\",\n        \"bunka shinryaku\": \"文化☆侵略\",\n        \"gokudou daigensui\": \"極道大元帥\",\n        \"oojikake\": \"大仕掛け\",\n        \"illumination.\": \"ゐるみねゐしょん。\",\n        \"sumi kara sumi made\": \"スミカラスミマデ\",\n        \"kankodori chaen\": \"閑古鳥茶園\",\n        \"hell and heaven\": \"ヘルアンドヘブン\",\n        \"kisarazu teikoku\": \"きさらづ帝国\",\n        \"tiba-santi\": \"千葉産地\",\n        \"yokoshoku ice\": \"洋紅色アイス\",\n        \"nekomaru shouten\": \"猫マル商店\",\n        \"pandagaippiki.\": \"パンダが一匹。\",\n        \"tousen soudou\": \"冬扇草堂\",\n        \"jukusei kakuzatou\": \"熟成角砂糖\",\n        \"mikenekohanten\": \"三毛猫饭店\",\n        \"kamikire basami\": \"紙切ればさみ\",\n        \"undescribed\": \"アンディスクライブド\",\n        \"koharu syojo\": \"小春少女\",\n        \"hakai daiteikoku\": \"破坏大帝国\",\n        \"gusha suumitsuin\": \"愚者枢密院\",\n        \"kotsubuan\": \"こつぶあん\",\n        \"gokusaishiki\": \"极彩色\",\n        \"kirintei\": \"木铃亭\",\n        \"kanyou shoujo\": \"观用少女\",\n        \"ferallemma\": \"フィラレマ\",\n        \"bakayaro\": \"ばかやろう\",\n        \"nanimoshinai\": \"NANIMOSHINAI\",\n        \"mokumokusei\": \"モクモクセイ\",\n        \"junjou harinezumi\": \"純情ハリネズミ\",\n        \"miniomlet ongakudan\": \"ミニオムレツ音楽団\",\n        \"baiuzensen\": \"梅雨前線\",\n        \"nagomiyasan\": \"なごみやさん\",\n        \"kocc house\": \"koccハウス\",\n        \"hito no fundoshi\": \"人の裈\",\n        \"himitsukessya usagi\": \"秘密结社兔\",\n        \"nekonecotton\": \"ねこねこっとん\",\n        \"punipuni no hoppe\": \"ぷにぷにのほっぺ\",\n        \"houkago inokorigumi\": \"放課後居残り組\",\n        \"hokkyoku hotaru\": \"北極ホタル\",\n        \"kikyakudou\": \"鬼脚堂\",\n        \"ikameshi shokudou\": \"乌贼饭食堂\",\n        \"tairikukan dandoudan dan\": \"大陆间弹道弹团\",\n        \"shimobashira koubou\": \"しもばしら工房\",\n        \"muriyari egao\": \"无理矢理笑颜\",\n        \"southbamboo\": \"南方山竹笋\",\n        \"permission\": \"ぱ～みっしょん\",\n        \"tsuki usagi\": \"月うさぎ\",\n        \"ameiro\": \"あめいろ\",\n        \"alpharalpha alley\": \"アルファラルファ裏通り\",\n        \"thirty saver street 2d shooting\": \"サーティセイバーストリート\",\n        \"ruri ruri kikaku\": \"瑠璃瑠璃企画\",\n        \"amanedou\": \"あまね堂\",\n        \"esperanza\": \"真田成\",\n        \"tamago no kimi\": \"卵の黄身\",\n        \"shadan katsudoh\": \"遮断活動\",\n        \"tougen shokken\": \"桃幻食研\",\n        \"ciel-arc\": \"しえるあーく\",\n        \"meshi shinja\": \"饭信者\",\n        \"ishimuraya\": \"石村屋\",\n        \"seika kairaku shoten\": \"圣华快乐书店\",\n        \"ringo no naru ki\": \"林檎のなる木\",\n        \"traya\": \"TraYA\",\n        \"kuzuya\": \"屑屋\",\n        \"momojiru teien\": \"桃汁庭园\",\n        \"tamatamasanmyaku\": \"たまたま山脈\",\n        \"harthnir\": \"HarthNir\",\n        \"yoru no hitsuji\": \"夜のひつじ\",\n        \"nawairo sonata\": \"縄色ソナタ\",\n        \"momokamasu\": \"ももかます\",\n        \"kumo no ito\": \"雲之糸\",\n        \"tokachibare\": \"十勝晴レ\",\n        \"bomubomuburin\": \"ボムボムブリン\",\n        \"nisiarea\": \"にしえりあ\",\n        \"mentsukidou\": \"眼ん月堂\",\n        \"izumo gingatei\": \"出雲銀河亭\",\n        \"gedoudan\": \"外道团\",\n        \"garyuh-chitai\": \"我流痴带\",\n        \"tsf mousou chikusekijo\": \"TSF妄想蓄积所\",\n        \"ntype\": \"NtyPe\",\n        \"h.b\": \"H・B\",\n        \"star track\": \"★track\",\n        \"o.s\": \"O.S\",\n        \"wakame no oyatsu\": \"Wakame no Oyatsu\",\n        \"pantyhose\": \"パンティーHOSE\",\n        \"tomboy\": \"TomBoy\",\n        \"... mou ii desu.\": \"…もういいです。\",\n        \".7\": \".7\",\n        \".miz\": \".miz\",\n        \"0-parts\": \"0-PARTS\",\n        \"0123456789\": \"0123456789\",\n        \"02\": \"02\",\n        \"03-3297\": \"03-3297\",\n        \"04\": \"04\",\n        \"04th heaven\": \"04th Heaven\",\n        \"04u\": \"04U\",\n        \"0725co\": \"0725co\",\n        \"08base\": \"08BASE\",\n        \"096\": \"096\",\n        \"10-man bariki\": \"10マン馬力\",\n        \"10.10mhz\": \"10.10MHz\",\n        \"1000ap\": \"1000AP\",\n        \"100acre\": \"100Acre\",\n        \"100yenmofa\": \"100円外務省\",\n        \"102 goushitsu\": \"102号室\",\n        \"106gou\": \"106GOU\",\n        \"106m\": \"106m\",\n        \"10mile\": \"10mile\",\n        \"10pasec no kanata\": \"拾八secの彼方\",\n        \"10wadaxx\": \"10wadaxx\",\n        \"10yen jondo\": \"10円ジョンドゥ\",\n        \"110u\": \"いいお湯\",\n        \"112k\": \"112K\",\n        \"12-jigen\": \"12次元\",\n        \"12cut\": \"12CUT\",\n        \"12kaffeins\": \"12KAFFEINS\",\n        \"13cm\": \"13cm\",\n        \"148bpm\": \"148bpm\",\n        \"14lolita\": \"14ロリータ\",\n        \"152hertz\": \"152HERTZ\",\n        \"16 sai\": \"16彩\",\n        \"16000 all\": \"16000オール\",\n        \"16kenme\": \"16軒目\",\n        \"1756 studio\": \"1756スタジオ\",\n        \"17in\": \"17in\",\n        \"17w\": \"17W\",\n        \"180r\": \"180R\",\n        \"185 souko\": \"185倉庫\",\n        \"1bit\": \"1bit\",\n        \"1gaya\": \"1gaya\",\n        \"1or8\": \"イチカバチカ\",\n        \"2 carat\": \"2カラット\",\n        \"2000kcal shake club\": \"2000kcalシェイク同好会\",\n        \"209 goushitsu\": \"209号室\",\n        \"20liquid\": \"20LIQUID\",\n        \"20r0\": \"20R0\",\n        \"20twenty\": \"20twenty\",\n        \"231179rock\": \"231179=ROCK\",\n        \"241 inc.\": \"241 Inc.\",\n        \"273k\": \"273K\",\n        \"2b\": \"2B\",\n        \"2cv.ss\": \"2CV.SS\",\n        \"2d-note\": \"2D-Note\",\n        \"2h\": \"2H\",\n        \"2jimusubi\": \"二次結び\",\n        \"2m\": \"2m\",\n        \"2nd\": \"2ND\",\n        \"2nd life\": \"2nd Life\",\n        \"2p-color\": \"2P-Color\",\n        \"2stroke\": \"2ストローク\",\n        \"2tailqueen\": \"2tail Queen\",\n        \"2vs\": \"2vs\",\n        \"2zigen\": \"2ZIGEN\",\n        \"3 colors cat\": \"3 colors cat\",\n        \"3 colors corona\": \"3色コロナ\",\n        \"3 on 10\": \"3 on 10\",\n        \"3-2 gagen\": \"3-2画源\",\n        \"3-mega.ne\": \"3-MEGA.ne\",\n        \"3.5tousin\": \"3.5等身\",\n        \"300cm\": \"300cm\",\n        \"301 goushitsu\": \"301号室\",\n        \"30min-5000yen\": \"30分5000円ポッキリ\",\n        \"321go\": \"321go\",\n        \"360 degrees c\": \"360°C\",\n        \"36k\": \"36K\",\n        \"38shiki\": \"三十八式\",\n        \"39dmp\": \"39dmp\",\n        \"39xream\": \"ミックスリーム\",\n        \"3egg\": \"3egg\",\n        \"3jou\": \"3情\",\n        \"3lbox\": \"3LBOX\",\n        \"4.5space\": \"4.5space\",\n        \"40010 1-go\": \"40010壱号\",\n        \"4649 club\": \"4649苦愛\",\n        \"4dip\": \"4DIP\",\n        \"4or5 works\": \"よんかごわーくす\",\n        \"4season\": \"4season\",\n        \"4st injection\": \"4st Injection\",\n        \"5 06\": \"ゴー!マルロク\",\n        \"5 slash 4\": \"5/4\",\n        \"50000s\": \"五萬S\",\n        \"50on\": \"50on!\",\n        \"50pointcaliper\": \"50PointCaliper\",\n        \"5th library\": \"5th Library\",\n        \"5up\": \"5UP\",\n        \"64bit spectrum\": \"64bitスペクトル\",\n        \"64kbit\": \"64Kbit\",\n        \"66 no oka\": \"66の丘\",\n        \"662kb\": \"662KB\",\n        \"666-346\": \"666-346\",\n        \"666protect\": \"666プロテクト\",\n        \"69erotique\": \"69EROTIQUE\",\n        \"69hb\": \"69HB\",\n        \"6colors\": \"6COLORS\",\n        \"6x8breads\": \"6x8breads\",\n        \"7 colored led\": \"虹色発光ダイオード\",\n        \"7-ban no okimono\": \"7番の置物\",\n        \"707room\": \"707号室\",\n        \"73feti\": \"73フェチ\",\n        \"73gou koudou\": \"73号坑道\",\n        \"774 house\": \"774ハウス\",\n        \"7961shiki\": \"7961式\",\n        \"7fleur\": \"7Fleur\",\n        \"7menzippo\": \"7メンZippo\",\n        \"7th ark\": \"7th_arK\",\n        \"7th door\": \"7th Door\",\n        \"7th utopia\": \"7th utopia\",\n        \"8 no ji club\": \"8の字倶楽部\",\n        \"8 slash 7\": \"8/7\",\n        \"81dora\": \"81dora\",\n        \"86 saver\": \"86 SAVER\",\n        \"86cafe\": \"86珈琲店\",\n        \"88scones\": \"88scones\",\n        \"8cm\": \"8cm\",\n        \"8graphica\": \"エイトグラフィカ\",\n        \"8ji sugi\": \"8時すぎ\",\n        \"93bangai\": \"93番街\",\n        \"999 q-miz\": \"999 Q-miz\",\n        \"99mg\": \"99mg\",\n        \"9z\": \"9z\",\n        \"a\": \"Circle A\",\n        \"a 3103 hut\": \"a 3103 hut\",\n        \"a after school of silence\": \"沈黙の放課後\",\n        \"a cherry-blossom front\": \"A cherry-blossom front\",\n        \"a face\": \"a face\",\n        \"a hoimi\": \"a hoimi\",\n        \"a pear tree\": \"a pear tree\",\n        \"a taku studio takuno\": \"A TAKU STUDIO TAKUNO\",\n        \"a yellow aurora\": \"A Yellow Aurora\",\n        \"a-anima\": \"A-Anima\",\n        \"a-arinco\": \"A-arinco\",\n        \"a-hole\": \"A-HOLE\",\n        \"a-lucky murashige no ran\": \"A-Lucky☆村重の乱\",\n        \"a-mania9s\": \"A-mania9's\",\n        \"a-mw.\": \"A-mw.\",\n        \"a-office\": \"A-office\",\n        \"a.boc70\": \"a.boc70\",\n        \"a.c.g arts\": \"A.C.Gアーツ\",\n        \"a.l.c\": \"A.L.C\",\n        \"a.la.mode\": \"ア・ラ・モード\",\n        \"a.p. retriever\": \"A.P.レトリバー\",\n        \"a.p.yamamoh\": \"A.P.YAMAMOH\",\n        \"a.s.g group\": \"A・S・Gグループ\",\n        \"a.s.s\": \"A.S.S\",\n        \"a.u.forest\": \"A.U.FOREST\",\n        \"a.v. tokkoutai\": \"A.V.特攻隊\",\n        \"a2 lampshade\": \"A2 LAMPSHADE\",\n        \"a2-wing\": \"A2-WiNG\",\n        \"a440\": \"a440\",\n        \"aa aishiteru\": \"ああ愛してる\",\n        \"aa doushiyou\": \"あぁどうしよう\",\n        \"aa warera katou hayabusa sentoutai\": \"嗚呼、我等加藤隼戦斗隊\",\n        \"aaru\": \"アアル\",\n        \"ab normal\": \"あーびーのーまる\",\n        \"ab10\": \"AB10\",\n        \"abalone kiss\": \"ABALONE KISS\",\n        \"abara ga itai\": \"あばらが痛い\",\n        \"abarenbow tengu\": \"暴れん坊天狗\",\n        \"abaretabi\": \"暴れ旅\",\n        \"abbey load\": \"Abbey Load\",\n        \"abdg encirclement formation\": \"ABDG包囲網\",\n        \"abellcain\": \"アベルカイン\",\n        \"aberyu\": \"悪部流\",\n        \"abgrund\": \"abgrund\",\n        \"abigor\": \"アビゴール\",\n        \"abliss\": \"ABLISS\",\n        \"abonriya\": \"あぼんり屋\",\n        \"abradeli kami\": \"油照紙\",\n        \"absolute fantasy\": \"ABSOLUTE FANTASY\",\n        \"absorb\": \"アブそ～ぶ\",\n        \"abstract limit\": \"抽象境界\",\n        \"abunae koubou\": \"あぶな絵工房\",\n        \"abunai zeiniku\": \"あぶないぜいにく\",\n        \"aburasoba biyori\": \"あぶらそば日和\",\n        \"abyssdragon.\": \"AbyssDragon.\",\n        \"acchi no seikatsu\": \"あっちの生活\",\n        \"accidentbitterchocolate\": \"AccidentBitterChocolate\",\n        \"accolt\": \"accolt\",\n        \"ace enterprise\": \"Ace Enterprise\",\n        \"achromic\": \"Achromic\",\n        \"achumuchi\": \"あちゅむち\",\n        \"acid eaters\": \"ACID EATERS\",\n        \"acid noel\": \"Acid Noel\",\n        \"acidsea\": \"ACIDSEA\",\n        \"acid-head\": \"ACID-HEAD\",\n        \"acoram\": \"Acoram\",\n        \"action mokei\": \"アクション模型\",\n        \"active\": \"アクティブ\",\n        \"active sunrise\": \"あくてぃぶサンライズ\",\n        \"actively dawn\": \"ACTIVELY DAWN\",\n        \"actress\": \"アクトレス\",\n        \"actuator\": \"アクチュエーター\",\n        \"acute\": \"あきゅ〜と\",\n        \"ad-hoc\": \"Ad-Hoc\",\n        \"adabana\": \"徒花\",\n        \"adalt only\": \"成人向け\",\n        \"ade no shin\": \"あでのしん\",\n        \"adeyaka kunoichi-dan\": \"艶やかくノ一団\",\n        \"adnis\": \"ADNiS\",\n        \"adult house\": \"あだるとはうす\",\n        \"advance\": \"ADVANCE\",\n        \"advanced twinkle castle shinobi jou giga\": \"ADVANCEDトィンクル☆キャッスル+忍城GIGA\",\n        \"advanced-ss\": \"Advanced-SS\",\n        \"aeba fukashi\": \"饗庭淵\",\n        \"aegistone\": \"aegistone\",\n        \"aerial\": \"エアリアル\",\n        \"aerial rave\": \"AERIAL RAVE\",\n        \"aerial soul\": \"Aerial Soul\",\n        \"aerodog\": \"AERODOG\",\n        \"affidavit\": \"Affidavit\",\n        \"affix\": \"Affix\",\n        \"afj\": \"AFJ\",\n        \"after party\": \"after party\",\n        \"again.\": \"again.\",\n        \"ageage\": \"アゲ揚げ\",\n        \"ageku no hate no\": \"あげくの果ての\",\n        \"ago\": \"アゴ\",\n        \"agohimo yoika\": \"アゴヒモヨイカ\",\n        \"agoitei\": \"AGOI亭\",\n        \"ah.\": \"あー。\",\n        \"ahaan\": \"AHAAN\",\n        \"ahm\": \"AHM\",\n        \"ahoge\": \"あほ毛\",\n        \"ahou basha\": \"阿呆馬車\",\n        \"ahriman\": \"アーリマン\",\n        \"ahun\": \"アフン\",\n        \"ai no inu koujou\": \"愛の犬工場\",\n        \"ai no kura\": \"あいの倉\",\n        \"ai no senshi mimikaki\": \"愛の戦士みみかき\",\n        \"ai no sunatokei\": \"藍の砂時計\",\n        \"ai urara\": \"あいうらら\",\n        \"ai wa kurayami\": \"愛は暗闇\",\n        \"ai-chan no ozashiki\": \"あいちゃんのお座敷\",\n        \"aiai\": \"あいあい\",\n        \"aiaigasa\": \"あいあい傘\",\n        \"aida.\": \"間。\",\n        \"aidon raiki\": \"合丼来来\",\n        \"aienkien\": \"愛鉛奇縁\",\n        \"aigamodou\": \"あいがも堂\",\n        \"aigan shounen\": \"愛玩少年\",\n        \"aihara otome\": \"相原乙女\",\n        \"aiiro paradox\": \"藍色パラドックス\",\n        \"aiirojikan\": \"藍色時間\",\n        \"aiirosakura\": \"あいいろさくら\",\n        \"aik sole\": \"アイクソール\",\n        \"aikokusha\": \"愛国者\",\n        \"aikotobako\": \"アイコトバコ\",\n        \"aim\": \"AIM\",\n        \"aim-zero\": \"Aim-ZERO\",\n        \"aimaimemai\": \"あいまいめまい\",\n        \"aimaimoko\": \"曖昧模糊\",\n        \"aimasutei\": \"愛増庭\",\n        \"aimy\": \"Aimy\",\n        \"ainekokan\": \"愛猫缶\",\n        \"aiokougadou\": \"アイオコウガドウ\",\n        \"aion\": \"AION\",\n        \"air hike\": \"Air Hike\",\n        \"air plants\": \"Air Plants\",\n        \"air praitre\": \"AirФPraitre\",\n        \"air union\": \"AIR UNION\",\n        \"airily steps\": \"Airily Steps\",\n        \"airmusica\": \"AIRMUSICA\",\n        \"airyu\": \"あいりゅ\",\n        \"aitsu no tatebue\": \"あいつのたてぶえ\",\n        \"aiuea\": \"あいうえあ\",\n        \"aiviera\": \"アイヴィエラ\",\n        \"aiyamatarei\": \"あいやまたれい\",\n        \"aizou roman kikan\": \"愛憎浪漫機関\",\n        \"ajala\": \"戯アジャラ\",\n        \"ajapaa.\": \"あじゃぱー。\",\n        \"aje\": \"AJE\",\n        \"aji no hiraki\": \"あじのひらき\",\n        \"aji star\": \"鯵スター\",\n        \"aju ga mitsukarimasen\": \"あじゅが見つかりません\",\n        \"ajinomoto\": \"あじのもと\",\n        \"ajisaihuumitei\": \"紫陽花風味亭\",\n        \"aka\": \"aka\",\n        \"akaao\": \"あかあお\",\n        \"akabei soft\": \"AKABEi SOFT\",\n        \"akabei soft2\": \"あかべぇそふとつぅ\",\n        \"akabei soft3\": \"あかべぇそふとすりぃ\",\n        \"akachang time\": \"赤ちゃングタイム\",\n        \"akachi\": \"あかち\",\n        \"akacia\": \"AKACIA\",\n        \"akadama-ya\": \"赤玉屋\",\n        \"akadashi no misoshiru\": \"赤だしのみそ汁\",\n        \"akaeboshi\": \"アカエボシ\",\n        \"akagiridan\": \"あかぎり団\",\n        \"akagisou\": \"赤木荘\",\n        \"akagumotei\": \"朱雲亭\",\n        \"akahira kirin\": \"あかひら麒麟\",\n        \"akai chi to tetsu no roudousha tou\": \"赤い血と鉄の労働者党\",\n        \"akai hitomi to aoi tsuki\": \"紅い瞳と蒼い月\",\n        \"akai kitsune\": \"アカイキツネ\",\n        \"akai marlboro\": \"赤いマルボロ\",\n        \"akai muffler\": \"赤いマフラー\",\n        \"akai syohousen\": \"赤い処方箋\",\n        \"akai tsubasa\": \"赤い翼\",\n        \"akaihoho\": \"akaihoho\",\n        \"akairo mambo\": \"赤色まんぼー\",\n        \"akaironomahou\": \"あかいろのまほう\",\n        \"akamiru\": \"Akamiru\",\n        \"akamuni.\": \"あかむに。\",\n        \"akanagi\": \"あかなぎ\",\n        \"akane shuuhei dou\": \"茜しゅうへい堂\",\n        \"akaneko\": \"赤猫\",\n        \"akanoiki\": \"赤の域\",\n        \"akari wa honnori tomoreba ii\": \"明かりはほんのり灯ればいい\",\n        \"akaringo-chan\": \"あかりんごちゃん\",\n        \"akarui sm\": \"明るいSM\",\n        \"a-ka-sa-works\": \"あかさ製作所\",\n        \"akashitei\": \"あかし亭\",\n        \"akatama\": \"アカタマ\",\n        \"akatsuki akaza dou\": \"赤月赤座堂\",\n        \"akatsuki katsuie no circle\": \"暁勝家ノサークル\",\n        \"akatsuki works\": \"暁WORKS\",\n        \"akatsuki doumei\": \"アカツキドウメイ\",\n        \"aki no yonaga ni yoiyami ni\": \"秋の夜長に宵闇に\",\n        \"aki6666\": \"AKI6666\",\n        \"akifumi-chan\": \"あきふみちゃん\",\n        \"akikan\": \"アキカン\",\n        \"akino melpa\": \"アキノメルパ\",\n        \"akisame moyashi\": \"あきさめ萌やし\",\n        \"akisora\": \"秋空\",\n        \"akitaka seinikuten\": \"あきたか贅肉店\",\n        \"akitaku kikaku\": \"アキタク＊キカク\",\n        \"akitarainu\": \"あきたらいぬ\",\n        \"akitsuki\": \"秋月\",\n        \"akiya\": \"空屋\",\n        \"akiyama production\": \"アキヤマ興業\",\n        \"akkan-bi project\": \"あっかんBi～\",\n        \"akou kurou\": \"アコウクロウ\",\n        \"akoyagai to aumale ebi\": \"あこや貝とオマールえび\",\n        \"akuheki\": \"悪癖\",\n        \"akuma no ehon hakushu dan\": \"悪魔の絵本拍手団\",\n        \"akuma toshi keikaku\": \"悪魔都市計画\",\n        \"akumara\": \"あくまら\",\n        \"akumaster\": \"Akumaster\",\n        \"akunaki hourou\": \"あくなき放浪\",\n        \"akunomangakarenmei\": \"悪の漫画家連盟\",\n        \"akuochisukii kyoushitsu\": \"アクオチスキー教室\",\n        \"akuta space\": \"あくたスペース\",\n        \"akuyukai\": \"悪遊怪\",\n        \"akys honpo\": \"AKYS本舗\",\n        \"al dente\": \"あるでんて\",\n        \"albatross\": \"あるばとろす\",\n        \"albercorp.\": \"あるばーCorp.\",\n        \"albino no yuuhatsu\": \"アルビノの融発\",\n        \"albireo 7\": \"あるびれお7\",\n        \"alchemist works\": \"Alchemist works\",\n        \"alfalfa\": \"alfalfa\",\n        \"ali-san maku\": \"ALIさんマーク\",\n        \"alibi\": \"アリバイ\",\n        \"alice complex\": \"Alice Complex\",\n        \"alice digital factory\": \"Alice Digital Factory\",\n        \"alice-do\": \"ありす堂\",\n        \"alice.blood\": \"Alice.Blood\",\n        \"aliceflag\": \"AliceFlag\",\n        \"alicegarden\": \"AliceGarden\",\n        \"alicemiller\": \"alicemiller\",\n        \"alicetale\": \"ありすている♪\",\n        \"alikui v line\": \"ありくいVライン\",\n        \"alisex\": \"alisex\",\n        \"alkaloid no baketu\": \"アルカロイドノバケツ\",\n        \"all over the place.\": \"all over the Place.\",\n        \"all-time\": \"ALL-TiME\",\n        \"allbyte\": \"AllByte\",\n        \"allegro launcher\": \"アレグロランチャー\",\n        \"allium tuberosum\": \"Allium tuberosum\",\n        \"allo\": \"allo\",\n        \"almanacco\": \"almanacco\",\n        \"almism\": \"ALMISM\",\n        \"almond republic\": \"あーもんど共和国\",\n        \"almond to kyogyuunyuu\": \"アーモンドと巨牛乳\",\n        \"aloha soft\": \"あろはそふと\",\n        \"alpa\": \"ALPA\",\n        \"alpaca unit\": \"ALPACA Unit\",\n        \"alpha to yukaina nakamatachi\": \"有葉と愉快な仲間たち\",\n        \"alpha-beta\": \"alpha-beta\",\n        \"alps\": \"アルプス興業\",\n        \"alsetro\": \"ALSeTRO\",\n        \"alsiel\": \"Alsiel\",\n        \"alt\": \"ALT\",\n        \"alte notiz\": \"あるてのてぃつ\",\n        \"alter maschine\": \"Alter Maschine\",\n        \"altergott\": \"Altergott\",\n        \"alto letzel\": \"あるとれっつぇる\",\n        \"alto realize\": \"Alto realize\",\n        \"altopia\": \"アルトピア\",\n        \"altron\": \"アルトロン\",\n        \"alumi soft\": \"あるみそふと\",\n        \"alumican\": \"あるみかん\",\n        \"am colon tiger\": \"AM:TIGER\",\n        \"amaama-tei\": \"甘々亭\",\n        \"amadeus no isan\": \"アマデウスの遺産\",\n        \"amadoiza\": \"雨樋座\",\n        \"amadoki\": \"雨時\",\n        \"amagaeru to sprocket\": \"雨蛙とスプロケット\",\n        \"amagasa touge\": \"雨傘峠\",\n        \"amagashi\": \"甘菓子\",\n        \"amagi an ironworks\": \"天城製鉄所\",\n        \"amagoi koubou\": \"雨乞い工房\",\n        \"amai wakusei\": \"あまい惑星\",\n        \"amaichigo\": \"あまいちご\",\n        \"amairo denshi koubou\": \"天色電子工房\",\n        \"amakasas\": \"Amakasas\",\n        \"amakashi\": \"アマカシ\",\n        \"amakaya\": \"天香屋\",\n        \"amakuchi\": \"あまくち\",\n        \"amakura89gou ten\": \"天倉89号店\",\n        \"amakuro okami\": \"あまくろ狼\",\n        \"amakurodou\": \"甘黒堂\",\n        \"amam\": \"AMAM\",\n        \"amamin koubou\": \"あまみん工房\",\n        \"amanatsu mix\": \"あまなつミックス\",\n        \"amanatsu quality\": \"甘夏クオリテ\",\n        \"amanatsuya\": \"天夏屋\",\n        \"amanogawa tsuushin\": \"天の川通信\",\n        \"amanojaku\": \"天ノ邪鬼\",\n        \"amaon\": \"amaon\",\n        \"amaoto rensa yohou\": \"雨音連鎖予報\",\n        \"amapoteya\": \"あまぽて屋\",\n        \"amarini senpaku\": \"あまりにセンパク!\",\n        \"amatosui\": \"甘桃水\",\n        \"amatou continue\": \"甘党こんてぃにゅー\",\n        \"amatsu hanten opi\": \"天津反転OPi!\",\n        \"amatsukami\": \"アマツカミ\",\n        \"amayadori plus\": \"AMAYADORI+\",\n        \"amazake resonance\": \"甘酒レゾナンス\",\n        \"amazawa kingdom\": \"AMAZAWA KINGDOM\",\n        \"amazingsweets\": \"Amazing Sweets\",\n        \"ambience\": \"ambience\",\n        \"ambivalence\": \"AMBIVALENCE\",\n        \"ambivalent-e\": \"Ambivalent-E\",\n        \"ambivalenz\": \"AmBiVaLenZ\",\n        \"ame hotel\": \"AMEホテル\",\n        \"ame no aji\": \"雨の味\",\n        \"ame no murakumo\": \"アメノムラクモ\",\n        \"ame no nikki\": \"雨のにっき\",\n        \"amecir\": \"あめさー\",\n        \"amedamazakura\": \"飴玉桜\",\n        \"amefurasy\": \"amefurasy\",\n        \"amefuri canvas\": \"雨ふりキャンバス\",\n        \"ameiro biscuit\": \"飴色ビスケット\",\n        \"amemizu\": \"あめみず\",\n        \"ameno oukan\": \"雨の王冠\",\n        \"amenyan-tai\": \"あめにゃん隊\",\n        \"ameyama telegraph\": \"雨山電信社\",\n        \"ami-dabutsu\": \"ami-だぶつ\",\n        \"aminendo\": \"あみねんど\",\n        \"ammolite\": \"アンモライト\",\n        \"amorphous innocent fiction\": \"AMORPHOUS innocent fiction\",\n        \"ampullaria\": \"あんぷらりあ\",\n        \"amrita\": \"AMRITA\",\n        \"amuamu tiger\": \"あむあむタイガー\",\n        \"amulet\": \"あみゅれっと\",\n        \"amuse craft erotica\": \"アミューズクラフトエロチカ\",\n        \"ana\": \"ANA\",\n        \"ana futatsu\": \"穴ふたつ\",\n        \"anagura\": \"穴蔵\",\n        \"anal crisis\": \"アナル☆クライシス\",\n        \"analcime\": \"アナルシム\",\n        \"analog e.c.\": \"アナログE.C.\",\n        \"analog store\": \"あなろぐストア\",\n        \"ananas dolce\": \"Ananas Dolce\",\n        \"ananwanco\": \"あんあんわんこ\",\n        \"anapom\": \"ANAPOM\",\n        \"anarchy gangsta\": \"アナーキーギャングスタ\",\n        \"anarcomix\": \"ANARCOMIX\",\n        \"anchor\": \"ANCHOR\",\n        \"andante\": \"あんだんて\",\n        \"anegaoka sanchoume\": \"姉ヶ丘三丁目\",\n        \"anemitsu\": \"あねみつ\",\n        \"anemone\": \"Anemone\",\n        \"aneurysm.\": \"あにゅうりずむ。\",\n        \"anfini\": \"ANFINI\",\n        \"ange\": \"アンジェ\",\n        \"angel bless\": \"Angel Bless\",\n        \"angel of blue sky\": \"Angel of Blue Sky\",\n        \"angelic feather\": \"天使の羽\",\n        \"angelphobia\": \"angelphobia\",\n        \"angensou\": \"黯幻想\",\n        \"anglachel\": \"アングラヘル\",\n        \"angler soft\": \"アングラーソフト\",\n        \"angora doll\": \"Angora doll\",\n        \"ani ga saru\": \"兄が猿\",\n        \"aniki otokodou\": \"兄貴漢堂\",\n        \"anim\": \"Anim\",\n        \"animal herb\": \"あにまるハーブ\",\n        \"animal passion\": \"Animal Passion\",\n        \"animal service\": \"アニマルサービス\",\n        \"animalism\": \"あにまりずむ\",\n        \"animankan\": \"アニマン館\",\n        \"anime brothers\": \"アニメブラザーズ\",\n        \"animeeru\": \"あにめーる\",\n        \"ankake cha-han\": \"あんかけCha-haN\",\n        \"ankake chameshi\": \"あんかけチャメシ\",\n        \"ankanke\": \"安閑家\",\n        \"ankimo factory\": \"あんきも工房\",\n        \"anko koubou\": \"あんこ工房\",\n        \"ankoku azumaya\": \"暗黒あずまや\",\n        \"ankoku marimokan\": \"アンコクマリモカン\",\n        \"ankoku-bousougumi\": \"暗黒暴走組\",\n        \"ankoya\": \"アンコ屋\",\n        \"anmin koutou benmukan jimusho\": \"安眠高等弁務官事務所\",\n        \"anmitsuya\": \"あんみつや\",\n        \"annee suplex\": \"あんねーすーぷれっくす\",\n        \"annin\": \"杏仁\",\n        \"annon club\": \"安穏倶楽部\",\n        \"anons flood myth\": \"あのんの大洪水伝説\",\n        \"anonymax\": \"あのにまっくす\",\n        \"anoprimal\": \"アノプライマル\",\n        \"anorak post\": \"Anorak Post\",\n        \"another story\": \"Another Story\",\n        \"another world\": \"Another World\",\n        \"ant colony\": \"蟻の巣\",\n        \"antares\": \"ANTARES\",\n        \"antidying\": \"AntiDying\",\n        \"antineed\": \"ANTINEED\",\n        \"anxious delusionist\": \"アンキデ\",\n        \"anya\": \"ANYa\",\n        \"anysing world\": \"ANYSING WORLD\",\n        \"anything\": \"anything\",\n        \"anzen daiichi\": \"安全第一\",\n        \"anzen ekisu\": \"安全えきす\",\n        \"anzen na buffalo\": \"安全なバッファロー\",\n        \"anzeri kai\": \"アンゼリ会\",\n        \"anzu ame\": \"あんず飴\",\n        \"ao hana\": \"青華\",\n        \"ao niwashi\": \"青庭師\",\n        \"ao no oto\": \"青ノ音\",\n        \"aoaa\": \"AOAA\",\n        \"aoba q madou\": \"青葉Q魔洞\",\n        \"aoboshi\": \"青星\",\n        \"aodiso kankou\": \"青ぢそ甘工\",\n        \"aohibachi\": \"アオヒバチ\",\n        \"aohimo familia\": \"アオヒモファミリア\",\n        \"aoi\": \"AOI\",\n        \"aoi dennou\": \"アオイ電脳\",\n        \"aoi no ie\": \"葵の家\",\n        \"aoi project\": \"AOI PROJECT\",\n        \"aoikitoiki.\": \"青息吐息。\",\n        \"aoiro hakkyou diode\": \"青色ハッキョウダイオード\",\n        \"aoiro ichiza\": \"青色一座\",\n        \"aoirobindume\": \"青色瓶詰\",\n        \"aoirotone works\": \"Aoirotone works\",\n        \"aoiten\": \"青い点\",\n        \"aokumashii\": \"アオクマシー\",\n        \"aomayu\": \"あおまゆ\",\n        \"aomi dream maker\": \"あおみどりーむめーかー\",\n        \"aomidori\": \"蒼見鳥\",\n        \"aonatsusou\": \"蒼夏荘\",\n        \"aotokage\": \"青蜥蜴\",\n        \"aotsukitei\": \"蒼月亭\",\n        \"aoyama seisaku\": \"青山制作所\",\n        \"aozakura\": \"蒼桜\",\n        \"aozora market\": \"蒼空市場\",\n        \"aozora no mieru chikashitsu\": \"青空の見える地下室\",\n        \"apadash\": \"アパダッシュ\",\n        \"apatheia\": \"APATHEIA\",\n        \"aperitif\": \"Aperitif\",\n        \"aphrodite\": \"あふろでぃ～て\",\n        \"aphrodite fan club\": \"アフロディーテファンクラブ\",\n        \"apika\": \"apika\",\n        \"aplysia-gumi\": \"Aplysia組\",\n        \"apocolotte\": \"ApoCoLotte\",\n        \"apocrine.\": \"あぽくりん。\",\n        \"apokari\": \"あぽかり\",\n        \"apollo\": \"APOLLO\",\n        \"apple mint leaves\": \"あっぷるみんとのは\",\n        \"apple pie\": \"アップルパイ\",\n        \"apple rooftop\": \"あっぷる屋上\",\n        \"apple water\": \"Apple Water\",\n        \"applecat\": \"あっぷるきゃっと\",\n        \"applesoft\": \"アップルソフト\",\n        \"applique\": \"あっぷりけ\",\n        \"apricot\": \"apricot\",\n        \"apricot cherry\": \"Apricot Cherry\",\n        \"apricot sirup\": \"あんずシロップ\",\n        \"apricottea\": \"APRICOTTEA\",\n        \"apsara project\": \"あぷさらproject\",\n        \"apsis\": \"apsis\",\n        \"apupop\": \"apupop\",\n        \"apurikokko\": \"あぷりこっこ\",\n        \"aq rotation\": \"AQローテーション\",\n        \"aqua create\": \"AQUA CREATE\",\n        \"aqua space\": \"AQUA SPACE\",\n        \"aqua-baiser\": \"Aqua-baiser\",\n        \"aquadriver\": \"アクアドライバー\",\n        \"aquamarine\": \"あくあまりん\",\n        \"aquapit\": \"あくあぴっと\",\n        \"aquarium\": \"アクアリウム\",\n        \"aquarius gate\": \"Aquarius Gate\",\n        \"aquaver\": \"AQUA:VER\",\n        \"aquilegia\": \"Aquilegia\",\n        \"aquilno-zeroex\": \"あきるのぜろえっくす\",\n        \"aqukan\": \"亜空間\",\n        \"ar da coda\": \"あ～だこ～だ\",\n        \"arachnomania\": \"あらくの☆まにあ\",\n        \"arafuradou\": \"アラフラ胴\",\n        \"arahabaki\": \"アラハバキ\",\n        \"arakiya-san\": \"あらき屋さん\",\n        \"arakureta monotachi\": \"あらくれた者たち\",\n        \"araragi-1071-\": \"ARARAGI-1071-\",\n        \"ararudaito\": \"あらるだいと\",\n        \"arc\": \"ARC\",\n        \"arc slash turbine\": \"ARC/TURBINE\",\n        \"arcana club\": \"あるかな倶楽部\",\n        \"arch\": \"ARCH\",\n        \"archangel\": \"ARCHANGEL\",\n        \"archea\": \"archea\",\n        \"archf\": \"ARCHF\",\n        \"arcon\": \"あるこん\",\n        \"arcs\": \"ArcS\",\n        \"arctangent\": \"ARCTANGENT\",\n        \"arctic char\": \"Arctic Char\",\n        \"arctic pan\": \"北極鍋\",\n        \"are.\": \"あれ。\",\n        \"area-048\": \"Area-048\",\n        \"area-s\": \"Area-S\",\n        \"area188\": \"エリア188\",\n        \"area50\": \"Area50\",\n        \"area7\": \"えりあ7\",\n        \"arearee\": \"あれあれえ\",\n        \"areya\": \"あれ屋\",\n        \"argon\": \"アルゴン\",\n        \"argonauts\": \"Argonauts\",\n        \"argyle\": \"アーガイル\",\n        \"argyle check\": \"Argyle◇check\",\n        \"aria\": \"Aria\",\n        \"aria corporation\": \"アリアコーポレーション\",\n        \"arianrhod\": \"Arianrhod\",\n        \"ariari no nashinashi\": \"ありありのなしなし\",\n        \"arieroof\": \"Arieroof\",\n        \"arigatou\": \"ありが党\",\n        \"arikamatou\": \"ありかま糖\",\n        \"arikui mcqueen\": \"アリクイマックィーン\",\n        \"arimax\": \"アリマックス\",\n        \"arinotowatari\": \"ありのとわたり\",\n        \"arisan-antenna\": \"ありさんアンテナ\",\n        \"ark emerald\": \"Ark Emerald\",\n        \"arkadia\": \"ARKADIA\",\n        \"arkizm\": \"arkizm*\",\n        \"armanium\": \"あるまにうむ\",\n        \"armeria\": \"Armeria\",\n        \"armored ginkakuji\": \"アーマードギンカクジ\",\n        \"armored namamono\": \"アーマードなまもの\",\n        \"aroma terrace\": \"あろまてらす\",\n        \"aromatic girl\": \"aromatic girl\",\n        \"arpeggio\": \"あるぺじお\",\n        \"arsenothelus\": \"アルセノテリス\",\n        \"art en ciel.\": \"art en ciel.\",\n        \"art equals theater\": \"ART=THEATER\",\n        \"art jam\": \"Art Jam\",\n        \"artichoke\": \"artichoke\",\n        \"article 60 of criminal code\": \"刑法第60条\",\n        \"artificial eden\": \"Artificial Eden\",\n        \"arts graffiti\": \"アーツグラフィティ\",\n        \"aru-run\": \"あるるん\",\n        \"arubain\": \"あるばいん\",\n        \"aruchisuto\": \"アルチスト\",\n        \"aruheito\": \"あるへゐと\",\n        \"aruk9\": \"アルK9\",\n        \"arukaseya\": \"歩かせ屋\",\n        \"arumi seigen b-chiku\": \"アルミ制限B地区\",\n        \"arunekoki\": \"歩猫記\",\n        \"arutana\": \"あるたな\",\n        \"as known as\": \"as known as\",\n        \"as mission imphal\": \"インパール作戦\",\n        \"as-zadkiel\": \"As-Zadkiel\",\n        \"asa club\": \"あさクラブ\",\n        \"asabadou\": \"浅葉堂\",\n        \"asadukuyo no utage\": \"朝月夜の宴\",\n        \"asagayatei\": \"あさがや亭\",\n        \"asagindo\": \"あさぎん堂\",\n        \"asai kikaku\": \"あさい企画\",\n        \"asairo milktea\": \"朝色みるくちー\",\n        \"asaiumi\": \"浅い海\",\n        \"asakawa hetero\": \"麻川ヘテロ\",\n        \"asaki blog branch office\": \"朝木blog出張所\",\n        \"asaki yumemishi\": \"あさきゆめみし\",\n        \"asanebou crisis\": \"朝寝坊クライシス\",\n        \"asanegi shouten\": \"麻根木商店\",\n        \"asapi-keikaku.\": \"あさぴ計画。\",\n        \"asatsukimint\": \"アサツキミント\",\n        \"asg-project\": \"ASG-Project\",\n        \"ashanti\": \"アシャンティ\",\n        \"ashi zanmai\": \"あしざんまい\",\n        \"ashibububu\": \"あしぶぶぶ\",\n        \"ashima sandou\": \"芦間山道\",\n        \"ashinoie\": \"あしの家\",\n        \"ashiromance\": \"Ashiromance\",\n        \"ashitakara-ganbaru\": \"あしたから頑張る\",\n        \"ashiya\": \"脚屋\",\n        \"ashly\": \"ashly\",\n        \"ashtray\": \"ASHTRAY\",\n        \"ashuradou\": \"阿修羅堂\",\n        \"ashuraya\": \"阿修羅屋\",\n        \"asianboy\": \"ASIANBOY\",\n        \"asiangirl\": \"ASIANGIRL\",\n        \"ask\": \"ASK\",\n        \"askot\": \"askot\",\n        \"asma\": \"ASMA\",\n        \"asmodeus seiyaku\": \"アスモデウス製薬\",\n        \"asnaronyoichi\": \"あすなろにょいち\",\n        \"asonerikes\": \"アソネリケス\",\n        \"aspara noujou\": \"アスパラ農場\",\n        \"aspergillus\": \"Aspergillus\",\n        \"assaultbeer\": \"アサルトビア\",\n        \"assistreplaytime\": \"A.R.T\",\n        \"asterism\": \"アステリズム\",\n        \"astllatte\": \"アストラッテ\",\n        \"astras\": \"ASTRA'S\",\n        \"astrological sign\": \"Astrological Sign\",\n        \"astronauts alya\": \"アストロノーツ・アリア\",\n        \"astronauts comet\": \"アストロノーツ・コメット\",\n        \"astronomy\": \"ASTRONOMY\",\n        \"asuken\": \"明日軒\",\n        \"asumo koubou\": \"あすも工房\",\n        \"asunaro\": \"ASUNARO\",\n        \"asunaro neat.\": \"Asunaro Neat.\",\n        \"at kenkyuujo\": \"AT研究所\",\n        \"at mousse\": \"あっとむーす\",\n        \"at simapan\": \"@SIMAPAN+\",\n        \"atarime jerky\": \"あたりめジャーキー\",\n        \"atariya kyoushitsu\": \"アタりや教室\",\n        \"atelier bord\": \"Atelier Bord\",\n        \"atelier comet\": \"アトリエコメット\",\n        \"atelier curlicue\": \"Atelier Curlicue\",\n        \"atelier dew\": \"Atelier:Dew\",\n        \"atelier honkijiru\": \"あとりえ本気汁\",\n        \"atelier kaguya cheshirecat\": \"アトリエかぐや CheshireCat\",\n        \"atelier kirara\": \"Atelier Kirara\",\n        \"atelier lepus\": \"あとりえれーぷす\",\n        \"atelier m\": \"アトリエM\",\n        \"atelier sava\": \"アトリエサヴァ\",\n        \"atelier tiv artworks\": \"atelier Tiv artworks\",\n        \"atelier yang\": \"あとりえ・ヤン\",\n        \"atelier-d\": \"atelier-D\",\n        \"atelierkk\": \"あとりえKK\",\n        \"ateliermarl\": \"AtelierMARL\",\n        \"atemonai heya\": \"あてもない部屋\",\n        \"atempo\": \"atempo\",\n        \"aterut\": \"アテレート\",\n        \"ather\": \"エーテル\",\n        \"atkinson\": \"アトキンソン\",\n        \"atmosphere\": \"アトモスフィア\",\n        \"ato nana fun\": \"あと7分\",\n        \"atolier tougenkyou\": \"アトリエ桃源郷\",\n        \"atori akinao\": \"あとり秋尚\",\n        \"atorie rinbou\": \"アトリエ リンボウ\",\n        \"atrip\": \"atrip\",\n        \"ats\": \"ATS\",\n        \"atsd\": \"atSD\",\n        \"atsuatsucook\": \"あつあつCOOK\",\n        \"atsugari giyuugun\": \"あつがり義勇軍\",\n        \"atsuki nettaiya\": \"アつき熱帯夜\",\n        \"attamaro\": \"あったまろ。\",\n        \"attic\": \"ATTIC\",\n        \"attic work space\": \"ATTIC WORK SPACE\",\n        \"au pied\": \"au pied\",\n        \"aug18\": \"aug18\",\n        \"aurelia\": \"オーレリア\",\n        \"auroramix\": \"オーロラミックス\",\n        \"auta moon\": \"あうたむーん\",\n        \"authoring heaven\": \"オーサリングヘヴン\",\n        \"autobahn\": \"Autobahn\",\n        \"automa kikyuu\": \"オートマ気球\",\n        \"autonoe\": \"Autonoe\",\n        \"autoroo\": \"あうとろー\",\n        \"av\": \"サークルAV\",\n        \"avalon\": \"Avalon\",\n        \"avantgarde\": \"AVANTGARDE\",\n        \"avion village\": \"アビオン村\",\n        \"avion village f\": \"アビオン村F\",\n        \"awatsu retsudou\": \"粟津烈堂\",\n        \"ax\": \"あっくす\",\n        \"axis\": \"AXIS\",\n        \"axl\": \"AXL\",\n        \"axolotl\": \"アホロートル\",\n        \"aya pon\": \"あやPON\",\n        \"ayafujii private circle\": \"藤井あや個人サークル\",\n        \"ayamegaoka\": \"文目ヶ丘\",\n        \"ayashige dan\": \"あやしげ団\",\n        \"ayashii ayakashi\": \"アヤシイアヤカシ\",\n        \"ayashii bochi\": \"あやしい墓地\",\n        \"ayashii thigh high ongakutai\": \"怪しいサイハイ音楽隊\",\n        \"ayashii yatsura\": \"あやしいやつら\",\n        \"ayasii hon-ya\": \"あやしい本屋\",\n        \"ayatsuri-doom\": \"​文釣DOOM\",\n        \"ayayabidou\": \"あややび堂\",\n        \"azarashi waltz\": \"あざらしワルツ\",\n        \"azarashisoft\": \"海豹社\",\n        \"azasuke wind\": \"AZASUKE WIND\",\n        \"azcat\": \"azcat\",\n        \"azelye\": \"AzeLye\",\n        \"azi dahaka\": \"アジダハーカ\",\n        \"azksb\": \"あずきそーば。\",\n        \"azmaya\": \"azmaya\",\n        \"aztec theater\": \"Aztec Theater\",\n        \"azuki land\": \"あづきらんど\",\n        \"azuki monaka\": \"あずきもなか\",\n        \"azuki shot\": \"AZUKI SHOT\",\n        \"azuki yougashiten\": \"小豆洋菓子店\",\n        \"azukimanma\": \"あずきまんま\",\n        \"azul\": \"Azul\",\n        \"azuma doujou\": \"東道場\",\n        \"azumaya matsukaze\": \"あずまや松風\",\n        \"azumaya shiten\": \"アズマ屋支店\",\n        \"azure\": \"Azure\",\n        \"azure bekkan\": \"あずれ別館\",\n        \"azure lapis\": \"あずーるらぴす\",\n        \"azurite\": \"Azurite\",\n        \"b kaiman\": \"Bカイマン\",\n        \"b side\": \"B:side\",\n        \"b-bishop\": \"B-bishop\",\n        \"b-crews\": \"Bクルーズ\",\n        \"b-dash jump\": \"B-Dash Jump\",\n        \"b-kyuu kasen\": \"B級河川\",\n        \"b-kyuu site\": \"B級サイト\",\n        \"b-led\": \"B-LED\",\n        \"b-wa\": \"B-wa\",\n        \"b.s.k\": \"B.S.K\",\n        \"b3\": \"B3\",\n        \"b5 doumei\": \"B5同盟\",\n        \"bababalunch\": \"バババランチ\",\n        \"baby replay\": \"ベイビーリプレイ\",\n        \"babybed\": \"ベビーベッド\",\n        \"babylook.net\": \"BabyLook\",\n        \"babymaker\": \"べびーめいかー\",\n        \"babypink\": \"ベイビーピンク\",\n        \"bacchustab\": \"BacchusTAB\",\n        \"backraze\": \"BACKRAZE\",\n        \"backyourluck\": \"ばっくゆあらっく\",\n        \"bad company\": \"ばっどかんぱにー\",\n        \"bad end rst\": \"ばっどえんどRST\",\n        \"bad friend\": \"BAD FRIEND\",\n        \"bad mushrooms\": \"坏茸社\",\n        \"badcore\": \"バッドコア\",\n        \"badis badis\": \"バジスバジス\",\n        \"baguri koubou\": \"馬栗工房\",\n        \"baguri sangyou\": \"馬栗産業\",\n        \"baidou tenpurya\": \"梅洞てんぷりゃー\",\n        \"baka to hasa me\": \"バカトハサミ\",\n        \"bakaitei\": \"馬隗亭\",\n        \"bakemonogakari\": \"ばけものがかり\",\n        \"bakuchi jinsei sp\": \"博打人生SP\",\n        \"bakugeki monkeys\": \"爆撃モンキース\",\n        \"bakuhatsu brs.\": \"ばくはつBRS.\",\n        \"bakuhatsu market\": \"爆発まーけっと\",\n        \"bakunyuu bitch sei\": \"爆乳ビッチ生\",\n        \"bakuretsu shichouson\": \"爆裂市町村\",\n        \"bakushiishi\": \"ばくしぃし\",\n        \"balklash.\": \"バルクラッシュ\",\n        \"banana king\": \"バナナキング\",\n        \"banana no kawa\": \"ばななのかわ\",\n        \"banana saruen\": \"ばななサル園\",\n        \"banana trip\": \"BANANAとりっぷ\",\n        \"bananajam\": \"ばななじゃむ\",\n        \"bananatart\": \"ばななたると\",\n        \"bananer milion\": \"ばななーみりおん\",\n        \"bandit\": \"BANDIT\",\n        \"bang\": \"banG\",\n        \"bangeya\": \"BANGEYA\",\n        \"bannoutumayoujiire\": \"バンノウツマヨウジイレ\",\n        \"banny pop\": \"BANNYぽっぷ\",\n        \"banri no syoujo\": \"万里の少女\",\n        \"bansanchi\": \"ばんさんち\",\n        \"bansankan\": \"バンサンカン\",\n        \"bantendou shoten\": \"卍天堂書店\",\n        \"banubeefriends\": \"BanubeeFriends\",\n        \"banyu\": \"万有\",\n        \"banyuu\": \"万有\",\n        \"baobabu\": \"ばおばぶ\",\n        \"bar modoshiyu\": \"BAR戻し湯\",\n        \"barbaroi no sato\": \"バルバロイの里\",\n        \"barista\": \"バリスタ\",\n        \"barko\": \"Barko\",\n        \"baroque\": \"baroQue\",\n        \"baroqupid\": \"BAROQUPID\",\n        \"bartholin sendan\": \"バルトリン船団\",\n        \"barusan\": \"バルサン\",\n        \"baseson light\": \"BaseSon Light\",\n        \"bash-inc\": \"Bash-inc\",\n        \"basic champions\": \"BASIC CHAMPIONS\",\n        \"basilisk trapezohedron\": \"バジリスクトラペゾヘドロン\",\n        \"baskindam kingdom\": \"バスキンダム王国\",\n        \"batachiki\": \"バタチキ\",\n        \"batchaya\": \"ばっちゃ屋\",\n        \"batsu freak\": \"Batsu freak\",\n        \"batsu jirushi\": \"ばつ印\",\n        \"batten sketch\": \"ばってんスケッチ\",\n        \"bb\": \"BB\",\n        \"bbb\": \"BBB\",\n        \"bbb-extra\": \"BBBえくすとら\",\n        \"bbg\": \"BBG\",\n        \"bbuttondash\": \"BBUTTONDASH\",\n        \"bear tail\": \"べあている\",\n        \"bear-bear\": \"BEAR-BEAR\",\n        \"bears cave\": \"Bear's Cave\",\n        \"beast trail\": \"Beast Trail\",\n        \"beat-pop\": \"BEAT-POP\",\n        \"beats beasts partners\": \"Beats Beasts Partners\",\n        \"beautiful snow\": \"Beautiful Snow\",\n        \"beberoncino sei\": \"ベベロンチーノ星\",\n        \"bect\": \"BECT\",\n        \"bee light\": \"BEe Light\",\n        \"beelzebub\": \"ベルゼブブ\",\n        \"beenyan\": \"び～にゃん\",\n        \"beer bear\": \"BEER BEAR\",\n        \"beer kuzu brothers\": \"ビールクズブラザーズ\",\n        \"behind moon\": \"Behind Moon\",\n        \"beicon\": \"ベイコン\",\n        \"beigon\": \"ベイゴン\",\n        \"bekkoame.\": \"べっこあめ。\",\n        \"bell no su\": \"ベルの巣\",\n        \"bell-da\": \"BELL-DA\",\n        \"belphegor no 39\": \"ベルフェゴールの39\",\n        \"beni\": \"紅-beni-\",\n        \"beni jake soran\": \"紅鮭ソーラン\",\n        \"benichigaya\": \"べにちが屋\",\n        \"benikurage\": \"べにくらげ\",\n        \"benisuzumedo\": \"紅雀堂\",\n        \"beraidot\": \"ベライドット\",\n        \"bergamot\": \"べるがもっと\",\n        \"bergmund\": \"ベルクムント\",\n        \"beropepe\": \"Beropepe\",\n        \"berry 16\": \"Berry!16\",\n        \"berry bagel\": \"BERRY BAGEL\",\n        \"berry lollipop\": \"Berry Lollipop\",\n        \"berserker\": \"バーサーカー\",\n        \"besshun-tei\": \"べっしゅん亭\",\n        \"bhm\": \"BHM\",\n        \"bias factory\": \"バイアスファクトリー\",\n        \"bibasuku\": \"BIBASUKU\",\n        \"bible\": \"ばいぶる\",\n        \"bicho bichodan\": \"びちょびちょ団\",\n        \"bickle\": \"びっくる\",\n        \"bicocattu\": \"Bicocattu\",\n        \"big boss\": \"BIG・BOSS\",\n        \"big gym\": \"BIG GYM\",\n        \"big mama\": \"ビッグママ\",\n        \"big mouse\": \"ビッグマウス\",\n        \"bigfoot no mori\": \"ビッグフットの森\",\n        \"bigwednesday\": \"BigWednesday\",\n        \"bikkuri gyouten\": \"びっくり仰天\",\n        \"bin1production\": \"Bin1production\",\n        \"binatsu\": \"びなつ\",\n        \"binbou noujou\": \"貧乏農場\",\n        \"binbou yusuri\": \"びんぼうゆすり\",\n        \"binbou yusuri express\": \"貧乏ゆすり超特急\",\n        \"bindmix\": \"BindMix\",\n        \"binmalo\": \"ビンマロ\",\n        \"binz studio\": \"Binz Studio\",\n        \"biophile\": \"Biophile\",\n        \"bird forest\": \"Bird Forest\",\n        \"bird joke\": \"バードジョーク\",\n        \"birobon\": \"ビロボン\",\n        \"biroon jr.\": \"びろーんJr.\",\n        \"biroudo kairou\": \"びろうど廻廊\",\n        \"biruban\": \"びるばん\",\n        \"bishamon\": \"びしゃもん。\",\n        \"bishoujo labo\": \"美少女ラボ\",\n        \"bishoujo netto\": \"美少女ネット\",\n        \"bishoujo suishin iinkai\": \"美少女推進委員会\",\n        \"bismarcho\": \"Bismarcho!\",\n        \"bistro mountain\": \"ビストロマウンテン\",\n        \"bitacos\": \"びっくりたこす\",\n        \"bite\": \"BITE\",\n        \"bitimaru\": \"びちまる\",\n        \"bitmap\": \"ビットマップ\",\n        \"bitmap power\": \"びとまぷぱわー\",\n        \"bitter crown\": \"ビタークラウン\",\n        \"bitter sweet\": \"BITTER SWEET\",\n        \"bitto\": \"∞Bitto\",\n        \"bizensiki roroppu\": \"備前式ロロップ\",\n        \"black and white\": \"Black and White\",\n        \"black angel\": \"ブラックエンゼル\",\n        \"black base\": \"BLACK★BASE\",\n        \"black box\": \"Black Box\",\n        \"black crusher\": \"ブラック・クラッシャー\",\n        \"black cyc\": \"ブラックサイク\",\n        \"black doctor\": \"BLACK DOCTOR\",\n        \"black factory\": \"Black Factory\",\n        \"black force\": \"BLACK FORCE\",\n        \"black light\": \"ブラックライト\",\n        \"black list\": \"Black List\",\n        \"black maria\": \"ブラックマリア\",\n        \"black megane kenkyuujo\": \"ブラックメガネ研究所\",\n        \"black moon\": \"ブラックムーン\",\n        \"black package\": \"ブラックパッケージ\",\n        \"black package try\": \"ブラックパッケージトライ\",\n        \"black panda\": \"BLACK PANDA\",\n        \"black pepper\": \"Black Pepper\",\n        \"black russian\": \"ぶらっく☆ルシアン\",\n        \"black sugar\": \"Black_Sugar(仮)\",\n        \"black thunder\": \"Black thunder\",\n        \"black vinegar\": \"ぶらっくびねがー\",\n        \"blackglobe\": \"BLACKGLOBE\",\n        \"blackrainbow\": \"BLACKRAINBOW\",\n        \"blackwing\": \"ブラックウィング\",\n        \"blade\": \"BLADE\",\n        \"blaze\": \"BLAZE\",\n        \"blazer one\": \"Blazer One\",\n        \"blessing fall\": \"Blessing Fall\",\n        \"blind alley\": \"Blind Alley\",\n        \"blink\": \"blink\",\n        \"blip\": \"BLIP\",\n        \"blitzkrieg\": \"ブリッツクリーク\",\n        \"blood plus blood\": \"ぶらっど+ぶらっど\",\n        \"blood temple\": \"BLOOD TEMPLE\",\n        \"bloodberry\": \"BloodBerry\",\n        \"bloodtype-b\": \"Bloodtype-B\",\n        \"bloody hawk\": \"ブラッディーホーク\",\n        \"bloom factory\": \"BLOOM FACTORY\",\n        \"blossom eight\": \"ブロッサムエイト\",\n        \"blossom sphere\": \"Blossom Sphere\",\n        \"blow\": \"BLOW\",\n        \"blue banana\": \"Blue Banana\",\n        \"blue blood\": \"ブルーブラッド\",\n        \"blue bloods\": \"BLUE BLOOD'S\",\n        \"blue blossom\": \"Blue Blossom\",\n        \"blue catty\": \"BLUE CATTY\",\n        \"blue colors nightmare\": \"ブルウカラアズナイトメア\",\n        \"blue cosmos\": \"BLUE COSMOS\",\n        \"blue crest\": \"Blue Crest\",\n        \"blue devil\": \"Blue Devil\",\n        \"blue drop\": \"Blue Drop\",\n        \"blue frill\": \"ブルーフリル\",\n        \"blue gale\": \"ブルーゲイル\",\n        \"blue gale light\": \"ブルゲLIGHT\",\n        \"blue garnet\": \"BLUE GARNET\",\n        \"blue killer\": \"blue killer\",\n        \"blue metal\": \"ブルーメタル\",\n        \"blue moon\": \"ブルームーン\",\n        \"blue percussion\": \"ブルー・パーカッション\",\n        \"blue shachi\": \"ブルーシャッチー\",\n        \"blue sheets\": \"ブルーシーツ\",\n        \"blue signals\": \"BLUE SIGNALS\",\n        \"blue soaproot\": \"Blue soaproot\",\n        \"blue spark\": \"BLUE★SPARK\",\n        \"blue stardust\": \"blue Stardust\",\n        \"blue topaz\": \"ぶるぅとぱぁず\",\n        \"blue trigger\": \"ブルートリガー\",\n        \"blue wave\": \"BLUE WAVE\",\n        \"blue wind\": \"blue wind\",\n        \"blue-noise\": \"BLUE-NOISE\",\n        \"blue24\": \"BLUE24\",\n        \"bluebrand\": \"BlueBrand\",\n        \"bluebullpen\": \"BlueBullPen\",\n        \"bluelagos\": \"Bluelagos\",\n        \"bluemage\": \"BlueMage\",\n        \"bluemonday\": \"BlueMonday\",\n        \"blueocean\": \"BlueOcean\",\n        \"blueversusred\": \"BlueVersusRed\",\n        \"blume\": \"BLUME\",\n        \"blz maniax\": \"BLZ Maniax\",\n        \"bm dan\": \"BM団\",\n        \"bobcaters\": \"BOBCATERS\",\n        \"bocchi island\": \"ぼっちアイランド\",\n        \"bocchi koubou\": \"ぼっち工房\",\n        \"bodley head\": \"BODLEY HEAD\",\n        \"bofubofu mat\": \"ぼふぼふマット\",\n        \"bohyadam\": \"ボヒャダム\",\n        \"bojorebon\": \"ボジョレボン\",\n        \"bokiya\": \"ぼき屋\",\n        \"bokki oniisan\": \"ぼっきおにいさん\",\n        \"boku\": \"撲\",\n        \"boku-hitori.\": \"ぼくひとり。\",\n        \"bokuhako\": \"BOKUHAKO\",\n        \"bokujin\": \"ボクジン\",\n        \"bokura\": \"ぼくら\",\n        \"bokura gosai\": \"ぼくらごさい\",\n        \"bokura no kajitsu\": \"ボクラノカジツ\",\n        \"bolze.\": \"bolze.\",\n        \"boma -born to be mild-\": \"ボマ！-Born to be Mild-\",\n        \"bon\": \"梵\",\n        \"bonanza\": \"ボナンザ\",\n        \"bonelessham\": \"ボンレスハム\",\n        \"bongaichinyon\": \"ぼんがいちにょん\",\n        \"bonnou honpo\": \"煩悩本舗\",\n        \"bonnou strategy\": \"煩悩ストラテジ\",\n        \"bonnou stream\": \"煩悩ストリーム\",\n        \"bonnoudou\": \"凡悩堂\",\n        \"bonsketch\": \"Bonsketch\",\n        \"boobookid\": \"ブーブーキッド\",\n        \"booch\": \"ぶーち\",\n        \"books takada\": \"BOOKSたかだ\",\n        \"boribiya\": \"ボリビ屋\",\n        \"boroboroya\": \"ぼろぼろ屋\",\n        \"boruboru\": \"ボルボる\",\n        \"borushiti teisyoku\": \"ぼるしち定食\",\n        \"bose no doujin manga kenkyuujo\": \"boseの同人漫画研究所\",\n        \"boshi soukan\": \"母子相姦\",\n        \"boston tea party\": \"ボストン茶会\",\n        \"botamochi no utage\": \"ぼたもちの宴\",\n        \"botanzakura\": \"牡丹桜\",\n        \"botibotiikoka\": \"ぼちぼちいこか\",\n        \"botsuraku kizoku\": \"没落貴族\",\n        \"bottle syrup\": \"ボトルシロップ\",\n        \"bottomress pit\": \"Bottomress Pit\",\n        \"bourgeois ice cream\": \"ブルジョワアイスクリーム\",\n        \"bousou fuhatsudan\": \"暴走！！不発団\",\n        \"bouzen meiden r\": \"呆然乙女R\",\n        \"box\": \"■BOX■\",\n        \"box doll\": \"BOX DOLL\",\n        \"boxbear\": \"BoxBear\",\n        \"boyari.\": \"ぼやり。\",\n        \"boyishsuky\": \"BOYISHSUKY\",\n        \"boys be gakuen\": \"ぼーいずびぃ学園\",\n        \"boys musume.\": \"ボーイズ娘。\",\n        \"bp88\": \"BP88\",\n        \"bpm12\": \"bpm12\",\n        \"bq\": \"BQ\",\n        \"brabustersystem\": \"BraBusterSystem\",\n        \"brand new way\": \"Brand New Way\",\n        \"brand nyu\": \"brand nyu\",\n        \"brave chicken\": \"ぶれいぶちきん\",\n        \"bread and cake\": \"パンとケーキ\",\n        \"bread bread\": \"Bread Bread\",\n        \"breath2\": \"BREATH2\",\n        \"breeze\": \"BREEZE\",\n        \"brief case\": \"Brief case\",\n        \"briest\": \"BRIEST\",\n        \"brilliant thunder\": \"brilliant thunder\",\n        \"bringles\": \"ブリんぐるズ\",\n        \"brio\": \"BRIO\",\n        \"britanian\": \"ぶりたにあん\",\n        \"broad smile\": \"Broad smile\",\n        \"broken world\": \"Broken World\",\n        \"bronco hitoritabi\": \"ブロンコ一人旅\",\n        \"bronze age\": \"BRONZE AGE\",\n        \"brown bunny\": \"BROWNBUNNY\",\n        \"brown sugar\": \"Brown sugar\",\n        \"brownie\": \"ブラウニー\",\n        \"brownstone\": \"brownstone\",\n        \"bubble company\": \"バブルカンパニー\",\n        \"bubble fruit\": \"バブルフルーツ\",\n        \"budou bekkan\": \"ブドウ別館\",\n        \"budou nouen\": \"ぶどう農園\",\n        \"buggeman factory\": \"ブギーマンファクトリー\",\n        \"build-tetsu\": \"ビルドテツ\",\n        \"buji kore ameba\": \"無事これアメーバ\",\n        \"buki to bougu no mise\": \"ぶきとぼうぐのみせ\",\n        \"bullet ballet\": \"Bullet Ballet\",\n        \"bumsign\": \"BUMSIGN\",\n        \"bunbonian\": \"ぶんぼにあん\",\n        \"bunbukudou\": \"ぶんぶく堂\",\n        \"bunchindoh\": \"ぶんちん堂\",\n        \"bungalow\": \"バンガロゥ\",\n        \"bunmei kaika\": \"文明快化\",\n        \"buppa studio\": \"ブッパスタジオ\",\n        \"burakuradou\": \"ブラクラ堂\",\n        \"buranko shinshi\": \"ブランコ紳士\",\n        \"buri daikon\": \"ぶり大根\",\n        \"buriburi nyanya\": \"ぶりぶりにゃにゃ\",\n        \"buriki daiou\": \"武力大王\",\n        \"burikichoco\": \"ブリキチョコ\",\n        \"burisuta\": \"ブリスタ\",\n        \"burning hammer\": \"バーニングハンマー\",\n        \"burning sisters\": \"バーニング姉妹\",\n        \"burning soul\": \"バーニンソウル\",\n        \"bushi\": \"節\",\n        \"bushiteki tamashii\": \"武士的魂\",\n        \"busou megami\": \"武装女神\",\n        \"busou yousei\": \"武装妖精\",\n        \"bust emperor\": \"バストエンペラル\",\n        \"buta no bucket\": \"豚のバケツ\",\n        \"buta no hidume\": \"ぶたのひづめ\",\n        \"butagoya dot com\": \"豚小屋.com\",\n        \"butano\": \"ぶたの\",\n        \"butazuraya seinikuten\": \"豚面屋精肉店\",\n        \"butsuri hansha club\": \"物理反射倶楽部\",\n        \"butter cookie\": \"ばたあくっきい\",\n        \"butterfly dream\": \"Butterfly Dream\",\n        \"buttyakedo\": \"ぶっちゃけ堂\",\n        \"buzzer\": \"BUZZER\",\n        \"bv31.5\": \"BV31.5\",\n        \"bye-be\": \"Bye-Be\",\n        \"byougatei\": \"猫画亭\",\n        \"byunbyunhouse\": \"びゅんびゅんはうす\",\n        \"c equal\": \"C=equal\",\n        \"c-arts\": \"C-ARTS\",\n        \"c-company\": \"C-COMPANY\",\n        \"c-line\": \"C-線上\",\n        \"c-rex\": \"C-Rex\",\n        \"c-type\": \"C-type\",\n        \"c.\": \"C.\",\n        \"c.a.t\": \"C・A・T\",\n        \"c.cpu\": \"C.CPU\",\n        \"c.h.a.r.i.o.t\": \"C.H.A.R.I.O.T\",\n        \"c.m.\": \"C.M.\",\n        \"c.n.p\": \"C.N.P\",\n        \"c.o.2\": \"C.O.2\",\n        \"c.r.c\": \"C・R・C\",\n        \"c.s.\": \"C.S.\",\n        \"c.www\": \"C.www\",\n        \"c.y.room\": \"C.Y.roOm\",\n        \"c3h8o3\": \"C3H8O3\",\n        \"c8\": \"C8\",\n        \"c9sou\": \"c9sou\",\n        \"ca.d.d\": \"C：／／A.D.D／\",\n        \"cabbage box\": \"キャベツBOX\",\n        \"cabbage soft\": \"きゃべつそふと\",\n        \"cabbit\": \"Cabbit\",\n        \"caburibbon\": \"caburibbon\",\n        \"cacao\": \"カカオ\",\n        \"cactus\": \"Cactus\",\n        \"cafe atagawa\": \"カフェあたがわ\",\n        \"cafe unlimited\": \"カフェ・アンリミテッド\",\n        \"cafe-hotcocoa.\": \"cafe-hotcocoa.\",\n        \"cafeteria watermelon\": \"カフェテリアWATERMELON\",\n        \"caffeine\": \"Caffeine\",\n        \"cage\": \"CAGE\",\n        \"cahlacahla\": \"CAHLACAHLA\",\n        \"caipirinha\": \"caipirinha\",\n        \"cake maker\": \"cake maker\",\n        \"cake-hitokire\": \"ケーキひと切れ\",\n        \"caligula\": \"カリギュラ\",\n        \"calmblue\": \"CalmBlue\",\n        \"calmboy.com\": \"カームボーイドットコム\",\n        \"calme\": \"calme\",\n        \"calorie off\": \"カロリーオフ\",\n        \"calpara-shed\": \"calpara-shed\",\n        \"calpis koubou\": \"カルピス工房\",\n        \"cambropachycope\": \"カンブロパキコーペ\",\n        \"camp.\": \"カンプ。\",\n        \"campanula\": \"campanula\",\n        \"campers\": \"きゃんぱーず\",\n        \"camrism\": \"カムリズム\",\n        \"can do now\": \"キャンドゥーなう!\",\n        \"canaria\": \"canaria\",\n        \"canary to tsubame\": \"カナリアとつばめ\",\n        \"candy pop\": \"Candy Pop\",\n        \"candy-ya\": \"キャンディー屋\",\n        \"candyman\": \"Candyman\",\n        \"canopus\": \"Canopus\",\n        \"canzume quality\": \"かんづめクオリティ\",\n        \"cao\": \"CaO\",\n        \"capital one\": \"きゃぴたるわん\",\n        \"caplet0.5\": \"caplet0.5\",\n        \"captain santa\": \"Captain SANTA\",\n        \"caramel colors\": \"カラメルシキソ\",\n        \"caramel mamire\": \"カラメルマミレ\",\n        \"caramel soft\": \"キャラメルソフト\",\n        \"caramel yarou\": \"キャラメル野郎\",\n        \"carbonate\": \"carbonate\",\n        \"carburetor\": \"キャブレター\",\n        \"carnage engine\": \"カルネージエンジン\",\n        \"carnelian\": \"CARNELIAN\",\n        \"carnevale9\": \"CARNEVALE9\",\n        \"carol works\": \"Carol Works\",\n        \"carpaccio\": \"カルパッチョ\",\n        \"carrot\": \"きゃろっと\",\n        \"carrot academy\": \"キャロットアカデミー\",\n        \"carrot caramel batake\": \"きゃろっときゃらめる畑\",\n        \"carrot works\": \"きゃろっとワークス\",\n        \"caryo\": \"CARYO\",\n        \"cascade\": \"CASCADE\",\n        \"casket\": \"Casket\",\n        \"casmania\": \"CASMANIA\",\n        \"cassis\": \"CassiS\",\n        \"castella tamago\": \"カステラたまご\",\n        \"castle.m\": \"castle.m\",\n        \"cat and me\": \"Cat&me\",\n        \"cat food\": \"Cat FooD\",\n        \"cat run\": \"Cat Run\",\n        \"cat scratch\": \"CAT scratch\",\n        \"cat tower\": \"きゃっと★たわぁー\",\n        \"catastrophe.\": \"catastrophe.\",\n        \"catcher in the rye\": \"Catcher in the Rye\",\n        \"catchers mitt of silver\": \"銀のキャッチャーミット\",\n        \"catjellyfish\": \"CatJellyFish\",\n        \"catmask\": \"catmask\",\n        \"cats-box\": \"cats-box\",\n        \"cattleya\": \"CATTLEYA\",\n        \"catwalknero\": \"catwalkNERO\",\n        \"cauldron\": \"Cauldron\",\n        \"causciant\": \"かうすしあん\",\n        \"caution\": \"かうじょん\",\n        \"caza mayor\": \"CAZA MAYOR\",\n        \"cc\": \"cc\",\n        \"ccb-elo\": \"ccb-ELO\",\n        \"cdd\": \"CDD\",\n        \"cdpa\": \"CDPA\",\n        \"cecile fan club\": \"セシールファン倶楽部\",\n        \"celeste69\": \"チェレステロック\",\n        \"celica\": \"CELICA\",\n        \"celluloid brothers\": \"セルロイド・ブラザーズ\",\n        \"celluloid-acme\": \"CELLULOID-ACME\",\n        \"celsius\": \"Celsius\",\n        \"cemetery\": \"CEMETERY\",\n        \"censored\": \"censored\",\n        \"cent millibar\": \"¢mb\",\n        \"centaurea cyanus\": \"Centaurea cyanus\",\n        \"center of universe\": \"Center Of Universe\",\n        \"center.village\": \"CENTER.VILLAGE\",\n        \"ceramic heart\": \"セラミックハート\",\n        \"ceremonica\": \"ceremonica\",\n        \"cesalion\": \"シザリオン\",\n        \"cesium-p\": \"セシウムP\",\n        \"cha cha cha brothers\": \"ちゃちゃちゃぶらざーず\",\n        \"chabanchabancha\": \"茶番茶番茶\",\n        \"chabane ninja\": \"ちゃばねにんじゃ\",\n        \"chacha batake.\": \"茶々畑。\",\n        \"chahan\": \"ちゃーはん\",\n        \"chaihazuki\": \"チャイハヅキ\",\n        \"chain reaction\": \"チェーン リアクション\",\n        \"chaingang\": \"CHAINGANG\",\n        \"chakku hankai\": \"チャック半開\",\n        \"chakui\": \"着衣\",\n        \"champagnegold\": \"シャンパンゴールド\",\n        \"champloo\": \"ちゃんぷるー\",\n        \"chandora\": \"ちゃんどら\",\n        \"chanko nabe\": \"ちゃんこ鍋\",\n        \"channel ubai\": \"チャンネル奪\",\n        \"chanpurux\": \"チャンプルX\",\n        \"chantilly\": \"chantilly\",\n        \"chaoizum\": \"ちゃおいずむ\",\n        \"chaos shoujo no mise\": \"カオス少女の店\",\n        \"chaos-graphixxx\": \"chaos-graphixxx\",\n        \"chaos-l\": \"CHAOS-L\",\n        \"chaotic otome studio\": \"カオティック乙女工房\",\n        \"chaotic wolf\": \"Chaotic Wolf\",\n        \"chapedizo\": \"ちゃぺでぃぞ\",\n        \"chaps\": \"チャップス\",\n        \"charan poran\": \"CHARAN PORAN\",\n        \"charinko fox\": \"チャリンコ狐\",\n        \"charis\": \"CHARIS\",\n        \"charisma serve\": \"カリスマサーブ\",\n        \"charme\": \"Charme\",\n        \"charveltiger\": \"シャーベルタイガー\",\n        \"chateau dassault\": \"シャトーダッソー\",\n        \"cheapseek\": \"cheapseek\",\n        \"check mate\": \"Check Mate!\",\n        \"cheese company\": \"チーズカンパニー\",\n        \"cheese takoyaki\": \"チーズたこ焼き\",\n        \"chelsea lip\": \"Chelsea lip\",\n        \"chemi-story\": \"Chemi-Story\",\n        \"chemical itoh\": \"ケミカル伊藤\",\n        \"chemical janky\": \"Chemical Janky\",\n        \"cherokee\": \"CHEROKEE\",\n        \"cherry baron\": \"cherry baron\",\n        \"cherry blossom\": \"チェリーブロッサム\",\n        \"cherry bomb g\": \"チェリーボムG\",\n        \"cherry milk\": \"cherry milk\",\n        \"cherry moon\": \"チェリームーン\",\n        \"cherry pepper\": \"cherry*pepper\",\n        \"cherry snow\": \"ちぇり☆すの\",\n        \"cherry soft\": \"ちぇりーそふと\",\n        \"chest box\": \"ちぇすとぼっくす\",\n        \"chested\": \"chested\",\n        \"chestnut tree\": \"chestnut tree\",\n        \"chibineco honpo\": \"ちびねこ本舗\",\n        \"chicchi bokujou\": \"チッチ牧場\",\n        \"chichai mono club\": \"ちっちゃい物クラブ\",\n        \"chichi mafia\": \"乳マフィア\",\n        \"chichikemo\": \"ちちけも\",\n        \"chick tack bon\": \"ちくたくぼん\",\n        \"chicken nugget gyuuniku aji\": \"チキンナゲット牛肉味\",\n        \"chicken union\": \"ちきんゆにおん\",\n        \"chicken zombies\": \"chicken zombies\",\n        \"chicropokke\": \"チクロポッケ\",\n        \"chideji\": \"チデヂ\",\n        \"chidoriashi\": \"千鳥足\",\n        \"chiduru grind\": \"チヅルグラインド\",\n        \"chie no genseki\": \"知恵の原石\",\n        \"chien\": \"シアン\",\n        \"chiffon\": \"Chiffon\",\n        \"chigen torino\": \"違んTORINO\",\n        \"chigiri-ke\": \"ちぎり家\",\n        \"chigo dou\": \"チーゴ堂\",\n        \"chigoku no icchoume\": \"痴獄の一丁目\",\n        \"chiguraya\": \"ちぐら屋\",\n        \"chigusaya\": \"千草屋\",\n        \"chihagura\": \"ちはぐら\",\n        \"chihiro lanting\": \"千仞蘭庭\",\n        \"chii sanchi\": \"ちい産地\",\n        \"chiisana kagi\": \"小さな鍵\",\n        \"chika kenkyuujo\": \"地下研究所\",\n        \"chikadoh\": \"地下堂\",\n        \"chikashitsu\": \"地下室\",\n        \"chikirazu\": \"チキラーズ\",\n        \"chikiuya\": \"ちきう屋\",\n        \"chiko goya\": \"Limited\",\n        \"chikoku doumei\": \"遅刻同盟\",\n        \"chikoku penpen\": \"遅刻ペンペン\",\n        \"chikomayoya\": \"ちこまよや\",\n        \"chikotsu mania\": \"恥骨マニア\",\n        \"chikutakudoh\": \"ちくたく堂\",\n        \"chikuwa\": \"ちくわ\",\n        \"chikuwa drop\": \"ちくわドロップ\",\n        \"chikuwanko\": \"ちくわんこ\",\n        \"chikuwano kimochi\": \"ちくわの気持ち\",\n        \"childwife\": \"childwife\",\n        \"chill-out\": \"Chill-Out\",\n        \"chilukuni\": \"散る国\",\n        \"chimamire yashiki\": \"血まみれ屋敷\",\n        \"chimatsuriya honpo\": \"血祭屋本舗\",\n        \"chime\": \"ちゃいむ\",\n        \"chimeishou\": \"致命傷\",\n        \"chimere marie\": \"chimere/marie\",\n        \"chimple hotters\": \"チンプルホッターズ\",\n        \"chimple island\": \"チンプル愛☆ランド\",\n        \"chimuya\": \"ちむ屋\",\n        \"chin soudou\": \"珍騒動\",\n        \"chin-up\": \"CHIN-UP\",\n        \"chinasanchi\": \"ちゃいなさんち\",\n        \"chinchintei\": \"ちんちん亭\",\n        \"chinjuu mufy\": \"珍獣ムフィ\",\n        \"chinpudo\": \"珍譜堂\",\n        \"chinshieden\": \"靜雪殿\",\n        \"chinzuri bop\": \"Chinzuri Bop\",\n        \"chips\": \"CHIPS\",\n        \"chiriakuta\": \"塵芥\",\n        \"chirigami goya\": \"ちり紙小屋\",\n        \"chirimen studio\": \"ちりめんすたじお\",\n        \"chirimenjako\": \"ちり綿じゃこ\",\n        \"chirimozuku cha\": \"チリモズク茶\",\n        \"chidorinu\": \"チドリヌ\",\n        \"chirorura\": \"ちろるら\",\n        \"chise\": \"千世\",\n        \"chiukorone\": \"ちうころね\",\n        \"chizakiya\": \"ちざき屋\",\n        \"chloroplast\": \"くろろぷらすと\",\n        \"cho-jin hakaba\": \"超人墓場\",\n        \"choco biscuits\": \"ちょこ★びすけっつ\",\n        \"choco box\": \"choco BOX\",\n        \"choco croissant\": \"チョコクロワッサン\",\n        \"choco zakura\": \"ちょこざくら\",\n        \"choco-banana\": \"ちょこばなな。\",\n        \"chocobits\": \"Chocobits\",\n        \"chococroissants\": \"チョコクロワッサン\",\n        \"chocoholic\": \"chocoholic\",\n        \"chocolat\": \"しょこら～と!\",\n        \"chocolate addiction\": \"Chocolate Addiction\",\n        \"chocolate banana ou lait\": \"ちょこれーとバナナ・オレ\",\n        \"chocolate jam\": \"ちょこれぃとじゃむ\",\n        \"chocolate lily\": \"ちょこりり\",\n        \"chocolate lv.5\": \"chocolate Lv.5\",\n        \"chocolate macaron\": \"チョコレートマカロン\",\n        \"chocolate pepper.\": \"Chocolate Pepper.\",\n        \"chocolate shop\": \"チョコレート・ショップ\",\n        \"chocomoka\": \"ちょこもか\",\n        \"chocotan mogumogu\": \"チョコタンもぐもぐ\",\n        \"chokie\": \"chokie\",\n        \"chokomonetto\": \"ちょこもねっと\",\n        \"chokudoukan\": \"直道館\",\n        \"chokusen ikki\": \"直線一気\",\n        \"chonmage teikoku\": \"丁髷帝国\",\n        \"chori\": \"chori\",\n        \"chotto dake yanke\": \"ちょっとだけやんけ\",\n        \"chotto h gallery\": \"ちょっとHギャラリー\",\n        \"chou a la creme\": \"chou à la crème\",\n        \"chou chemical gakuen z\": \"超ケミカル学園Z\",\n        \"chou mm bekkan\": \"超MM別館\",\n        \"chou project\": \"超プロジェクト\",\n        \"chou the taizenkutsu\": \"超THE体前屈\",\n        \"chou yutori kyouiku\": \"超ゆとり教育\",\n        \"choukyori dandou keisan\": \"长距离弹道计算\",\n        \"choushizen kenkyuujo\": \"超自然研究所\",\n        \"christmas\": \"クリスマス\",\n        \"chroma of wall\": \"壁の彩度\",\n        \"chromaticclip\": \"ChromaticClip\",\n        \"chronicle\": \"くろにくる\",\n        \"chrono mail\": \"クロノ・メール\",\n        \"chrronix\": \"Chrronix\",\n        \"chukara coffee\": \"中辛珈琲\",\n        \"chunhaikan\": \"中海館\",\n        \"chupa chupa ya\": \"ちゅぱちゅぱ屋\",\n        \"chuu ni no kaori\": \"中二のかおり\",\n        \"chuugakukan\": \"中学館\",\n        \"chuuka hanten\": \"ちゅうか飯店\",\n        \"chuuka mantou\": \"中華饅頭\",\n        \"chuuni byoutou\": \"厨二病棟\",\n        \"chuusei mafuman\": \"中性まふまん♀\",\n        \"chuutohanpa man\": \"中途半端マン\",\n        \"ciaociao\": \"ciaociao\",\n        \"cicada\": \"CICADA\",\n        \"ciel\": \"Ciel\",\n        \"cinderella complex\": \"Cinderella Complex\",\n        \"cinnamon cigar\": \"Cinnamon Cigar\",\n        \"cior\": \"Cior\",\n        \"cipher\": \"裁羽\",\n        \"circle 1 gou\": \"サークル1号\",\n        \"circle a\": \"Circle A\",\n        \"anastasia\": \"Anastasia\",\n        \"circle anco\": \"サークルアンコ\",\n        \"circle b.c.a.\": \"サークルB.C.A.\",\n        \"circle baku\": \"サークル獏\",\n        \"circle bob\": \"サークルボブ\",\n        \"circle credit\": \"サークルくれじっと\",\n        \"circle daiinma\": \"サークル大淫魔\",\n        \"circle damesimai\": \"サークル駄目姉妹\",\n        \"circle dare\": \"サークル誰?\",\n        \"circle energy\": \"サークルENERGY\",\n        \"circle enzin\": \"サークルENZIN\",\n        \"circle fairy flower\": \"サークル☆フェアリーフラワー\",\n        \"circle foundation\": \"CIRCLE FOUNDATION\",\n        \"circle ggm\": \"サークルGGM\",\n        \"circle hcm\": \"サークルHCM\",\n        \"circle hitori\": \"サークルひとり\",\n        \"circle huxian\": \"サークル狐仙\",\n        \"circle itaku\": \"サークルイタク\",\n        \"circle itomagoi\": \"サークル暇乞い\",\n        \"circle iwaodou\": \"サークル岩尾堂\",\n        \"circle kgb\": \"サークルKGB\",\n        \"circle king\": \"サークルきんぐ\",\n        \"circle kotatubuton\": \"サークルこたつぶとん\",\n        \"circle meimitei\": \"サークル冥魅亭\",\n        \"circle msm\": \"サークルMSM\",\n        \"circle nekome\": \"サークルねこめ\",\n        \"circle nnn\": \"サークルN･N･N\",\n        \"circle nuruma-ya\": \"サークルぬるま屋\",\n        \"circle of kenkyo\": \"サークルオブ謙虚\",\n        \"circle op\": \"circle OP\",\n        \"circle outerworld\": \"サークルOUTER WORLD\",\n        \"circle plum\": \"サークルぷらむ\",\n        \"circle rachigai\": \"サークル埒外\",\n        \"circle rindou\": \"さーくるりんどー\",\n        \"circle shakunetsu\": \"サークル灼熱\",\n        \"circle sigma\": \"Circle Σ\",\n        \"circle six\": \"circle six\",\n        \"slave\": \"SLAVE\",\n        \"circle spice\": \"さーくるスパイス\",\n        \"circle streak\": \"CIRCLE STREAK\",\n        \"tintin\": \"TinTin\",\n        \"circle trident\": \"Circle Trident\",\n        \"circle yaranaika\": \"サークルやらないか\",\n        \"circle yubokumin\": \"サークル遊牧民\",\n        \"circle yuki\": \"サークルゆき\",\n        \"circle den\": \"田\",\n        \"circled 1\": \"①\",\n        \"circus\": \"サーカス\",\n        \"circus fetish\": \"サーカス・フェティッシュ\",\n        \"citron\": \"CITRON\",\n        \"citron love\": \"CITRON LOVE\",\n        \"citron tree\": \"citron tree\",\n        \"citrus\": \"Citrus\",\n        \"city forest\": \"City Forest\",\n        \"ciz\": \"CIZ!!\",\n        \"cla cla clala\": \"Cla Cla Clala\",\n        \"clammbon\": \"クラムボン\",\n        \"clara soap\": \"クララソープ\",\n        \"classic orange\": \"Classic Orange\",\n        \"cle2700\": \"cle2700\",\n        \"clean up\": \"CLEAN UP\",\n        \"cleanliness.\": \"cleanliness\",\n        \"clear glass\": \"Clear Glass\",\n        \"clearbook\": \"ClearBook\",\n        \"clione house\": \"くりおねハウス\",\n        \"clip\": \"くりっぷ\",\n        \"clipline\": \"クリップライン\",\n        \"clipper\": \"CLiPPER\",\n        \"clock\": \"CLOCK\",\n        \"clodia\": \"CLODIA\",\n        \"close heart\": \"CLOSE HEART\",\n        \"cloud nine\": \"雲9\",\n        \"cloud noise\": \"クラウドノイズ\",\n        \"cloud palette\": \"Cloud Palette\",\n        \"cloudair\": \"cloudair\",\n        \"cloudy\": \"くらうでぃ\",\n        \"clover\": \"CLOVER\",\n        \"clover kai\": \"くろーヴァー会\",\n        \"clownculture\": \"ClownCulture\",\n        \"club bacteria\": \"クラブ・バクテリア\",\n        \"club dark-shadow\": \"CLUB Dark-Shadow\",\n        \"club-z\": \"CLUB-Z\",\n        \"club54\": \"club54\",\n        \"clubmatt\": \"clubmatt\",\n        \"cluster\": \"くらすたぁ\",\n        \"clutch shot king\": \"CLUTCH SHOT KING\",\n        \"clymenia\": \"クリメニア\",\n        \"cnc\": \"CNC\",\n        \"cobrano\": \"こぶらの\",\n        \"coburamenman\": \"コブラーメンマン\",\n        \"cocca\": \"cocca\",\n        \"coccinelle\": \"coccinelle\",\n        \"cock-a-doodle-doo\": \"Cock-a-Doodle-Doo\",\n        \"cocktail soft\": \"カクテル・ソフト\",\n        \"coco\": \"COCO\",\n        \"cocoa break\": \"COCOA BREAK\",\n        \"cocoloco note\": \"CoCoLoCo☆Note\",\n        \"cocon\": \"cocon!\",\n        \"coconutbless\": \"ココナッツブレス\",\n        \"cocoon\": \"cocoon\",\n        \"cocotto\": \"cocotto\",\n        \"cocytusgarden\": \"CocytusGarden\",\n        \"codeine girl\": \"コデインガール\",\n        \"coffee chazuke\": \"珈琲茶漬け\",\n        \"coffee curry\": \"コーヒーカレー\",\n        \"coffee maker\": \"こーひーめーかー\",\n        \"cokot\": \"cokot\",\n        \"cola bolt\": \"コーラーボルト\",\n        \"colette\": \"Colette\",\n        \"coli-chu\": \"coli厨\",\n        \"colobocs\": \"CoLoBoCs\",\n        \"color art\": \"Color art\",\n        \"color hiyoko dousoukai\": \"カラーひよこ同窓会\",\n        \"color-staining\": \"COLOR-STAINING\",\n        \"colosseum\": \"コロセウム\",\n        \"colour and shape\": \"からーあんどしぇいぷ\",\n        \"colt\": \"Colt\",\n        \"colt-run\": \"こるとらん\",\n        \"combat mon-mon\": \"コンバットモンモン\",\n        \"comic empire\": \"コミックエンパイア\",\n        \"comic kingdom\": \"コミックキングダム\",\n        \"command plus z\": \"Command+Z\",\n        \"commanding eagle\": \"Commanding Eagle\",\n        \"commando\": \"コマンドー\",\n        \"commelina\": \"Commelina\",\n        \"comomo\": \"COMOMO\",\n        \"compact software\": \"Compact Software\",\n        \"complete box\": \"コンプリートボックス\",\n        \"complets\": \"コンプリーツ\",\n        \"complex\": \"COMPLEX\",\n        \"concerto\": \"コンチェルト\",\n        \"concrete river\": \"CONCRETE RIVER\",\n        \"coneco house\": \"こねこはうすー\",\n        \"confiture soft\": \"コンフィチュールソフト\",\n        \"consava\": \"こんさば\",\n        \"contamination\": \"こんたみねーしょん\",\n        \"convallo-stick\": \"Convallo-stick\",\n        \"cool brain\": \"COOL BRAIN\",\n        \"cool kyou dai san shibu\": \"クール教第三支部\",\n        \"cool palace\": \"Cool Palace\",\n        \"cool sister\": \"く～るシスター\",\n        \"coolheadwarmheart\": \"CoolHeadWarmHeart\",\n        \"coonelius\": \"くーねりあす\",\n        \"coopy\": \"coopy\",\n        \"copen\": \"こぺん\",\n        \"copin\": \"Copin\",\n        \"copo deluxe\": \"こぽDELUXE\",\n        \"coral reef\": \"コーラルリーフ\",\n        \"corkbox\": \"コルクBOX\",\n        \"coronach\": \"カラナック\",\n        \"cosmic cute\": \"COSMIC CUTE\",\n        \"cothurnus\": \"Cothurnus\",\n        \"cotojikan\": \"琴慈館\",\n        \"cottage\": \"cottage\",\n        \"cotton candy\": \"Cotton Candy\",\n        \"cotton color\": \"コットンカラー\",\n        \"cotton house\": \"こっとん堂\",\n        \"cotton pop\": \"Cotton Pop\",\n        \"cottontail\": \"cottontail\",\n        \"countack\": \"カウンタック\",\n        \"counter attack\": \"COUNTER ATTACK\",\n        \"counter-censorship\": \"COUNTER-CENSORSHIP\",\n        \"counterparts\": \"COUNTERPARTS\",\n        \"countryside\": \"countryside\",\n        \"courmet-nyankichi\": \"くるめにゃん吉\",\n        \"courreges accel\": \"クレージュアクセル\",\n        \"covare\": \"covare\",\n        \"cow lipid\": \"Cow Lipid\",\n        \"cozybowl\": \"cozybowl\",\n        \"cpi\": \"cpi\",\n        \"craft\": \"CRAFT\",\n        \"craft-gear\": \"CRAFT-GEAR\",\n        \"craftworks\": \"CraftWorks\",\n        \"crank.in\": \"クランク・イン\",\n        \"crash tv\": \"CRASH TV\",\n        \"crayon arts\": \"くれよんあーつ\",\n        \"crayon48\": \"くれよん48\",\n        \"crazy alicetale\": \"Crazy Alicetale\",\n        \"crazy clover club\": \"CRAZY CLOVER CLUB\",\n        \"crazy comedian\": \"クレイジーコメディアン\",\n        \"crazyregion\": \"crazyregion\",\n        \"crea-holic\": \"Crea-Holic\",\n        \"cream cider\": \"くりぃむサイダー\",\n        \"cream gallon\": \"くりーむがろん\",\n        \"cream zenzai\": \"くりいむぜんざい\",\n        \"creamy cafe\": \"Creamy Cafe\",\n        \"crear mint\": \"CREAR★MINT\",\n        \"crepe\": \"Crepe\",\n        \"crimson\": \"クリムゾン\",\n        \"crimson crown\": \"Crimson CROWN\",\n        \"crimson ground\": \"CRIMSON GROUND\",\n        \"crimson kantai\": \"クリムゾン艦隊\",\n        \"crips\": \"Crips\",\n        \"critical hit\": \"くりてぃかるひぅと\",\n        \"crocodile-ave.\": \"CROCODILE-Ave.\",\n        \"cronus\": \"Cronus\",\n        \"crooked navel\": \"Crooked Navel\",\n        \"cross down\": \"CROSS DOWN\",\n        \"cross fire\": \"CROSS FIRE\",\n        \"cross hearts\": \"CROSS HEARTS\",\n        \"cross place\": \"CROSS PLACE\",\n        \"cross talk\": \"Cross Talk\",\n        \"cross-do\": \"黒酢堂\",\n        \"crossco switch\": \"くろすこスイッチ\",\n        \"crossnet\": \"クロスネット\",\n        \"crossover\": \"CROSSOVER\",\n        \"crossray\": \"crossray\",\n        \"crotch\": \"Crotch\",\n        \"crowclock\": \"crowclock\",\n        \"crown brigade\": \"CROWN BRIGADE\",\n        \"crowview\": \"CrowView\",\n        \"cryptid\": \"cryptid\",\n        \"crystal capricorn\": \"Crystal Capricorn\",\n        \"crystal shoujo\": \"クリスタル少女\",\n        \"crystal strawberry\": \"硝子の苺\",\n        \"crystal tower\": \"クリスタルタワー\",\n        \"crystalia\": \"CRYSTALiA\",\n        \"cshouse\": \"しーずはうす\",\n        \"ctn\": \"クリスチーネ\",\n        \"cube sugar\": \"Cube Sugar\",\n        \"cubic\": \"Cubic\",\n        \"cuffs\": \"Cuffs\",\n        \"cuniculus\": \"CUNICULUS\",\n        \"cupi\": \"キュピ\",\n        \"cupid ice\": \"キューピッドアイス\",\n        \"curefull base\": \"Curefull Base\",\n        \"curiocity\": \"Curiocity\",\n        \"current storage\": \"Current Storage\",\n        \"cursor\": \"カーソル\",\n        \"curtain wall no ie\": \"カーテンウォールの家\",\n        \"custardragon\": \"Custardragon\",\n        \"custom\": \"くすとむ\",\n        \"cut a dash\": \"CUT A DASH!!\",\n        \"cut works publishing\": \"Cut Works Publishing\",\n        \"cute\": \"Cute\",\n        \"cute bilibili\": \"キュートビリビリ\",\n        \"cvl launching pad\": \"CVL発射台\",\n        \"cyanos\": \"CYANOS\",\n        \"cyber ark\": \"CYBER ARK\",\n        \"cyber f\": \"Cyber F\",\n        \"cyber manga doujou\": \"サイバー☆マンガ道場\",\n        \"cyber sakura\": \"サイバー桜\",\n        \"cyberangel\": \"CYBERANGEL\",\n        \"cyborg hum\": \"サイボーグハム\",\n        \"cyc\": \"Cyc\",\n        \"cyc no-nos\": \"サイクノノス\",\n        \"cyclet\": \"CYCLET\",\n        \"cyclo-\": \"Cyclo-\",\n        \"cyclone\": \"サイクロン\",\n        \"cyduster\": \"CYDUSTER\",\n        \"cykranosh\": \"さいくらの〜しゅ\",\n        \"cynthia\": \"Cynthia\",\n        \"cytokine\": \"CYTOKINE\",\n        \"cz\": \"CZ\",\n        \"d-baird\": \"D-Baird\",\n        \"d-dkd\": \"D-DKD\",\n        \"d-heaven\": \"D-heaven\",\n        \"d-ivision\": \"D-ivision\",\n        \"d-lovers\": \"D-LOVERS\",\n        \"d-march\": \"D-MARCH\",\n        \"d-point\": \"D-Point!\",\n        \"d-ten\": \"D-TEN\",\n        \"d.a.p\": \"d.a.p\",\n        \"d.h\": \"D.H\",\n        \"d.o.\": \"ディーオー\",\n        \"d2 algorithm\": \"D2 Algorithm\",\n        \"dadachamame\": \"だだちゃまめ\",\n        \"daddymulk\": \"DADDYMULK\",\n        \"dagashiya\": \"駄菓子屋\",\n        \"dai 13 kantai\": \"第13艦隊\",\n        \"dai 3 no shippo\": \"だい③のしっぽ\",\n        \"dai 46 kishidan\": \"第46騎士団\",\n        \"dai n honpo\": \"第N本舗\",\n        \"dai ninja teikoku\": \"大忍者帝国\",\n        \"dai nippon kodomo shuppan\": \"大日本子供出版\",\n        \"dai-l studio\": \"第Lスタジオ\",\n        \"daidai koubou\": \"大々工房\",\n        \"daidaido\": \"橙堂\",\n        \"daidaros\": \"ダイだろす\",\n        \"daidenjin koubou\": \"大電人工房\",\n        \"daiginjou masshigura\": \"大吟醸まっしぐら\",\n        \"daiichi denshi\": \"第一電子\",\n        \"daiichi yutakasou\": \"第壱ユタカ荘\",\n        \"daiji na koto wa nikai mo iwanai\": \"大事なことは二回も言わない\",\n        \"daijobi kenkyuujo\": \"ダイジョビ研究所\",\n        \"daikichi-ya\": \"だいきち屋\",\n        \"daikonya sanchoume\": \"大根屋三丁目\",\n        \"daini hokenshitsu\": \"ダイニホケンシツ\",\n        \"dainichakai\": \"第二茶会\",\n        \"dainyu dougumo\": \"代入道雲\",\n        \"dairiseki\": \"大理石\",\n        \"daisaku no iru circle\": \"大作のいるサークル\",\n        \"daisan shinsekai\": \"第三新世界\",\n        \"daisy chain\": \"デイジーチェイン\",\n        \"daitokei\": \"大刀契\",\n        \"daitoutaku\": \"大董卓\",\n        \"daiznosusume\": \"だいずのススメ\",\n        \"daizu azuki\": \"大豆小豆\",\n        \"daizuya\": \"だいず屋\",\n        \"dakashiya oroshi\": \"堕菓子屋卸\",\n        \"daken nanban\": \"駄犬南蛮\",\n        \"dakuhan\": \"だくはん\",\n        \"dall\": \"DALL\",\n        \"dam labo\": \"だむlabo\",\n        \"damage honpo\": \"ダメージ本舗\",\n        \"damaguro\": \"だまぐろ\",\n        \"dame project\": \"DAMe project\",\n        \"damedungeon\": \"DameDungeon\",\n        \"damn bomb\": \"だむぼむ\",\n        \"danball man\": \"ダンボールまん\",\n        \"danball mansion\": \"ダンボールマンション\",\n        \"dancing cat\": \"ダンシングキャット\",\n        \"dandan chinjufu\": \"弾々鎮守府\",\n        \"dandandadan\": \"段々打団\",\n        \"dandelion\": \"だんでらいおん\",\n        \"dandy lonely cherry\": \"Dandy Lonely Cherry\",\n        \"dandy skip\": \"だんでぃすきっぷ\",\n        \"danekoya gunekodou\": \"駄猫屋愚猫堂\",\n        \"dangan densetsu\": \"弾丸伝説\",\n        \"dangan honey\": \"弾丸ハニィ\",\n        \"dange\": \"談華\",\n        \"danger equals zone\": \"DANGER=ZONE\",\n        \"dangerous charms\": \"デンジャラス・チャームス\",\n        \"dangoya\": \"DANGOYA\",\n        \"danikuya-san\": \"駄肉家さん\",\n        \"dankon no sato\": \"男根の里\",\n        \"danna\": \"ダンナ\",\n        \"dannoura\": \"壇ノ浦\",\n        \"dansei clear gadget\": \"弾性クリアガジェット\",\n        \"danshaku ryou\": \"男爵領\",\n        \"dantyo neko\": \"だんちょねこ\",\n        \"danzi engine\": \"ダンジエンジン\",\n        \"darabuchidou\": \"だらぶち堂\",\n        \"daradara no kiheitai\": \"だらだらの騎兵隊\",\n        \"dark battery\": \"Dark battery\",\n        \"dark buta gorilla\": \"ダーク・ブタゴリラ\",\n        \"dark cherish\": \"Dark Cherish\",\n        \"dark crimson\": \"Dark Crimson\",\n        \"dark force\": \"suzuki shinobu\",\n        \"dark roseex-s\": \"Dark RoseEX-S\",\n        \"dark side\": \"ダークサイド\",\n        \"dark spirit\": \"だーくすぴりっと\",\n        \"dark water\": \"Dark Water\",\n        \"dark zone\": \"ダーク・ゾーン\",\n        \"darmax\": \"DARMAX\",\n        \"darumasan koronda\": \"達磨さん転んだ\",\n        \"dashigara 100\": \"ダシガラ100%\",\n        \"dashimakitamago\": \"DASHIMAKITAMAGO\",\n        \"dashinoko\": \"だしの粉\",\n        \"dashiotto\": \"だしおっと\",\n        \"dass\": \"DASS\",\n        \"date wa gorgeous ni\": \"デートはゴージャスに\",\n        \"dateline\": \"デートライン\",\n        \"datendou\": \"堕天堂\",\n        \"daylight\": \"デイライト\",\n        \"db-soft\": \"デービーソフト\",\n        \"dbh\": \"DBH\",\n        \"ddal84\": \"DDAL84\",\n        \"ddt\": \"DDT\",\n        \"dead angle\": \"デッドアングル\",\n        \"dead ranker\": \"Dead Ranker\",\n        \"deadnoodles\": \"Deadnoodles\",\n        \"dear\": \"Dear\",\n        \"dear durandal\": \"Dear Durandal\",\n        \"dear life\": \"DEAR LIFE\",\n        \"deardeer\": \"でぃあでぃあ\",\n        \"dearmyfriends\": \"DearMyFriends\",\n        \"death dolls\": \"Death Dolls\",\n        \"death presso\": \"デスプレッソ\",\n        \"deathgaze-system\": \"deathgaze-system\",\n        \"debagame daisoujou\": \"出歯亀大僧正\",\n        \"debodebodan\": \"でボでボ団\",\n        \"debonosu works\": \"でぼの巣製作所\",\n        \"december-girl\": \"December-Girl\",\n        \"dedepoppo\": \"ででぽっぽ\",\n        \"deed\": \"DEED\",\n        \"deeeepforest\": \"DeeeePforest\",\n        \"def cats\": \"DEF CATS\",\n        \"def999\": \"DEF999\",\n        \"degicat\": \"デジキャット\",\n        \"deisui oukoku\": \"泥酔桜国\",\n        \"dejavu\": \"Dejavu\",\n        \"dejikago\": \"でじかご\",\n        \"dekiai shinkou\": \"溺愛信仰\",\n        \"dekoboko furniture\": \"凸凹ファニチャー\",\n        \"dekoponzu\": \"でこぽんず\",\n        \"dekosenn titai\": \"デコ戦地帯\",\n        \"delayder\": \"でぃれ～だー\",\n        \"delica\": \"Delica\",\n        \"delta\": \"DELTA\",\n        \"delta blade\": \"デルタブレード\",\n        \"delta box\": \"DELTA BOX\",\n        \"deltaforce\": \"DELTAFORCE\",\n        \"delusion\": \"でるしおん\",\n        \"dende\": \"でんで\",\n        \"denden\": \"電電\",\n        \"denden-dou\": \"電伝導\",\n        \"dengenoff\": \"電源OFF\",\n        \"denji yuudou\": \"電磁誘導\",\n        \"denjin\": \"電神\",\n        \"denki biribiri\": \"電気びりびり\",\n        \"denki orange\": \"電気おれんじ\",\n        \"denkishiki\": \"電気式\",\n        \"dennou chocolate\": \"電脳ちょこれーと\",\n        \"dennou denpa hatsureisho\": \"電脳電波発令所\",\n        \"dennou fuyu mikan\": \"電脳冬蜜柑\",\n        \"dennou yamasakigumi\": \"電脳山咲組\",\n        \"dennougiwa\": \"電脳戯話\",\n        \"denpa anshitsu\": \"電波暗室\",\n        \"denpa tsuushin\": \"デンパツーシン\",\n        \"denpa yunyun\": \"電波ゆんゆん\",\n        \"denpaesidan\": \"電派絵師団\",\n        \"derashine can\": \"でらしね缶\",\n        \"derashobokai\": \"でらしょぼ会\",\n        \"deresuke syuppan\": \"でれすけ出版\",\n        \"derlanger\": \"D'ERLANGER\",\n        \"derolian\": \"デロリアン\",\n        \"desafinado\": \"desafinado\",\n        \"desart.\": \"desart.\",\n        \"desire\": \"デザイアー\",\n        \"desire gadget\": \"Desire Gadget\",\n        \"desk drawer\": \"Desk Drawer\",\n        \"desorden\": \"DESORDEN\",\n        \"death purin\": \"デスプリン\",\n        \"destron shoukai\": \"デストロン商会\",\n        \"desuroguma\": \"デスロ熊\",\n        \"detergent\": \"detergent\",\n        \"detox-girls\": \"Detox-Girls\",\n        \"developers\": \"デベロッパーズ\",\n        \"devri channel\": \"デヴリチャンネル\",\n        \"dewdrop\": \"DewDrop\",\n        \"dex plus\": \"DEX+\",\n        \"dg\": \"D☆G\",\n        \"dg project\": \"DG Project\",\n        \"dhr-ken\": \"dHR研\",\n        \"diablo\": \"Diablo\",\n        \"diamond dust\": \"ダイヤモンドダスト\",\n        \"diamond guardian\": \"ダイヤモンドガーディアン\",\n        \"diamond tiara\": \"Diamond tiara\",\n        \"dicca\": \"dicca\",\n        \"dice b\": \"ダイスB\",\n        \"dickpital\": \"ディクピタル\",\n        \"dieppe factory\": \"DIEPPE FACTORY\",\n        \"diethyl ether\": \"ジエチルエーテル\",\n        \"dig dug\": \"Dig Dug\",\n        \"digi-ai\": \"DiGi-Ai\",\n        \"digianko\": \"デジアンコ\",\n        \"digiel\": \"DiGiEL\",\n        \"digital cute\": \"Digital Cute\",\n        \"digital flyer\": \"Digital Flyer\",\n        \"digital g power\": \"デジタルGパワー\",\n        \"digital graffiti\": \"Digital Graffiti\",\n        \"digital onahole\": \"でじたるおなほ～る\",\n        \"digital symphony\": \"DIGITAL SYMPHONY\",\n        \"digital tambourine\": \"でじたるたんばりん\",\n        \"digix\": \"digiX\",\n        \"dildo rotor\": \"ディルドローター\",\n        \"diletta\": \"diletta\",\n        \"dilettante\": \"ディレッタント\",\n        \"dimension empire\": \"dimension empire\",\n        \"dimension25\": \"2.5次元\",\n        \"dinosaur house\": \"だいなそ～ハウス\",\n        \"dip switch\": \"ディップ・スイッチ\",\n        \"dipper magic\": \"Dipper Magic\",\n        \"dirty\": \"DIRTY\",\n        \"dirty69star\": \"Dirty69star★\",\n        \"discovery\": \"ディスカバリー\",\n        \"discovery mars\": \"ディスカバリー・マーズ\",\n        \"dish up\": \"Dish up\",\n        \"divine fountain\": \"神聖ファウンテン\",\n        \"dix-sept\": \"dix-sept\",\n        \"dixie\": \"ディクシー\",\n        \"dixieland\": \"迪西蘭\",\n        \"dkjmn\": \"dkjmn\",\n        \"dmcontrast\": \"DMコントラスト\",\n        \"dmmc\": \"DMMC\",\n        \"do well\": \"Do well !!!\",\n        \"do you die\": \"DO YOU DIE?\",\n        \"dobakin.\": \"どばきん。\",\n        \"dobu no hotori.\": \"どぶのほとり。\",\n        \"doc.\": \"doc.\",\n        \"dodo fuguri\": \"百々ふぐり\",\n        \"dodomeiro teishoku\": \"どどめ色定食\",\n        \"dog house\": \"ドッグハウス\",\n        \"dogear\": \"Dogear\",\n        \"doggie style\": \"doggie★style\",\n        \"dogstyle\": \"DogStyle\",\n        \"dogtag\": \"DOGTAG\",\n        \"dogu-sensya storm\": \"土偶戦車ストーム\",\n        \"dohatsu shouten\": \"怒髪商店\",\n        \"dojin otome\": \"ドージンオトメ\",\n        \"dojinchi\": \"どじんち\",\n        \"dokomademo aoi sora ni ukabu niku\": \"何処までも蒼い空に浮かぶ肉。\",\n        \"doku alice\": \"どくアリス\",\n        \"doku ringo\": \"毒リンゴ\",\n        \"doku sasori\": \"毒蠍\",\n        \"doku69\": \"毒69\",\n        \"dokudami\": \"ドクダミ\",\n        \"dokudenpa jushintei\": \"毒電波受信亭\",\n        \"dokudenpa kenkyuusho\": \"毒電波研究所\",\n        \"dokudenpa tsuushin\": \"毒電波通信\",\n        \"dokudoku melon\": \"どくどくめろん\",\n        \"dokudoku ryouki garou\": \"毒どく猟奇画廊\",\n        \"dokumushi shokeitai\": \"毒虫処刑隊\",\n        \"dokunuma\": \"どくぬま\",\n        \"dokupan koubou\": \"毒パン工房\",\n        \"dokuritsu gurentai\": \"独立愚連隊\",\n        \"dolce\": \"DOLCE\",\n        \"dolce einsatz\": \"Dolce Einsatz\",\n        \"dolcecanto\": \"DolceCanto\",\n        \"dolkavtahn\": \"Dolkavtahn\",\n        \"doll play\": \"DOLL PLAY\",\n        \"dom joshidan\": \"ドM女史団\",\n        \"dom kishidan\": \"ドM騎士団\",\n        \"domestic animals\": \"Domestic animals\",\n        \"donkin darnuts\": \"どんきんだぁなっつ\",\n        \"dontokodon\": \"どんとこどん\",\n        \"dontokoi oo\": \"ドンと来い!○○!\",\n        \"donut ike\": \"ど～なつ池\",\n        \"donzoko kashiwa meshi\": \"どん底かしわめし\",\n        \"donzoko tengoku\": \"ドン底天国\",\n        \"donzoko.\": \"どんぞこ。\",\n        \"doomcomic\": \"ドゥームコミック\",\n        \"doppelgesicht\": \"DOPPELGESICHT\",\n        \"dorepooru\": \"ドレポール\",\n        \"dorgel\": \"dorgel\",\n        \"dorichin koubou\": \"ドリチン工房\",\n        \"doronuma kyoudai\": \"泥沼兄弟\",\n        \"doropanda tours\": \"どろぱんだTOURS\",\n        \"doroyume\": \"とろゆめ\",\n        \"dosukoi\": \"どすこい!\",\n        \"dosukoi jinja\": \"どす恋☆神社\",\n        \"dot collector\": \"Dot Collector\",\n        \"dotechin tengoku\": \"どてちん天国\",\n        \"dotou no m kikaku\": \"怒涛のM企画!!\",\n        \"dots and lines\": \"どっつ&らいんず\",\n        \"dou-chikikure\": \"童チキクレ\",\n        \"double branch\": \"だぶるぼらんち\",\n        \"double deck seisakujo\": \"ダブルデック製作所\",\n        \"double dice\": \"だぶるだいす\",\n        \"double melon\": \"ダブルメロン\",\n        \"double slash\": \"ダブルスラッシュ\",\n        \"double typhoon\": \"ダブルタイフーン\",\n        \"double volante\": \"だぶるぼらんち\",\n        \"double-h\": \"DOUBLE-H\",\n        \"doubleflower\": \"DoubleFlower\",\n        \"doudantsutsujitomonokai\": \"満天星友乃会\",\n        \"douganebuibui\": \"ドウガネブイブイ\",\n        \"doujin kappa\": \"同人河童\",\n        \"doujin mukashibanashi\": \"同人昔話\",\n        \"doumou\": \"DOUMOU\",\n        \"doushia\": \"ドーシア\",\n        \"doushin chaya\": \"童心茶屋\",\n        \"doutei shokudou\": \"童貞食堂\",\n        \"douwa-kensetsu\": \"童話建設\",\n        \"doux\": \"DOUX\",\n        \"downbeat\": \"downbeat\",\n        \"doyondo.\": \"どよんど。\",\n        \"dozo-mae\": \"どーぞーまえ\",\n        \"dragon edge\": \"龍泉\",\n        \"dragon goya\": \"ドラゴン小屋\",\n        \"dragon heart\": \"Dragon Heart\",\n        \"dragon island\": \"ドラゴンアイランド\",\n        \"dragonia\": \"どらごにあ\",\n        \"dragonstorm\": \"ドラゴンストーム\",\n        \"dragula\": \"DRAGULA\",\n        \"drain\": \"drain\",\n        \"drakle-nekota perpetual motion\": \"どらねこ永久機関\",\n        \"draw go\": \"Draw Go\",\n        \"drawpnir\": \"Drawpnir\",\n        \"dream chaser\": \"Dream Chaser\",\n        \"dream club\": \"ドリーム倶楽部\",\n        \"dream dot\": \"ドリームドット\",\n        \"dream halls\": \"Dream Halls!\",\n        \"dream house\": \"DREAM HOUSE\",\n        \"dream project\": \"ドリームプロジェクト\",\n        \"dream rider\": \"DREAM RIDER\",\n        \"dream-mist\": \"dream-mist\",\n        \"drei\": \"Drei\",\n        \"dress\": \"ドレス\",\n        \"dressblackheulee\": \"dressblackheulee\",\n        \"dressmash\": \"DRESSMASH\",\n        \"drill biyori\": \"どりる日和\",\n        \"drilln girl\": \"drill'n girl\",\n        \"drink it\": \"Drink it!\",\n        \"drivehome\": \"drivehome\",\n        \"drizzly rain\": \"drizzly rain\",\n        \"dro-ya\": \"泥屋\",\n        \"drop\": \"DROP\",\n        \"drops\": \"どろっぷす!\",\n        \"drum-kan\": \"ドラム缶\",\n        \"dryr\": \"DryR\",\n        \"dsb style\": \"DSB Style\",\n        \"dso\": \"でぃえすおー\",\n        \"dssk\": \"DSSK\",\n        \"dt koubou\": \"DT工房\",\n        \"dual beat\": \"DUAL BEAT\",\n        \"dual i fap\": \"Dual i fap\",\n        \"dualtail\": \"dual tail\",\n        \"dudedle studio\": \"デュードルスタジオ\",\n        \"dummyrun\": \"DUMMY RUN\",\n        \"dummyusagi\": \"DummyUsagi\",\n        \"dvcommunications\": \"DVコミュニケイションズ\",\n        \"dying kitchen z\": \"Dying Kitchen Z\",\n        \"dynamic kanoke\": \"ダイナミック棺桶\",\n        \"dynamite honey\": \"ダイナマイト☆ハニー\",\n        \"e\": \"e\",\n        \"e ali-al\": \"e☆ALI-aL!\",\n        \"e factory\": \"E factory\",\n        \"e ni kaita mochi\": \"絵にかいた餅\",\n        \"e project\": \"E project\",\n        \"e roman koubou\": \"江☆浪漫工房\",\n        \"e-10 field\": \"E-10フィールド\",\n        \"e-hentaicore\": \"E-Hentaicore\",\n        \"e-lse\": \"E-lse\",\n        \"e.b.\": \"E.B.\",\n        \"e50\": \"絵50\",\n        \"e649ne\": \"e649ne\",\n        \"e73\": \"E73\",\n        \"eapo-zu\": \"eapo-zu\",\n        \"ear-pop\": \"EAR-POP\",\n        \"earl lumines\": \"Earl LUMINES\",\n        \"earth-goya\": \"アース小屋\",\n        \"earthean\": \"アーシアン\",\n        \"earthlight\": \"アースライト\",\n        \"easy thrilling\": \"Easy Thrilling\",\n        \"easygame\": \"EasyGame\",\n        \"ebikino\": \"エビキノ\",\n        \"ebimashi\": \"えびまし\",\n        \"ebisen kikaku\": \"えびせん企画\",\n        \"ebisuya\": \"えびすや\",\n        \"ebisuyu\": \"ゑびす湯\",\n        \"ebitendon\": \"えびてん丼\",\n        \"ebysuya\": \"恵比寿屋\",\n        \"ecarlate\": \"E'carlate\",\n        \"eccentric girl\": \"エキセントリックガール\",\n        \"echigo-ya kikaku\": \"越後屋企画\",\n        \"echizen bugyousho\": \"越前奉行所\",\n        \"echo\": \"ECHO\",\n        \"echo view\": \"Echo View\",\n        \"echo.\": \"echo.\",\n        \"eclipse\": \"えくりぷす\",\n        \"eco-filter\": \"えこふぃるたぁ\",\n        \"ecolonun\": \"えころぬん\",\n        \"ecp\": \"ECP\",\n        \"ectoborn\": \"ectoborn\",\n        \"edash\": \"EDASH\",\n        \"edenmode\": \"EDENMODE\",\n        \"edge\": \"edge\",\n        \"edge diver\": \"Edge Driver\",\n        \"edge worth\": \"えっじわーす\",\n        \"edgeworthia\": \"Edgeworthia\",\n        \"edit\": \"edit\",\n        \"edo-ya\": \"EDO屋\",\n        \"edogawa koubou\": \"江戸川工房\",\n        \"ether\": \"エエテル\",\n        \"ef-labo\": \"ef-labo\",\n        \"effecter\": \"エフェクター\",\n        \"effordom soft\": \"エフォルダムソフト\",\n        \"egao ga ichiban\": \"笑顔が一番\",\n        \"eggplant\": \"えっぐぷらんと\",\n        \"ego\": \"イージーオー\",\n        \"ego dance\": \"EGO DANCE\",\n        \"egoism\": \"EGOISM\",\n        \"egonokatamari\": \"エゴノカタマリ\",\n        \"eichi jijou\": \"エイチジジョウ\",\n        \"chikatetsu shokudou\": \"地下鉄食堂\",\n        \"eien no 17-sai\": \"永遠の17歳\",\n        \"eight beat\": \"エイトビート\",\n        \"eight man\": \"eight man\",\n        \"eight world\": \"エイト・ワールド\",\n        \"eikyuu kikan\": \"永久機関\",\n        \"einfach\": \"einfach\",\n        \"einhorn\": \"あいんほるん\",\n        \"eins\": \"あいんず\",\n        \"einsatz gruppe\": \"EINSATZ GRUPPE\",\n        \"einshotenin\": \"アインショテンイン\",\n        \"eisaidou\": \"えーさい堂\",\n        \"eisbahn\": \"アイスバーン\",\n        \"eisei vegeta g\": \"衛星ベジータG\",\n        \"eisenhower\": \"あいぜんはわぁ\",\n        \"eiwa industries\": \"エイワインダストリーズ\",\n        \"ejigen\": \"EJIGEN\",\n        \"ek-shop\": \"eK-SHOP\",\n        \"ekakigoya\": \"絵描き小屋\",\n        \"ekakigoya notesystem\": \"絵描き小屋\",\n        \"ekitai no tomosha\": \"液体の友社\",\n        \"ekitica\": \"EKITICA\",\n        \"ekurabe\": \"エクラベ\",\n        \"el-ahrairah\": \"El-ahrairah\",\n        \"electric rokugen\": \"エレクトリックロクゲン\",\n        \"electrical\": \"エレクトリカル\",\n        \"electricsheep\": \"ElectricSheep\",\n        \"elephant.giraffe\": \"ELEPHANT.GIRAFFE\",\n        \"elf\": \"エルフ\",\n        \"elfin facies\": \"Elfin Facies\",\n        \"elflite\": \"elflite\",\n        \"elhearts\": \"ELHEART'S\",\n        \"elilys lab.\": \"Elily's Lab.\",\n        \"elithheart\": \"エリスハート\",\n        \"elle-murakami\": \"elle-叢神\",\n        \"ellese no yakata\": \"エリーゼの館\",\n        \"elza\": \"ELZA\",\n        \"emade.\": \"いーめいど。\",\n        \"emakiya-sakyodo\": \"絵巻屋紗香堂\",\n        \"empathy\": \"Empathy\",\n        \"empty lounge\": \"Empty Lounge\",\n        \"empty room\": \"Empty Room\",\n        \"emu\": \"emu\",\n        \"en\": \"袁\",\n        \"en-sof\": \"En-Sof\",\n        \"endless requiem\": \"Endless Requiem\",\n        \"endorphin\": \"Endorphin\",\n        \"energia\": \"えねるぎあ\",\n        \"energya\": \"エネルギヤ出版所\",\n        \"enfant terrible\": \"ENFANT TERRIBLE\",\n        \"engetsuten\": \"遠月点\",\n        \"england peach\": \"England Peach\",\n        \"engoutenma\": \"炎業天魔\",\n        \"enio\": \"Enio\",\n        \"enishi soft\": \"えにしそふと\",\n        \"enishing\": \"縁ing\",\n        \"enji\": \"ENJI\",\n        \"enjoy mix\": \"ENJOY MIX\",\n        \"enka boots\": \"塩化ブーツ\",\n        \"enkan\": \"円環\",\n        \"enmaya\": \"えんま屋\",\n        \"enmuhaze\": \"えんむへいず\",\n        \"ennui akatako\": \"アンニュイ赤蛸\",\n        \"ennui-tei\": \"アンニュイ亭\",\n        \"enokippu\": \"えのきっぷ\",\n        \"enokoro kurage\": \"えのころくらげ\",\n        \"enoughmin\": \"イナフミン\",\n        \"entelekheia\": \"エンテレケイア\",\n        \"entro beast\": \"エントロビースト\",\n        \"enueeru\": \"えぬえ～る\",\n        \"enuemu\": \"enuemu\",\n        \"enuma elish\": \"enuma elish\",\n        \"enyakora hoisassa\": \"えんやこら☆ほいさっさ\",\n        \"equivalence\": \"equivalence\",\n        \"era feel\": \"era feel\",\n        \"erare\": \"ERARE\",\n        \"erdelied\": \"エルデライド\",\n        \"erectlip\": \"エレクトリップ\",\n        \"erimo\": \"えりも\",\n        \"eringitoro salmon\": \"えりんぎとろサーモン\",\n        \"ero ero time\": \"エロ×2TIME\",\n        \"ero mangaka pikupikun\": \"えろ漫画家ピクピクン\",\n        \"ero spirits\": \"エロスピリッツ\",\n        \"erocawa tonya\": \"エロカワ問屋\",\n        \"erocs\": \"erocs\",\n        \"eroitto\": \"エロイット\",\n        \"eroliya\": \"えろり屋\",\n        \"eromafia\": \"エロマフィア\",\n        \"eromazun\": \"エロマズン\",\n        \"eronamin h\": \"エロナミンH\",\n        \"erondo\": \"eRONDO\",\n        \"eroro\": \"Eroro\",\n        \"eros and entertainment\": \"Eros&Entertainment\",\n        \"eroslium\": \"エロスリウム\",\n        \"erostellus\": \"Erostellus\",\n        \"erotic fantasy larvaturs\": \"らばた工房\",\n        \"erotic honeymoon\": \"Erotic Honeymoon\",\n        \"erotica black\": \"EROTICA BLACK\",\n        \"erotica peach\": \"EROTICA PEACH\",\n        \"erotis\": \"ErotIs\",\n        \"erotomania\": \"EROTOMANIA\",\n        \"error\": \"ERROR!\",\n        \"error404\": \"ERROR404\",\n        \"eruapo gundan\": \"エルアポ軍団\",\n        \"escape club\": \"ESCAPE CLUB\",\n        \"escapizma\": \"ESCAPIZMA\",\n        \"escargot club\": \"えすかるご倶楽部\",\n        \"esebateira\": \"エセバテイラ\",\n        \"esecool\": \"エセクール\",\n        \"esoragoto\": \"エソラゴト\",\n        \"espresso\": \"espresso\",\n        \"esto\": \"esto\",\n        \"estrella\": \"estrella\",\n        \"esuesu\": \"EsuEsu\",\n        \"esuodan\": \"えすおだん\",\n        \"esusaizu\": \"えすさいず\",\n        \"etc x etc\": \"ETC×ETC\",\n        \"etcycle\": \"etcycle\",\n        \"eterna-radiare\": \"エテルナ-ラディアーレ\",\n        \"eternal\": \"ETERNAL\",\n        \"eternal song\": \"Eternal Song\",\n        \"eternal world\": \"ETERNAL WORLD\",\n        \"eternal-eclipse\": \"ETERNAL-ECLIPSE\",\n        \"eterno\": \"Eterno\",\n        \"etigoya\": \"えち後屋\",\n        \"etoile zamurai\": \"エトワール待\",\n        \"etsuran\": \"悦卵\",\n        \"etwas\": \"etwas\",\n        \"eunospress\": \"ゆ～のす通信\",\n        \"eunox\": \"EUNOX\",\n        \"eunoxline\": \"EUNOXLINE\",\n        \"euphonia\": \"Euphonia\",\n        \"euphony production\": \"Euphony Production\",\n        \"euphoria\": \"euphoria\",\n        \"euphoric\": \"EUPHORIC!\",\n        \"eve\": \"Eve\",\n        \"eve-sya\": \"EVE-舎\",\n        \"eves garden box\": \"イヴの箱庭\",\n        \"evidence.\": \"Evidence.\",\n        \"evo.r.b\": \"宇行日和\",\n        \"evoll\": \"evoLL\",\n        \"evolution\": \"Evolution\",\n        \"evork festa\": \"Evork Festa\",\n        \"ewokakuman\": \"絵を描くマン\",\n        \"ews at works\": \"EWS@Works\",\n        \"ex production\": \"EXプロダクション\",\n        \"ex-\": \"EX-\",\n        \"ex-one\": \"EX-ONE\",\n        \"ex35\": \"EX35\",\n        \"excite\": \"絵喜祭人\",\n        \"excite neko\": \"エキサイト猫\",\n        \"excite rabbit\": \"えきらび\",\n        \"executor\": \"EXECUTOR ～エグゼクター～\",\n        \"exit nothing\": \"Exit Nothing\",\n        \"exodus\": \"エクソダス\",\n        \"explorer\": \"Explorer\",\n        \"extage\": \"EXtage\",\n        \"extern\": \"extern\",\n        \"extry\": \"ExTry\",\n        \"ezogoro\": \"エゾゴロウ\",\n        \"f no heya\": \"Fの部屋\",\n        \"f.w.zholic\": \"F.W.ZHolic\",\n        \"f.workshop\": \"F.Workshop\",\n        \"f4-company\": \"F4 COMPANY\",\n        \"face to face\": \"face to face\",\n        \"facehouse\": \"Facehouse\",\n        \"fact on fiction\": \"Fact on Fiction\",\n        \"faf\": \"FAF\",\n        \"fairy key\": \"フェアリーキー\",\n        \"fairy pink\": \"FAIRY PINK\",\n        \"fairy tale house\": \"Fairy Tale House\",\n        \"fake an\": \"FAKE庵\",\n        \"fake69rose\": \"fake69rose\",\n        \"fakepucco\": \"偽製pucco\",\n        \"faker\": \"Faker\",\n        \"fakereal\": \"FakeReal\",\n        \"falchion\": \"ファルシオン\",\n        \"fall-in-love\": \"Fall-in-Love\",\n        \"falling spiral\": \"Falling Spiral\",\n        \"fallinmoon\": \"FallinMoon\",\n        \"family affair\": \"Family Affair\",\n        \"family void\": \"ファミリーVOID\",\n        \"fan-na\": \"ふぁんな\",\n        \"fancy fantasia\": \"Fancy Fantasia\",\n        \"fancy feeling\": \"Fancy Feeling\",\n        \"fancy-polori\": \"空想ポロリ\",\n        \"fangs\": \"FANGS\",\n        \"fannel\": \"ファンネル\",\n        \"fantasy of vermilion\": \"Fantasy of Vermilion\",\n        \"fantasy wind\": \"FANTASY WIND\",\n        \"fap seisakusho\": \"FAP製作所\",\n        \"farthest land\": \"farthest land\",\n        \"fastest lap\": \"FASTEST LAP\",\n        \"fastrope\": \"FASTROPE\",\n        \"fat\": \"FAT\",\n        \"fatboy\": \"ふぁっとぼ～い\",\n        \"fatima cigarette\": \"Fatima Cigarette\",\n        \"favorite\": \"FAVORITE\",\n        \"fclg\": \"フクラグ\",\n        \"fechisupi\": \"ふぇちすぴ\",\n        \"feeld hern halle\": \"FEELD HERN HALLE\",\n        \"felicitan\": \"フェリシタン\",\n        \"felina\": \"Felina\",\n        \"felt-kobo\": \"ふぇると工房\",\n        \"femidrop\": \"フェミドロップ\",\n        \"femme enfant\": \"FEMME ♀ ENFANT\",\n        \"festa\": \"ふぇすた。\",\n        \"festival\": \"ふぇすてぃばる!\",\n        \"fetch\": \"Fetch\",\n        \"fetish\": \"ふぇてぃっしゅ\",\n        \"fetish children\": \"フェティッシュ チルドレン\",\n        \"fetism\": \"ふぇちずむ\",\n        \"fever lactic acid bacteria deluxe\": \"フィーバー乳酸菌DX\",\n        \"fhfhfh\": \"fhfhfh\",\n        \"fiance tank\": \"フィアンセ戦車\",\n        \"fiancee\": \"フィアンセ\",\n        \"fiesole\": \"Fiesole\",\n        \"fighting peroriina\": \"ファイティングペロリーナ\",\n        \"figure ni naritai zoku\": \"フィギュアになりたい\",\n        \"figure-hugging\": \"FIGURE-HUGGING\",\n        \"fika\": \"FIKA\",\n        \"film grain\": \"FILM GRAIN\",\n        \"final frontier\": \"FINAL FRONTIER\",\n        \"finecraft69\": \"Finecraft69\",\n        \"finish doll\": \"フィニッシュドール\",\n        \"fippenluck\": \"fippenluck\",\n        \"fire\": \"FIRE\",\n        \"firefly\": \"Firefly\",\n        \"fireworks\": \"ファイヤーワークス\",\n        \"first class\": \"1組\",\n        \"first crash\": \"ファーストクラッシュ\",\n        \"first mirage\": \"FIRST MIRAGE\",\n        \"firstspear\": \"Firstspear\",\n        \"fish\": \"FISH\",\n        \"fish and chicken\": \"魚肉と鳥肉\",\n        \"fishbone\": \"fish bone\",\n        \"fishneak\": \"Fishneak\",\n        \"five\": \"five\",\n        \"fivecoa.\": \"Fivecoa.\",\n        \"fiyorudou\": \"ふぃよる堂\",\n        \"fizz\": \"Fizz\",\n        \"fizzcode\": \"FIZZCODE\",\n        \"fjnsoft\": \"FJNsoft\",\n        \"flaming dragon\": \"フレイミングドラゴン\",\n        \"flamme soft\": \"ふらむそふと\",\n        \"flash point\": \"FLASH POINT\",\n        \"flat\": \"FLAT\",\n        \"flattwelve\": \"FLATTWELVE\",\n        \"flatwoods\": \"Flatwoods\",\n        \"flieger\": \"Flieger\",\n        \"flip tail\": \"FLIP TAIL\",\n        \"flock blue\": \"Flock Blue\",\n        \"flower child\": \"フラワーチャイルド\",\n        \"flowerblade\": \"FlowerBlade\",\n        \"flowerchildueda\": \"flowerchild植田\",\n        \"fluffy x fluffy\": \"fluffy×fluffy\",\n        \"fluid liquid\": \"ふるいどりきっど\",\n        \"fluorite\": \"ふろーらいと\",\n        \"flying chicken\": \"フライングチキン\",\n        \"flying panjandrum\": \"ふらいんぐパンジャンドラム\",\n        \"flyingcat\": \"FlyingCat\",\n        \"foliage fossil\": \"木葉化石\",\n        \"folkro\": \"フォルクロ\",\n        \"fonetrason\": \"FONETRASON\",\n        \"foo10\": \"Foo10\",\n        \"fool-in-love\": \"Fool-in-Love\",\n        \"forbidden-lips\": \"Forbidden-Lips\",\n        \"forest snow\": \"Forest Snow\",\n        \"forever and ever...\": \"Forever and ever...\",\n        \"fortress76\": \"七六要塞\",\n        \"fortuna\": \"FORTUNA\",\n        \"fortunequest\": \"FortuneQuest\",\n        \"foryourprotection\": \"ForYourProtection\",\n        \"foundation\": \"FOUNDATION\",\n        \"four leaves clover\": \"Four Leaves Clover\",\n        \"fourthcape\": \"fourthcape\",\n        \"fox-club\": \"FOX-CLUB\",\n        \"fp works\": \"FP WORKS\",\n        \"fractalthink\": \"FractalThink\",\n        \"fraeulein\": \"Fräulein\",\n        \"fragile\": \"fragile\",\n        \"fragrant olive\": \"Fragrant Olive\",\n        \"frank banana\": \"Frank Banana\",\n        \"frank factory\": \"Frank Factory\",\n        \"frapowa\": \"ふらぽわ\",\n        \"frapper spirits\": \"ふらすぴ\",\n        \"freakilycharming\": \"FreakilyCharming\",\n        \"freaks\": \"フリークス\",\n        \"free color 814\": \"フリーカラー814\",\n        \"free heaven\": \"FREE HEAVEN\",\n        \"free style\": \"Free Style\",\n        \"freedom\": \"FREEDOM\",\n        \"freedom prophet\": \"フリーダムプロフェット\",\n        \"freedom tomy r\": \"フリーダム☆トミーR\",\n        \"freelife\": \"freelife\",\n        \"freeze world\": \"フリーズワールド\",\n        \"french cancan\": \"フレンチカンカン\",\n        \"fresh fruit s\": \"Fresh Fruit S\",\n        \"fresnel lens\": \"ふれぇねるれんず\",\n        \"freud no inmu\": \"フロイトの淫夢\",\n        \"fried kitchen.\": \"ふらいどきっちん。\",\n        \"friendly sky\": \"Friendly Sky\",\n        \"fringe flange\": \"フリンジフランジ\",\n        \"from control\": \"from control\",\n        \"from japan\": \"ふろむ・じゃぱん\",\n        \"from nou kanja no kai\": \"フロム脳患者の会\",\n        \"from scratch\": \"from SCRATCH\",\n        \"frontline\": \"ふろんとらいん\",\n        \"fruitsjam\": \"フルーツJAM\",\n        \"fly dish\": \"ふらいでぃっしゅ\",\n        \"fss\": \"FSS\",\n        \"fuantei\": \"ふあん亭\",\n        \"fudegaki soft\": \"筆柿そふと\",\n        \"fudomae5\": \"フドウマエ5\",\n        \"fuego\": \"FUEGO\",\n        \"fuerzabruta\": \"Fuerzabruta\",\n        \"fugu macaroni\": \"フグマカロニ\",\n        \"fugudoku\": \"川豚毒\",\n        \"fuguri\": \"ふぐり\",\n        \"fuhatudan.\": \"不発団。\",\n        \"fuji sangou koubou\": \"富士参號工房\",\n        \"fuji yoshida sa\": \"藤吉田SA\",\n        \"fujidan\": \"藤団\",\n        \"fujikome-ya\": \"藤米屋\",\n        \"fujiiro bomber\": \"ふじいろボンバー\",\n        \"fujiiro sabou\": \"藤色茶房\",\n        \"fujiko fujio fc kurosawa kei\": \"藤子不二雄FC黒沢系\",\n        \"fujinomiya millenium\": \"藤ノ宮ミレニアム\",\n        \"fujitomomo\": \"藤と桃\",\n        \"fujiya\": \"ふじ家\",\n        \"fujiyuu kenkyuu\": \"不自由研究\",\n        \"fukafuka moufu\": \"ふかふか毛布\",\n        \"fukafuka tenshoku\": \"ふかふか天職\",\n        \"fukagawa\": \"深川\",\n        \"fukahire\": \"フカヒレ\",\n        \"fukakutei kuukan\": \"不確定空間\",\n        \"fukame takame\": \"ふかめたかめ\",\n        \"fukashigi\": \"不可思議\",\n        \"fukasu-santaro\": \"深酢さんたろ\",\n        \"fukazume kizoku\": \"深爪貴族\",\n        \"fuketsudan\": \"不決断\",\n        \"hukidamari\": \"吹溜\",\n        \"fukucha koubou\": \"福茶工房\",\n        \"fukuda sennen oukoku\": \"福田千年王国\",\n        \"fukugou marjoram\": \"複合マジョラム\",\n        \"fukumaden\": \"伏魔殿\",\n        \"fukunoren\": \"福のれん\",\n        \"fukupukutei\": \"福ぷく亭\",\n        \"fukurou naru tori\": \"フクロウなる鳥\",\n        \"fukurou no yuubinya san\": \"梟の郵便屋さん\",\n        \"fukurou-ya\": \"梟屋\",\n        \"fukuya\": \"福屋\",\n        \"full accele\": \"フルアクセル\",\n        \"full bottle\": \"フルボトル\",\n        \"full flap\": \"フルフラップ\",\n        \"fullauto firing\": \"fullauto firing\",\n        \"fullbloom\": \"fullbloom\",\n        \"fullbottom\": \"FULLBOTTOM\",\n        \"fullmetal madness\": \"FULLMETAL MADNESS\",\n        \"fullmoff\": \"ふるもっふ\",\n        \"fullmoon and tangerine\": \"満月と蜜柑\",\n        \"fulloro\": \"fulloro\",\n        \"fullswing otome\": \"フルスイングオトメ\",\n        \"fumichaya\": \"史茶屋\",\n        \"fumifumi cat\": \"ふみふみ☆きゃっと\",\n        \"fumikan.\": \"ふみかん。\",\n        \"fumikirimae\": \"踏切前\",\n        \"fumitsuke\": \"ふみつけ\",\n        \"funa time\": \"ふなたいむ\",\n        \"funanori house\": \"ふなのりはうす\",\n        \"funiai-ice\": \"ふにあいあいす\",\n        \"funi funi soft\": \"ふにふにソフト\",\n        \"funikigumi\": \"雰囲気組\",\n        \"funimani\": \"ふにまに\",\n        \"funiya\": \"ふに屋\",\n        \"funny devil\": \"Funny Devil\",\n        \"funny rays\": \"ファニーレイズ\",\n        \"funwari rice\": \"ふんわり☆らいす\",\n        \"funyuhanyounyaran\": \"ふにゅはにょうにゃらん\",\n        \"furafuradou\": \"ふらふら堂\",\n        \"furansowa\": \"ふらんそわ\",\n        \"furi furi paradise\": \"Furi Furi PARADISE\",\n        \"furikake parapara\": \"ふりかけぱらぱら\",\n        \"furitendou\": \"フリテン堂\",\n        \"furrock\": \"ふぁーろっく\",\n        \"furry fandom\": \"ふぁ～りぃ☆ふぁんだむ\",\n        \"furscoblus\": \"Furscoblus\",\n        \"furuhonya\": \"古本屋\",\n        \"furuike\": \"furuike\",\n        \"furuya\": \"ふる屋\",\n        \"fushigi dou\": \"フシギ堂\",\n        \"fushinsya guilty\": \"不審者罪\",\n        \"fushizen doubutsu hogodantai\": \"不自然動物保護団体\",\n        \"fusions\": \"Fusions\",\n        \"fusuido\": \"封粋堂\",\n        \"fusuma goten\": \"ふすま御殿\",\n        \"futaba\": \"双葉\",\n        \"futabasshu\": \"ふたばっしゅ\",\n        \"futabatei\": \"ふたば亭\",\n        \"futaburo\": \"ふたブロ\",\n        \"futagotei\": \"双子亭\",\n        \"futaket junbikai\": \"ふたけっと準備会\",\n        \"futamura futon ten\": \"ふたむらふとん店\",\n        \"futanarist zatsudan\": \"ふたなりすと雑談\",\n        \"futanarun\": \"ふたなるん\",\n        \"futanaya\": \"フタナ屋\",\n        \"futatsu no hokuro\": \"ふたつのほくろ\",\n        \"futeikei zenzai\": \"不定形ぜんざい\",\n        \"futon mushi\": \"布団虫\",\n        \"futonton\": \"布団団\",\n        \"futoumei z\": \"不透明Z\",\n        \"future\": \"future\",\n        \"futurepack\": \"Futurepack\",\n        \"fuuga\": \"風☆雅\",\n        \"fuukyou kimiko\": \"風狂公子\",\n        \"fuuma kekkai\": \"風舞結界\",\n        \"huurai no dan\": \"風来の団\",\n        \"fuurintei\": \"風鈴亭\",\n        \"fuusa ryouiki\": \"封鎖領域\",\n        \"fuusen club kuroshiki\": \"風船クラブ「黒式！」\",\n        \"fuwa fuwa pinkchan\": \"ふわふわぴんくちゃん\",\n        \"fuwatoro marinepolis\": \"ふわとろ★まりんぽりす\",\n        \"fuwatto\": \"ふわっと\",\n        \"fuyu wa samui\": \"冬は寒い\",\n        \"fuyugomori\": \"FUYUGOMORI\",\n        \"fuyunonchi\": \"冬のん家\",\n        \"fuzainoyamada\": \"ふざいのやまだ\",\n        \"fz5000\": \"FZ5000\",\n        \"g equals kundow\": \"G=Kundow\",\n        \"g-cage\": \"G-CAGE\",\n        \"g-complex\": \"G-complex\",\n        \"g-planet\": \"G-PLANET\",\n        \"g-power\": \"G-Power!\",\n        \"g-r\": \"G-R\",\n        \"g-ring\": \"G-RING\",\n        \"g-rough\": \"g-rough\",\n        \"g-scan corp.\": \"G-SCAN CORP.\",\n        \"g-spot\": \"じぃすぽっと\",\n        \"g.b.f\": \"G.B.F\",\n        \"g.entertainment\": \"G.Entertainment\",\n        \"g.g.blue\": \"G.G.BLUE\",\n        \"g.g.g.\": \"G.G.G.\",\n        \"g.g.t.\": \"G.G.T.\",\n        \"g.k.p.\": \"g.k.p.\",\n        \"g500\": \"G500\",\n        \"ga fake\": \"ガ・フェーク\",\n        \"gaball screen\": \"GABALL SCREEN\",\n        \"gabugabu\": \"GABUGABU\",\n        \"gabunomi tororokonbu\": \"がぶ飲みとろろ昆布\",\n        \"gacha\": \"画チャ\",\n        \"gachapin mukku.\": \"がちゃぴんむっく。\",\n        \"gachi drunkers\": \"ガチ★ドランカーズ\",\n        \"gachinko shobou\": \"我チ○コ書房\",\n        \"gadget\": \"ガジェット工房\",\n        \"gadoujuku\": \"我道塾\",\n        \"gagaga honpo\": \"ガガガ本舗\",\n        \"gagaken\": \"画々研\",\n        \"gaikotsu no spare rib\": \"骸骨のスペアリブ\",\n        \"gaisei dou\": \"凱聖堂\",\n        \"gakeppuchi koubou\": \"崖っぷち工房\",\n        \"gakuen ketsumeichou\": \"學園血盟帖\",\n        \"gakuen yuushabu\": \"学園勇者部\",\n        \"gakugen\": \"楽玄\",\n        \"gakupoppo\": \"牙九ぽっぽ\",\n        \"galapagos\": \"ガラパゴス\",\n        \"galaxy ginga\": \"ギャラクシー銀河\",\n        \"galaxy style\": \"GALAXY STYLE\",\n        \"galerie.\": \"Galerie.\",\n        \"galette\": \"Galette\",\n        \"gallery culter\": \"Gallery Culter\",\n        \"gallery walhalla\": \"gallery walhalla\",\n        \"gallerycraft\": \"ギャラリークラフト\",\n        \"galley\": \"Galley\",\n        \"gallop\": \"gallop\",\n        \"gallphilia\": \"gallphilia\",\n        \"galvas\": \"GALVAS\",\n        \"gamanjiru-ni-chinpaipai\": \"我☆慢☆汁にチンパイパイ\",\n        \"game dome\": \"GAME DOME\",\n        \"game dome ariake\": \"GAME DOME 有明店\",\n        \"game dome hamamatsuchouten\": \"GAME DOME 浜松町店\",\n        \"game technopolis\": \"GAMEテクノポリス\",\n        \"gamenhaji\": \"がめんはじ\",\n        \"gamenhaji no yoru\": \"画面端の夜\",\n        \"games express\": \"ゲーム・エクスプレス\",\n        \"gamugumi\": \"ガムグミ\",\n        \"gamute de kotei\": \"ガムテで固定\",\n        \"ganbari machine\": \"ガンバリマシン\",\n        \"gang koubou\": \"ぎゃんぐ工房\",\n        \"ganmenki joe\": \"巌面鬼JOE\",\n        \"ganmo-no-oyatsu\": \"がんものおやつ\",\n        \"ganmou koubou\": \"がんもぅ工房\",\n        \"ganso sonodaya\": \"元祖園田屋\",\n        \"gaptax\": \"GapTax\",\n        \"gara ayuri nisshi\": \"柄あゆり日誌\",\n        \"garage-talk\": \"garage-talk\",\n        \"garakuta ga oka\": \"ガラクタが丘\",\n        \"garakuta teikoku\": \"がらくた帝國\",\n        \"garakuta-ya\": \"我楽多屋\",\n        \"garam\": \"ガラム\",\n        \"garamumasara\": \"がらむまさら\",\n        \"garandou\": \"がらんどう\",\n        \"garbage\": \"がーべいじ\",\n        \"garden in the air\": \"Garden in the Air\",\n        \"gargoyle\": \"Gargoyle\",\n        \"garigarigari\": \"がりがりがり\",\n        \"garland\": \"Garland\",\n        \"garou kissa hapido\": \"画廊喫茶はぴど\",\n        \"gasayabu\": \"がさやぶ\",\n        \"gashadokuro\": \"がしゃどくろ\",\n        \"gasoku\": \"GASOKU\",\n        \"gate two\": \"GATE TWO\",\n        \"gateau scotch\": \"ガトースカッチ\",\n        \"gaten\": \"画展\",\n        \"gattomakia\": \"ガットマキア\",\n        \"gauloises blue\": \"GAULOISES BluE\",\n        \"gaus\": \"GAUS\",\n        \"gawwow\": \"gawwow!\",\n        \"gby\": \"GBY\",\n        \"gc-dan\": \"GC団\",\n        \"gdmd.\": \"gdmd.\",\n        \"geafcart\": \"ギーフカート\",\n        \"geboku shuppan\": \"下僕出版\",\n        \"gedou shoukai\": \"外道商会\",\n        \"gehlenite\": \"Gehlenite\",\n        \"geiwamiwosukuu\": \"芸は身を救う!!\",\n        \"gekidan asaroku\": \"劇団あさろく\",\n        \"gekidan bunshichi\": \"劇団文七\",\n        \"gekidan kinmirai\": \"劇團近未来\",\n        \"gekidan onigashima\": \"劇団☆鬼ヶ島\",\n        \"gekijou pierrot\": \"激情ピエロ\",\n        \"gekikara\": \"GEKIKARA\",\n        \"gekirou director\": \"激浪Director\",\n        \"gekiteki gekidan l\": \"劇的劇団エル\",\n        \"gekka bijin\": \"月下美刃\",\n        \"gekka no neko\": \"月華の猫\",\n        \"gekkan hitorizumou\": \"月刊一人相撲\",\n        \"gekkan toshiue milk tank\": \"月刊年上ミルクタンク\",\n        \"gekkou sanctuary\": \"月光サンクチュアリ\",\n        \"gekkou tei\": \"月光亭\",\n        \"gekkou touzoku\": \"月光盗賊\",\n        \"gekkou-dou\": \"月咬洞\",\n        \"gekkouya\": \"げっこうや\",\n        \"gelatin utopia\": \"ゼラチンユートピア\",\n        \"gem\": \"GEM\",\n        \"gemasyafyu\": \"ゲマシャフュ\",\n        \"gemou the cat\": \"ゲモウ the Cat\",\n        \"gen sou dokoro\": \"幻創処\",\n        \"genei teito\": \"幻影帝都\",\n        \"geneihohjin\": \"幻影法人\",\n        \"general tank\": \"じぇねらるたんく\",\n        \"genetrix\": \"GENETRIX\",\n        \"genkei yuugi\": \"幻繋遊戯\",\n        \"genki honpo\": \"元気本舗\",\n        \"genki no mizu no wakutokoro\": \"げんきのみずのわくところ\",\n        \"genkotsu dan\": \"げんこつ団\",\n        \"genmonrou\": \"幻門楼\",\n        \"genocide\": \"GENOCIDE\",\n        \"genocide niku shoujo\": \"ジェノサイド肉少女\",\n        \"genocidou\": \"ジェノサイ堂\",\n        \"genshoku sweets\": \"原色スイーツ\",\n        \"genshoudou\": \"幻笙堂\",\n        \"gensou eigakan\": \"幻創映画館\",\n        \"gensou graphics\": \"幻想グラフィックス\",\n        \"gensou hack\": \"幻想ハック\",\n        \"gensou kuukan\": \"幻蒼空間\",\n        \"gensou kyoukai\": \"幻想協会\",\n        \"gensou mikan\": \"幻想美甘\",\n        \"gensou pheles\": \"幻想フェレス\",\n        \"gensou seimeitai\": \"幻想生命体\",\n        \"gensyokuhakoniwa\": \"原色箱庭\",\n        \"gentei mikan\": \"限定蜜柑\",\n        \"gentleman trap\": \"紳士罠\",\n        \"gentou matenrou\": \"幻灯摩天楼\",\n        \"genussmittel\": \"ゲヌスミッテル\",\n        \"genyukyo\": \"幻遊郷\",\n        \"geosiphon\": \"Geosiphon\",\n        \"geranium\": \"GERANIUM\",\n        \"gerhard\": \"GERHARD\",\n        \"german kartoffel\": \"じゃーまんかとっふぇる\",\n        \"gerudochuu oukoku\": \"げるどちゅう王国\",\n        \"gesellschaft\": \"ゲゼルシャフト\",\n        \"gessen do\": \"月泉堂\",\n        \"gessyu\": \"げっしゅ\",\n        \"gesuko no heya\": \"ゲス子のへや\",\n        \"getsusekai\": \"月世界\",\n        \"getsuyoubi no brenda\": \"月曜日ノぶれんだ\",\n        \"gettsu\": \"GETTSU\",\n        \"gewalt\": \"Gewalt\",\n        \"gh\": \"GH\",\n        \"gh.k\": \"GH.K\",\n        \"ghost\": \"Ghost\",\n        \"gift\": \"Gift\",\n        \"giftbell\": \"ぎふとべる\",\n        \"giftkuchen\": \"GiftKuchen\",\n        \"gigameka\": \"ギガメーカー\",\n        \"giman no hakoniwa\": \"欺瞞の箱庭\",\n        \"gimme logic\": \"Gimme Logic\",\n        \"gimmix\": \"ギミックス\",\n        \"gin no ringo\": \"銀の林檎\",\n        \"gin penguin\": \"銀ぺんぎん\",\n        \"ginchaya\": \"銀茶屋\",\n        \"gindokei\": \"銀時計\",\n        \"ginga toppuu\": \"銀河突風\",\n        \"ginga-ryusei\": \"銀河流星\",\n        \"ginger\": \"Ginger\",\n        \"gingerblend\": \"Gingerblend\",\n        \"ginhakushi\": \"銀白紙\",\n        \"giniro noel\": \"銀色ノエル\",\n        \"ginjou maggots\": \"吟醸マゴッツ\",\n        \"ginshari.\": \"ぎんしゃり。\",\n        \"ginsiba.\": \"ぎんしば。\",\n        \"ginto\": \"銀兎\",\n        \"gioncarnival\": \"擬音謝肉祭\",\n        \"gipsy underground\": \"Gipsy underground\",\n        \"girigiri nijiiro\": \"ギリギリ虹色\",\n        \"girigiri works\": \"ギリギリWorks\",\n        \"girin mahha\": \"ぎんりんまっは\",\n        \"girlboy\": \"Girlboy\",\n        \"girls kingdom\": \"少女の王国\",\n        \"girls residence\": \"GIRLS RESIDENCE\",\n        \"girls-potion\": \"Girls-Potion\",\n        \"girls...now\": \"Girls...Now\",\n        \"girlsport\": \"GirlSport\",\n        \"giro chinko shoukai\": \"ギロ・チン子商会\",\n        \"giroutei\": \"妓楼亭\",\n        \"giuniuya\": \"ぎうにう屋\",\n        \"gj-x\": \"GJ-X\",\n        \"gkvoltage\": \"GKボルテージ\",\n        \"glace\": \"GLace\",\n        \"glamour works\": \"GLAMOUR WORKS\",\n        \"glass no kabocha\": \"ガラスのカボチャ\",\n        \"glass wall garden\": \"ぐらすうぉーるがーでん\",\n        \"glassed concrete\": \"ガラストコンクリート\",\n        \"glasses perser\": \"グラセスパーサー\",\n        \"glassfiber\": \"グラスファイバー\",\n        \"glaze\": \"glaze\",\n        \"gleipnir\": \"Gleipnir\",\n        \"globe\": \"GLOBE\",\n        \"glutamic acid\": \"GLUTAMIC:ACID\",\n        \"gmr\": \"牛MR\",\n        \"go go heaven\": \"Go! Go! Heaven!!\",\n        \"go-go-merry-go-round\": \"Go-Go-Merry-Go-Round\",\n        \"goberazzo\": \"ごべらっつぉ\",\n        \"god hand mar\": \"God Hand Mar\",\n        \"godbirdlove\": \"ゴッドバードLOVE\",\n        \"goddandies\": \"GodDandies\",\n        \"godfinmew\": \"Godfinmew\",\n        \"godone syndrome\": \"五度寝シンドローム\",\n        \"gohanya\": \"ごはん屋\",\n        \"gohyakuen chokinbako\": \"五百円貯金箱\",\n        \"gokakukansuu\": \"五角関数\",\n        \"gokigen takabisha\": \"ゴキゲン高飛車\",\n        \"goku-raku\": \"GOKU-RAKU\",\n        \"gokuaku shounin henshuubu\": \"極悪商人編集部\",\n        \"gokufero\": \"極フェロ\",\n        \"gokuraku-chou yon-choume\": \"獄楽町四丁目\",\n        \"gokutsubushi\": \"穀潰し\",\n        \"gold dust\": \"GOLD DUST\",\n        \"gold koman sex\": \"GOLD KOMAN SEX\",\n        \"gold leaf\": \"GOLD LEAF\",\n        \"gold lip\": \"ゴールドリップ\",\n        \"gold ninja\": \"黄金忍者\",\n        \"gold rush\": \"GOLD RUSH\",\n        \"golden bat\": \"GOLDEN BAT\",\n        \"golden fever\": \"ゴールデンフィーバー\",\n        \"golden tube\": \"ゴールデンチューブ\",\n        \"goldendawn89\": \"GoldenDawn89\",\n        \"golem inc.\": \"Golem Inc.\",\n        \"goma brothers\": \"ごまブラザーズ\",\n        \"goma hangetsu\": \"ごまはんげつ\",\n        \"gomadoufu\": \"ごまどうふ\",\n        \"gomafu toufudou\": \"ゴマフ豆腐堂\",\n        \"gomaneko brief\": \"ごまねこブリーフ\",\n        \"gomigomi seisaku iinkai\": \"ゴミゴミ制作委員会\",\n        \"gomix\": \"GOMIX!\",\n        \"gomiyashiki\": \"五三八式\",\n        \"gomoku gohan\": \"五目ごはん\",\n        \"gomuhachi\": \"ごむはち\",\n        \"goo-paaa\": \"goo-paaa\",\n        \"good bye life\": \"Good Bye Life\",\n        \"goodluck\": \"Goodluck\",\n        \"goodsleep\": \"GoodSleep!\",\n        \"goosebumps\": \"goosebumps\",\n        \"goraku hiroba\": \"娯楽広場\",\n        \"gorgeous lunch\": \"ゴージャスランチ\",\n        \"gorichu\": \"ゴリッチュ\",\n        \"gorigorilland\": \"ゴリゴリランド\",\n        \"gorilion\": \"ゴリライオン\",\n        \"gorilla gang dan\": \"ゴリラギャング団\",\n        \"gorilla squad\": \"ゴリラスクワッド\",\n        \"gorilla typhoon\": \"ゴリラタイフーン\",\n        \"gorinjuu\": \"ご臨終\",\n        \"goro mask\": \"クチナシ館\",\n        \"gorori no diy\": \"ゴロリのDIY\",\n        \"gorotaishi\": \"五郎太石\",\n        \"gos to vi\": \"gos to vi\",\n        \"gosousha\": \"護送車\",\n        \"gossipgothic\": \"ごしっぷごしっく\",\n        \"gosuidou\": \"午睡堂\",\n        \"gothical blade\": \"GOTHICAL BLADE\",\n        \"gothya\": \"ゴス屋\",\n        \"gotouroku-goku\": \"誤登録語句\",\n        \"gouon\": \"轟音\",\n        \"gouriki hyakkaten\": \"剛力百貨店\",\n        \"gouten doujou\": \"轟天道場\",\n        \"goutwollow\": \"GoutWolloW\",\n        \"gozen shichiji no awase kagami\": \"午前七時の合わせカガミ\",\n        \"gozenrokuji\": \"午前六時\",\n        \"gpen\": \"じーぺん\",\n        \"gpx\": \"GPX\",\n        \"grace\": \"Grace\",\n        \"grachegrache\": \"ぐらっちぇぐらっちぇ\",\n        \"graf zeppelin\": \"Graf Zeppelin\",\n        \"grafroller\": \"Grafroller\",\n        \"granberry heaven\": \"グランベリーヘヴン\",\n        \"grand cru\": \"Grand Cru\",\n        \"grand-nauts\": \"grand-nauts\",\n        \"grand-slum\": \"grand-slum\",\n        \"graphicarossa\": \"GRAPHICAROSSA\",\n        \"grary\": \"Grary\",\n        \"grassturtle\": \"グラスタートル\",\n        \"grauer hase\": \"グラウエルハーゼ\",\n        \"gravidan\": \"ぐらヴィ団\",\n        \"graygreed\": \"graygreed\",\n        \"grazie\": \"grazie\",\n        \"grease pencil\": \"グリースペンシル\",\n        \"great acta\": \"GREAT芥\",\n        \"great dadan\": \"ぐれいと・だだん\",\n        \"greatest kyuutei\": \"グレイテスト宮廷\",\n        \"green ketchup\": \"グリーンケチャップ\",\n        \"green star\": \"GREEN STAR\",\n        \"green tea lab\": \"Green tea Lab\",\n        \"greenhouse\": \"ぐりいん野はうす\",\n        \"greg soujou\": \"グレッグ僧正\",\n        \"greone\": \"GREONE\",\n        \"greyhound\": \"Greyhound\",\n        \"group 601\": \"グループ601\",\n        \"group hinoran\": \"ぐる～ぷひのらん\",\n        \"group i.n\": \"グループI・N\",\n        \"group neko\": \"グループNEKO\",\n        \"grungeworks\": \"GRUNGE WORKS\",\n        \"gt works\": \"GT Works\",\n        \"gu no nai curry\": \"具のないカレー\",\n        \"guchi wotabatake\": \"愚痴ヲタ畑\",\n        \"gudon-no-uta\": \"ぐどんの歌\",\n        \"guhan shounen\": \"虞犯少年\",\n        \"guild plus\": \"Guild Plus\",\n        \"guillotine mozzarella\": \"ぎろちんモッツァレラ\",\n        \"gul-fuh\": \"Gul-Fuh\",\n        \"gulf stream\": \"Gulf Stream\",\n        \"gum base\": \"ガムベース\",\n        \"gum junky\": \"ガムジャンキー\",\n        \"gumi syrup\": \"グミシロップ\",\n        \"guminchu\": \"ぐみんちゅ\",\n        \"gummy-rise\": \"ガミ・ライズ\",\n        \"gun modoki\": \"群モドキ\",\n        \"gunjou kakumei\": \"群青革命\",\n        \"gunjougoya\": \"群青小屋\",\n        \"gunp\": \"GUNP\",\n        \"guntank\": \"ガンタンク\",\n        \"gurasan boots\": \"ぐらさんぶーつ\",\n        \"guru guru honpo\": \"ぐるぐる本舗\",\n        \"guruguru honpo\": \"ぐるぐる本舗\",\n        \"guruguru taiyo\": \"ぐるぐる太陽\",\n        \"gurumedou\": \"ぐるめ堂\",\n        \"gurumepoppo\": \"ぐるめポッポ\",\n        \"gururido\": \"ぐるり堂\",\n        \"gusha\": \"グシャ!!\",\n        \"gutari-ya\": \"ぐたり屋\",\n        \"gutenberg no musume\": \"グーテンベルグの娘\",\n        \"guts ichimotsu\": \"ガッツいちもつ\",\n        \"guy-ya\": \"男屋\",\n        \"guybase\": \"GUY基地\",\n        \"gyara cter\": \"ギャラ☆クター\",\n        \"gyarandoh\": \"逆乱堂\",\n        \"gyarandou\": \"ぎゃらん堂\",\n        \"gyf-107\": \"GYF-107\",\n        \"gymno\": \"gymno\",\n        \"gyogyou rengou\": \"漁業連合\",\n        \"gyokotsu kouzou\": \"魚骨工造\",\n        \"gyokumi\": \"漁組\",\n        \"gyokusai club\": \"玉砕倶楽部\",\n        \"gyokusaidan\": \"玉砕団\",\n        \"gyokusaijima\": \"玉砕島\",\n        \"gyomania\": \"ギョマニア\",\n        \"gyotaku\": \"魚拓\",\n        \"gyoubudou\": \"刑部堂\",\n        \"gyoukousyu\": \"僥倖酒\",\n        \"gyoutenriki\": \"仰天力\",\n        \"gyunyu-gekijo\": \"牛乳劇場\",\n        \"gyutto dakishimetai\": \"ギュっと抱きしめ隊\",\n        \"gyuunyuuya\": \"牛乳屋\",\n        \"gyuutou chikujinkai\": \"牛頭畜人会\",\n        \"h and k\": \"H&K\",\n        \"h na hon. ya san.\": \"Hなほん。やさん。\",\n        \"h plus\": \"H+\",\n        \"h senshokutai\": \"H染色体\",\n        \"h-net\": \"H-net\",\n        \"h-squad\": \"H-SQUAD\",\n        \"h-sys.\": \"H-sYS.\",\n        \"h.a.h.g.s\": \"H.A.H.G.S\",\n        \"h.h\": \"H.H\",\n        \"h.i.t. koubou\": \"H.I.T.工房\",\n        \"h.p.c. meirei denpa\": \"H.P.C命令電波\",\n        \"h.p.d.\": \"H.P.D.\",\n        \"h.s.c.\": \"H.S.C.\",\n        \"h3i\": \"H×3I\",\n        \"haa haa works\": \"はぁはぁWORKS\",\n        \"hacca candy\": \"薄荷キャンディー\",\n        \"hacchakesou\": \"はっちゃけ荘\",\n        \"hachi\": \"hachi\",\n        \"hachibanchi no kaijin\": \"八番地の怪人\",\n        \"hachigatsu futsuka\": \"八月二日\",\n        \"hachijikan roudou\": \"はちじかんろーどー\",\n        \"hachikoromura\": \"はちころ村\",\n        \"hachimidosan\": \"八緑緑緑\",\n        \"hachimin\": \"ハチミン\",\n        \"hachimitsu himawari\": \"ハチミツヒマワリ\",\n        \"hachimitsu pineapple\": \"はちみつパイナップル\",\n        \"hachimitsu sand\": \"はちみつサンド\",\n        \"hachimitsu soft\": \"はちみつそふと\",\n        \"hachiwaredou\": \"ハチワレ堂\",\n        \"hachiyou\": \"蜂様\",\n        \"hadairo crayon\": \"はだいろクレヨン\",\n        \"hadairo rooibos tea\": \"肌色ルイボスティー\",\n        \"hadairozanmai\": \"肌色三昧\",\n        \"hadantorque\": \"破断torque\",\n        \"hadashi shoujo\": \"裸足少女\",\n        \"haekake\": \"生えかけ\",\n        \"haeya\": \"南風屋\",\n        \"hagane koubou\": \"鋼工房\",\n        \"hagane no naru ki\": \"羽鐘の鳴る木\",\n        \"hagane no tsurugi\": \"はがねのつるぎ\",\n        \"hagure maron\": \"はぐれまろん\",\n        \"haguruma\": \"はぐるま\",\n        \"haguruman\": \"はぐるまん\",\n        \"hai-tai\": \"胚胎\",\n        \"haiana gumentai\": \"肺穴愚麺隊\",\n        \"haiboku kamen\": \"敗北仮面\",\n        \"haidara\": \"haidara\",\n        \"haigoku ryodan\": \"廃獄旅団\",\n        \"haiiro jikuu\": \"灰色時空\",\n        \"haiiro koubou betsumune\": \"灰色工房別棟\",\n        \"haiiro ookami\": \"灰色狼\",\n        \"haikara cafe\": \"ハイカラ喫茶\",\n        \"haikibutsushorijou\": \"廃棄物処理場\",\n        \"haikiro\": \"灰奇路\",\n        \"haikuo-soft\": \"ハイクオソフト\",\n        \"haim mint\": \"ハイムミント\",\n        \"haine club\": \"灰猫倶楽部\",\n        \"hairyo fusoku\": \"配慮不足\",\n        \"haisui no jin\": \"ハイスイノ陣\",\n        \"haitokukan\": \"背德漢\",\n        \"hajimari to owari\": \"はじまりとおわり\",\n        \"hakaba\": \"墓場\",\n        \"hakidame no koganemushi\": \"掃き溜めのこがねむし\",\n        \"hakka onsen\": \"ハッカ温泉\",\n        \"hakkakyou\": \"八卦鏡\",\n        \"hakkekkyuu sekkekkyuu\": \"白血球赤血球\",\n        \"hakkindo\": \"白金堂\",\n        \"hakobune\": \"箱舟\",\n        \"hakkou kimuti\": \"発光きむち\",\n        \"hakoniwa toshokan\": \"ハコニワトショカン\",\n        \"hakonyan.\": \"はこにゃん。\",\n        \"hakorimu\": \"はこりむ\",\n        \"hakubajin\": \"はくばじん\",\n        \"hakuchuu doudou\": \"白昼堂々\",\n        \"hakuchuu shobou\": \"白昼書房\",\n        \"hakudakukei\": \"白濁系\",\n        \"hakuginkan\": \"白銀冠\",\n        \"hakugyoku aquarea\": \"白玉アクエリア\",\n        \"hakushu kassai\": \"拍手喝罪\",\n        \"hakusuijuko\": \"白水重工\",\n        \"hakusyoku miminagaten\": \"白触耳長店\",\n        \"hakutoukai\": \"白糖会\",\n        \"hakuzendo honpo\": \"白髯堂本舗\",\n        \"halcyon\": \"Halcyon\",\n        \"halcyon factory\": \"Halcyon Factory\",\n        \"halcyon maker\": \"ハルシオンメーカー\",\n        \"half mile\": \"はーふまいる\",\n        \"hallenchi planet\": \"ハレンチプラネット\",\n        \"hallucigenia\": \"ハルキゲニア\",\n        \"halopack\": \"HALOぱっく\",\n        \"haltype\": \"ハルタイプ\",\n        \"halumonica\": \"Halumonica\",\n        \"halvetica\": \"HALvetica\",\n        \"halworks\": \"HALWORKS\",\n        \"hamabeuo\": \"ハマベウオ\",\n        \"hamachi tomosaku\": \"ハマチトモサク\",\n        \"hamaiya\": \"はまい屋\",\n        \"hamanan-doboku\": \"浜南土木\",\n        \"hamanasu chaya\": \"はまなす茶屋\",\n        \"hamasei\": \"浜せい\",\n        \"hamehame service area\": \"はめはめサービスエリア\",\n        \"hamham soft\": \"はむはむソフト\",\n        \"hamiheya\": \"はみ部屋\",\n        \"hammer head\": \"HAMMER_HEAD\",\n        \"hamustar\": \"ハム星\",\n        \"hamusuta-nonikomi\": \"ハムスターの煮込み\",\n        \"hana tabako\": \"花煙草\",\n        \"hana to ribon\": \"華とりぼん\",\n        \"hana x hana\": \"花*はな\",\n        \"hanada\": \"縹\",\n        \"hanadorobou\": \"花泥棒\",\n        \"hanafubuki gorilla\": \"花吹雪ゴリラ\",\n        \"hanagara shirt\": \"花柄シャツ\",\n        \"hanairogaeru\": \"花色蛙\",\n        \"hanaji koubou\": \"鼻血工房\",\n        \"hanakuchi mememe\": \"はなくちめめめ\",\n        \"hanamachi horebore chou\": \"花町ホレボレ丁\",\n        \"hanamachi shimaiten\": \"花街姉妹店\",\n        \"hanami-ga saku\": \"花実ガ咲ク\",\n        \"hanamiduki\": \"華みづき\",\n        \"hanamuguri\": \"花潜\",\n        \"hanao shouke\": \"花尾娼家\",\n        \"hanasameyashiro\": \"花雨社\",\n        \"hanaya\": \"華屋\",\n        \"hanbyounin\": \"半病人\",\n        \"hand-grip\": \"はんどぐりっぷ\",\n        \"handful happiness\": \"Handful☆Happiness!\",\n        \"hang on\": \"ハングオン\",\n        \"hanger hansha\": \"ハンガー反射\",\n        \"hanibi land\": \"hanibi land\",\n        \"hanigura soft\": \"はにぐらそふと\",\n        \"haniwa mania\": \"ハニワマニア\",\n        \"haniya\": \"はに屋\",\n        \"hanjuku kinokotei\": \"半熟茸亭\",\n        \"hanjuku nora\": \"ハンジュクノラ\",\n        \"hanjuku yude tamago\": \"半熟茹で卵\",\n        \"hannama\": \"はんなま\",\n        \"hanshi x hanshow\": \"半死半生\",\n        \"hanya yashiki\": \"はにゃ屋敷\",\n        \"hanyan\": \"覇娘。\",\n        \"hanzai tengoku\": \"犯罪天国\",\n        \"haochi\": \"haochi\",\n        \"haoh\": \"覇王\",\n        \"hapa\": \"ハーパー\",\n        \"hapihapi\": \"hapihapi\",\n        \"happaya\": \"葉っぱ屋\",\n        \"happiness milk\": \"はぴねすみるく\",\n        \"happo ryuu\": \"HAPPO流\",\n        \"happy drive\": \"はっぴぃどらいぶっ!\",\n        \"happy life\": \"Happy Life\",\n        \"happy lime\": \"はっぴぃライム\",\n        \"happy man\": \"Happy Man\",\n        \"happy paranoia\": \"ハッピーパラノイア\",\n        \"happy present\": \"はっぴーぷれぜんと\",\n        \"happy strawberry\": \"はっぴーすとろべりー\",\n        \"happy studio\": \"HAPPY STUDIO\",\n        \"happy time\": \"ハッピータイム\",\n        \"happy turn\": \"はっぴ〜た〜ん\",\n        \"happy unbirthday\": \"HAPPY UNBIRTHDAY\",\n        \"happydrop\": \"Happydrop\",\n        \"happypink\": \"happypink\",\n        \"hara-zoo\": \"HARA-ZOO\",\n        \"haradaya\": \"原田屋\",\n        \"haraguro tenshi\": \"腹黒天使\",\n        \"haraise kaiwai\": \"ハライセカイワイ\",\n        \"harakiri gozen\": \"ハラキリ御膳\",\n        \"harakiri yakkyoku\": \"腹切薬局\",\n        \"harako misshitsu\": \"はらこ密室\",\n        \"haranabi shuppan\": \"はらなび出版\",\n        \"harapecodonburi\": \"はらぺこどんぶり\",\n        \"harapekkoken\": \"ハラペッコケン\",\n        \"harapeko shucchoujo\": \"はらぺこ出張所\",\n        \"harapeko teishoku\": \"はらぺこ定食\",\n        \"harapekopon\": \"はらぺこぽん\",\n        \"haratama\": \"ハラタマ\",\n        \"hard days\": \"hard days\",\n        \"hard hypno\": \"HARD HYPNO\",\n        \"hard lucker\": \"Hard Lucker\",\n        \"hard puncher maniax\": \"Hard Puncher Maniax\",\n        \"hardcore 001\": \"ハードコア001\",\n        \"hardcore zayaku souten\": \"ハードコアザヤクソウテン\",\n        \"hardcore zutsuu\": \"ハードコア頭痛\",\n        \"harem\": \"Harem\",\n        \"harem heat\": \"ハーレムヒート\",\n        \"haresaku\": \"ハレサク\",\n        \"hari poteto\": \"はりぽてと\",\n        \"hariko no tora\": \"はりこのとら\",\n        \"harinezumi koubou\": \"はりねずみ工房\",\n        \"hariwata\": \"hariwata\",\n        \"harmorise\": \"Harmorise\",\n        \"harness\": \"HARNESS\",\n        \"harogen\": \"ハロゲン\",\n        \"harshwordsworth\": \"harshwordsworth\",\n        \"haru mochi\": \"はるもち\",\n        \"haru youbi\": \"春曜日\",\n        \"harugoya\": \"はるごや\",\n        \"harugumo.\": \"はるぐも。\",\n        \"haruiro fudepen\": \"はルいろ筆ペン\",\n        \"haruiro no sora\": \"春色の空\",\n        \"harukaze\": \"HARUKAZE\",\n        \"harukomachikan.\": \"はるこまちかん。\",\n        \"harumachi tsurara\": \"春待氷柱\",\n        \"harumankai\": \"はるまん会\",\n        \"harumichi\": \"ハルミチ\",\n        \"harunoyu\": \"ハルノユ\",\n        \"harureri\": \"はるれり\",\n        \"harusame lunch b set\": \"はるさめランチBセット\",\n        \"harusame-soup\": \"はるさめすぅぷ\",\n        \"harvest\": \"HARVEST\",\n        \"harvest home\": \"ハーベストホーム\",\n        \"hashi to knife de niku wo kiru\": \"はしとナイフで肉を切る\",\n        \"hashikure koubou\": \"はしくれ工房\",\n        \"hasoyua\": \"ハソユア\",\n        \"hasshaku-sama\": \"八尺様\",\n        \"hastured cake\": \"ハスタードケーキ\",\n        \"hasuya\": \"はす家\",\n        \"hatahata factory\": \"ハタハタ工房\",\n        \"hatake no oniku\": \"はたけのお肉\",\n        \"hato suppressor\": \"ハトサプレッサー\",\n        \"hatogoya\": \"鳩小屋\",\n        \"hatomame\": \"ハトマメ\",\n        \"hatomugi x genmai\": \"はとむぎげんまい\",\n        \"hatosable\": \"ハトサブレ\",\n        \"hatsuai roumanjou\": \"初愛浪漫帖\",\n        \"hatsuen kikan\": \"発煙器官\",\n        \"hatsushio\": \"ハツ塩\",\n        \"hattari dou\": \"はったり堂\",\n        \"havemoon\": \"はべむん\",\n        \"hawk bit\": \"ホークビット\",\n        \"hayaku byouin e itte kudasai\": \"早く病院へ行ってください\",\n        \"hayashi puramoten\": \"はやしプラモ店\",\n        \"hayo-cinema\": \"はよしねま\",\n        \"hayonipo\": \"はよにぽ\",\n        \"hazama\": \"狭間\",\n        \"hazuki tsuitachi\": \"葉月一日\",\n        \"hb\": \"HB\",\n        \"hbo\": \"HBO\",\n        \"hcg\": \"HCG\",\n        \"hcom\": \"hcom\",\n        \"header liner\": \"へっだらいなー\",\n        \"headroom\": \"HEADROOM\",\n        \"healthy prime\": \"HEALTHY PRIME\",\n        \"heart ga hitotsu\": \"ハートがひとつ\",\n        \"heart house\": \"HEART HOUSE\",\n        \"heart of cool\": \"Heart of cooL\",\n        \"heart some bread\": \"heart some bread\",\n        \"heart tail\": \"ハートテイル\",\n        \"heart work\": \"HEART WORK\",\n        \"heartfolio\": \"Heartfolio\",\n        \"heartless k\": \"ココロナシK\",\n        \"hearts\": \"Hearts\",\n        \"hearts and crusts\": \"HEARTS & CRUSTS\",\n        \"hearts nest\": \"Heart's Nest\",\n        \"heat-soft\": \"HEAT-SOFT\",\n        \"heavenstar\": \"ヘヴンスター\",\n        \"heavenly\": \"heavenLy\",\n        \"heavens\": \"HEAVENS\",\n        \"heavens gate\": \"Heaven's Gate\",\n        \"heavens unit\": \"HEAVEN'S UNIT\",\n        \"heavy syrup\": \"Heavy syrup\",\n        \"hebereke black7\": \"へべれけBLACK7\",\n        \"hebichang\": \"へびちゃんぐ\",\n        \"hebitunagary\": \"ヘビツナガリ\",\n        \"hechima koubou\": \"へちま工房\",\n        \"hechima teishoku\": \"ヘチマ定食\",\n        \"hechocho\": \"ヘ蝶々\",\n        \"hegurimurayakuba\": \"へぐり村役場\",\n        \"heiantei\": \"平安亭\",\n        \"heika hp\": \"HEIKA HP\",\n        \"heikoto\": \"へいこと\",\n        \"heikoushihenkei\": \"平行四辺形\",\n        \"heineken\": \"Heineken\",\n        \"heinetsu 37 degrees celsius\": \"平熱37°C\",\n        \"heinetsu 98.5 degrees v\": \"平熱98.5°V\",\n        \"heisei chachamaru dou\": \"平成茶々丸堂\",\n        \"heisei metal gakuen\": \"平成メタル学園\",\n        \"heisen-dou\": \"へいせん堂\",\n        \"heiwa seisakujo\": \"平和製作所\",\n        \"heiyou kinki.\": \"ヘイヨウキンキ。\",\n        \"hekiga ni nemuru\": \"壁画に眠る\",\n        \"hekireki\": \"霹靂\",\n        \"hekiten industrial complex\": \"碧天コンビナート\",\n        \"hekohekoroid shidan\": \"へこへこロイド師団\",\n        \"helicalrizing\": \"HelicaLRizinG\",\n        \"hell-ion\": \"HELL-ION\",\n        \"helldevice\": \"HellDevice\",\n        \"hellenism\": \"へれニズム\",\n        \"hellfragrance\": \"ヘルフレグランス\",\n        \"hello girls\": \"Hello Girls!\",\n        \"hellter skelter\": \"ヘルタースケルター\",\n        \"helmet ga naosemasen\": \"ヘルメットが直せません\",\n        \"hemelopa\": \"HeMeLoPa\",\n        \"henderson\": \"HENDERSON\",\n        \"hending\": \"Hending\",\n        \"hentai emblem\": \"へんたいゑむぶれむ\",\n        \"hentai maker tomo no kai\": \"Hentai Maker 友の会\",\n        \"hentai musume\": \"へんたい娘\",\n        \"hentai ojisan\": \"ヘンタイオジサン\",\n        \"hentai to hentai no hentai\": \"HENTAI to HENTAI no HENTAI\",\n        \"hentaiworks\": \"hentaiworks\",\n        \"henyottobird\": \"へにょっとばーど\",\n        \"hep\": \"HEP\",\n        \"heppoko housing\": \"へっぽこはうじんぐ\",\n        \"heppoko youchien\": \"へっぽこ幼稚園\",\n        \"heppokodou\": \"へっぽこ堂\",\n        \"herencia\": \"HERENCIA\",\n        \"hermes shobou\": \"ヘルメス書房\",\n        \"hermit\": \"ハーミット\",\n        \"hermit9\": \"ハーミット9\",\n        \"heroes factory\": \"HEROES FACTORY\",\n        \"herohero hospital\": \"へろへろHospital\",\n        \"heroine engineering\": \"ヒロイン工学研究所\",\n        \"heroineism\": \"Heroineism\",\n        \"herunia tengoku\": \"ヘルニア天国\",\n        \"heshi factory\": \"HESHI FACTORY\",\n        \"hesogoma\": \"へそごま\",\n        \"hesoten\": \"ヘソてん\",\n        \"heta no yoko zuki\": \"ヘタの横好き\",\n        \"hetalearts\": \"ヘタレアーツ\",\n        \"hetaretch\": \"へたれっち\",\n        \"hetchhog\": \"へっちほっぐ\",\n        \"hews\": \"Hews\",\n        \"hexaflange\": \"hexaflange\",\n        \"hexagram point\": \"ヘキサグラムポイント\",\n        \"hexenhaus\": \"ヘクセンハウス\",\n        \"hey you\": \"hey you!\",\n        \"heya no sumi.\": \"部屋の隅。\",\n        \"hgh\": \"HGH\",\n        \"hgt labo\": \"HGTラボ\",\n        \"hhb\": \"hhb\",\n        \"hht\": \"HHT\",\n        \"hi-cal\": \"Hi-CAL\",\n        \"hi-flier\": \"Hi-Flier\",\n        \"hiatari ryoukou\": \"日当良好\",\n        \"hibari\": \"★☆雲雀☆★\",\n        \"hibi kirari production\": \"ひびきらりプロダクション\",\n        \"hibi rakuraku\": \"日日楽楽\",\n        \"hibiiro clutch\": \"ヒビイロクラッチ\",\n        \"hibiki\": \"響輝\",\n        \"hibinoutao\": \"ヒビノウタオ\",\n        \"hibitoridori\": \"日々鳥々\",\n        \"hibon\": \"非凡\",\n        \"hidari kara shitsurei\": \"左から失礼\",\n        \"hidarikiki\": \"HIDARIkiki\",\n        \"hidden sideway\": \"ryuuta\",\n        \"hiensou\": \"飛燕想\",\n        \"hierarchy\": \"ヒエラルキー\",\n        \"hiero\": \"ハイエロ\",\n        \"higashi no penguine\": \"東のペンギン\",\n        \"higasimikawa midoriiro doukoukai\": \"東三河みどり色同好会\",\n        \"hige to deko\": \"Hige to deko\",\n        \"higedaihuku\": \"ひげ大福\",\n        \"higeudon\": \"ひげうどん\",\n        \"high fly flow\": \"はいふらいふろう\",\n        \"high risk revolution\": \"HIGH RISK REVOLUTION\",\n        \"high star\": \"HIGH STAR\",\n        \"high thrust\": \"ハイスラスト\",\n        \"high-spirit\": \"High-Spirit\",\n        \"highdrug\": \"HighDrug\",\n        \"highend\": \"ハイエンド\",\n        \"highleg peach\": \"ハイレグピーチ\",\n        \"highrunning\": \"HighRunning\",\n        \"highway\": \"highway\",\n        \"highway61\": \"Highway61\",\n        \"higouhou shoujo\": \"非合法少女\",\n        \"hihiyama tsuyabon\": \"比比山艶本\",\n        \"hijet\": \"ハイジェット\",\n        \"hijiki-ya\": \"ひじき屋\",\n        \"hijinzou\": \"非人造\",\n        \"hijouguchi\": \"ひじょうぐち\",\n        \"hikage mon\": \"日陰もん\",\n        \"hikagemono\": \"ヒカゲモノ\",\n        \"hikari club\": \"光クラブ\",\n        \"hikari no ki\": \"光の樹\",\n        \"hikari no tomoshibi\": \"光の燭\",\n        \"hikarito mahou koubou\": \"光と魔法工房\",\n        \"hikodge beya\": \"彦二部屋\",\n        \"hikou dai 50 sentai\": \"飛行第50戦隊\",\n        \"hikousensuitei\": \"飛行潜水亭\",\n        \"hiland-studio\": \"ハイランド工房\",\n        \"hima serval\": \"ひまサーバル\",\n        \"himajinism\": \"ひまじにずむ\",\n        \"himameshiki\": \"火豆式\",\n        \"himawari endan\": \"ひまわり園団\",\n        \"himawari seed\": \"ひまわりシード\",\n        \"himawari-noren\": \"向日葵のれん\",\n        \"himawarisou\": \"ひまわり荘\",\n        \"hime club\": \"姫倶楽部\",\n        \"himegami\": \"姫神\",\n        \"himehajime.com\": \"himehajime.com\",\n        \"himepuchitei\": \"ひめぷち亭\",\n        \"himitsu doyoubi\": \"秘密土曜日\",\n        \"himitsu kessha vanitas\": \"秘密結社ヴァニタス\",\n        \"himitsu tetra\": \"ひみつテトラ\",\n        \"hinaeron\": \"ひなえろん\",\n        \"hinahara yashiki\": \"ひなはら屋敷\",\n        \"hinahina box\": \"HINAHINA BOX\",\n        \"hinakan\": \"ひなかん\",\n        \"hinamaru chuujou\": \"ひな丸中将\",\n        \"hinamaru soft\": \"ヒナマルソフト\",\n        \"hinaprin\": \"ひなプリン\",\n        \"hinatabokko\": \"ひなたぼっこ\",\n        \"hinatabokko club\": \"ひなたぼっこ倶楽部\",\n        \"hinauta\": \"ひなうた\",\n        \"hinjyaku\": \"HINJYAKU\",\n        \"hinoenma haken jimukyoku\": \"催眠すし屋\",\n        \"hinoiti\": \"ヒノイティ\",\n        \"hinokiburo\": \"檜風呂\",\n        \"hinokist\": \"hinokist\",\n        \"hinouhe family\": \"ひのうへファミリー\",\n        \"hirani\": \"ヒラマニ\",\n        \"hirame jichiku\": \"ひらめ自治区\",\n        \"hirari\": \"ひらり\",\n        \"hirataira\": \"平平\",\n        \"hired girl\": \"ハイヤードガール\",\n        \"hirekatsu\": \"ヒレカツ\",\n        \"hiroi heya\": \"拾い部屋\",\n        \"hirojuu renshuuchou\": \"広十練習帖\",\n        \"hirokaworld\": \"ヒロカワールド\",\n        \"hirumeshidoki\": \"昼飯時\",\n        \"hirusagari no bijutsukan\": \"昼下がりの美術館\",\n        \"hisoutan\": \"ひそうたん\",\n        \"hispano-suiza\": \"Hispano-Suiza\",\n        \"hissatsuwaza\": \"ひっさつわざ\",\n        \"hisuitei\": \"翡翠亭\",\n        \"hitobankoneko\": \"一晩仔猫\",\n        \"hitodenashi\": \"ひとでなし\",\n        \"hitoe\": \"一重\",\n        \"hitokumi\": \"ひとくみ\",\n        \"hitomaron\": \"ひとまろん\",\n        \"hitonchi\": \"ひとんち\",\n        \"hitori de dekirumon\": \"火鳥でできるもん！\",\n        \"hitori kakumei\": \"一人革命\",\n        \"hitori no daiyokujou\": \"一人の大浴場\",\n        \"hitori online\": \"一人オンライン\",\n        \"hitori tower bridge\": \"ヒトリタワーブリッジ\",\n        \"hitoride dekirumon\": \"ひとりでできるもんっ\",\n        \"hitoriyorihutari\": \"ヒトリヨリフタリ\",\n        \"hitoriyou no pot\": \"ひとりようのポット\",\n        \"hitotosensou\": \"一年戦争\",\n        \"hitoya-r\": \"ヒトヤ-R\",\n        \"hitoyasumi\": \"ひとやすみ\",\n        \"hitstales\": \"ヒッツッツ\",\n        \"hitsuji drill\": \"羊ドリル\",\n        \"hitsuji no munko hiryou\": \"羊のむんこ肥料\",\n        \"hitsuji to kitsune\": \"ひつじときつね\",\n        \"hitsuji-1ban-shibori\": \"ヒツジ一番搾り\",\n        \"hitsujimama\": \"ひつじまま\",\n        \"hitsujin toko\": \"ひつじんトコ\",\n        \"hitsujiniku\": \"ひつじにく\",\n        \"hitujinoki\": \"ひつじの木\",\n        \"hiwatari honpo\": \"樋渡本舗\",\n        \"hiyashi asia\": \"ヒヤシアジア\",\n        \"hiyashi chuuka hajimemashita\": \"冷し中華おわりました\",\n        \"hiyashichuuka hajimemashita\": \"冷やし中華はじめました\",\n        \"hiyocco\": \"HIYOCCO\",\n        \"hiyoko box\": \"ひよこBOX\",\n        \"hiyoko crown\": \"HIYOKO CROWN\",\n        \"hiyoko soft\": \"ひよこソフト\",\n        \"hiyori hamster\": \"ひよりハムスター\",\n        \"hiyorimi no sora\": \"ひよりみのソラ\",\n        \"hiyotamaya\": \"ひよたま屋\",\n        \"hiyoubeya\": \"飛葉部屋\",\n        \"hizadachi bunny\": \"膝立ちバニー\",\n        \"hizamakura\": \"ひざまくら。\",\n        \"hizatora\": \"ヒザトラ\",\n        \"hj production\": \"HJプロダクション\",\n        \"hjukism\": \"HJUKISM\",\n        \"hk\": \"HK\",\n        \"hkmnk\": \"hkmnk\",\n        \"hl\": \"エイチェル\",\n        \"hlz\": \"hlz\",\n        \"hm\": \"HM\",\n        \"hma\": \"HMA\",\n        \"hn.03\": \"Hn.03\",\n        \"hobby land soft\": \"Hobby Land Soft\",\n        \"hochidonmai\": \"ほちどんまい\",\n        \"hoepporoppo\": \"ほえっぽろっぽ\",\n        \"hoge hoge club\": \"ほげほげCLUB\",\n        \"hogege\": \"HOGEGE\",\n        \"hogeplan\": \"HOGEPLAN\",\n        \"hogero kikaku\": \"ほげろー企画\",\n        \"hohhe dan\": \"ほっへ!!団\",\n        \"hokanko\": \"ほかんこ\",\n        \"hokentaiiku\": \"保健体育\",\n        \"hokkahoka-mesotei\": \"ほっかほかめそ亭\",\n        \"hokke\": \"ホッケ\",\n        \"hokke o tabeyou\": \"ほっけを食べよう\",\n        \"hokkebain\": \"ほっけばいん!\",\n        \"hokkepen\": \"ほっけぺん\",\n        \"hokuroza\": \"ホクロ座\",\n        \"hokushintei\": \"北辰亭\",\n        \"hole in one\": \"ほーるいん椀\",\n        \"holiday note\": \"Holiday Note\",\n        \"holiday school\": \"休日学校\",\n        \"holy avenger\": \"ホーリーアベンジャー\",\n        \"holymist\": \"HolyMist\",\n        \"homadelic.\": \"homadelic.\",\n        \"home wrecker\": \"ホームレッカー\",\n        \"homerun chaya\": \"ホームラン茶屋\",\n        \"homuhomu seisakujo\": \"ほむほむ製作所\",\n        \"homunculus\": \"ホムンクルス\",\n        \"honda koumuten\": \"本田工務店\",\n        \"hone shaburi-tei\": \"骨しゃぶり亭\",\n        \"honekawaya\": \"ホネカワ屋\",\n        \"honey bomb\": \"ハニーボム\",\n        \"honey bump\": \"ハニーバンプ\",\n        \"honey bunny\": \"ハニーバニー\",\n        \"honey crunch\": \"HONEY*CRUNCH\",\n        \"honey dipped\": \"Honey Dipped\",\n        \"honey knuckle\": \"Honey Knuckle\",\n        \"honey lounge\": \"honey lounge\",\n        \"honey pharmacy\": \"Honey Pharmacy\",\n        \"honey rice\": \"はちみつごはん\",\n        \"honey rider69\": \"Honey Rider69\",\n        \"honeybee\": \"honeybee\",\n        \"honeybee-tea\": \"蜜蜂紅茶\",\n        \"honeycrown\": \"HoneyCrown\",\n        \"honeysuckle\": \"Honeysuckle\",\n        \"hongkong hanten\": \"香港飯店\",\n        \"honjitsu no higawari lunch\": \"本日の日替わりランチ\",\n        \"honmatsu tentou\": \"本末天道\",\n        \"honnojihen\": \"ホンノーヂヘン\",\n        \"honnori tei\": \"ほんのり亭\",\n        \"honnou juushigata\": \"本能重視型\",\n        \"honnou to yokubou no gyuutan\": \"本能と欲望の牛タン\",\n        \"honohono\": \"HonoHono\",\n        \"honoka na omochiya\": \"ほのかなおもち屋\",\n        \"honomiya\": \"穂の実舎\",\n        \"honoyurara\": \"HONOYURARA\",\n        \"honpou kishitsu\": \"奔放気質\",\n        \"hontoinu\": \"ほんトいぬ\",\n        \"honya no hidari click\": \"ほにゃーの左クリック\",\n        \"hoppe\": \"hoppe\",\n        \"hopper island\": \"ホッパーアイランド\",\n        \"hopuhopu team\": \"ほぷほぷチーム\",\n        \"horic works\": \"HORIC WORKS\",\n        \"horiishi horuto\": \"堀石掘人\",\n        \"horimonya\": \"彫りモン屋\",\n        \"horloger\": \"Horloger\",\n        \"horohoro tei\": \"ホロホロ亭\",\n        \"horonaminz\": \"ホロナミンZ\",\n        \"horumon curry\": \"ほるもんカレー\",\n        \"hoshizora kagekidan\": \"星空華劇団\",\n        \"hoshi ni kaeru\": \"星に帰る!\",\n        \"hoshi no kuzu\": \"星の屑\",\n        \"hoshi no yume\": \"星の夢\",\n        \"hoshiame\": \"星飴\",\n        \"hoshidokei\": \"星時計\",\n        \"hoshiedatei\": \"ほしえだ亭\",\n        \"hoshikuzu comet\": \"星屑コメット\",\n        \"hosikuz dolce\": \"星屑ドルチェ\",\n        \"hoshimaki project\": \"ほしまきProject\",\n        \"hoshimitai\": \"ほしみたい\",\n        \"hoshinagi\": \"星凪\",\n        \"hoshinatenpo\": \"保科店舗\",\n        \"hoshiratta\": \"星らった\",\n        \"hoshiyukicha\": \"干し雪茶\",\n        \"hoshizono\": \"星園\",\n        \"hoshizora tokou\": \"星空渡航\",\n        \"hosi hutatu.\": \"ほしふたつ。\",\n        \"hosinokuzu\": \"Hosinokuzu\",\n        \"hosizora step\": \"星空ステップ\",\n        \"hosokawaya\": \"細川屋\",\n        \"hot kari\": \"H：O：T(仮)\",\n        \"hot language\": \"ホットランゲージ\",\n        \"hot pot\": \"Hot Pot\",\n        \"hotateya\": \"ほたてや。\",\n        \"hotel california\": \"加州大飯店\",\n        \"hotoariboshi\": \"ほとおり星\",\n        \"hotori bocchi\": \"ほとりぼっち\",\n        \"houenken\": \"方円軒\",\n        \"hougyoku densetsu\": \"宝玉伝説\",\n        \"houjuan\": \"峯寿庵\",\n        \"houkago paradise\": \"放課後パラダイス\",\n        \"houkiboshi\": \"箒星\",\n        \"hououya\": \"鳳凰屋\",\n        \"houruri\": \"蓬瑠璃\",\n        \"house game\": \"ハウスゲーム\",\n        \"house of karsea\": \"ハウス オブ KARSEA\",\n        \"house saibai mochi\": \"ハウス栽培もち\",\n        \"houzuki\": \"ほう☆づき\",\n        \"however\": \"However\",\n        \"hozmi kan\": \"ほづみかん\",\n        \"hozuriya\": \"ほづり屋\",\n        \"hr\": \"HR\",\n        \"hr-st\": \"HR-ST\",\n        \"http\": \"http\",\n        \"hukakuteiseigenri\": \"不確定性原理\",\n        \"hulotte\": \"Hulotte\",\n        \"human high-light film\": \"ヒューマン・ハイライト・フィルム\",\n        \"hummel\": \"ヒュンメル\",\n        \"huri-neko\": \"ふりかえればねこがいる\",\n        \"hutoshi nyuugyou\": \"ふとし乳業\",\n        \"huzinami koubou\": \"藤波工房\",\n        \"hy-dou\": \"灰同\",\n        \"hyakkarou no tanuki\": \"百華楼の狸\",\n        \"hyakuen nikuniku\": \"百元肉々\",\n        \"hyakuitishiki\": \"百壱式\",\n        \"hyakumangoku\": \"百萬石\",\n        \"hyakutake sakusen\": \"百武作戦\",\n        \"hyakuyoubako\": \"百葉箱\",\n        \"hyamolot bakurai\": \"ヒャモロット爆雷\",\n        \"hybrid jimushitsu\": \"ハイブリッド事務室\",\n        \"hydden world\": \"ひどぅんワールド\",\n        \"hydroharbor\": \"HydroHarbor\",\n        \"hyk42\": \"HYK42\",\n        \"hyoco road\": \"ひょこ道\",\n        \"hyouketsu mikan\": \"氷結蜜柑\",\n        \"hyper houbokujou\": \"ハイパー放牧場\",\n        \"hyper summer wars\": \"ハイパーサマーウォーズ\",\n        \"hyperiyon\": \"はいぺりよん\",\n        \"hypnotic angel\": \"Hypnotic Angel\",\n        \"hypnotisms\": \"hypnotisms\",\n        \"hyspaniplus\": \"HyspaniPlus\",\n        \"hysteric typhoon\": \"ヒステリックタイフーン\",\n        \"hyudorabo\": \"ひゅどらぼ\",\n        \"hzkletter\": \"HZKletter\",\n        \"i\": \"I\",\n        \"i am a rock\": \"I am a Rock\",\n        \"i slash h slash r\": \"I/H/R\",\n        \"i think\": \"i think\",\n        \"i-proya\": \"あいぷろ屋\",\n        \"i.r.o.zi\": \"i.r.o.Zi\",\n        \"i.s.o.p.\": \"I.S.O.P.\",\n        \"i.t.gyro\": \"I.T.ジャイロ\",\n        \"ibiza\": \"Ibiza\",\n        \"ibotsukigunte\": \"いぼつきぐんて\",\n        \"ibros\": \"ibros\",\n        \"ice cream\": \"アイスクリウム\",\n        \"ice kick\": \"アイスキック\",\n        \"ice lycoris\": \"氷のリコリス\",\n        \"ice manjuu\": \"あいす饅頭\",\n        \"ice pink\": \"Ice Pink\",\n        \"ice sugar\": \"Ice Sugar\",\n        \"ice-place\": \"ICE-PLACE\",\n        \"ichigo\": \"いちご\",\n        \"ichigo bakery\": \"イチゴベーカリ\",\n        \"ichigo batake\": \"いちご畑\",\n        \"ichigo crepe oomorigumi\": \"いちごクレープ大盛組\",\n        \"ichigo fax\": \"Ichigo Fax\",\n        \"ichigo ichie\": \"一期一会\",\n        \"ichigo jet\": \"いちごじぇっと\",\n        \"ichigo maririn\": \"いちごマリ凛\",\n        \"ichigo milk\": \"いちごみるく\",\n        \"ichigoen\": \"いちご苑\",\n        \"ichigohou\": \"苺砲\",\n        \"ichigoya\": \"いちご屋\",\n        \"ichikasho nihoukou\": \"一箇所二方向\",\n        \"ichikawa gekibansha\": \"市川劇版社\",\n        \"inomaru\": \"いの丸\",\n        \"ichimatsu kougyou\": \"市松稿行\",\n        \"ichimonkai\": \"一門会\",\n        \"ichinichi atelier\": \"いちにちアトリエ\",\n        \"ichinichijuu guttari\": \"一日中ぐったり\",\n        \"ichino nijou\": \"いちのにじょう\",\n        \"ichinose\": \"一ノ瀬\",\n        \"ichiokumangenjaya\": \"一億万軒茶屋\",\n        \"ichiokunen wakusei\": \"1億年惑星\",\n        \"ichiya neko no yume\": \"一夜猫の夢\",\n        \"ichiya teikoku\": \"壱屋帝国\",\n        \"ichiyonroku\": \"イチヨンロク\",\n        \"ichiyuzai\": \"壱釉斎\",\n        \"icicle\": \"Icicle\",\n        \"iciclepink\": \"IciclePink\",\n        \"ico-ba\": \"Ico-ba\",\n        \"idenshi no fune\": \"遺伝子の舟\",\n        \"idivide\": \"アイディバイド\",\n        \"ido no naka\": \"井戸の中\",\n        \"ido no soko\": \"井戸の底\",\n        \"idobata kaigisho\": \"井戸端会議所\",\n        \"idolize\": \"iDOLIZE\",\n        \"idomizuya\": \"井戸水屋\",\n        \"if no danpen\": \"ifの断篇\",\n        \"ifdef\": \"ifdef\",\n        \"ifpark com\": \"ifpark.com\",\n        \"igou\": \"異郷\",\n        \"iihama shokudou\": \"飯浜食堂\",\n        \"iihitoya dosukoidou\": \"いい人屋どすこい堂\",\n        \"iiiiitune\": \"IIIIItune\",\n        \"iinari bijin\": \"いいなり美人\",\n        \"iio tetsuaki honpo\": \"飯尾鉄明本舗\",\n        \"iiwake-gaisya\": \"いいわけ会社\",\n        \"iji\": \"IJI\",\n        \"ijigen kichi\": \"異次元基地\",\n        \"ijiise\": \"イジイセ\",\n        \"ik.projectear\": \"IK.projectear\",\n        \"ika client\": \"いか・クライアント\",\n        \"ikaruganomiya\": \"斑鳩宮\",\n        \"ikasumi no dendou\": \"イカスミの殿堂\",\n        \"ikasumiya\": \"烏賊墨屋\",\n        \"ikechika\": \"いけちか\",\n        \"ikeda jun kikakushitsu\": \"池田淳企画室\",\n        \"ikemen teikoku\": \"イケメン帝国\",\n        \"ikennabi\": \"イケンナビ\",\n        \"ikibata 49ers\": \"いきばた49ERS\",\n        \"ikigire shoukai\": \"いきぎれ商会\",\n        \"ikihaji hummingbird\": \"生き恥ハミングバード\",\n        \"ikite-chou-made-todoku\": \"生きて腸まで届く\",\n        \"ikka risan\": \"一家離散\",\n        \"ikkansei\": \"一貫星\",\n        \"ikuiku com\": \"いくいくコン\",\n        \"ikumura\": \"郁村\",\n        \"ikuukan massatsu-ken\": \"異空間抹殺圏\",\n        \"ild cat\": \"ILD CAT\",\n        \"illuminator\": \"illuminator\",\n        \"illust koubou kakutasu\": \"イラスト工房描くたす\",\n        \"im\": \"Im\",\n        \"im fragile\": \"i'm Fragile\",\n        \"imagawatei\": \"今川亭\",\n        \"image craft\": \"IMAGE CRAFT\",\n        \"image rider\": \"Image Rider\",\n        \"imagination scenery\": \"Imagination scenery\",\n        \"imagineforme\": \"イマジンフォルム\",\n        \"imakan\": \"IMAKAN\",\n        \"imakaya\": \"いまか屋\",\n        \"imasori dondai\": \"イマソリドンダイ\",\n        \"imazon no ana\": \"今ゾンの穴\",\n        \"imitation genome\": \"イミテーションゲノム\",\n        \"imitation moon\": \"Imitation Moon\",\n        \"imitation star\": \"イミテーション スタア\",\n        \"immoral heart\": \"Immoral Heart\",\n        \"imoarai-ya\": \"芋洗屋\",\n        \"imomaru\": \"芋。\",\n        \"imopotato\": \"いもポテト\",\n        \"imotare\": \"imotare\",\n        \"imoutogensouzitiku\": \"妹幻想自治区\",\n        \"imozaiku\": \"いもざいく\",\n        \"imozuru-shiki\": \"いもずる式\",\n        \"imperial chicken\": \"インペリアルチキン\",\n        \"imuneko\": \"イムネコ\",\n        \"in the teapot\": \"In the Teapot\",\n        \"in the water\": \"in the WATER.\",\n        \"inaf\": \"INAF\",\n        \"inai uchi ni\": \"いないうちに\",\n        \"inakagurashi\": \"イナカグラシ\",\n        \"inaridou shoten\": \"稲荷堂書店\",\n        \"inarimochi.\": \"いなり餅。\",\n        \"inarizushi\": \"いなりずし\",\n        \"inasaku\": \"稲作\",\n        \"inayama shrine\": \"稲山神社\",\n        \"inchikidou\": \"いんちき堂\",\n        \"include\": \"include\",\n        \"independenko\": \"インデペンダンコ\",\n        \"ineusaruka\": \"イネウサルカ\",\n        \"infinity\": \"infinity\",\n        \"infinity line\": \"infinity line\",\n        \"iniminimanimo\": \"イニミニマニモ\",\n        \"initiative\": \"イニシアティ部\",\n        \"inja no kuruwa\": \"陰者の廓\",\n        \"inkstone\": \"InkStone\",\n        \"inner map\": \"Inner Map\",\n        \"innocence\": \"Innocence\",\n        \"innocent lucy\": \"イノセントルーシー\",\n        \"inran teddy bear\": \"淫乱テディベア\",\n        \"inre\": \"インレ\",\n        \"inshoujo\": \"淫少女\",\n        \"insky.\": \"insky.\",\n        \"inspi.\": \"inspi.\",\n        \"inspire\": \"inspire\",\n        \"intendou\": \"淫天堂\",\n        \"interlude\": \"interlude\",\n        \"intondou\": \"隠遁堂\",\n        \"intrepid\": \"イントレピッド\",\n        \"inu batake\": \"犬畑\",\n        \"inu no sekai\": \"いぬのせかい\",\n        \"inu ringo\": \"イヌリンゴ\",\n        \"inu system\": \"犬システム\",\n        \"inu to kotatsu\": \"犬とコタツ\",\n        \"inubaka\": \"いぬばか\",\n        \"inudamashi\": \"いぬだまし\",\n        \"inudrill lolita engine\": \"イヌドリルロリータエンジン\",\n        \"inudrill.\": \"イヌドリル。\",\n        \"inuduya\": \"いぬづや\",\n        \"inufuro\": \"いぬふろ\",\n        \"inuhouse.\": \"いぬはうす。\",\n        \"inukamedou\": \"いぬかめ堂\",\n        \"inukare\": \"犬彼\",\n        \"inuyamakagashi\": \"イヌヤマカガシ\",\n        \"inuyoukan\": \"狼幼館\",\n        \"inuzuka clinic\": \"犬塚クリニック\",\n        \"inym\": \"INYM\",\n        \"inyu-goya\": \"いにゅ小屋\",\n        \"io lite\": \"Io Lite\",\n        \"ioom\": \"ioom\",\n        \"ioteact\": \"Ioteact\",\n        \"ip\": \"IP\",\n        \"ipheion\": \"Ipheion\",\n        \"ippatsu shooter\": \"一発シューター\",\n        \"ippatsutei\": \"一発亭\",\n        \"ippo mae e\": \"一歩前へ\",\n        \"ipro back dancers\": \"iProバックダンサーズ\",\n        \"iraremai\": \"いられまい\",\n        \"irekubadou\": \"いれくば堂\",\n        \"irene\": \"Irene\",\n        \"iris art\": \"Iris art\",\n        \"iro neko pencil\": \"色ねこペンシル\",\n        \"irodorip\": \"彩RIP\",\n        \"iroiroiro\": \"iroiroiro\",\n        \"iroman\": \"いろまん\",\n        \"iron\": \"iron\",\n        \"iron fin\": \"IRON FIN\",\n        \"iron grimoire\": \"IRON GRIMOIRE\",\n        \"iron plate\": \"あいあんぷれーと\",\n        \"iron sugar\": \"アイアンシュガー\",\n        \"iron y\": \"IRON Y\",\n        \"isada-ke\": \"いさだ家\",\n        \"isami kaihatsu jigyoudan\": \"イサミ再開発事業団\",\n        \"ise no mug cup\": \"いせのマグカップ\",\n        \"isekai ryokou dairiten\": \"異世界旅行代理店\",\n        \"ishi kenpi\": \"石ケンピ\",\n        \"ishi wa hakanaki ame no shirabe ni\": \"意思は儚き雨の調べに\",\n        \"ishidaya\": \"イシダヤ\",\n        \"ishikari shake nabe doukoukai\": \"石狩しゃけ鍋同好会\",\n        \"ishikorodou\": \"イシコロドウ\",\n        \"ishin denshin\": \"以心伝心\",\n        \"ishitoku ya\": \"イシトク屋\",\n        \"island belle\": \"Island Belle\",\n        \"island green\": \"アイランドグリーン\",\n        \"iso no sozaiten\": \"いその惣菜店\",\n        \"isocurve\": \"アイソカーブ\",\n        \"isofura\": \"いそふら\",\n        \"isofura ribbon\": \"イソフラリボン\",\n        \"isorashi dou\": \"イソラシ堂\",\n        \"isotonix\": \"アイソトニクス\",\n        \"isou\": \"isou\",\n        \"issun kobo\": \"一寸工房\",\n        \"isurusdo\": \"いするす堂\",\n        \"itachitai\": \"イタチ隊\",\n        \"itadaki\": \"頂\",\n        \"itadaki cat\": \"イタダキキャット\",\n        \"item box\": \"あいてむぼっくす\",\n        \"itibosi\": \"ITIBOSI\",\n        \"ito ichizo shouten\": \"伊藤一蔵商店\",\n        \"itou chaba\": \"伊東茶葉\",\n        \"itsuka no sora\": \"いつかのそら\",\n        \"itsukano\": \"イツカノ\",\n        \"itsukano cabayaki\": \"いつかのカバヤキ\",\n        \"itsukidou\": \"樹堂\",\n        \"itsutsuba no clover\": \"五つ葉のクローバー\",\n        \"itsuwari no shirohata\": \"偽りの白旗\",\n        \"ittou ryoudan\": \"一刀両断\",\n        \"iv va shin\": \"IV VA SHIN\",\n        \"ivory\": \"IVORY\",\n        \"ivycrown\": \"ivycrown\",\n        \"iwamanga honpo\": \"いわまんが本舗\",\n        \"iwanakaya\": \"岩中屋\",\n        \"iwashita shoten\": \"いわした書店\",\n        \"iyokan.\": \"いよかん。\",\n        \"iyou\": \"iYou\",\n        \"izakaya yocchan\": \"居酒屋よっちゃん\",\n        \"izayoi no tsuki\": \"十六夜の月\",\n        \"izumi gakuen\": \"いずみ学園\",\n        \"izumi shoseki\": \"いづみ書籍\",\n        \"izumiyu\": \"イズミユ\",\n        \"izumnizm\": \"イズムニズム\",\n        \"izumo gasshuukoku\": \"いづも合衆国\",\n        \"izumunizm\": \"IzumuNizm\",\n        \"izuya\": \"IZU屋\",\n        \"j\": \"j\",\n        \"j-m-box\": \"J-M-BOX\",\n        \"j.o.c e.go\": \"J.O.C★e.go!!\",\n        \"j.s\": \"ジェイ・エス\",\n        \"j7w\": \"j7w\",\n        \"jabara yane\": \"じゃばら屋根\",\n        \"jabyssk\": \"JabyssK\",\n        \"jack dou\": \"ジャック堂\",\n        \"jack-o-lantern\": \"ぢゃっからんたん\",\n        \"jack-r\": \"Jack-R\",\n        \"jackass\": \"ジャッカス\",\n        \"jacklake\": \"Jacklake\",\n        \"jackmarry\": \"JACKMARRY\",\n        \"ja no michi wa hebi soft\": \"蛇ノ道ハ蛇ソフト\",\n        \"jagaimo potato\": \"じゃがいもポテト\",\n        \"jail black\": \"JaiL Black\",\n        \"jajujo\": \"じゃじゅじょ\",\n        \"jakushou jimusho shokun\": \"弱小事務所諸君\",\n        \"jaleco\": \"ジャレコ\",\n        \"jam\": \"ジャム\",\n        \"jam kingdom\": \"ジャム王国\",\n        \"jamboree\": \"Jamboree!\",\n        \"jamurika\": \"ジャム理科\",\n        \"jangari koubou\": \"じゃんがり工房\",\n        \"janis toilet\": \"ジャニストイレ\",\n        \"jasmon\": \"JASもん\",\n        \"je taime\": \"濡鼎夢\",\n        \"jelly fish\": \"Jelly fish\",\n        \"jennys jimusho\": \"じぇにーず事務所\",\n        \"jenoa cake\": \"じぇのばけーき\",\n        \"jereheim garden\": \"Jereheim Garden\",\n        \"jermaneels\": \"jermaneels\",\n        \"jet dekopin books\": \"JET DEKOPIN BOOKS\",\n        \"jeter studio\": \"ジータースタジオ\",\n        \"jewelry\": \"ジュエリー\",\n        \"jibaku-system\": \"自爆SYSTEM\",\n        \"zydan\": \"痔男\",\n        \"jido-hikki\": \"じどー筆記\",\n        \"jiesu\": \"じーえす\",\n        \"jigen bakudan\": \"時限爆弾\",\n        \"jigoku potion\": \"地獄ポーション\",\n        \"jigoku shinjuu\": \"地獄心中\",\n        \"jigoku studio\": \"地獄スタジオ\",\n        \"jikansa-kougeki\": \"時間差攻撃\",\n        \"jikayou kamihikouki\": \"自家用紙飛行機\",\n        \"jikomankitsu.\": \"自己満喫。\",\n        \"jikomanzoku\": \"じこまんぞく\",\n        \"jinapakusu\": \"じなぱーくす\",\n        \"jinbow\": \"JINBOW\",\n        \"jingai makyou club\": \"人外魔境倶楽部\",\n        \"jinkenhakudatsu kougeki\": \"人権剥奪攻撃\",\n        \"jinmen 62\": \"ジンメン62\",\n        \"jinoriya\": \"じのり屋\",\n        \"jinraiken\": \"迅雷拳\",\n        \"jinrikisha\": \"人力社\",\n        \"jinsei ano denchuu made sakusen\": \"人生あの電柱まで作戦\",\n        \"jinsei tsuukoudome\": \"人生通行止め\",\n        \"jipohou\": \"時ポ砲\",\n        \"jishaku no sunaba\": \"じしゃくのすなば\",\n        \"jishin kajyou\": \"地震過剰\",\n        \"jishou seijunha\": \"自称清純派\",\n        \"jisyakunyudo\": \"じしゃく入道\",\n        \"jitaku ijouari\": \"自宅異常あり!\",\n        \"jitaku studio\": \"自宅すたじお\",\n        \"jitsuyou tosho fukyuukai r\": \"実用図書普及会\",\n        \"jiyuu inpon tou\": \"自由いんぽん党\",\n        \"jiyuubeya\": \"自由部屋\",\n        \"jiyuugaoka shoutengai\": \"自由ヶ丘商店会\",\n        \"jizeru enjin\": \"じーぜるエンジン\",\n        \"jk-pasta\": \"JKぱすた\",\n        \"jms space\": \"JMSスペース\",\n        \"john doe shinobu\": \"あっぱーきゃんでぃー\",\n        \"johnny iron pipe\": \"ジョニー鉄パイプ\",\n        \"joji panchu uriba\": \"女児ぱんちゅ売場\",\n        \"joker type\": \"JOKER TYPE\",\n        \"jokou kukan\": \"徐行区間\",\n        \"jon\": \"JON\",\n        \"jonathan ssss\": \"じょなさんず\",\n        \"jongotei\": \"ジョーんご亭\",\n        \"jorijori\": \"JoRiJoRi\",\n        \"joshi nimo katezu\": \"女子ニモ勝テズ\",\n        \"joshinzoku\": \"女真族\",\n        \"joujou tenki\": \"上々天気\",\n        \"joukitei\": \"蒸気亭\",\n        \"joy convoy\": \"ジョイコンボイ\",\n        \"joydivision\": \"JoyDivision\",\n        \"js style\": \"J's STYLE\",\n        \"judgement\": \"JUDGEMENT\",\n        \"juicy fruits\": \"Juicy Fruits\",\n        \"jujuppe\": \"ヂュヂュッペ\",\n        \"jukai shoko\": \"樹海書庫\",\n        \"jukujuku juvenile\": \"熟々ジュブナイル\",\n        \"jukuseiya koubou\": \"熟成屋工房\",\n        \"julia\": \"JULIA\",\n        \"jumbomax\": \"JUMBOMAX\",\n        \"jumelles\": \"ジュメルズ\",\n        \"junai shijoushugi\": \"純愛至上主義\",\n        \"junes rain\": \"六月雨\",\n        \"junes202\": \"ジュネス202\",\n        \"junk arts\": \"ジャンクアーツ\",\n        \"junk box\": \"Junk Box\",\n        \"junk center kameyoko bldg\": \"JUNKセンター亀横ビル\",\n        \"junk gear\": \"ジャンクギア\",\n        \"junk island\": \"ジャンクアイランド\",\n        \"junk market\": \"Junk Market\",\n        \"junk story\": \"JUNK STORY\",\n        \"junkan\": \"循環\",\n        \"junkin\": \"純禁\",\n        \"junkissa gen\": \"潤喫茶・弦\",\n        \"junkland2\": \"JUNKLAND2\",\n        \"junkxjunk\": \"JUNK×JUNK\",\n        \"junpuumanpandou\": \"順風満帆堂\",\n        \"jushoku to sono ichimi\": \"住職とその一味\",\n        \"jusou music\": \"十三ミュジック\",\n        \"juubai matsuri\": \"十倍祭り\",\n        \"juugoichie\": \"十誤一会\",\n        \"juujigen\": \"十次元\",\n        \"juuryoku dou\": \"重力堂\",\n        \"juvecross\": \"じゅぶくろす\",\n        \"jyakonegi sarada\": \"じゃこネギさらだ\",\n        \"jyaraya\": \"じゃらや\",\n        \"jyouren kishidan\": \"ジョウ・レン騎士団\",\n        \"jzargo\": \"ジェイザルゴ\",\n        \"k equals k\": \"[K=K]\",\n        \"k h\": \"K☆H\",\n        \"k plus w\": \"K+W\",\n        \"k plus y equals k\": \"K+Y=K\",\n        \"k-1\": \"K-1\",\n        \"k-ten\": \"K-てん\",\n        \"k.a.d\": \"K.A.D\",\n        \"k.f.d.\": \"K.F.D.\",\n        \"k.h.r\": \"K.H.R\",\n        \"k.n.d.\": \"K.N.D.\",\n        \"k.s. ozaki\": \"K.S.尾崎\",\n        \"k2 manhole\": \"K2マンホール\",\n        \"k2 tomo no kai\": \"K²友の怪\",\n        \"ka-mi-night town\": \"カーミー夜番街\",\n        \"kaaburidou\": \"顔振堂\",\n        \"kab-studio\": \"KAB-studio\",\n        \"kabaya\": \"樺屋\",\n        \"kabocha company\": \"かぼちゃカンパニー\",\n        \"kabocha daioh\": \"かぼちゃ大王\",\n        \"kabocha get\": \"かぼちゃげっと\",\n        \"kabocha heim\": \"かぼちゃハイム\",\n        \"kabocha obake\": \"カボチャオバケ\",\n        \"kabocha oukoku\": \"かぼちゃ王国\",\n        \"kabuki-man\": \"カブキマン\",\n        \"kabuto jirushi\": \"カブト印\",\n        \"kabutomushi\": \"カブとムシ\",\n        \"kabuttari kaburanakattari\": \"かぶったりかぶらなかったり\",\n        \"kachiwari jikkenshitsu\": \"カチワリ実験室\",\n        \"kachusha\": \"Kachusha\",\n        \"kadobeya tengoku\": \"角部屋天国\",\n        \"kaede momiji\": \"かえでもみじ\",\n        \"kaede no harawata\": \"楓のはらわた\",\n        \"kaededou\": \"楓道\",\n        \"kaedelic\": \"KAEdeLIC\",\n        \"kaeru neko no shippo\": \"かえるねこのしっぽ\",\n        \"kaeru no oyado\": \"カエルの御宿\",\n        \"kaerudon teishoku\": \"カエル丼定食\",\n        \"kagamichaya\": \"鏡茶屋\",\n        \"kage kiri\": \"影霧\",\n        \"kagehara juukou\": \"影原重工\",\n        \"kageneko\": \"カゲねこ\",\n        \"kageneko.\": \"かげねこ。\",\n        \"kagero\": \"カゲ路\",\n        \"kaginord\": \"鍵のーど\",\n        \"kagimushi\": \"かぎむし\",\n        \"kagitsuki\": \"限月\",\n        \"kagura hitsuji\": \"神楽ひつじ\",\n        \"kaguradou\": \"かぐら堂\",\n        \"kaguyahime\": \"かぐや姫\",\n        \"kahlua milk\": \"かるーあみるく\",\n        \"kai\": \"KAI\",\n        \"kai.tenchou\": \"改・店長\",\n        \"kaibido\": \"快微動\",\n        \"kaicho-maniax\": \"カイチョーマニアックス\",\n        \"kaigansen\": \"カイガンセン\",\n        \"kaigetsudou\": \"海月堂\",\n        \"kaigishitsu\": \"カイギ室\",\n        \"kaigun daisan shidan\": \"怪軍第3師団\",\n        \"kaihatsushitsu\": \"開発室\",\n        \"kaikan algorithm\": \"快感アルゴリズム\",\n        \"kaiki dennou manga bako\": \"怪奇電脳漫画箱\",\n        \"kaiki nisshoku\": \"怪奇日蝕\",\n        \"kaiman\": \"カイマン\",\n        \"kairaku shuudan\": \"怪楽集団\",\n        \"kairaku yarou g team\": \"快楽野郎Gチーム\",\n        \"kairanban\": \"快乱版\",\n        \"kairansya\": \"海覧車\",\n        \"kairoudou\": \"海老堂\",\n        \"kairyuu\": \"海竜\",\n        \"kaisei hallelujah\": \"快晴ハレルヤ\",\n        \"kaisei yohou\": \"快晴予報\",\n        \"kaisen teikoku\": \"海鮮帝国\",\n        \"kaishaku\": \"介錯\",\n        \"kaishundou honpo\": \"回春堂本舗\",\n        \"kaiteisinden\": \"海底神殿\",\n        \"kaiteki circle\": \"カイテキサークル\",\n        \"kaiten anzu tei\": \"回転杏子亭\",\n        \"kaiten sommelier\": \"回転ソムリエ\",\n        \"kaitenshiki kebabu\": \"回転式けばぶ\",\n        \"kaiun\": \"海運\",\n        \"kaiyuu kikaku\": \"回遊企画\",\n        \"kaizoku seibutsu\": \"海族生物\",\n        \"kajigurumi\": \"かじぐるみ\",\n        \"kajimura market\": \"かじむらマーケット\",\n        \"kakao kakoujou\": \"カカオ加工場\",\n        \"kaki no boo\": \"柿ノ房\",\n        \"kakinotanehitotsubu\": \"柿の種一粒\",\n        \"kakitsubata no yashiro\": \"杜若社\",\n        \"kakkasouyou\": \"かっかそうよう\",\n        \"kakogawa-ya\": \"加古川屋\",\n        \"kakohimenoutuwa\": \"かこひめのうつわ\",\n        \"kaku shoseki\": \"架空書籍\",\n        \"kakumei seifu kouhoushitsu\": \"革命政府広報室\",\n        \"kakumeiji\": \"革命児\",\n        \"kakuni\": \"KAKUNI\",\n        \"kakuq\": \"kakuQ\",\n        \"kakuu byoutou\": \"架空病棟\",\n        \"kalbi santarou\": \"カルビさん太郎\",\n        \"kaleido sky\": \"Kaleido Sky\",\n        \"kalmia\": \"KALMIA\",\n        \"kalmia8\": \"Kalmia8\",\n        \"kamaboko koujouchou.\": \"かまぼこ工場長。\",\n        \"kamaboko-doh\": \"かまぼこ堂\",\n        \"kamabokodokoro\": \"かまぼこ処\",\n        \"kamadeva\": \"Kamadeva\",\n        \"kamagabuchi\": \"かまがぶち\",\n        \"kamakiri farm\": \"カマキリファーム\",\n        \"kamameshiya\": \"かまめし屋\",\n        \"kamaros\": \"カマロス\",\n        \"kamarujirushi\": \"かまる印\",\n        \"kamawanyo\": \"KAMAWANYO\",\n        \"kame no ko\": \"亀の子\",\n        \"kamebeya\": \"かめべや\",\n        \"kamemushi\": \"カメムシ\",\n        \"kameneji\": \"かめねじ\",\n        \"kamepotel\": \"かめぽてる\",\n        \"kami no misosiru\": \"神のみそ汁\",\n        \"kami no tsuki no yashiro\": \"神の月の社\",\n        \"kamibukuro works\": \"紙袋Works\",\n        \"kamico\": \"カミコ!\",\n        \"kamifubukimura\": \"紙ふぶき村\",\n        \"kamikawa studio\": \"神川スタジオ\",\n        \"kamikaze style\": \"神風STYLE\",\n        \"kaminari-neko\": \"カミナリネコ\",\n        \"kaminendo.corporation\": \"KAMINENDO.CORPORATION\",\n        \"kaminosaki shiten\": \"神ノ裂支店\",\n        \"kamiyan\": \"かみやん\",\n        \"kamiyorozu\": \"上万\",\n        \"kamome no shokudou\": \"かもめの食道\",\n        \"kamoro-sa-z\": \"鴨ローサーズ\",\n        \"kamoshireya\": \"かもしれ屋\",\n        \"kamotama shuzou\": \"かもたま酒造\",\n        \"kamotamaza\": \"かもたま座\",\n        \"kamukamu\": \"かむかむっ!\",\n        \"kanagawa macchiato.\": \"かながわマキアート。\",\n        \"kanakana shoutengai\": \"カナカナ商店街\",\n        \"kanariya bai kanariya\": \"カナリヤバいカナリヤ\",\n        \"kanarukan\": \"歌鳴館\",\n        \"kanbotan\": \"カンボタン\",\n        \"kancho hatto\": \"艦長法度\",\n        \"kandelaar\": \"カンテラ\",\n        \"kanemasita\": \"kanemasita\",\n        \"kaneshiro083\": \"カネシロ083\",\n        \"kanidouraku\": \"かにどうらく\",\n        \"kanie-don\": \"鹿贄どん\",\n        \"kanifry\": \"カニフライ\",\n        \"kanikieru\": \"カニキエル\",\n        \"kaniman\": \"かにまん\",\n        \"kanimura hanten\": \"蟹村飯店\",\n        \"kaniparadise\": \"かにぱらだいす\",\n        \"kaniya\": \"かに家\",\n        \"kankyokusetsu\": \"寒極雪\",\n        \"kanmi ningyou\": \"甘味人形\",\n        \"kanmido\": \"甘味堂\",\n        \"kanmidokoro usb\": \"甘味処USB\",\n        \"kanmidokoro-hibiki\": \"甘味処 響\",\n        \"kanmiya makkuro\": \"感味屋真黒\",\n        \"kanmuri kamuri\": \"冠かむり\",\n        \"kannazuki seisakusho\": \"神無月製作所\",\n        \"kanosamu line\": \"KANOSAMU LINE\",\n        \"kanosawa\": \"カノサワ\",\n        \"kansai kemono rengou\": \"関西ケモノ連合\",\n        \"kanshasai soft\": \"感謝祭ソフト\",\n        \"kanshin soft\": \"かんしんソフト\",\n        \"kansyouyou marmotte\": \"鑑賞用モルモット\",\n        \"kanten garas\": \"寒天硝子\",\n        \"kantera\": \"かんてら\",\n        \"kantera no kissaten\": \"カンテラの喫茶店\",\n        \"kantou usagi gumi\": \"関東うさぎ組\",\n        \"kanyou shounen\": \"観用少年\",\n        \"kanzen busouya\": \"完全武装屋\",\n        \"kanzen dokusen\": \"完全独占\",\n        \"kanzume honpo\": \"かんづめ本舗\",\n        \"kaochuu kingdom\": \"顔厨王国\",\n        \"kaodashi bijutsukan\": \"顔出し美術館\",\n        \"kaokaoiyan\": \"かおかおいやん\",\n        \"kaori no nichiyoubi\": \"Kaoriの日曜日\",\n        \"kaoru system\": \"KAORU SYSTEM\",\n        \"kappa create\": \"カッパくりえいと\",\n        \"kappa yousai\": \"かっぱ要塞\",\n        \"kappaya\": \"河童屋\",\n        \"kara no mozuku\": \"空のもずく\",\n        \"kara no tsuki\": \"カラノツキ\",\n        \"karaage market\": \"からあげ市場\",\n        \"karaage of the year\": \"からあげオブザイヤー\",\n        \"karakuchi choucream\": \"辛口しゅーくりーむ\",\n        \"karamomo tart\": \"からももたると\",\n        \"karamoyou\": \"唐模様\",\n        \"karappa\": \"karappa\",\n        \"karashitakana\": \"からしたかな\",\n        \"karasu chan\": \"カラスちゃん\",\n        \"karasu no su\": \"鴉の巣\",\n        \"karasuke honpo\": \"烏毛本舗\",\n        \"karasuma pink higashiiru\": \"烏丸ぴんく東入ル\",\n        \"karaya\": \"殻屋\",\n        \"karazishibotan\": \"からじしぼたん\",\n        \"kareha\": \"生姜うどん\",\n        \"karehaneko\": \"かれはねこ\",\n        \"karei nudol\": \"華麗NUDOL\",\n        \"karen soft\": \"可憐ソフト\",\n        \"karibian\": \"かりび庵\",\n        \"karikari bacon\": \"カリカリベーコン\",\n        \"karin\": \"Karin\",\n        \"karintou\": \"かりん党\",\n        \"karitara kaesu\": \"かりたらかえす\",\n        \"karma laboratory\": \"業-karma-Laboratory\",\n        \"karoyaka step\": \"かろやかステップ\",\n        \"karst diary\": \"カルスト日記\",\n        \"karuhazumi\": \"かるはずみ\",\n        \"karumaya\": \"かるま屋\",\n        \"karuwani\": \"かるわに\",\n        \"kasama kou\": \"カサマ コウ\",\n        \"kasaya\": \"かさや\",\n        \"kasetsu shirokuma kakko yoi\": \"仮設しろくま\",\n        \"kasetsu yousai\": \"仮設要塞\",\n        \"kasha\": \"珈舎\",\n        \"kashinoki\": \"カシノ木\",\n        \"kashitsuki\": \"菓子つき\",\n        \"kashiwa-ya\": \"かしわ屋\",\n        \"kasou genjitsu\": \"禍葬現実\",\n        \"kasozama\": \"過疎座間\",\n        \"kassam rocketer\": \"Kassam rocketer\",\n        \"kasshoku amazoness\": \"褐色アマゾネス\",\n        \"kasshoku waisei\": \"褐色矮星\",\n        \"kasuga 1-chome\": \"春日ー丁目\",\n        \"kasugano kikaku\": \"春日野企画\",\n        \"kasukabe pantsu hunter\": \"糟日部☆ぱんつハンター\",\n        \"kasumi eater\": \"カスミイーター\",\n        \"kasuterura\": \"かすてるら\",\n        \"katagun catapult\": \"片眼カタパルト\",\n        \"katahaba creatures\": \"肩幅クリーチャーズ\",\n        \"katakuchiiwashi\": \"カタクチイワシ\",\n        \"katakuri house\": \"カタクリハウス\",\n        \"katame koime oome\": \"硬め濃いめ多め\",\n        \"katamichi kippu\": \"カタミチキップ\",\n        \"katamimi buta\": \"片耳豚\",\n        \"katamimi headphone\": \"カタミミヘッドフォン\",\n        \"kataribeya\": \"かたりべや\",\n        \"katayude tamago\": \"かたゆでたまご\",\n        \"katooya\": \"カトー屋\",\n        \"katou suzuki\": \"加藤鈴木\",\n        \"katsubushi\": \"勝つ節\",\n        \"katsuma gokurakudou\": \"かつま極楽堂\",\n        \"katsuo shisetsu gallery\": \"カツオ私設ギャラリー\",\n        \"katsuobushi\": \"勝男武士\",\n        \"katuobusi\": \"カツオ武士\",\n        \"katuraya\": \"カツラ屋\",\n        \"kaudenya lab\": \"高電壓Lab\",\n        \"kawaisouko\": \"可哀想子\",\n        \"kawaisounako\": \"かわいそうな子\",\n        \"kawanakashima kobo\": \"川中島工房\",\n        \"kawasaki jian\": \"川崎事案\",\n        \"kawasemi\": \"翡翠\",\n        \"kawauso no hokanko cg\": \"kawauso no hokanko CG\",\n        \"kawazunoen\": \"蛙の宴\",\n        \"kaya no soto\": \"蚊帳の外\",\n        \"kayano mototo\": \"茅ノ素ト\",\n        \"kayoubi\": \"火曜日\",\n        \"kayoudou\": \"華容道\",\n        \"kazakiribane\": \"風切羽\",\n        \"kazama dojo\": \"風間道場\",\n        \"kazamichizu\": \"風海地図\",\n        \"kaze no kotowari\": \"かぜのことわり\",\n        \"kazetonbo\": \"風蜻蛉\",\n        \"kazeuma\": \"かぜうま\",\n        \"kazum\": \"kazum\",\n        \"kazuya\": \"カズ屋\",\n        \"kb\": \"KB\",\n        \"ke-kiyasan\": \"けーきやさん\",\n        \"kearuda\": \"けあるだ\",\n        \"kebero corporation\": \"EBEROコーポレーション\",\n        \"kedama cube\": \"毛玉キューブ\",\n        \"kedamono\": \"kedamono\",\n        \"kedamono kangoku tou\": \"けだもの監獄島\",\n        \"kedamonoya san\": \"ケダモノ屋さん\",\n        \"kee sanpo\": \"けー散歩\",\n        \"keep-out\": \"きーぷあうと\",\n        \"kegani kenkyuushitsu\": \"毛ガニ研究室\",\n        \"kei kei dou\": \"啓々堂\",\n        \"kei kei kei loan\": \"ケイケイケイローン\",\n        \"keigai tengen\": \"境外天元\",\n        \"keikouon\": \"傾向音\",\n        \"keisotsu na ana\": \"軽率な穴\",\n        \"keito\": \"圭斗\",\n        \"keito no mori\": \"毛糸の森\",\n        \"kekanoya\": \"けかの屋\",\n        \"kemao coopercent\": \"ケマオ9%\",\n        \"kemochi\": \"けもち\",\n        \"kemokomoya\": \"けもこも屋\",\n        \"kemomimi eki\": \"けもみみ駅\",\n        \"kemomimi koukyuu jikken kikan\": \"獣耳恒久実験機関\",\n        \"kemono masshigura.\": \"けものまっしぐら。\",\n        \"kemono michi\": \"けものみち\",\n        \"kemono no koshikake\": \"けもののこしかけ\",\n        \"kemonoburg\": \"けものぶるく\",\n        \"kemonomichi\": \"KEMONOMICHI\",\n        \"kemoshiko doukoukai\": \"けもシコ同好会\",\n        \"kemotsubo\": \"ケモつぼ\",\n        \"kemoyuru\": \"けもゆる\",\n        \"kemuriya\": \"煙屋\",\n        \"kemusi no bansan kai\": \"けむしの晩餐会\",\n        \"ken-chan no tokoro\": \"ケンちゃんのところ\",\n        \"kengai san\": \"圏外さん\",\n        \"kenix\": \"KENIX\",\n        \"kenja mode\": \"賢者も～ど\",\n        \"kenkou kyoushitsu\": \"健康教室\",\n        \"kenkou wagomu\": \"けんこう輪ゴム\",\n        \"kenou shineitai\": \"拳王親衛隊\",\n        \"kenrou koubo\": \"けんろー工房\",\n        \"kensoh ogawa\": \"ケンソウオガワ\",\n        \"keraku no tsubomi\": \"けらくのつぼみ\",\n        \"kereno teikoku\": \"けれの帝国\",\n        \"kerokero mountain chicken\": \"けろけろまうんてんちきん\",\n        \"keruto\": \"ける都\",\n        \"kes3000\": \"KES3000\",\n        \"kesa and noise\": \"ケサトノイズ\",\n        \"kesson shoujo\": \"欠損少女\",\n        \"ketchup aji no mayonnaise\": \"ケチャップ味のマヨネーズ\",\n        \"ketsudon teishoku\": \"ケツ丼定食\",\n        \"ketsune cyadokoro\": \"けつね茶処\",\n        \"keumaya\": \"希有马屋\",\n        \"keyspa\": \"きーすぱ\",\n        \"kezukaya\": \"毛塚屋\",\n        \"kf\": \"KF\",\n        \"kfc\": \"KFC\",\n        \"kgb\": \"KGB\",\n        \"ki no nekko\": \"木のねっこ\",\n        \"ki-software\": \"KI-SofTWarE\",\n        \"kibawomuku\": \"牙を剥く\",\n        \"kichiku bansankai\": \"きちくばんさんかい\",\n        \"kichinemu\": \"キチネム\",\n        \"kichu\": \"きちゅ!\",\n        \"kid\": \"KID\",\n        \"kidou juushi\": \"機動重視\",\n        \"kidoukan\": \"綺堂館\",\n        \"kieyza cmp\": \"喜栄座cmp\",\n        \"kigeki banzai\": \"喜劇万歳\",\n        \"kigeki gahou\": \"喜劇画報\",\n        \"kigineiro\": \"木々音色。\",\n        \"kiheitai\": \"畸兵隊\",\n        \"kiina vitamin\": \"きいなビタミン\",\n        \"kiiro bird\": \"きいろバード\",\n        \"kijinrou\": \"奇人楼\",\n        \"kijinabe to kitsunedon\": \"きじ鍋ときつね丼\",\n        \"kikaiatama\": \"機械頭\",\n        \"kikaishojo kaiho-sensen\": \"機械少女解放戦線\",\n        \"kikaten\": \"キカテン\",\n        \"kikitsukiya\": \"ききつき屋\",\n        \"kikka-shurou\": \"菊花酒楼\",\n        \"kikkanten\": \"喫甘展\",\n        \"kikkaya\": \"橘花屋\",\n        \"kikonet\": \"きこねっと\",\n        \"kikuya\": \"姫玖屋\",\n        \"kikyou no hana no saku tokoro\": \"桔梗の花の咲くところ\",\n        \"kill the king\": \"きるきん\",\n        \"killer bambi\": \"KILLER BAMBI\",\n        \"killkill michill\": \"Killkill Michill\",\n        \"kilometer\": \"きろめーとる\",\n        \"kimagu restaurant\": \"きまぐれすとらん\",\n        \"kimagure blue\": \"きまぐれblue\",\n        \"kimagure full course\": \"気まぐれフルコース\",\n        \"kimagure na bakeneko\": \"気まぐれな化け猫\",\n        \"kimagure nyaa nyaa\": \"きまぐれ娘々♪\",\n        \"kimarinet\": \"Kimarinet\",\n        \"kimidori\": \"君彩\",\n        \"kimino kakuremino\": \"キミノカクレミノ\",\n        \"kimpotsu\": \"きムぽつ\",\n        \"kimuchi\": \"鬼武致\",\n        \"kimuchi-tei\": \"キムチ亭\",\n        \"kin-youbi\": \"金揚尾\",\n        \"kinari\": \"きなり\",\n        \"kinbou sokai\": \"近傍租界\",\n        \"kindandowa\": \"禁断童話\",\n        \"kindergarten\": \"キンダーガーテン\",\n        \"kinema bambi\": \"キネマ☆バンビ\",\n        \"kinen jumper\": \"禁煙ジャンパー\",\n        \"kinetoscope\": \"キネトスコープ\",\n        \"king revolver\": \"キングリボルバー\",\n        \"kingpin\": \"キングピン\",\n        \"kingyo no suisou\": \"金魚の水槽\",\n        \"kinmekki damashii\": \"金メッキ魂\",\n        \"kinmekki studio\": \"金メッキスタジオ\",\n        \"kinmirai kyouyou bunko\": \"近未来教養文庫\",\n        \"kino manga sekkeishitsu\": \"鬼ノ漫画設計室\",\n        \"kinoko dx\": \"きのこDX\",\n        \"kinoko hamburg tei\": \"きのこはんばーぐ亭\",\n        \"kinoko house\": \"キノコハウス\",\n        \"kinoko no kakushi beya\": \"きのこの隠し部屋\",\n        \"kinoko no karutei-nu\": \"キノコの狩るてぃーぬ\",\n        \"kinoko pot pie\": \"きのこポットぱい\",\n        \"kinoko-ex\": \"KINOKO-ex\",\n        \"kinokotai\": \"きのこ隊\",\n        \"kinokoya kari\": \"茸屋(仮)\",\n        \"kinominoyama\": \"きのみの山\",\n        \"kinomiya\": \"季の宮\",\n        \"kinzoku hannou\": \"きんぞくはんのう\",\n        \"kirakira candy\": \"キラキラキャンディ\",\n        \"kirarinkuru\": \"きらりんくる\",\n        \"kirei club\": \"奇令クラブ\",\n        \"kirei na oneesan\": \"紀霊なお姉さん\",\n        \"kirimochi texture\": \"キリモチテクスチャ\",\n        \"kirin mamire\": \"キリンまみれ\",\n        \"kirin no chisato\": \"きりんのちさと\",\n        \"kirisawa giken\": \"桐沢技研\",\n        \"kirsi engine\": \"キルシーエンジン\",\n        \"kirscherise\": \"kirscherise\",\n        \"kisachi\": \"kisachi\",\n        \"kisama soredemo ningenka\": \"貴様それでも人間か!!\",\n        \"kisamamaki soft\": \"貴様巻きソフト\",\n        \"kisaradudou\": \"木更津堂\",\n        \"kiseki\": \"軌跡\",\n        \"kisekitei\": \"軌跡亭\",\n        \"kisha-\": \"きしゃー\",\n        \"kishiben\": \"きし弁\",\n        \"kisidou\": \"旗幟堂\",\n        \"kisoima\": \"きそいま\",\n        \"kisou d koubou\": \"奇想D工房\",\n        \"kisoutengai\": \"奇想天外\",\n        \"kissyoudo\": \"亀祥堂\",\n        \"kitagawajima\": \"キタガワジマ\",\n        \"kitaizumi koubou\": \"北泉工房\",\n        \"kitakami triple\": \"北神トリプル\",\n        \"kitakara tagayase\": \"きたからたがやせ\",\n        \"kitchen studio\": \"きっちんすたじお\",\n        \"kitkaters\": \"キットカッターズ\",\n        \"kitsch\": \"吉鼠-Kitsch-\",\n        \"kitsukedou\": \"きつけ堂\",\n        \"kitsune\": \"来つ寝\",\n        \"kitsune box system\": \"きつねぼっくすしすてむ\",\n        \"kitsune no daishokudou\": \"キツネの大食堂\",\n        \"kitsune to budou\": \"きつねとぶどう\",\n        \"kitsunenomori\": \"狐の杜\",\n        \"kitsunenotera\": \"きつねのてら\",\n        \"kitsuneya\": \"きつね屋\",\n        \"kitsuneyane\": \"きつね屋根\",\n        \"kitsunezuka\": \"狐塚\",\n        \"kittydrop\": \"KittyDrop\",\n        \"kiyosumi hurricane\": \"清炭ハリケーン\",\n        \"kizaruya\": \"黄猿屋\",\n        \"kizuna project\": \"絆プロジェクト\",\n        \"kk-spa\": \"KK-SPA\",\n        \"kki\": \"KKI\",\n        \"kkk\": \"KKK\",\n        \"kkkk\": \"kkkk\",\n        \"kkm\": \"K·K·M\",\n        \"klara works\": \"Klara Works\",\n        \"klaramate\": \"クララメイト\",\n        \"kleitos\": \"クレイトス\",\n        \"kmkz5.56\": \"KMKZ5.56\",\n        \"knife edge\": \"ナイフエッジ\",\n        \"knights\": \"KNIGHTS\",\n        \"knuckle chop\": \"knuckle chop\",\n        \"knuckle head\": \"KNUCKLE HEAD\",\n        \"ko nekoneko house\": \"こねこねこはうス\",\n        \"koa\": \"こあ\",\n        \"koakuma sageha\": \"小悪魔sage派\",\n        \"koala machine\": \"コアラマシン\",\n        \"koban dou\": \"小判堂\",\n        \"kobasoft\": \"KOBAsoft;\",\n        \"koboro nindan\": \"小幌忍団\",\n        \"koboshi no niwa\": \"コボシノニワ\",\n        \"kocher\": \"コッヘル\",\n        \"kocho kocho koukou\": \"こちょこちょ高校\",\n        \"kodama planet\": \"コダマノ惑星\",\n        \"kodanukidou\": \"小狸堂\",\n        \"kodoh\": \"kodoh\",\n        \"kodomo no koe\": \"こどものこえ\",\n        \"kodukuejou\": \"小机城\",\n        \"koedame\": \"KOEDAME\",\n        \"koei\": \"コーエー\",\n        \"kogemashita\": \"焦げました\",\n        \"kohaneto\": \"こはねと\",\n        \"koharu koubou\": \"こはる工房\",\n        \"koharuchaya\": \"KOHARUCHAYA\",\n        \"koharumachi\": \"小春町\",\n        \"kohimemachi\": \"狐姫町\",\n        \"kohitsujitei\": \"古羊亭\",\n        \"kohri club\": \"氷倶楽部\",\n        \"koi no danmenzu\": \"恋の断面図\",\n        \"koigokoro no borderline\": \"恋心のボーダーライン\",\n        \"koike-ya\": \"こいけ屋\",\n        \"koikuchi kinako\": \"こいくちきなこ\",\n        \"koinu computer\": \"koinu computer\",\n        \"koinu gumi\": \"こいぬ組\",\n        \"koinu kantai\": \"子犬艦隊\",\n        \"koito sousakusho\": \"小糸創作所\",\n        \"koji2\": \"KOJI2\",\n        \"kojiki hiroba\": \"乞食広場\",\n        \"kojimashiki\": \"コジマシキ\",\n        \"kokemomo\": \"こけもも\",\n        \"kokesimuken\": \"こけしム軒\",\n        \"kokikko\": \"KOKIKKO\",\n        \"kokkei-nagaya\": \"滑稽長屋\",\n        \"kokkishin\": \"こっき心\",\n        \"kokochikyuu\": \"心地球\",\n        \"kokonokiya\": \"ここのき屋\",\n        \"kokoro metro\": \"ココロメトロ\",\n        \"kokoro no boss\": \"心のBOSS\",\n        \"kokoro no ie\": \"心之家\",\n        \"kokoro no tsubasa\": \"こころのつばさ\",\n        \"kokoro shidoushitsu\": \"ココロ指導室\",\n        \"kokumaren\": \"kokumaren\",\n        \"kokuten no sato\": \"黒甜の郷\",\n        \"kokutou kuromame\": \"黒糖くろまめ\",\n        \"kokuyouchou\": \"黒耀蝶\",\n        \"komagome pipette\": \"コマゴメピペット\",\n        \"komamesugata\": \"こまめすがた\",\n        \"komanest\": \"こまねすと\",\n        \"komatsuna-ya\": \"小松菜屋\",\n        \"komatta tomato\": \"こまったとまと\",\n        \"komatta yatsu da na.\": \"こまった奴だな。\",\n        \"komaya\": \"駒屋\",\n        \"kome\": \"米\",\n        \"kome nouka\": \"こめ農家\",\n        \"komebitsu\": \"米びつ\",\n        \"komedokoro\": \"こめどころ\",\n        \"komekami kishi dan\": \"こめかみ騎士団\",\n        \"komekouji\": \"コメコウジ\",\n        \"komenikki\": \"米にっき。\",\n        \"komenosukima\": \"米の隙間\",\n        \"kometubu\": \"米粒\",\n        \"komickers\": \"Komickers\",\n        \"komorebi-notebook\": \"こもれびのーと\",\n        \"komorebitei\": \"木漏れ日亭\",\n        \"komugiko 100 percent\": \"小麦粉100%\",\n        \"kon no pencase\": \"紺のペンケース\",\n        \"konagona biscuit\": \"こなごなビスケット\",\n        \"konagona makki shoujou\": \"粉々末期症状\",\n        \"konapoka01\": \"こなぽか01\",\n        \"konatuiro\": \"来夏色\",\n        \"konbu-maru\": \"こんぶ丸\",\n        \"konbuni\": \"こんぶに\",\n        \"koneko dorobou\": \"子猫泥棒\",\n        \"koneko gumi\": \"こねこ組\",\n        \"koneko no manma\": \"こねこのまんま\",\n        \"konekotei\": \"虎猫亭\",\n        \"kongou rikisi\": \"金剛力士\",\n        \"kongs home\": \"kongs home\",\n        \"koniro drops\": \"绀色ドロップス\",\n        \"koniro milkiro\": \"紺色ミルク色\",\n        \"konjiki no monde selection\": \"金色のモンドセレクション\",\n        \"konjikineko\": \"金色猫\",\n        \"konna tokoro no kinniku made kitaeru nante...\": \"こんなところのきんにくまできたえるなんて...\",\n        \"konno seisakubou\": \"紺野制作坊\",\n        \"konnyaku\": \"こんにゃく\",\n        \"konoderu\": \"このでる\",\n        \"konoha\": \"このは\",\n        \"konohanaya\": \"此花屋\",\n        \"konowata\": \"コノワタ\",\n        \"konpekitou\": \"紺碧糖\",\n        \"konpon jinja\": \"コンポン神社\",\n        \"kontohboh\": \"痕桃梦\",\n        \"konton lady studio\": \"混沌レディースタジオ\",\n        \"koori ame\": \"こおりあめ\",\n        \"koorigoya\": \"氷小屋\",\n        \"kooriume\": \"こおりうめ\",\n        \"kopanda\": \"子パンダ\",\n        \"koppamijin\": \"コッパミジン\",\n        \"koppun\": \"骨粉\",\n        \"korikori koubou\": \"狐狸古里工房\",\n        \"korindou\": \"こりん堂\",\n        \"korisuya\": \"こりすや\",\n        \"korogarutsuki\": \"コロガルツキ\",\n        \"korogi comics\": \"こおろぎコミックス\",\n        \"korokoro koronp\": \"ころころころんぴ\",\n        \"korokorokokoro\": \"ころころこころ\",\n        \"korokuto\": \"ころくと\",\n        \"korokyu\": \"孤狼宮\",\n        \"koropot\": \"ころぽっと\",\n        \"kororofu\": \"コロロフ\",\n        \"koruri-ya\": \"こるり屋\",\n        \"kosuko teikoku\": \"こすこ帝国\",\n        \"kosuru buta\": \"こする豚\",\n        \"kotacyuya\": \"こたちゅ屋\",\n        \"kotake souhonke\": \"小武総本家\",\n        \"kotatsu de mikan chokubaijo\": \"こたつでみかん直売所\",\n        \"kotatsu guild\": \"コタツギルド\",\n        \"kotatsu no tsukaima\": \"古竜の使い魔\",\n        \"kotatsu room\": \"KOTATSU ROOM\",\n        \"kotatsuya\": \"炬燵屋CO.LTD\",\n        \"kotau\": \"こたう\",\n        \"kotee\": \"コテ絵\",\n        \"koti\": \"KOTI\",\n        \"kotoba asobi\": \"言葉遊戯\",\n        \"kotobukiya\": \"ことぶきや\",\n        \"kotonoya\": \"琴乃屋\",\n        \"kotori jimusho\": \"小鳥事務所\",\n        \"kotoribidou\": \"小鳥日堂\",\n        \"kotorikan\": \"小鳥館\",\n        \"kotoshiki\": \"コトシキ\",\n        \"kotoyoshi wired\": \"琴義ワイアード\",\n        \"kotsumudiya\": \"こつむぢや\",\n        \"kou kidou shoujo\": \"高機動少女\",\n        \"koubai gekka\": \"紅梅月下\",\n        \"koubaitei\": \"勾配亭\",\n        \"koubou juuichiya\": \"工房十一屋\",\n        \"koucha rakkyo\": \"紅茶辣韭\",\n        \"koudansha\": \"幸田ん舎\",\n        \"koufukuya\": \"幸福屋\",\n        \"kougaku meisai\": \"光学迷彩\",\n        \"kougeki\": \"幸撃\",\n        \"kougi anmitsu\": \"公儀あんみつ\",\n        \"kougi no mikan batake\": \"KOUGIのみかん畑\",\n        \"kougyo\": \"耿魚\",\n        \"kougyokutei dokuringo\": \"紅玉亭毒林檎\",\n        \"kouhuku shigen\": \"幸福資源\",\n        \"kouketsu no otome\": \"高潔の乙女\",\n        \"koukotsu panda\": \"恍惚熊猫\",\n        \"koukyou koukoku kikou\": \"公共広告奇行\",\n        \"kourinsha\": \"降臨社\",\n        \"koushi\": \"子牛\",\n        \"kousoku bitch network\": \"高速ビッチネットワーク\",\n        \"kousoku gurihari-tei\": \"高速グリハリ亭\",\n        \"kousoku kaiten\": \"高速回転\",\n        \"koutarou with t\": \"こうたろうWithティー\",\n        \"koutetsu\": \"鋼鉄\",\n        \"koutetsu rengou\": \"鋼鉄連合\",\n        \"koutetsuryoku kikaku\": \"鋼鉄力企画\",\n        \"kouya ni sakebu aitsu no heya\": \"荒野に叫ぶアイツの部屋\",\n        \"kouyadou\": \"こうや堂\",\n        \"kouzaka-san to makino jimusho\": \"神坂さんとマキノ事務所\",\n        \"kouzukitei\": \"香月亭\",\n        \"kouzuya\": \"興津屋\",\n        \"kowaremono\": \"こわれもの\",\n        \"kowareta omocha\": \"壊れたおもちゃ\",\n        \"kozimoko\": \"こじもこ\",\n        \"kozouya\": \"子蔵屋\",\n        \"kptms\": \"KPTM'S\",\n        \"kraftbox\": \"Kraftbox\",\n        \"krono-hudenekotei\": \"クロノ筆猫亭\",\n        \"kss\": \"ケイエスエス\",\n        \"ktn\": \"KTN\",\n        \"ktq48\": \"KTQ48\",\n        \"ku-ten\": \"KU-TEN\",\n        \"kubaya\": \"くば屋\",\n        \"kubotaya\": \"久保田屋\",\n        \"kuchen sirup\": \"く～へんしろっぷ\",\n        \"kuchibashi feti\": \"くちばしフェチ\",\n        \"kuchiki no uro\": \"朽木ノ洞\",\n        \"kudamono damono\": \"くだものだもの\",\n        \"kudarizaka guardrail\": \"下り坂ガードレール\",\n        \"kugatsuya\": \"九月屋\",\n        \"kuikome sagi\": \"食い込め詐欺\",\n        \"kujira logic\": \"くぢらろじっく\",\n        \"kujuukuri nyajuu kai\": \"九十九里ニャ獣会\",\n        \"kukudou\": \"くく堂\",\n        \"kukuya\": \"くく屋\",\n        \"kulmov\": \"kulmov_\",\n        \"kuma knights\": \"クマナイツ\",\n        \"kuma no mori\": \"くまのもり\",\n        \"kuma x usagi\": \"くま×うさぎ\",\n        \"kuma-puro\": \"Kuma-puro\",\n        \"kumagai stars\": \"くまがいスターズ\",\n        \"kumagaya hakushon kai\": \"熊谷はくしょん会\",\n        \"kumakumadou\": \"くまくま道\",\n        \"kumakumaice\": \"くまくまあいす\",\n        \"kumakuramizu\": \"熊倉水\",\n        \"kumameshi-ya\": \"クマ飯屋\",\n        \"kumanikotec\": \"クマニコテック\",\n        \"kumao cafe\": \"くまおカフェ\",\n        \"kumapanda\": \"くまぱんだ\",\n        \"kumatyu bokujou\": \"クマチュウ牧場\",\n        \"kume\": \"久米\",\n        \"kumikae dna\": \"組換DNA\",\n        \"kumogakure.\": \"くもがくれ。\",\n        \"kumohatiya\": \"雲八屋\",\n        \"kune kune project\": \"Kune Kune Project\",\n        \"kunkakunka teikoku\": \"くんかくんか帝国\",\n        \"kunseidou\": \"燻製堂\",\n        \"kuon hirohiko\": \"久遠広彦\",\n        \"kuoone\": \"くお～ね\",\n        \"kuragakuya\": \"倉楽屋\",\n        \"kurage kenkyuusho\": \"くらげ研究所\",\n        \"kurage no candume\": \"くらげのかんづめ\",\n        \"kurage suizokukan\": \"くらげ水族館\",\n        \"kurahashi shoin\": \"倉橋書院\",\n        \"kurakamadou\": \"くらかま堂\",\n        \"kurasan\": \"倉さん\",\n        \"kurenai heptagon\": \"KureNAI HeptaGoN\",\n        \"kurenai shoujo\": \"紅少女\",\n        \"kureten\": \"KURETEN\",\n        \"kureura seisakujo\": \"呉浦製作所\",\n        \"kuributon\": \"栗布団\",\n        \"kurimanjuu\": \"くりまんじゅう\",\n        \"kurione-sha\": \"くりおね館\",\n        \"kuripachi no heya\": \"クリパチの部屋\",\n        \"kuripick\": \"栗pick\",\n        \"kuripod\": \"KURIPOD\",\n        \"kurita sora\": \"栗田空\",\n        \"kuro cornet\": \"黒こるね\",\n        \"kuro inu sha\": \"黒戌舎\",\n        \"kuro majutsu coffee\": \"黒魔術コーヒー\",\n        \"kuro no alice\": \"黒のアリス\",\n        \"kuro queen\": \"Kuro Queen\",\n        \"kuro to kane no hane\": \"黒と銀の羽\",\n        \"kuro-level\": \"KURO-LEVEL\",\n        \"kurobuchi\": \"クロブチ\",\n        \"kurocan\": \"クロ缶\",\n        \"kurodamaya\": \"黒玉屋\",\n        \"kurodensha\": \"黒電車\",\n        \"kurodenwa\": \"黒電話\",\n        \"kurodou holdings\": \"黒堂ホールディングス(株)\",\n        \"kurogane cage\": \"くろがねけーじ\",\n        \"kuroge to momojiru\": \"黒毛と桃汁\",\n        \"kurogomaknights\": \"黒ごま騎士団\",\n        \"kurohamya\": \"黒ハム屋\",\n        \"kurohime\": \"黒姫\",\n        \"kurohina\": \"黒雛\",\n        \"kurohinabako\": \"黒雛箱\",\n        \"kurohonyasan\": \"くろほんやさん\",\n        \"kuroi inu no daisharin\": \"黒い犬の大車輪\",\n        \"kuroi kyoudain\": \"黒いキョーダイン\",\n        \"kuroi mikan no naru momo no ki\": \"黒いみかんのなるももの木\",\n        \"kuroi miyako\": \"黒イ都\",\n        \"kuroi mono\": \"黒いモノ\",\n        \"kurokami studio s\": \"クロカミスタジオS\",\n        \"kurokari\": \"くろかり\",\n        \"kurokishi no kakurega\": \"黒騎士の隠れ家\",\n        \"kurokoya\": \"くろこ屋\",\n        \"kuromame pack\": \"くろまめぱっく\",\n        \"kuromisakaijou\": \"黒ミサ会場\",\n        \"kuromogu teikoku\": \"黒モグ帝国\",\n        \"kuromori-ya\": \"黒森屋\",\n        \"kuroneko akaribon\": \"黒ねこ赤リボン\",\n        \"kuroneko to taijutei\": \"黒猫と大樹亭\",\n        \"kuroneko waltz\": \"黒ネコワルツ\",\n        \"kuronekodou\": \"黒猫堂\",\n        \"kuronekokan-monpetit\": \"黒猫館モンプチ\",\n        \"kuronekotei\": \"黒猫亭\",\n        \"kurono taitsu\": \"黒野タイツ\",\n        \"kuropoplar\": \"くろぽぷら\",\n        \"kurosawa pict\": \"黒澤pict\",\n        \"kuroshikatei\": \"黒鹿亭\",\n        \"kuroshiro desire\": \"黒白デザイア\",\n        \"kurotoshiro\": \"黒ト白\",\n        \"kurotoya\": \"黒杜屋\",\n        \"kurotsuki shoukai\": \"黒月商会\",\n        \"kurousagi\": \"kurousagi\",\n        \"kuroyuki\": \"黒雪\",\n        \"kurozako palace\": \"くろざこパレス\",\n        \"kurubusi-kai\": \"踝会\",\n        \"kuruguru dna\": \"くるぐるDNA\",\n        \"kurumian\": \"くるみ庵\",\n        \"kurusugawa pikumintei\": \"来栖川ピクミン亭\",\n        \"kusanagi-blade\": \"KUSANAGI-BLADE\",\n        \"kusari\": \"KUSARI\",\n        \"kusari caterpillar\": \"锁キャタピラ\",\n        \"kusari no youjo\": \"鎖の幼女\",\n        \"kusariku\": \"草陸\",\n        \"kushimoto house\": \"くしもとハウス\",\n        \"kushiyabu\": \"クシヤブ\",\n        \"kusosweets\": \"kusosweets\",\n        \"kusoyuridanchi\": \"クソユリ団地\",\n        \"kusozako nameko\": \"くそざこなめこ\",\n        \"kusugu land\": \"くすぐらんど\",\n        \"kusuribako\": \"くすり箱\",\n        \"kusurin soft\": \"くすりんソフト\",\n        \"kutushita nijiru honpo\": \"靴下煮汁本舗\",\n        \"kuuchuusen\": \"空中線\",\n        \"soramitiheno-r\": \"空道へのR\",\n        \"kuudou flare\": \"空洞フレア\",\n        \"kuuppii\": \"くぅっぴぃ\",\n        \"kuurintei\": \"空輪艇\",\n        \"kuusou banana\": \"空想バナナ\",\n        \"kuusou kyuuka\": \"空想休暇\",\n        \"kuusou monochrome\": \"空想モノクローム\",\n        \"kuusou post\": \"空想ポスト\",\n        \"kuusou riot\": \"空想RIOT!\",\n        \"kuusou switch\": \"空想スイッチ\",\n        \"kuwaikuwa\": \"くわいくわ\",\n        \"kuzu no kagami\": \"クズの鑑\",\n        \"kuzumochi\": \"KUZUMOCHI\",\n        \"kuzunari\": \"くずなり\",\n        \"kwi ag\": \"KWI AG\",\n        \"kyapa city\": \"きゃぱCITY\",\n        \"kyo-rakuji\": \"享楽寺\",\n        \"kyodai kidou yousai kyoushuu\": \"巨大軌道要塞強襲\",\n        \"kyojinkou\": \"巨人港\",\n        \"kyokutou dennou kaihatsukyoku\": \"極東電脳開発局\",\n        \"kyokutou funamushi\": \"極東舟虫\",\n        \"kyomu no uta\": \"虚無の歌\",\n        \"kyoshoku shou\": \"虚飾症\",\n        \"kyosuu shiniki\": \"虚数神域\",\n        \"kyoten heichou\": \"拠点兵長\",\n        \"kyou no keiro\": \"今日の毛色\",\n        \"kyoubou jouchotai\": \"凶暴情緒帯\",\n        \"kyougetsutei\": \"共月邸\",\n        \"kyouki na shiunten\": \"狂気な試運転\",\n        \"kyoumata\": \"今日また\",\n        \"kyounetsuzanbun\": \"強熱残分\",\n        \"kyourakuen\": \"享樂苑\",\n        \"kyouretsu hiyougeka\": \"強烈肥養外科\",\n        \"kyouryuu no tamago\": \"恐竜の卵\",\n        \"kyousatu\": \"きょうさつ\",\n        \"kyousei josou kyousei nyotaika kyousei otokonoko\": \"強制女装・強制女体化・強制男の娘\",\n        \"kyousei tsf no ohanashi\": \"強制TSFのお話し\",\n        \"kyouun rrr\": \"きょううんRRR\",\n        \"kyouya\": \"今日屋\",\n        \"kyozoya\": \"京蔵屋\",\n        \"kyujitsusyukkin\": \"休日出勤\",\n        \"kyun kyun art works\": \"きゅんきゅんあーとわーくす\",\n        \"kyusuisei polymer\": \"吸水性ポリマー\",\n        \"kyuu no mon\": \"九の門\",\n        \"kyuu tekki jidai\": \"旧鉄器時代\",\n        \"kyuukeijo no higashi\": \"休憩所の東\",\n        \"kyuuketsukousi\": \"吸血公子\",\n        \"kyuusanpin\": \"きゅうさんぴん\",\n        \"kyuushoku dorobou\": \"給食泥棒\",\n        \"l novels\": \"Lノベルズ\",\n        \"l-u\": \"L-u\",\n        \"l.l. milk\": \"L.L.MILK\",\n        \"l.o.w\": \"L.O.W\",\n        \"l.p.e.g.\": \"L.P.E.G.\",\n        \"la vender\": \"La vender\",\n        \"la.c.\": \"La.C.\",\n        \"lab chicken\": \"LAB CHICKEN\",\n        \"lab-star\": \"らびすたー\",\n        \"laboratory\": \"Laboratory\",\n        \"laboratory 09\": \"Laboratory#09\",\n        \"lacti9\": \"Lacti9\",\n        \"lactobacillus\": \"ラクトバシラス\",\n        \"lactucopicrin\": \"ラクチュコピクリン\",\n        \"ladybacker\": \"LadyBacker\",\n        \"lagarto\": \"Lagarto\",\n        \"lagerstatten\": \"Lagerstatten\",\n        \"lagrangian-point\": \"Lagrangian-Point\",\n        \"laichi\": \"LAICHI\",\n        \"lala soft\": \"Lala soft\",\n        \"lala studio\": \"LALA STUDIO\",\n        \"lamchat\": \"ラム茶っと!\",\n        \"lamia\": \"Lamia\",\n        \"lamipas\": \"lamipas\",\n        \"landurchin\": \"Land Urchin\",\n        \"landcut\": \"ランドカット\",\n        \"lapis blue.\": \"LAPIS BLUe.\",\n        \"lapis lazuli\": \"ラピスラズリ\",\n        \"lapiss\": \"Lapiss\",\n        \"lapiz lazuli kouseki\": \"ラピスラズリ鉱石\",\n        \"laplacedotcom\": \"らぷらすどっとこむ\",\n        \"laplacian\": \"Laplacian\",\n        \"lass\": \"ラス\",\n        \"lass pixy\": \"Lass Pixy\",\n        \"last eden\": \"LAST EDEN\",\n        \"last resort\": \"ラストリゾート\",\n        \"latelate\": \"latelate\",\n        \"lathimania kyouwakoku\": \"ラチマニア共和国\",\n        \"latte\": \"Latte\",\n        \"laurier\": \"ろりえーる\",\n        \"lazy crew\": \"レイジークルー\",\n        \"lazystyle\": \"LazyStyle\",\n        \"leaf geometry\": \"リーフジオメトリ\",\n        \"leaf party\": \"リーフパーティー\",\n        \"leaz koubou\": \"りーず工房\",\n        \"left\": \"LEFT\",\n        \"legato\": \"Legato\",\n        \"leimz-project\": \"LEIMZ-PROJECT\",\n        \"leman koukoku\": \"レマン公国\",\n        \"lemming\": \"Lemming\",\n        \"lemniscate\": \"レムニスケート\",\n        \"lemon bakudan\": \"レモンばくだん\",\n        \"lemon cake\": \"レモンケーキ\",\n        \"remon no omise\": \"れもんのお店\",\n        \"lemon zest\": \"LEMON ZEST\",\n        \"lemonbridge\": \"レモンブリッジ\",\n        \"lemontei\": \"檸檬亭\",\n        \"leo-circle\": \"さーくるLEO-CIRCLE\",\n        \"leprotto\": \"Leprotto\",\n        \"lesport\": \"Lesport\",\n        \"lesser panda ga yome\": \"レッサーパンダが嫁\",\n        \"leucojum\": \"LEUCOJUM\",\n        \"level-x\": \"LEVEL-X\",\n        \"level.41\": \"Level.41\",\n        \"level1\": \"level1\",\n        \"lewd angels\": \"Lewd Angels\",\n        \"leymei\": \"LEYMEI\",\n        \"lhezi\": \"LHEZI\",\n        \"liar-soft\": \"ライアーソフト\",\n        \"libertaria\": \"リバタリア\",\n        \"libido\": \"リビドー\",\n        \"libido kaikan\": \"リビドー会館\",\n        \"libido soft\": \"りびどーそふと\",\n        \"libya cuckoo\": \"リビア郭公\",\n        \"licorice candy\": \"リコリスキャンディ\",\n        \"liddell\": \"Liddell\",\n        \"liebe\": \"リーベ\",\n        \"lielos no kakurega\": \"ゆいれその隠れ家\",\n        \"life\": \"life\",\n        \"life degeneration laboratory\": \"人生堕落研究所\",\n        \"light\": \"ライト\",\n        \"light garden\": \"ライト・ガーデン\",\n        \"light in the night\": \"ライトインザナイト\",\n        \"light of night\": \"Light of Night\",\n        \"light pink\": \"ライトピンク\",\n        \"light rate port pink\": \"ライト・レイト・ポート・ピンク\",\n        \"lightguide\": \"LightGuide\",\n        \"lightplan\": \"ライトプラン\",\n        \"likefairly\": \"LikeFairly\",\n        \"lilac\": \"lilac\",\n        \"lili\": \"lili\",\n        \"lili marleen\": \"リリーマルレーン\",\n        \"lilije drug\": \"リリェドラッグ\",\n        \"lilim\": \"LiLiM\",\n        \"lilim darkness\": \"リリムダークネス\",\n        \"lilium\": \"LILIUM\",\n        \"lilium auratum\": \"Lilium auratum\",\n        \"liliya\": \"リリ舎\",\n        \"lilliput\": \"リリパット\",\n        \"lily under\": \"リリーアンダー\",\n        \"lilyth\": \"Lilyth\",\n        \"limecat\": \"LimeCat\",\n        \"limit\": \"LIMIT\",\n        \"limit break\": \"りみっとぶれいく\",\n        \"limit cycle\": \"LIMIT CYCLE\",\n        \"limit plus\": \"limit+\",\n        \"limit works\": \"Limit Works\",\n        \"limited\": \"ちこ★小屋\",\n        \"lindas ark\": \"Linda's ark\",\n        \"linke hand\": \"Linke Hand\",\n        \"linkringrin\": \"リンクリングリン\",\n        \"lion heart\": \"Lion Heart\",\n        \"liongoya\": \"らいおん小屋\",\n        \"lip van winkle\": \"Lip Van Winkle\",\n        \"lipstar\": \"LIPSTAR\",\n        \"lipterrible\": \"クチビルテリブル\",\n        \"liquid\": \"リキッド\",\n        \"lirico\": \"lirico\",\n        \"listless time\": \"listless time\",\n        \"lithium\": \"Lithium\",\n        \"little bear\": \"リトルベア\",\n        \"little cosmos\": \"Little☆Cosmos\",\n        \"little hopper with h\": \"りとるほっぱー with H\",\n        \"little lindo\": \"Little Lindo\",\n        \"little mantis\": \"Little mantis\",\n        \"little mermaid henshuubu\": \"リトル・マーメイド編集部\",\n        \"little quartz\": \"Little Quartz\",\n        \"little shop\": \"little shop\",\n        \"little snow\": \"little snow\",\n        \"littlemare\": \"リトルメア\",\n        \"littleollie\": \"Littleollie\",\n        \"live kuroneko iin\": \"来舞黒猫医院\",\n        \"liz\": \"LiZ\",\n        \"liz project\": \"liz project\",\n        \"lo likyo new\": \"LoりきょNEW!\",\n        \"lo5type\": \"Lo5type\",\n        \"lobatt\": \"LOBATT\",\n        \"lobelia\": \"Lobelia\",\n        \"local kintas\": \"Local Kintas\",\n        \"locomocodon\": \"ろこもこどん\",\n        \"locus\": \"Locus\",\n        \"log\": \"LOG\",\n        \"log house\": \"Log House\",\n        \"logic choco\": \"ロジックチョコ\",\n        \"loiter\": \"loiter\",\n        \"lol\": \"LOL\",\n        \"loli goranyo\": \"ろりーごーらんにょ\",\n        \"lolic system\": \"LOLIC SYSTEM\",\n        \"lolicon trap\": \"ロリコントラップ\",\n        \"lolimajin\": \"ろりま陣\",\n        \"lolimate seizou koujou\": \"ロリメイト製造工場\",\n        \"lolli pop\": \"Lolli*PoP\",\n        \"lolol\": \"LOLOL\",\n        \"lomelette\": \"Lomelette\",\n        \"lonely island\": \"ロンリーアイランド\",\n        \"longhorntrain\": \"LongHornTrain\",\n        \"loopholic\": \"loopholic\",\n        \"loopsoft\": \"loopsoft\",\n        \"lop\": \"LOP\",\n        \"lopet dan\": \"ろぺっとだん\",\n        \"loser\": \"LOSER\",\n        \"lost garden\": \"Lost Garden\",\n        \"lotus\": \"LOTUS\",\n        \"love and sekkan\": \"らぶ&セッカン\",\n        \"love bird\": \"Love Bird\",\n        \"love bitch\": \"らぶびっち\",\n        \"love circle young punch\": \"ラブサークルヤングパンチ\",\n        \"love kyun maiden\": \"らぶキュンめいでん\",\n        \"love me do\": \"LOVE ME DO\",\n        \"love size\": \"ラブサイズ\",\n        \"love xxx.\": \"love xxx.\",\n        \"love-rs\": \"love-Rs\",\n        \"love4sale\": \"love4sale\",\n        \"lovejuice pink\": \"LoveJuiceピンク\",\n        \"loveletter carburetor\": \"恋文気化器\",\n        \"lovelovedoll\": \"LOVELOVEDOLL\",\n        \"lovely complex\": \"Lovely complex\",\n        \"lovely pretty chou aishiteru\": \"ラブリープリチー超愛してる\",\n        \"loveolsis\": \"らぶおるしす\",\n        \"lovesca\": \"lovesca\",\n        \"lovesugi\": \"らぶすぎ\",\n        \"low angler\": \"ろうあんぐら～\",\n        \"low tech team\": \"Low Tech Team\",\n        \"low-f\": \"Low-F\",\n        \"low-tension\": \"Low-Tension\",\n        \"lowhide project\": \"LOWHIDE PROJECT\",\n        \"lrig lab\": \"ルリ研\",\n        \"ls\": \"LS\",\n        \"ls-box\": \"LS-Box\",\n        \"lsize\": \"Lサイズ\",\n        \"ltm.\": \"LTM.\",\n        \"ltu\": \"Ltu\",\n        \"luciferhood\": \"Luciferhood\",\n        \"luck and pluck co.\": \"LUCK&PLUCK!Co.\",\n        \"luck gear\": \"Lucky GEAR\",\n        \"luck10\": \"Luck10\",\n        \"lucky club\": \"LUCKY CLUB\",\n        \"lucky paranoia\": \"lucky paranoia\",\n        \"luckyend\": \"ラッキーエンド\",\n        \"luckystripe\": \"LuckyStripe\",\n        \"lucretia\": \"LUCRETiA\",\n        \"lucyr\": \"LUCYR\",\n        \"lulu koubou\": \"LULU工房\",\n        \"lummy\": \"Lummy\",\n        \"lumnesoda\": \"ラムネソーダ\",\n        \"luna industria\": \"ルナ・インダストリア\",\n        \"luna papa\": \"LUNA PAPA\",\n        \"luna soft\": \"ルナソフト\",\n        \"lunacy\": \"Lunacy\",\n        \"lunar gravity acceleration\": \"月面重力加速度\",\n        \"lunarium\": \"ルナリウム\",\n        \"lunasummit\": \"LUNASUMMIT\",\n        \"lunaterk\": \"るなたーく\",\n        \"lunatic\": \"ルナティック\",\n        \"lunatic joker\": \"lunatic joker\",\n        \"lunatic orgasm\": \"ルナティックオーガズム\",\n        \"lunatic prophet\": \"LUNATIC PROPHET\",\n        \"lunatic star\": \"ルナティックスター\",\n        \"lunatic traveler\": \"るなてぃっくとらべらー\",\n        \"lunatics\": \"Lunatics\",\n        \"lunatique\": \"LUNATIQUE\",\n        \"lunch box\": \"LUNCH BOX\",\n        \"lunchbox\": \"lunchbox\",\n        \"lune\": \"ルネ\",\n        \"lune comic\": \"ルネコミック\",\n        \"lune team bitters\": \"ルネ Team Bitters\",\n        \"lust bit\": \"ルストビット\",\n        \"lusterise\": \"Lusterise\",\n        \"lutein\": \"るていん\",\n        \"luwen workshop\": \"Luwen Workshop\",\n        \"luxia continent\": \"るくしあ大陸\",\n        \"luxury\": \"ラグジュアリー\",\n        \"luxury tiara\": \"Luxury Tiara\",\n        \"lv.x\": \"LV.X+\",\n        \"lycoly\": \"Lycoly\",\n        \"lyrical magical\": \"リリカルマジカル\",\n        \"lyricalize\": \"Lyricalize\",\n        \"lyricbox\": \"リリックボックス\",\n        \"m\": \"M\",\n        \"m de pink\": \"M de PINK\",\n        \"m no violet\": \"エム・ヴァイオレット\",\n        \"m shousetsu doumei\": \"M小説同盟\",\n        \"m-10\": \"M-10\",\n        \"m-free\": \"M-FREE\",\n        \"m-keifu\": \"Mケイフ\",\n        \"m-koujou\": \"M工場\",\n        \"m-lab.\": \"M-LAB.\",\n        \"m-style\": \"M・S T Y L E\",\n        \"m-trinity\": \"M-trinity\",\n        \"m.a.d works\": \"M.A.D WORKS\",\n        \"m.a.f\": \"M.A.F\",\n        \"m.a.l.t\": \"m.a.l.t\",\n        \"m.h. bokujou\": \"M.H.牧場\",\n        \"m.i.r.u\": \"M.I.R.U\",\n        \"m.i.ring\": \"M.I.RING\",\n        \"m.o.k. teabag\": \"M.O.K.ちゃぶくろ\",\n        \"m.r products\": \"M.R プロダクツ\",\n        \"m2230\": \"m2230\",\n        \"ma2\": \"MA2\",\n        \"mabatakimosezu\": \"瞬きもせず\",\n        \"mabo udon teishoku\": \"麻婆うどん定食\",\n        \"mabonasu\": \"マーボーナス\",\n        \"macaron\": \"マカロン\",\n        \"macaron sketch\": \"Macaron*Sketch\",\n        \"macaron sugar\": \"まかろんシュガー\",\n        \"macaroncrown\": \"MacaronCrown\",\n        \"macaroni ring\": \"マカロニグミ\",\n        \"macaroni teikoku\": \"マカロニ帝国\",\n        \"macchadokoro\": \"抹茶処\",\n        \"macdoll\": \"macdoll\",\n        \"machednia\": \"まけどに屋\",\n        \"machi no kissaten\": \"街の喫茶店\",\n        \"machida cherry boys\": \"町田チェリーボーイズ\",\n        \"machikado-mapoze\": \"街角麻婆豆\",\n        \"machinery\": \"マシーナリー\",\n        \"machwing\": \"マッハウイング\",\n        \"maclona\": \"まっ黒な\",\n        \"macneil koubou\": \"マクニエル工房\",\n        \"macolulu\": \"マコルル\",\n        \"macrown\": \"macrown\",\n        \"macv-sog\": \"MACV-SOG\",\n        \"mad hand rowa\": \"マドハンドロワ\",\n        \"mad mac\": \"MAD MAC\",\n        \"mad-puppy\": \"MAD-PUPPY\",\n        \"mada maniau kamo\": \"まだ間に合うかも\",\n        \"madam project\": \"マダム・プロジェクト\",\n        \"mado no kuchibue fuki\": \"窓の口笛吹き\",\n        \"mado soft\": \"まどそふと\",\n        \"madogiwa oukoku\": \"窓際王国\",\n        \"madogiwa works\": \"Madogiwa Works\",\n        \"madou shiryoushitsu\": \"魔導資料室\",\n        \"madraid\": \"マッドレイド\",\n        \"maebax\": \"maebax\",\n        \"mafiya\": \"マフィ家\",\n        \"mafuri marimonnu\": \"まふりまりもんぬ\",\n        \"mafuya\": \"まふ屋\",\n        \"mag\": \"まぐ!\",\n        \"mag kan\": \"MAG館\",\n        \"magaimonoyasoinabashiten\": \"まがいもの八十稲羽支店\",\n        \"magetarudou\": \"髷樽堂\",\n        \"magi\": \"MAGI\",\n        \"magi black\": \"MAGI black\",\n        \"magic fortune hachioujiten\": \"マジックフォーチュン八王子店\",\n        \"magic house\": \"まじっくハウス\",\n        \"magic machinery\": \"MAGIC MACHINERY\",\n        \"magic private eye\": \"魔法探偵社\",\n        \"magic wand\": \"Magic wand\",\n        \"magical arts\": \"マジカルアーツ\",\n        \"magical garden\": \"魔法庭園\",\n        \"magnetic field\": \"MAGNETIC FIELD\",\n        \"magnitude 711\": \"マグニ厨度711\",\n        \"magnolia\": \"MAGNOLIA\",\n        \"magont\": \"MAGONT\",\n        \"magudara kaihou doumei\": \"マグダラ解放同盟\",\n        \"magukappu\": \"マグカップ\",\n        \"maguma sansou\": \"マグマ山荘\",\n        \"maguni fc\": \"マグニFC\",\n        \"maguro\": \"MAGURO\",\n        \"maguro beya\": \"まぐろ部屋\",\n        \"maguro bokujo\": \"まぐろ牧場\",\n        \"maguro donburi\": \"まぐろどんぶり\",\n        \"maguro.\": \"maguro.\",\n        \"magurodrastic\": \"まぐろドラスティック\",\n        \"mahirutei\": \"まひる亭\",\n        \"mahjong yugen co.ltd 58\": \"麻雀有限会社58\",\n        \"mahola\": \"MaHoLa\",\n        \"mahouse\": \"MAHOUSE\",\n        \"mahupoko\": \"マフポコ\",\n        \"maibotsu\": \"埋没\",\n        \"maichan kikaku\": \"まいちゃん企画\",\n        \"maid club\": \"メイド倶楽部\",\n        \"maika\": \"MAIKA\",\n        \"maikata kougyou\": \"マイカタ工業\",\n        \"maimaimai\": \"まいまいまい！\",\n        \"maina-mania\": \"マイナー・マニア\",\n        \"mainichi ga mushi no iki\": \"毎日が虫の息\",\n        \"mainichi sonoba shinogi\": \"毎日その場シノギ\",\n        \"maisai\": \"まいさい\",\n        \"majesticrune\": \"MajesticRune\",\n        \"majihima\": \"まじひま\",\n        \"majikayo\": \"マジかよ\",\n        \"majikoru gensou kyoudan\": \"蠱る幻想狂団\",\n        \"majimadou\": \"真嶋堂\",\n        \"majin houkou\": \"魔神咆哮\",\n        \"majocolony\": \"majocolony\",\n        \"maka no sokutu\": \"摩訶の巣窟\",\n        \"maka-rakko\": \"まからっこ\",\n        \"make pig press\": \"make pig press\",\n        \"make3d\": \"MAKE3D\",\n        \"makepriority\": \"MakePriority\",\n        \"makiba no asa\": \"まきばの朝\",\n        \"makikusu\": \"まきくす\",\n        \"makino eki\": \"牧野駅\",\n        \"makka tintin\": \"マッカTINTIN\",\n        \"makkou kujira\": \"まっこうくじら\",\n        \"makkurona\": \"まっ黒な\",\n        \"makoto shiyaka\": \"間琴しや架\",\n        \"makoto skip\": \"まこと☆スキップ\",\n        \"maku\": \"Maku\",\n        \"makura\": \"枕\",\n        \"makuriya\": \"まくりや\",\n        \"makushiro\": \"マクシロ\",\n        \"malus pumila\": \"まるすぷみら\",\n        \"mama ni wa naisho\": \"ママにはナイショ\",\n        \"mama-san ballet\": \"ママさんバレエ\",\n        \"mamagotoya\": \"ままごと屋\",\n        \"mamagult\": \"ママグル徒\",\n        \"mamamax\": \"MAMAMAX\",\n        \"mame\": \"豆\",\n        \"mamedaifukuya\": \"豆大福屋\",\n        \"mamekome\": \"まめこめ\",\n        \"mamekura\": \"豆蔵\",\n        \"mamemochi\": \"まめもち\",\n        \"mamenon\": \"まめのん\",\n        \"mamex\": \"mamex\",\n        \"mamiana paradise\": \"狸穴天国\",\n        \"mammypoko\": \"＊mammypoko＊\",\n        \"mamoru soup\": \"まもるスープ\",\n        \"man chin low\": \"満珍楼\",\n        \"man say\": \"Man Say\",\n        \"man-room\": \"MAN-ROOM\",\n        \"manam\": \"MANAM\",\n        \"manamagu\": \"まなまぐ\",\n        \"manbaka\": \"漫バカ\",\n        \"manboutei\": \"まんぼう亭\",\n        \"manbun no ichi\": \"万分の市\",\n        \"manchindou\": \"マンチン堂\",\n        \"mandoragora striker\": \"まんどらごらすとらいかー\",\n        \"mandrill\": \"まんドリル\",\n        \"manga jigoku\": \"マンガジゴク\",\n        \"manga super\": \"マンガスーパー\",\n        \"mangan\": \"マンガン\",\n        \"mangana\": \"漫画な。\",\n        \"manganiku\": \"幡芽にく\",\n        \"mange\": \"万華\",\n        \"mangetsu hagure\": \"満月はぐれ\",\n        \"mangosteen\": \"マンゴスチン\",\n        \"manguri cannon\": \"まんぐりキャノン\",\n        \"maniac street\": \"Maniac Street\",\n        \"manianima\": \"まにあにま\",\n        \"maniax55\": \"ManiaX55\",\n        \"manimani.\": \"まにまに。\",\n        \"manitou\": \"MANITOU\",\n        \"manjuu x\": \"まんじゅうX\",\n        \"manjyu-umai.\": \"まんじゅううまい。\",\n        \"mankan zenseki\": \"漫甘全席\",\n        \"manles laboratory\": \"マンルのラボラトリー\",\n        \"manman\": \"まんまん\",\n        \"manmanya\": \"まんまん屋\",\n        \"manmaru hoppe\": \"まんまるほっぺ\",\n        \"mano-ya\": \"まの屋\",\n        \"manpuchi\": \"まんぷち\",\n        \"mantaman\": \"マンタマン\",\n        \"manten hoshizora\": \"満天星空\",\n        \"mantobi\": \"まんとび\",\n        \"many b\": \"Many B\",\n        \"manymanyrain\": \"manymanyrain\",\n        \"manzokudou\": \"満足堂\",\n        \"maple-go\": \"maple号\",\n        \"marabians\": \"マラビアンズ\",\n        \"marakkuma\": \"マラックマ\",\n        \"maraparte\": \"まらぱるて\",\n        \"marasca no oni\": \"マラスカの鬼\",\n        \"maraschino\": \"MARASCHINO\",\n        \"marastudio\": \"MaraStudio\",\n        \"marble\": \"marble\",\n        \"marble candy soft\": \"マーブルCandySoft\",\n        \"marble kid\": \"マーブルキッド\",\n        \"marbodon\": \"MARBODON\",\n        \"march\": \"MARCH\",\n        \"marchen honpo\": \"メルヘン本舗\",\n        \"margarita\": \"Margarita\",\n        \"marge-loop\": \"Marge-Loop\",\n        \"maria system00\": \"Maria_System00\",\n        \"marialite\": \"Marialite\",\n        \"mariana kaikou kikaku\": \"まりあな海溝企画\",\n        \"marigold\": \"marigold\",\n        \"marin\": \"まりん\",\n        \"marinconia\": \"MARINCONIA\",\n        \"marine\": \"マリン\",\n        \"marinwhip\": \"まりんホイップ\",\n        \"mario almanac\": \"MARIO ALMANAC\",\n        \"marisaya\": \"まりさ屋\",\n        \"marley and scrooge shoukai\": \"マーリィ&スクルージ商会\",\n        \"marmalade\": \"ま～まれぇど\",\n        \"maromayu\": \"まろまゆ\",\n        \"maromi club\": \"まろみくらぶ\",\n        \"maron head\": \"マロンヘッド\",\n        \"maroron ex\": \"マロロンEX\",\n        \"maroyaka kominka\": \"まろやか古民家\",\n        \"marry bell\": \"マリーベル\",\n        \"marshmallow kyoudan\": \"マシュマロ響団\",\n        \"marshmallow soft\": \"ましゅまろそふと\",\n        \"marshmallow x whip\": \"ましゅまろ×ほいっぷ\",\n        \"maru tendon\": \"まる天丼\",\n        \"maruarai\": \"まるあらい\",\n        \"marubatsu bunko\": \"○×文庫\",\n        \"maruchuu seisaku\": \"まるちゅう製作\",\n        \"marugoshi-do\": \"丸腰堂\",\n        \"maruguya.exe\": \"まるぐ屋.exe\",\n        \"maruhamaya\": \"マルハマヤ\",\n        \"marui don\": \"丸居丼\",\n        \"maruiro kikou\": \"丸色季候\",\n        \"marukaya\": \"まるか家\",\n        \"marumagic\": \"まるまgic\",\n        \"marumaru arumajiro\": \"まるまるアルマジロー\",\n        \"marume works\": \"マルメワークス\",\n        \"maruno keikaku\": \"まるの計画\",\n        \"marunomare\": \"まる のま れ\",\n        \"marusan\": \"まるサン\",\n        \"maruta production\": \"MARUTA Production\",\n        \"maruta-dojo\": \"丸田道場\",\n        \"marutori corp\": \"まる鳥Corp\",\n        \"marutori no chazuke\": \"丸鳥の茶漬け\",\n        \"marvelous zents\": \"Marvelous Zents\",\n        \"mary no yamai\": \"メリィの病\",\n        \"mashimin koubou\": \"ましみん工房\",\n        \"mashiro no hihoukan\": \"真城の秘宝館\",\n        \"mashomaro\": \"マショ麻呂\",\n        \"masmenos\": \"マスメノス\",\n        \"massala\": \"まっさら\",\n        \"massaratou\": \"まっさら島\",\n        \"master volume\": \"Master Volume\",\n        \"master-random\": \"Master-random\",\n        \"masulao maximum\": \"MASULAO MAXIMUM\",\n        \"masuraion.\": \"ますらいおん。\",\n        \"masurao\": \"MASURAO\",\n        \"mat\": \"MAT\",\n        \"matagitei\": \"マタギ亭\",\n        \"matango honten\": \"マタンゴ本店\",\n        \"matatabi sanjou\": \"またたび参上\",\n        \"maten\": \"魔天\",\n        \"material\": \"Material\",\n        \"matilda kanmidokoro\": \"まちるだ甘味処\",\n        \"matine\": \"matine\",\n        \"matsuda shin\": \"松田シン\",\n        \"matsuge antenna\": \"マツゲアンテナ\",\n        \"matsumoto drill kenkyuujo\": \"松本ドリル研究所\",\n        \"matsumoto kichidi\": \"松本きちぢ\",\n        \"matsumotoke\": \"松本家\",\n        \"matsunoan\": \"マツノアン\",\n        \"matsuri kikaku\": \"祭企画\",\n        \"matsurika\": \"茉莉花\",\n        \"matsutakehime\": \"松茸姫\",\n        \"matsuyama seiji\": \"松山せいじ\",\n        \"mattari house\": \"まったりハウス\",\n        \"mattsuaya\": \"まっつあ屋\",\n        \"matyaya\": \"真茶屋\",\n        \"maumau shoujotai\": \"まうまう少女帯\",\n        \"max and cool\": \"MAX&Cool.\",\n        \"maxal\": \"マクサル\",\n        \"maxi\": \"MAXI\",\n        \"maxi age\": \"MAXI AGE\",\n        \"maxi queen\": \"Maxi Queen\",\n        \"maximum wind\": \"MAXIMUM WIND\",\n        \"maxiy\": \"MAXIY\",\n        \"maxzheart\": \"マックズハート\",\n        \"may\": \"May\",\n        \"may no tenshi\": \"メイの天使\",\n        \"maya-tei\": \"まや邸\",\n        \"mayakasiya\": \"まやかしや\",\n        \"mayo bukuro\": \"マヨぶくろ\",\n        \"mayoineko\": \"迷い猫\",\n        \"mayonaka no acchigawa\": \"真夜中のあっち側\",\n        \"mayonaka no funkotsudou\": \"真夜中のふんこつどう\",\n        \"mayonaka tsubame\": \"真夜中ツバメ\",\n        \"mayonnaise bakufu\": \"マヨネーズ幕府\",\n        \"mayorice suishou iinkai\": \"マヨライス推奨委員会\",\n        \"mayu to mato\": \"まゆとまと\",\n        \"mayugesaien\": \"眉毛菜園\",\n        \"mayugeya\": \"眉毛屋\",\n        \"mazarashi\": \"まざらし\",\n        \"maze\": \"まぜ | 迷-めいず-(メイズ)\",\n        \"maze rerijio\": \"迷図 レリジオ\",\n        \"mazemono\": \"まぜもの\",\n        \"mbs truth\": \"メイビーソフトトゥルース\",\n        \"mc hanbaiten\": \"エムシー販売店\",\n        \"mcnail koubou\": \"まくねいる工房\",\n        \"mdo\": \"MDO\",\n        \"mean machine\": \"MEAN MACHINE\",\n        \"mebi-ken\": \"女美研\",\n        \"mach maze\": \"メックメイズ\",\n        \"mechanical code\": \"メカニカルコード\",\n        \"mechanical pencil\": \"メカニカルペンシル\",\n        \"mecharis\": \"mecharis\",\n        \"medama keikoku\": \"めだま渓谷\",\n        \"medetasi\": \"めでたし\",\n        \"media zomex\": \"メディアZOMEX\",\n        \"medical berry\": \"Medical Berry\",\n        \"medical company\": \"めでぃかるカンパニー\",\n        \"medium bodied\": \"Medium bodied\",\n        \"medium passion\": \"medium passion\",\n        \"mega heart ski\": \"Mega Heart Ski\",\n        \"mega w\": \"mega w\",\n        \"mega-mix\": \"MEGA-MIX\",\n        \"megabox\": \"メガボックス\",\n        \"megacycle13\": \"Megacycle13\",\n        \"megafeps\": \"MEGAFEPS\",\n        \"megalith production\": \"MEGALITH PRODUCTION\",\n        \"megalodon\": \"megalo丼\",\n        \"megami\": \"メガミ\",\n        \"megami kyouten\": \"女神教典\",\n        \"megami no tamago\": \"メガミノタマゴ\",\n        \"megamouthsystem\": \"MEGAMOUTHsystem\",\n        \"megane beam\": \"めがねビーム\",\n        \"megane gaikotsu\": \"メガネガイコツ\",\n        \"megane81\": \"MEGANE81\",\n        \"megasoundorchestra\": \"MegaSoundOrchestra\",\n        \"megative gate\": \"メガてぃぶGATE\",\n        \"megaton express\": \"メガトン・エクスプレス\",\n        \"megrim\": \"Megrim\",\n        \"meguro teikoku\": \"目黒帝国\",\n        \"megurumi\": \"めぐるみ\",\n        \"mei\": \"明\",\n        \"meikyoushisui\": \"明鏡止水\",\n        \"meiousei presents\": \"冥王星Presents\",\n        \"meirei denpa\": \"命令電波\",\n        \"meisaku network\": \"名作ネットワーク\",\n        \"meishou misettei\": \"名称未設定\",\n        \"meisou junkie\": \"迷走ジャンキー\",\n        \"meiteitei.\": \"MEiTEiTEi.\",\n        \"mekabu fighter\": \"メカブファイター\",\n        \"mekabutei\": \"めかぶ亭\",\n        \"mekakushi musume\": \"目隠し娘\",\n        \"mekao\": \"Mekao\",\n        \"mekimeki oukoku\": \"めきめき王国\",\n        \"mekongdelta\": \"MEKONGDELTA\",\n        \"mekujira\": \"めくじら\",\n        \"mekurume yuuen\": \"目眩悠遠\",\n        \"mellow\": \"mellow\",\n        \"melody\": \"Melody\",\n        \"melomo\": \"メロモ\",\n        \"melon\": \"Melon\",\n        \"melon no hoshiboshi\": \"めろんの星々\",\n        \"melon pants\": \"めろんぱんつ\",\n        \"meloncholic\": \"meloncholic\",\n        \"melt downers\": \"MELT DOWNERS\",\n        \"melt-down\": \"MELT-DOWN\",\n        \"melty koubou\": \"メルティ工房\",\n        \"mememery\": \"mememery\",\n        \"memexile\": \"めめXILE\",\n        \"memeya\": \"メメ屋\",\n        \"memme douza\": \"メッメ堂座\",\n        \"memoria\": \"Memoria\",\n        \"mengerekun\": \"めんげれくん\",\n        \"menino\": \"Menino\",\n        \"mens equal k\": \"MEN'S=K\",\n        \"mentaiko\": \"MENたいこ\",\n        \"mental sex\": \"mental sex\",\n        \"mental specialist\": \"めんたるスペシャリスト\",\n        \"mentei dokoro\": \"めんてい処\",\n        \"menya okamoto\": \"麺屋オカモト\",\n        \"meow\": \"MEOW\",\n        \"meowdic core\": \"Meowdic Core\",\n        \"mephisto\": \"メフィスト\",\n        \"merapuremi\": \"めらぷれみ\",\n        \"mercator zuhou\": \"メルカトル図法\",\n        \"merci\": \"メルシー\",\n        \"mercurochrome\": \"ま～きゅろ\",\n        \"meringue\": \"めれんげ\",\n        \"merino\": \"めりの\",\n        \"merkmal\": \"めるくまーる\",\n        \"meromero melon\": \"xoxoメロン\",\n        \"meromerofactory xl\": \"メロメロファクトリーXL\",\n        \"meronpanchu\": \"めろんぱんちゅ\",\n        \"meroro\": \"meroro\",\n        \"merukoro\": \"メルコロ\",\n        \"merveille\": \"merveille\",\n        \"meryx3\": \"MERYx3\",\n        \"meshita\": \"目下\",\n        \"meshiya\": \"飯屋\",\n        \"mess zylinder\": \"メスしりんだ～\",\n        \"messiah and pikaring\": \"messiah&pikaring\",\n        \"messiah syndrome\": \"MessiahSyndrome\",\n        \"shiawase hotel\": \"しあわせホテル\",\n        \"mesuchanghonpo\": \"メスチャンホンポ\",\n        \"mesuman teikoku\": \"メスマン帝国\",\n        \"metabocafe offensive smell uproar\": \"メタボ喫茶異臭騒ぎ\",\n        \"metal drill pure chinpo land\": \"メタルドリルピュアちんぽランド\",\n        \"metal kids meeting\": \"METAL KIDS MEETING\",\n        \"metal-egg\": \"METAL-EGG\",\n        \"metal-wind\": \"METAL-WIND\",\n        \"metallic steel\": \"メタリックスチール\",\n        \"metalltanz\": \"メタルタンツ\",\n        \"metalrack\": \"めたるらっく\",\n        \"metamor\": \"めたもる\",\n        \"metamorphose\": \"めたもるふぉーぜ\",\n        \"meteor\": \"メテオ\",\n        \"meteor garden\": \"メテオガーデン\",\n        \"meteor labyrinth\": \"メテオ☆ラビリンス\",\n        \"metro notes\": \"めとろのーつ\",\n        \"metroier\": \"メトロイヤー\",\n        \"mexe.jp\": \"mexe.jp\",\n        \"mezase esisama\": \"目指せ絵師様\",\n        \"mf future\": \"MF Future\",\n        \"mg.\": \"mg.\",\n        \"mgt\": \"MGT\",\n        \"mgw\": \"MGW\",\n        \"mi\": \"mi\",\n        \"miburi\": \"美武里\",\n        \"mica\": \"MICA\",\n        \"michinakaba\": \"三血中吐\",\n        \"michinoku hitori tabi\": \"みちのく一人旅\",\n        \"micro page\": \"みくろぺえじ\",\n        \"microbeurre\": \"Microbeurre\",\n        \"microbit\": \"Microbit\",\n        \"microdat\": \"マイクロ脱兎\",\n        \"micromacro\": \"MICROMACRO\",\n        \"middle earth\": \"みどるあ～す\",\n        \"midnight muumus\": \"ミッドナイトむぅむズ\",\n        \"midnight pleasure\": \"ミッドナイトプレジャー\",\n        \"midori no niwatori\": \"緑の鶏\",\n        \"midoriiro cut in\": \"緑色カットIN\",\n        \"midoriya\": \"みどりや\",\n        \"mig\": \"mig\",\n        \"migimagari-ya\": \"右曲がり屋\",\n        \"migome\": \"ミゴメ\",\n        \"migumigu-sou\": \"ミグミグ荘\",\n        \"mijirushi box\": \"みじるしBOX\",\n        \"mika-chan center\": \"ミカちゃんセンター\",\n        \"mikaguuland\": \"みかぐーらんど\",\n        \"mikaka\": \"みかか\",\n        \"mikan douwa\": \"未完童話\",\n        \"mikan to uri\": \"蜜柑と瓜\",\n        \"mikan-ya\": \"みかん屋\",\n        \"mikanbako\": \"みかん箱\",\n        \"mikanberry\": \"ミカンベリー\",\n        \"mikandensya\": \"蜜柑電車\",\n        \"mikapikazo\": \"MikaPikazo\",\n        \"mikayla\": \"ミカイラ\",\n        \"mikazuki ondo\": \"三日月音頭\",\n        \"mike ni mage\": \"三毛にマゲ\",\n        \"mikeneko disco\": \"三毛猫ディスコ\",\n        \"mikeneko-children\": \"三毛猫チルドレン\",\n        \"mikenekodou\": \"三毛猫堂\",\n        \"mikenekotei\": \"みけ猫亭\",\n        \"mikkamisaki\": \"みっかみさき\",\n        \"mikorabi\": \"みこらび\",\n        \"mikouken 2nd\": \"味巧軒2nd\",\n        \"milcrepe\": \"みるくれーぷ\",\n        \"milf shobou\": \"ミルフ書房\",\n        \"milk angel\": \"みるくえんじぇる\",\n        \"milk boy\": \"みるくぼーい\",\n        \"milk cha\": \"みるく茶\",\n        \"milk chips\": \"ミルクチップス\",\n        \"milk cocoa shake\": \"ミルクココアセーキ\",\n        \"milk crown\": \"ミルククラウン\",\n        \"milk drop\": \"みるくどろっぷ\",\n        \"milk ejaculation\": \"みるくいじゃきゅれーしょん\",\n        \"milk gohan\": \"みるくごはん\",\n        \"milk hall\": \"milk hall\",\n        \"milk land\": \"MILK LAND\",\n        \"milk pai\": \"みるくぱい\",\n        \"milk price\": \"MILK☆PRICE\",\n        \"milk ring\": \"milk ring\",\n        \"milk rotary\": \"みるくロータリー\",\n        \"milk server\": \"みるくさーばー\",\n        \"milk standard\": \"MILK STANDARD\",\n        \"milk tea house\": \"牛乳茶屋\",\n        \"milk-size\": \"みるく-SIZE\",\n        \"milkholic\": \"milkholic\",\n        \"milkpop\": \"MILKPOP\",\n        \"milkshake work\": \"奶昔工坊\",\n        \"milktub\": \"milktub\",\n        \"milky high tension\": \"ミルキーハイテンション♂\",\n        \"milky paint\": \"Milky Paint\",\n        \"milky pearl\": \"みるきぃぱぁる\",\n        \"milky souffle\": \"みるきーすふれ\",\n        \"milky strike\": \"milky strike\",\n        \"milky way\": \"みるきーうぇい\",\n        \"mill-mill\": \"Mill-Mill\",\n        \"mille-feuille\": \"ミルフィーユ\",\n        \"million bank\": \"みりおんばんく\",\n        \"million beast from diana\": \"Million beast from DIANA\",\n        \"million drops\": \"MILLION☆DROPS\",\n        \"millionlove\": \"みりおんらぶ\",\n        \"millions hope\": \"Millions Hope\",\n        \"milts chaya\": \"みるつ茶屋\",\n        \"mimasaka direct\": \"ミマサカダイレクト\",\n        \"mime channel\": \"MImeチャンネル\",\n        \"mimesis\": \"ミメーシス\",\n        \"mimicry.z\": \"みみくりどっとぜっと\",\n        \"mimippu\": \"みみっぷ\",\n        \"mimishiki\": \"耳式\",\n        \"mimitto\": \"ミミット\",\n        \"mimiya\": \"耳屋\",\n        \"mimizu thousand\": \"ミミズサウザンド\",\n        \"mimo hutamo\": \"身も蓋も\",\n        \"mimori.\": \"ミモリ。\",\n        \"mimoritei\": \"水護亭\",\n        \"mimoton\": \"みもとん\",\n        \"mimura namae\": \"三村生恵\",\n        \"minadukitei\": \"水無月亭\",\n        \"minami alps\": \"ミナミアルプス\",\n        \"minamikanazawa 5th studio\": \"南金沢第五スタジオ\",\n        \"minamono\": \"みなmono\",\n        \"minamoon\": \"みなむーん\",\n        \"minarai honpo\": \"みならい本舗\",\n        \"minarindo\": \"みなりん堂\",\n        \"minarui\": \"みなるい\",\n        \"minasokomori\": \"水底森\",\n        \"minato carnival\": \"みなとカーニバル\",\n        \"minato future\": \"minato future\",\n        \"mind and mind\": \"Mind and Mind\",\n        \"mindstone\": \"マインドストーン\",\n        \"mine noujou\": \"ミネ農場\",\n        \"mine slash mine\": \"mine/mine\",\n        \"mineya\": \"峰屋\",\n        \"mini\": \"mini\",\n        \"minies club\": \"MINIES CLUB\",\n        \"minimum lab\": \"みにまむラボ\",\n        \"mink\": \"ミンク\",\n        \"mink ego\": \"Mink EGO\",\n        \"minna shindoi\": \"みんなしんどい\",\n        \"mino kureha\": \"美濃紅葉\",\n        \"minobu gentle\": \"身延ジェントル\",\n        \"minobuya\": \"みのぶ屋\",\n        \"minomushitei\": \"みのむし亭\",\n        \"minori\": \"minori\",\n        \"minori kenkyuujo\": \"みのり研究所\",\n        \"minors escort\": \"マイナーズエスコート\",\n        \"minpee\": \"みんペー\",\n        \"minshuku inarimushi\": \"民宿いなりむし\",\n        \"mint blue\": \"MINT BLUE\",\n        \"mint chocolate\": \"ミントチョコレート\",\n        \"mintcube\": \"MintCUBE\",\n        \"mintjulep\": \"mintjulep\",\n        \"minus unlimited\": \"-unlimited\",\n        \"minusartworks\": \"MinusArtWorks\",\n        \"minwa\": \"ミンワ\",\n        \"miogui\": \"澪杙\",\n        \"miracle candy\": \"ミラクルキャンディ\",\n        \"miracle ponchi matsuri\": \"ミラクルポンチ祭り\",\n        \"mirage\": \"鏡樹\",\n        \"mirage cat\": \"MIRAGE CAT\",\n        \"mirage-soft\": \"みらーじゅそふと\",\n        \"mirai\": \"mirai\",\n        \"mirapare\": \"みらぱれ\",\n        \"mirin\": \"みりん\",\n        \"mirukomi\": \"みるこみ\",\n        \"mirukuseiki\": \"みるく世紀\",\n        \"misaki ai\": \"美咲愛\",\n        \"misakix megamix\": \"MISAKIX MEGAMIX\",\n        \"misokko chuutai\": \"みそっ子中隊\",\n        \"misonodenpatou\": \"みそのデンパ塔\",\n        \"misopanya\": \"みそパン屋\",\n        \"misoya\": \"味噌屋\",\n        \"miss black offline\": \"MISS BLACK OFFLINE\",\n        \"missa\": \"missa\",\n        \"missing park\": \"MISSING PARK\",\n        \"misssail\": \"MISS/SAIL\",\n        \"mist night\": \"Mist Night\",\n        \"misty\": \"ミスティ\",\n        \"misty isle\": \"Misty Isle\",\n        \"misty wind\": \"Misty Wind\",\n        \"mita kazuo daihyakka\": \"三田和夫大百科\",\n        \"mitarashi club\": \"みたらし倶楽部\",\n        \"mitarou teishoku\": \"ミタロウ定食\",\n        \"mitegura\": \"MITEGURA\",\n        \"mithril\": \"ミスリル\",\n        \"miti\": \"ミィティ\",\n        \"mitikage\": \"みちかげ\",\n        \"mitsu\": \"蜜\",\n        \"mitsu-iro syrup\": \"蜜色シロップ\",\n        \"mitsuami mobius\": \"蜜あみメビウス\",\n        \"mitsuami romance\": \"三つ編みロマンス\",\n        \"mitsuiri house\": \"みついり♡ハウス\",\n        \"mitsuki no mori\": \"林樹の森～ミツキノモリ～\",\n        \"mitsumata suihanki\": \"三又炊飯器\",\n        \"mitsunoya\": \"みつのや\",\n        \"mitsuya yoguru\": \"ミツヤヨーグル\",\n        \"miumiu\": \"MiUMiU\",\n        \"miura jota\": \"三浦いお太\",\n        \"mitsuwa building\": \"三輪ビルヂング\",\n        \"miwaku-iro missile\": \"魅惑色ミサイル\",\n        \"mix station\": \"ミックス ステーション\",\n        \"mix-ism\": \"MIX-ISM\",\n        \"mixed breed\": \"mixed breed\",\n        \"mixwill soft\": \"Mixwill Soft\",\n        \"miyabi tsuzuru bu\": \"みやびつづる部\",\n        \"miyama enseki\": \"深山燕石\",\n        \"miyanchi\": \"みやんち\",\n        \"miyubi\": \"ミユビ\",\n        \"miyumiyu project\": \"みゆみゆProject\",\n        \"mizu\": \"水\",\n        \"mizuiro usagi\": \"Mizuiro うさぎ\",\n        \"mizuiro zenmai\": \"みずいろぜんまい\",\n        \"mizujouyu jouryuusho\": \"水醤油蒸留所\",\n        \"mizuki-chan club\": \"みずきちゃんくらぶ\",\n        \"mizukidou\": \"観月堂\",\n        \"mizumo club\": \"みずも倶楽部\",\n        \"mizutama neko\": \"水玉ねこ\",\n        \"mizutofu\": \"水豆腐\",\n        \"mizuwari neko\": \"水割り猫\",\n        \"mjgg\": \"もりじおぎゅうぎゅう\",\n        \"mjkitty\": \"mjkitty\",\n        \"mjks\": \"mjks\",\n        \"mk ultra\": \"MKウルトラ\",\n        \"mlkx\": \"MLKx\",\n        \"mm kan\": \"MM館\",\n        \"mmt\": \"MMT!!\",\n        \"mmu2000\": \"MMU2000\",\n        \"mnh\": \"MNH\",\n        \"moai lion\": \"モアイライオン\",\n        \"mob.1\": \"MOB.1\",\n        \"mobco.\": \"mobco.\",\n        \"mobris\": \"MOBRIS\",\n        \"mocchimochiya\": \"もっちもち屋\",\n        \"mocchomudake\": \"モッチョム茸\",\n        \"mochi dog laboratory\": \"餅犬製作所\",\n        \"mochi hasamiuchi da\": \"餅はさみ撃ちだっ!\",\n        \"mochi kiss junkie\": \"もちxoジャンキー\",\n        \"mochi mochi\": \"もちもち\",\n        \"mochi mochi mikan\": \"もちもちみかん\",\n        \"mochi-ya\": \"餅屋\",\n        \"mochimochi carnevale\": \"もちもちCarnevale\",\n        \"mochimochi dou\": \"もちもち堂\",\n        \"mochimochitaiyo\": \"もちもちたいよう\",\n        \"mochinige\": \"持ち逃げ\",\n        \"mochinonnon.\": \"もちのんのん。\",\n        \"mocking soft\": \"木琴Soft\",\n        \"moco chouchou\": \"Moco Chouchou\",\n        \"moco note\": \"もこのーと\",\n        \"mocreation\": \"mocreation\",\n        \"modae shine\": \"悶え死ね!!!\",\n        \"moe\": \"MoE\",\n        \"moe dukuri oukoku\": \"萌えづくり王国\",\n        \"moegekidon\": \"萌撃丼\",\n        \"moehina kagaku\": \"萌雛化学\",\n        \"moekorodo\": \"萌殺堂\",\n        \"moenai gomi bukuro\": \"萌えないゴミ袋\",\n        \"moenomiya\": \"萌宮\",\n        \"moeru gomi\": \"燃えるゴミ\",\n        \"moewrest\": \"もえれす\",\n        \"moffle\": \"moffle\",\n        \"mofu shippo lab\": \"もふしっぽらぼ\",\n        \"mofumanjuu\": \"もふまんじゅう\",\n        \"mofumofuen\": \"もふもふ苑\",\n        \"mofurafu\": \"mofurafu\",\n        \"mofuya\": \"モフ屋\",\n        \"mogemogeya\": \"モゲモゲ屋\",\n        \"mogetama\": \"もげたま\",\n        \"mogiki-chan chi\": \"もぎきちゃんち\",\n        \"mogullaz\": \"Mogullaz\",\n        \"mogumogu soft\": \"もぐもぐソフト\",\n        \"mogura company\": \"MOGURA COMPANY\",\n        \"mogura tengu\": \"もぐら天狗\",\n        \"moirai\": \"moirai\",\n        \"mojiya\": \"MOじ屋\",\n        \"mokkori musume.\": \"もっこり娘。\",\n        \"mokugyuutan\": \"もくぎゅうたん。\",\n        \"mokumoku\": \"もくもく\",\n        \"mokusa\": \"Mokusa\",\n        \"mokusei-gaeri\": \"木星帰り\",\n        \"mokuzou zabuton\": \"モクゾウザブトン\",\n        \"molamola.software\": \"Molamola.software\",\n        \"molfo\": \"molfo\",\n        \"molossan\": \"喪loss庵\",\n        \"molotov cocktail\": \"モロトフカクテル\",\n        \"molten club\": \"モルテンクラブ\",\n        \"moment silicon\": \"木綿シリコン\",\n        \"momi momi studio\": \"もみもみスタジオ\",\n        \"momiage rapunzel\": \"もみあげラプンツェル\",\n        \"momiji coffee\": \"もみじ珈琲\",\n        \"momiji mofumofutei\": \"椛もふもふ亭\",\n        \"momiji oroshi\": \"もみじおろし\",\n        \"mominoki\": \"もみの木\",\n        \"momizi koubou\": \"もみじ工房\",\n        \"momo\": \"Momo\",\n        \"momo mania\": \"桃マニア\",\n        \"momo no kanzume\": \"桃のカンヅメ\",\n        \"momo no omochi\": \"もものおもち\",\n        \"momo-meron\": \"桃メロン\",\n        \"momo.\": \"momo。\",\n        \"momoameya\": \"桃飴屋\",\n        \"momochi\": \"MOMOCHI\",\n        \"momochoko\": \"ももチョコ\",\n        \"momodaya\": \"百田屋\",\n        \"momohina\": \"桃雛\",\n        \"momoiro cait sith\": \"ももいろけっとしー\",\n        \"momoiro diva\": \"桃色DIVA\",\n        \"momoiro scissors\": \"桜色シザーズ\",\n        \"momoiro settoudan\": \"桃色窃盗団\",\n        \"momoiro sugoroku\": \"桃色双六\",\n        \"momoiro toiki\": \"桃色吐息\",\n        \"momoiro-gekijyou\": \"桃色劇場\",\n        \"momoiro-netsuduki\": \"桃色熱月\",\n        \"momoiro-rip\": \"ももいろリップ\",\n        \"momoirohoppe\": \"ももいろほっぺ\",\n        \"momoirosyounenki\": \"桃色少年期\",\n        \"momokan\": \"ももかん\",\n        \"momokawa\": \"モモカワ\",\n        \"momokuri\": \"もも栗\",\n        \"momomoya\": \"もももや\",\n        \"momonashi potato\": \"桃梨ぽてと\",\n        \"momoneko doumei\": \"ももねこ同盟\",\n        \"momonga club\": \"モモンガ倶楽部\",\n        \"momosakiiro\": \"桃咲色\",\n        \"momoshiba anzu\": \"ももしば杏子\",\n        \"momoziri hustle dou\": \"桃尻ハッスル堂\",\n        \"mon amour.\": \"もなむーる。\",\n        \"mon-petit\": \"mon-petit\",\n        \"monado\": \"MONADO\",\n        \"monako\": \"MONAKO\",\n        \"mondo\": \"モンド\",\n        \"mongoose studio\": \"高浜屋\",\n        \"moni teishoku\": \"もに定食\",\n        \"monica\": \"monica\",\n        \"monji koubou\": \"もんじ肛房\",\n        \"monke\": \"もんけ\",\n        \"monkey adventure\": \"モンキー・アドベンチャー\",\n        \"monkey pinx.\": \"MonkeyPinx.\",\n        \"monkey reppuutai\": \"モンキー烈風隊\",\n        \"monkeys factory\": \"モンキーズFACTORY\",\n        \"monmo bokujou\": \"モンモー牧場\",\n        \"mono letter\": \"モノ手紙\",\n        \"mono x chro\": \"モノ×クロ\",\n        \"monochrome\": \"モノクローム\",\n        \"monochrome circuit\": \"ものくろサーキット\",\n        \"monochrose\": \"monochrose\",\n        \"monoeye\": \"Monoeye\",\n        \"monokichi youhoujou\": \"ものきち養蜂場\",\n        \"monokulolli\": \"ものくろり\",\n        \"monokuromomiji\": \"モノクロモミジ\",\n        \"monokurored\": \"モノクロRed\",\n        \"monolove\": \"MONOLOVE\",\n        \"mononoke hobaku butai\": \"もののけ捕縛部隊\",\n        \"monorabbi\": \"ものらび\",\n        \"monpe kagekiha\": \"モンペ過激派\",\n        \"monshiro\": \"モンシロ\",\n        \"monster box\": \"もんすたーぼっくす\",\n        \"monster tribe\": \"MONSTER TRIBE\",\n        \"monstera\": \"モンステラ\",\n        \"monsters biscuit\": \"モンスターズビスケット\",\n        \"monte carlo-ya\": \"もんてかるろ屋\",\n        \"monteriakitto\": \"もんてりあきっと\",\n        \"monukenokara\": \"もぬけのから\",\n        \"moon knight sparkle\": \"MOON KNIGHT SPARKLE\",\n        \"moon the angry\": \"Moon the angry!\",\n        \"moon wort\": \"Moon Wort\",\n        \"moongarden\": \"MoonGarden\",\n        \"moonknives\": \"moonknives\",\n        \"moonlight diner\": \"ムーンライト・ダイナー\",\n        \"moonrevenge\": \"MoonRevenge\",\n        \"moorusu\": \"モール巣\",\n        \"mopuo oyakata\": \"もぷお親方\",\n        \"mor\": \"MOR\",\n        \"moladolog\": \"モラードログ\",\n        \"morgue\": \"morgue\",\n        \"mori no kumasan yuugekitai\": \"森のくまさん遊撃隊\",\n        \"mori no mushi\": \"森の蟲\",\n        \"mori no seirei tittilty\": \"森の精霊ティッティルティ\",\n        \"morihama no shindansho\": \"モリハマの診断書\",\n        \"moriisan-tokono\": \"森井さんとこの\",\n        \"moriman shoten\": \"森まん商店\",\n        \"morimori runrun\": \"もりもりルンルン\",\n        \"morino koubou\": \"森野工房\",\n        \"morinomiya koushinkyoku\": \"森ノ宮行進曲\",\n        \"morishigeru laboratory\": \"もりしげる研究所\",\n        \"morisoba iccho\": \"盛りそば一丁\",\n        \"morittokoke\": \"もりっとこけ\",\n        \"moriya\": \"杜屋\",\n        \"moriya630\": \"moriya630\",\n        \"morizo\": \"盛増\",\n        \"morning\": \"もーにんぐ\",\n        \"morohane.\": \"もろはね。\",\n        \"morozumix\": \"morozumix\",\n        \"morrow\": \"morrow\",\n        \"moruda ramenya\": \"もる田ラーメン屋\",\n        \"morugastudio\": \"MORUGAstudio\",\n        \"morutaya\": \"もるた屋\",\n        \"mosome\": \"モソーム\",\n        \"motachi\": \"もたち\",\n        \"motchie kingdom\": \"もっちー王国\",\n        \"mothman\": \"もすまん\",\n        \"motley crew\": \"Motley crew\",\n        \"motsu ryouri\": \"もつ料理\",\n        \"mottekoi sangyou\": \"モッテコイ産業\",\n        \"mottocompany\": \"MottoCompany\",\n        \"motu club\": \"モツクラブ\",\n        \"mou nero\": \"もう寝ろ\",\n        \"mou sukoshi hidari e\": \"もう少し左へ\",\n        \"moudou\": \"もうどう\",\n        \"mouko mouretsu hasai dan\": \"蒙古猛烈破砕団\",\n        \"moumoku nezumi\": \"盲目ねずみ\",\n        \"moumoku no inu-tachi\": \"盲黙のいぬたち\",\n        \"moumoubox\": \"も〜も〜ぼっくす\",\n        \"mount position\": \"マウントポジション\",\n        \"mountain topper\": \"マウンテントッパー\",\n        \"mousou aria\": \"妄想アリア\",\n        \"mousou bussan\": \"妄想物産\",\n        \"mousou caution\": \"妄想Caution\",\n        \"mousou colosseum\": \"妄想コロッセオ\",\n        \"mousou endemic\": \"妄想エンデミック\",\n        \"mousou engine\": \"妄想エンジン\",\n        \"mousou fukuzagata\": \"妄想複座型\",\n        \"mousou katharsis\": \"妄想カタルシス\",\n        \"mousou kenkyuujo\": \"妄想研究所\",\n        \"mousou meteoroid\": \"妄想メテオロイド\",\n        \"mousou pasta\": \"妄想パスタ\",\n        \"mousou pushon\": \"妄想PushOn\",\n        \"mousou tokkyuu\": \"妄想特急\",\n        \"mousou wakusei\": \"妄想惑星\",\n        \"mousou web\": \"妄想ウェブ\",\n        \"mousou zukan\": \"もーそーずかん\",\n        \"mousoudokei\": \"妄想時計\",\n        \"moviendo\": \"Moviendo\",\n        \"moyasix\": \"moyasix\",\n        \"mozuchichi\": \"MOZUCHICHI\",\n        \"mozuya\": \"もず屋\",\n        \"mp0\": \"MP0\",\n        \"mr.outside\": \"Mr. Outside\",\n        \"mr.rabbit\": \"Mr.Rabbit\",\n        \"mro\": \"MRO\",\n        \"ms is\": \"M's I's\",\n        \"ms works.\": \"M's WORKS.\",\n        \"msize\": \"エムサイズ\",\n        \"mtk\": \"MTK\",\n        \"mu\": \"美遊\",\n        \"mu-cute\": \"μ-CuTe\",\n        \"mucha koubou\": \"無茶工房\",\n        \"mudai picture\": \"無題ピクチャ\",\n        \"mugcat\": \"Mugcat\",\n        \"mugen honpo\": \"むげん本舗\",\n        \"mugen kairou\": \"夢幻回廊\",\n        \"mugen kidousha\": \"夢幻機動舎\",\n        \"mugen lens\": \"無限レンズ\",\n        \"mugen mountain\": \"夢幻マウンテン\",\n        \"mugen mousou\": \"無限妄想\",\n        \"mugen no soul\": \"無限のソウル\",\n        \"mugendou cinema\": \"無限堂キネマ\",\n        \"mugenkan\": \"夢幻館頒布\",\n        \"mugenya honpo\": \"無限屋本舗\",\n        \"mugicha.\": \"むぎちゃ。\",\n        \"mugichoko store\": \"むぎちょこストア\",\n        \"mugiwara club\": \"麦わらクラブ\",\n        \"muhakiya\": \"ムハキヤ\",\n        \"muhouchitai\": \"無法地帯\",\n        \"muin coffee\": \"無印コーヒー\",\n        \"mujina\": \"狢\",\n        \"mujirushi shounen\": \"無印少年\",\n        \"mujirushi-dou\": \"無印堂\",\n        \"mukade tou\": \"ムカデ島\",\n        \"mukeikaku syugi\": \"無計画主義\",\n        \"muki pomera\": \"ムキぽめら\",\n        \"mukibutsu heart\": \"無機物はーと\",\n        \"mukuchi na hakoniwa\": \"無口な箱庭\",\n        \"mukuge\": \"毳\",\n        \"mukumukumoon\": \"むくむくむーん\",\n        \"mukuton kyouju to soratobu potato.\": \"むくトン教授と空飛ぶポテト。\",\n        \"mukyuu dynamic\": \"ムキューダイナミック\",\n        \"mulberry\": \"マルベリ\",\n        \"multi-type\": \"Multi-Type\",\n        \"multivitamin\": \"MULTIVITAMIN\",\n        \"mumeiya\": \"夢迷屋\",\n        \"mumumu jirushi\": \"むむむ印\",\n        \"mumunyan\": \"むむにゃん\",\n        \"mumyoudou\": \"夢妙堂\",\n        \"mumyoukutsu\": \"無明窟\",\n        \"munak\": \"ムナック\",\n        \"munmun dou\": \"ムンムン堂\",\n        \"munomeritei\": \"むのめり亭\",\n        \"mura no ikinokori\": \"村の生き残り\",\n        \"muramura pocky\": \"ムラムラPocky\",\n        \"murasaki nyanko bar\": \"むらさきにゃんこバー\",\n        \"murasaki switch\": \"ムラサキスイッチ\",\n        \"murasaki-dou honten\": \"紫紀堂本店\",\n        \"murasaki.\": \"紫。\",\n        \"murasakiiro no yoru\": \"むらさきいろのよる\",\n        \"murasakiiro orange\": \"むらさきいろオレンジ\",\n        \"murasame no yousai\": \"村雨の要塞\",\n        \"murderhouse\": \"MURDERHOUSE\",\n        \"muremure kaisendon\": \"むれむれ海鮮丼\",\n        \"murmur\": \"murmur\",\n        \"musansodou\": \"無酸素堂\",\n        \"musasabidou\": \"むささび堂\",\n        \"musashi-dou\": \"武蔵堂\",\n        \"muscadet\": \"ミュスカデ\",\n        \"muse\": \"MUSE\",\n        \"museifu kutsushita doumei\": \"無政府靴下同盟\",\n        \"mushaburu\": \"むしゃぶる\",\n        \"mushikui lettuce\": \"むしくいレタス\",\n        \"mushimusume aikoukai\": \"蟲娘愛好会\",\n        \"mushiringo\": \"むしりんご\",\n        \"mushiyaki\": \"むしやき!!\",\n        \"mushroom pig\": \"マッシュルームピッグ\",\n        \"mushroom shoutengai\": \"マッシュルーム商店街\",\n        \"musukichi\": \"むす吉\",\n        \"mutospectacle\": \"無糖スペクタクル\",\n        \"mutsukidou\": \"睦月堂\",\n        \"mutsuraboshi\": \"むつらぼし\",\n        \"mutsuya\": \"陸奥屋\",\n        \"muttumuu\": \"むっつむー\",\n        \"mx2\": \"M×2\",\n        \"my blue sky\": \"マイブルースカイ\",\n        \"my darling\": \"my_darling\",\n        \"my pace world\": \"my pace world\",\n        \"myao\": \"Myao\",\n        \"mycology.\": \"マイコロジィ。\",\n        \"mylab\": \"MYLAB\",\n        \"myon plus 1\": \"MYON+1\",\n        \"myonlyone\": \"MYONLYONE\",\n        \"myoukenya\": \"みょうけん屋\",\n        \"myriad purity\": \"Myriad Purity\",\n        \"mysp5cm\": \"まいすぺ5cm\",\n        \"mystery clock\": \"MYSTERY CLOCK\",\n        \"mystic chord\": \"ミスティック・コード\",\n        \"n\": \"ん！\",\n        \"n b g\": \"エヌベージー\",\n        \"n no tsukue\": \"Nの机\",\n        \"n shiki\": \"N式\",\n        \"n-bomb asylum\": \"核弾避難室\",\n        \"n-craft\": \"n-craft\",\n        \"n.a.u.s.\": \"N.A.U.S.\",\n        \"n.cs\": \"N.Cs\",\n        \"n.n.f.s\": \"N.N.F.S\",\n        \"n.r.d.works\": \"N.R.D.WORKS\",\n        \"n.s craft\": \"N.S Craft\",\n        \"n.s.project\": \"N.S.project\",\n        \"n2jirai\": \"N2地雷\",\n        \"n7747\": \"N7747\",\n        \"nabe no circle\": \"nabeのサークル\",\n        \"nabesekizaiten\": \"鍋石材店\",\n        \"nabeyaki udon\": \"鍋焼きうどん\",\n        \"nabeyama kaidou\": \"鍋山街道\",\n        \"nabeyashiki\": \"鍋屋敷\",\n        \"nac.\": \"Nac.\",\n        \"nac000\": \"nac000\",\n        \"nachtzug\": \"Nachtzug\",\n        \"nae petit\": \"nae petit\",\n        \"nagaremono\": \"流れもの\",\n        \"nagasaki-inter\": \"長崎インター\",\n        \"nagashi soumen\": \"ながしそうめん\",\n        \"naginata kikaku\": \"なぎなた企画\",\n        \"naginata-kan\": \"薙刀館\",\n        \"nagisa no haikara kingyo\": \"渚のハイカラ金魚\",\n        \"nagisawaya\": \"なぎさわ屋\",\n        \"nagomi no ame\": \"和ノ雨\",\n        \"nagumoya\": \"なぐも屋\",\n        \"naguu no shiro\": \"なぐうの城\",\n        \"nahabaru\": \"ナハバル\",\n        \"nahapuro\": \"なはぷろ\",\n        \"naitou kirara\": \"内藤キララ\",\n        \"naitou2\": \"NAITOU2\",\n        \"naivta\": \"ナイーブタ\",\n        \"naiyori alpha zaidan\": \"Naiyori alpha 財団\",\n        \"nakagawaya\": \"中川家\",\n        \"nakamuratakumi\": \"仲村巧\",\n        \"nakanoku kurochanno...\": \"中野区くろちゃんの…\",\n        \"nakasatogumi\": \"ナカサト組\",\n        \"nakasone battalion\": \"中曽根バタリアン\",\n        \"nakatashi family\": \"中田紫ファミリー\",\n        \"nakaun\": \"なかうん\",\n        \"nakayama shiki kenkou tosho\": \"中山式健康図書\",\n        \"nakayohi\": \"なかよひ\",\n        \"nakayoshi koyoshi\": \"なかよShiこよShi\",\n        \"nakayoshi obgyn\": \"なかよし産婦人科\",\n        \"nakigara\": \"無空\",\n        \"nakuru box\": \"ナクルボックス\",\n        \"nama mochi shichi banchi\": \"生餅七番地\",\n        \"nama shibori sour\": \"生搾りサワー\",\n        \"namaco\": \"NAMACO\",\n        \"namae kinyuuran\": \"名前記入欄\",\n        \"namaikichibi\": \"なまいきちび\",\n        \"namakemono kishidan\": \"なまけもの騎士団\",\n        \"namakoya\": \"なまこ屋\",\n        \"namakura dou\": \"なまくら堂\",\n        \"namakura na kura\": \"なまくらな鞍\",\n        \"namanama shandy gaff\": \"生ナマシャンディガフ\",\n        \"namanamago\": \"ナマナマゴ\",\n        \"namanecotei\": \"生猫亭\",\n        \"namaniku tappuri\": \"生肉たっぷり\",\n        \"namashoku de hara kowasu tami\": \"生食デ腹壊ス民\",\n        \"namasute koubou\": \"生棄工房\",\n        \"namayake.\": \"なまやけ。\",\n        \"namazu-no-ikesu\": \"鯰の生け簀\",\n        \"nambokuya\": \"南北屋\",\n        \"nameless\": \"ネームレス\",\n        \"namelesszero\": \"NamelessZero\",\n        \"nami-nami restaurant\": \"並々食堂\",\n        \"namiroji\": \"波路地\",\n        \"namitaitei\": \"並大抵\",\n        \"nanaban chamaru dou\": \"七番茶○堂\",\n        \"nanacan\": \"NANACAN\",\n        \"nanafundou\": \"七分堂\",\n        \"nanairo batake\": \"なないろ畑\",\n        \"nanairo koubou\": \"なないろ工房\",\n        \"nanairo momogumi\": \"なないろもも組\",\n        \"nanairo no magatama\": \"七色の勾玉\",\n        \"nanairo senpu-ji\": \"七色旋風児\",\n        \"nanairo shichihenge\": \"七色七変化\",\n        \"nanakamado\": \"七竈\",\n        \"nanakorobi yaoki\": \"七転八起\",\n        \"nanakumi\": \"ななくみ\",\n        \"nanamehan\": \"ななめ班\",\n        \"nanameno\": \"ななめの\",\n        \"nanamigumi\": \"七海組\",\n        \"nanamiya\": \"奈波屋\",\n        \"nanamoya\": \"ななも屋\",\n        \"nananana\": \"なななな\",\n        \"nanashi inflation\": \"ななしいんふれーしょん\",\n        \"nanashi shounen\": \"ナナシ少年\",\n        \"nanashiki\": \"七式\",\n        \"nanaten manten\": \"七点万点\",\n        \"nanatsu no kagiana\": \"七つの鍵穴\",\n        \"nanatsuboshi\": \"七つ星\",\n        \"nanatsugumi\": \"ななつ組\",\n        \"nanatsuhane\": \"ナナツハネ\",\n        \"nanaya\": \"奈々屋\",\n        \"nanayoduki\": \"七夜月\",\n        \"nanbu\": \"なんぶ\",\n        \"nandemodozo\": \"なんでもどうぞ\",\n        \"nandemoii\": \"なんでもいい\",\n        \"nanika\": \"なにか\",\n        \"nanika no heya\": \"何かの部屋\",\n        \"nanika-modoki\": \"なにかもどき\",\n        \"nanikaya\": \"なにか屋\",\n        \"naniwaya\": \"浪速屋\",\n        \"nankin honpo\": \"南京本舗\",\n        \"nankotsu age rice\": \"なんこつ揚げライス\",\n        \"nankyoku\": \"なんきょく\",\n        \"nano royal\": \"Nano Royal\",\n        \"nanokah\": \"なのかH\",\n        \"nansyu-koubow\": \"南洲好房\",\n        \"nantan e\": \"南端へ\",\n        \"nantoka narunaru.\": \"なんとかなるなる。\",\n        \"napier sabre\": \"Napier Sabre\",\n        \"napolinu\": \"napolinu\",\n        \"naranashitori\": \"ならなしとり\",\n        \"narashino kaitoudan\": \"習志野海盗団\",\n        \"narimasuya\": \"なります屋\",\n        \"narukotei\": \"鳴狐亭\",\n        \"naruto kenkyu sha\": \"なると研究社\",\n        \"nas-on-ch\": \"NAS-ON-CH\",\n        \"nasi-pasuya\": \"なしぱす屋\",\n        \"nasubi knight\": \"ナスビ騎士\",\n        \"nata de coco soda\": \"ナタデココ・ソーダ\",\n        \"natadekoko\": \"なたでここ\",\n        \"natakuga-yuku\": \"なたくが行く!\",\n        \"natorina dou\": \"なとりな堂\",\n        \"natsu no cheese koujou\": \"夏のチーズ工場\",\n        \"natsu no umi\": \"なつのうみ\",\n        \"natsugumo himawari\": \"夏雲ひまわり\",\n        \"natsuiro laika\": \"夏色ライカ\",\n        \"natsuiro otome\": \"なついろ乙女\",\n        \"natsuiro shoujo\": \"夏色少女\",\n        \"natsuiro terrace\": \"夏色テラス\",\n        \"natsukanmi\": \"なつかんみ\",\n        \"natsukon\": \"なつこん\",\n        \"natsumemo\": \"なつめも\",\n        \"natsumin no circle\": \"なつみんのさーくる\",\n        \"natsuyasumi\": \"夏休み\",\n        \"nattou mania\": \"納豆☆マニア\",\n        \"nattou no mori\": \"なっとうの杜\",\n        \"natukiya\": \"なつき屋\",\n        \"natumiruku\": \"なつみぃ〜るク♪\",\n        \"naturaldays\": \"NATURALDAYS\",\n        \"nature\": \"NaTuRe\",\n        \"nature.\": \"nature.\",\n        \"naughtygal style b\": \"NaughtyGal Style B\",\n        \"naunau\": \"なうなう\",\n        \"navi001\": \"Navi001\",\n        \"navy\": \"NAVY\",\n        \"navy blue\": \"Navy Blue\",\n        \"navy garden\": \"ネイビーガーデン\",\n        \"nawanoren\": \"縄のれん\",\n        \"nayuta\": \"ナユタ\",\n        \"nazo no akanekokan\": \"謎の赤猫団\",\n        \"nazonokai\": \"謎の会\",\n        \"nb teishoku\": \"NB定食\",\n        \"nb.\": \"nb.\",\n        \"ncdn\": \"ニチダン\",\n        \"ne.\": \"ね。\",\n        \"nebosukekin\": \"ねぼすけ菌\",\n        \"necomuffler\": \"ネコマフラー\",\n        \"necotoxin\": \"NECOTOXIN\",\n        \"necrolincer\": \"ネクロリンサー\",\n        \"nedaore\": \"ネダオレ\",\n        \"needle\": \"NEEDLE\",\n        \"needle garden\": \"NEEDLE GARDEN\",\n        \"neet corp\": \"ニート(株)\",\n        \"negapoji-bu\": \"ネガぽじーぶ\",\n        \"negibouzu\": \"ねぎ坊主\",\n        \"negimaers\": \"ねぎまーず\",\n        \"neginegio\": \"ネギネギ夫\",\n        \"negi to takenoko\": \"ねぎとたけのこ\",\n        \"negoro teppou tai\": \"根来鉄砲隊\",\n        \"negoto\": \"negoto\",\n        \"negoya\": \"寝語屋\",\n        \"neguradou\": \"塒堂\",\n        \"negurie\": \"ねぐりえ\",\n        \"neji hina no sekai\": \"ネジヒナの世界\",\n        \"neji roll\": \"ねじロール\",\n        \"nejikiri sister\": \"捻切シスター\",\n        \"nejimaki kougen\": \"ねじまきこうげん\",\n        \"nejiya no hito\": \"ねじやのひと\",\n        \"neko blizzard\": \"猫ブリザード\",\n        \"neko bus unsou\": \"ねこばす運送\",\n        \"neko daifuku\": \"ねこ大福\",\n        \"neko irazu\": \"猫イラズ\",\n        \"nekojarashy\": \"猫じゃらし\",\n        \"nekojarashi\": \"猫じゃらし\",\n        \"neko kan\": \"ねこ缶\",\n        \"neko kinryouku\": \"猫禁猟区\",\n        \"neko melonya\": \"猫メロン屋\",\n        \"neko neko house\": \"ねこねこハウス\",\n        \"neko no onsen\": \"猫の温泉\",\n        \"neko no sakegoto\": \"ねこのさけごと\",\n        \"neko no shoushuugen\": \"ねこの消臭元\",\n        \"neko no te koubou\": \"猫の手工房\",\n        \"neko no yurikago\": \"猫のゆりかご\",\n        \"neko pantsu\": \"ネコぱんつ\",\n        \"neko pockle\": \"ねこぽっくる\",\n        \"neko rop\": \"ねころっぷ\",\n        \"neko rush\": \"ねこらっしゅ\",\n        \"neko saffron\": \"ネコサフラン\",\n        \"neko shounen\": \"ねこ少年\",\n        \"neko studio\": \"ねこスタジオ\",\n        \"neko tantei dan\": \"ネコ☆探偵団\",\n        \"neko to hato\": \"ねことはと\",\n        \"neko yashiki\": \"ねこ屋敷\",\n        \"neko-rise\": \"Neko-rise\",\n        \"nekoarashi\": \"ねこあらし\",\n        \"nekoashi sanbi\": \"猫足讃美\",\n        \"nekomasshigura\": \"猫驀地\",\n        \"nekodaisuki\": \"猫大好き\",\n        \"nekodotto\": \"ネコドット\",\n        \"nekogoro\": \"ねこごろ\",\n        \"nekohachi eigyoubu\": \"猫八営業部\",\n        \"nekohige radio\": \"猫ひげラジオ\",\n        \"nekohigetei\": \"ねこひげ亭\",\n        \"nekoiro\": \"ネコイロ\",\n        \"nekokabe\": \"ネコカベ\",\n        \"nekokaburi\": \"ネコかブリ\",\n        \"nekokagerou\": \"猫蜻蛉\",\n        \"nekokota\": \"nekokotA\",\n        \"nekomajin\": \"ねこまじん\",\n        \"nekomakura soft\": \"ねこまくらsoft\",\n        \"nekomatakan\": \"猫又館\",\n        \"nekomeshiya\": \"ねこめし屋\",\n        \"nekomikan aruiwa nekomikan\": \"猫美館或いは猫蜜柑\",\n        \"nekomimi catharsis\": \"猫耳カタルシス\",\n        \"nekomiya\": \"猫見屋\",\n        \"nekonetoru\": \"ネコネトル\",\n        \"nekonin-so\": \"猫忍荘\",\n        \"nekono kaweruya\": \"ネコノカヱルヤ\",\n        \"nekonohoshi\": \"ネコノホシ\",\n        \"nekonote shobou\": \"ねこのてしょぼう\",\n        \"nekopunch bashibashi\": \"ねこぱんちバシバシ\",\n        \"nekoranbu\": \"猫乱舞\",\n        \"nekorinchi\": \"ねこりんち\",\n        \"nekoro ryuuseigun\": \"ねころ流星群\",\n        \"nekorobi\": \"ねころび\",\n        \"nekorondoru\": \"ネコロンドル\",\n        \"nekosenyou milk\": \"猫専用牛乳\",\n        \"nekoshaku\": \"猫尺\",\n        \"nekosupi\": \"ねこすぴ\",\n        \"nekottorando\": \"ネコットランド\",\n        \"nekousa pudding\": \"ねこうさプリン\",\n        \"nekoya\": \"ねこ屋\",\n        \"nekoya kaigetsudou\": \"猫屋懐月堂\",\n        \"nekoya-systemz\": \"猫屋システムズ\",\n        \"nekozame\": \"ネコザメ\",\n        \"nekozamedan\": \"ねこざめ団\",\n        \"nel\": \"ネル\",\n        \"nel-zel formula\": \"NEL-ZEL FORMULA\",\n        \"nemachizuki chaya\": \"寝待月茶屋\",\n        \"nemaki\": \"ねまき\",\n        \"nemokoroppu\": \"ネモコロップ\",\n        \"nemuke\": \"nemuke?\",\n        \"nemurineko\": \"ねむりねこ\",\n        \"nemutai neko\": \"眠たい猫\",\n        \"nengaranenjuu\": \"年がら年中\",\n        \"nenneko tanuki\": \"ねんねこたぬき\",\n        \"nenokuni\": \"ねのくに\",\n        \"neo frontier\": \"Neo Frontier\",\n        \"neo ultimate works\": \"ネオアルティメットワークス\",\n        \"neo wing\": \"Neo Wing\",\n        \"neo-de\": \"NEO-de\",\n        \"neondou\": \"ねおん堂\",\n        \"neoneet\": \"寝起新人\",\n        \"neonsign\": \"NeonSign\",\n        \"neoseporium\": \"NeoSeporium\",\n        \"neotenys\": \"ネオテニーズ\",\n        \"neotocite\": \"ネオトサイト\",\n        \"nephrite\": \"Nephrite\",\n        \"nerihibari\": \"ねりひばり\",\n        \"neron soft\": \"ネロンソフト\",\n        \"neta e okiba\": \"ネタ絵置き場\",\n        \"netorare masochist\": \"寝取られマゾヒスト\",\n        \"nettaigyo club\": \"熱帯魚倶楽部\",\n        \"neuromancer.\": \"Neuromancer.\",\n        \"neutral boy\": \"にゅーとらるぼぉい\",\n        \"new koubou\": \"NEW工房\",\n        \"new world\": \"NEW WORLD\",\n        \"new york spirits\": \"New York Spirits\",\n        \"new.\": \"NEW.\",\n        \"newberry transfer\": \"Newberry Transfer\",\n        \"newtype kenkyuujo\": \"にゅうたいぷ研究所\",\n        \"nexarius\": \"NEXARIUS\",\n        \"next\": \"N・E・X・T\",\n        \"nextage\": \"NEXTAGE\",\n        \"nexumi no sumika\": \"ねずみの住家\",\n        \"nexus koubou\": \"ネクサス工房\",\n        \"nezumitori\": \"ねズみ砦\",\n        \"nf121\": \"NF121\",\n        \"ngamura-san\": \"んがむらさん\",\n        \"ngl\": \"NGL\",\n        \"nguppu do m hakushaku\": \"んぐっぷ・ド・M伯爵\",\n        \"nhoooooooooooooo\": \"んほぉおおおぉおおおおおお♥おっ♥おっ♥\",\n        \"ni\": \"Ni\",\n        \"nibarera\": \"にばれら\",\n        \"nibiiro no sora\": \"鈍色の空\",\n        \"nibunn no ichi\": \"にぶんのいち!\",\n        \"nichijou superumisu\": \"日常すぺるみす\",\n        \"nico\": \"nico\",\n        \"nico plus\": \"Nico plus\",\n        \"nicolai\": \"NICOLAI\",\n        \"nicolion\": \"二コリオン\",\n        \"niesox\": \"niesox\",\n        \"nigakuriya\": \"ニガクリ屋\",\n        \"nigenige soldier\": \"逃げ逃げソルジャー\",\n        \"nigeru support\": \"にげるサポート\",\n        \"night ray kiss\": \"ナイトレイキス\",\n        \"night stalkers\": \"ないとすとーかーず\",\n        \"night stars\": \"ないと・すたーず\",\n        \"nightmare\": \"NIGHTMARE\",\n        \"nightride\": \"ナイトライド\",\n        \"nightstalker\": \"nightstalker\",\n        \"nigimitama no ya\": \"和魂屋\",\n        \"nigred\": \"ニグレド\",\n        \"nihon dandy\": \"日本ダンディ\",\n        \"nihon denga senmon gakkou\": \"日本電画専門学校\",\n        \"nihon sanjuufu\": \"二飜三十符\",\n        \"nihon sensou game kaihatsu\": \"日本戦争ゲーム開発\",\n        \"nihon shokushu shinkou kyoukai\": \"日本触手振興協会\",\n        \"nihon waru waru doumei\": \"日本ワルワル同盟\",\n        \"niikyuu\": \"にーきゅー\",\n        \"niimii dan\": \"にぃみぃ団\",\n        \"niizuma gaikokkaku\": \"新妻外骨格\",\n        \"niji no saki\": \"虹の先\",\n        \"niji seichou\": \"二次性徴\",\n        \"niji wo machinagara\": \"虹を待ちながら\",\n        \"nijigen complex\": \"にじげんCOMPLEX\",\n        \"nijigen koubou\": \"2次元工房\",\n        \"nijiiro denryuu\": \"虹色電流\",\n        \"nijiiro hyakka\": \"虹色百花\",\n        \"nijiiro mask\": \"虹色MASK\",\n        \"nijiiro suisho\": \"にじいろすいしょう\",\n        \"nijinoren\": \"虹のれん\",\n        \"nijiyome\": \"にじよめ\",\n        \"nijusei\": \"Nijusei\",\n        \"nikka\": \"NIKKA\",\n        \"niko\": \"NIKO\",\n        \"nikomark\": \"にこまあく\",\n        \"nikomutoko\": \"にこむとこ\",\n        \"nikopondo\": \"NIKOPONDO\",\n        \"niku jaguars\": \"NIKU・JAGUARS\",\n        \"niku no sashimi\": \"にくのさしみ\",\n        \"niku sushi\": \"肉寿司\",\n        \"nikukyu\": \"nikukyu\",\n        \"nikumanyaitimi\": \"にくまん屋一味\",\n        \"nikumomu\": \"ニクモム\",\n        \"nikutai gengo club\": \"肉体言語倶楽部\",\n        \"nikutaiha\": \"肉体派\",\n        \"nikuyakitei\": \"肉焼き亭\",\n        \"nikuyoku boutarou\": \"肉欲棒太郎\",\n        \"nil\": \"†NIL†\",\n        \"nilitsu haihan\": \"ニリツハイハン\",\n        \"nimame\": \"煮豆\",\n        \"nimensai\": \"二面賽\",\n        \"nine tail\": \"NINE TAIL\",\n        \"ninelives\": \"ninelives\",\n        \"ningen modoki\": \"人間モドキ\",\n        \"ningen tte iina\": \"にんげんっていいな\",\n        \"nininini\": \"にににに\",\n        \"ninjinpasta\": \"にんじんパスタ\",\n        \"ninniku batake\": \"にんにく畑\",\n        \"ninnindo\": \"にんにん堂\",\n        \"nino-kan\": \"にのカン\",\n        \"niponipo\": \"にぽにぽ\",\n        \"nipopo crisis\": \"ニポポクライシス\",\n        \"nihatsu shika ataranai\": \"2発しか当たらない\",\n        \"nipple mokuba\": \"にっぷる木馬\",\n        \"nippon teikoku toshokan\": \"日本帝國図書館\",\n        \"nipponbashi dennougumi\": \"ニッポンバシ電脳組\",\n        \"nir\": \"NiR\",\n        \"nirabatake\": \"にら畑\",\n        \"niratama\": \"にらたま\",\n        \"nirvana\": \"みるばーな\",\n        \"nirvana soft\": \"Nirvana Soft\",\n        \"nisemono\": \"偽もの\",\n        \"nisemonogoya\": \"ニセもの小屋\",\n        \"nisepakudo\": \"偽朴堂\",\n        \"nisha takuitsu\": \"二沙択一\",\n        \"nisin sansin\": \"にしん三振\",\n        \"nishiogi koubou\": \"西荻工房\",\n        \"nita ken\": \"ニタ研\",\n        \"nita-kane\": \"煮た鐘\",\n        \"nitaroutei\": \"ニタロウ亭\",\n        \"nicchi sangyou\": \"にっちさんぎょう\",\n        \"nitiniti sowa\": \"日々草話\",\n        \"niwakakamikiriyamodoki\": \"ニワカカミキリヤモドキ\",\n        \"niwatori\": \"にわとり\",\n        \"niwatoritowani\": \"にわとりとわに\",\n        \"niyatto company\": \"にやっとカンパニー\",\n        \"niyodo blue\": \"NIYODO BLUE\",\n        \"nizeru\": \"煮ぜる\",\n        \"niziyumedokoro\": \"虹夢処\",\n        \"nna timun\": \"んつぁてぃむん\",\n        \"nnz dan\": \"NNZ団\",\n        \"no actor\": \"NO ACTOR\",\n        \"no brand\": \"NO BRAND\",\n        \"no color\": \"No Color\",\n        \"no future\": \"No Future\",\n        \"no mercy\": \"No Mercy\",\n        \"no need\": \"NO NEED\",\n        \"no plan\": \"No Plan\",\n        \"no strike\": \"の～すとらいく\",\n        \"no such agency\": \"No Such Agency\",\n        \"no-plan\": \"No-Plan\",\n        \"no.3\": \"No.3\",\n        \"no3\": \"No3\",\n        \"noa\": \"noa\",\n        \"noa no sasabune\": \"のあのささぶね\",\n        \"noantica\": \"noantica\",\n        \"nobishiro\": \"のびしろ\",\n        \"nobita graph\": \"ノビタグラフ\",\n        \"nocohica\": \"nocohica\",\n        \"nocturnum\": \"ノクトルム\",\n        \"nodobotoke kingyo\": \"のどぼとけきんぎょ\",\n        \"noelvu\": \"ノエルヴ\",\n        \"noesis\": \"Noesis\",\n        \"noibara-en\": \"ノイバラ園\",\n        \"noirsoft\": \"ノアールソフト\",\n        \"noisy crown\": \"ノイジークラウン\",\n        \"noix\": \"ノア\",\n        \"nokishiki-box\": \"のき式BOX\",\n        \"nokishita-ya\": \"ノキシタ屋\",\n        \"nomad\": \"ノマド\",\n        \"nomucchi\": \"のむっち\",\n        \"nomugicha\": \"野麦茶\",\n        \"non brand\": \"Non_Brand\",\n        \"non non palette\": \"のんのんパレット\",\n        \"nonaka logic\": \"野中ロジック\",\n        \"nonbiri nonbiri\": \"のんびり のんびり\",\n        \"nonchalant\": \"のんしゃらん\",\n        \"nonono tsuushin\": \"ののの通信\",\n        \"nonoya\": \"のの屋\",\n        \"nonsense\": \"Nonsense\",\n        \"nonsugarloess\": \"のんしゅがーれす\",\n        \"nopland\": \"noPland\",\n        \"noppera koubou\": \"のっぺら工房\",\n        \"nora\": \"野良\",\n        \"norakurari.\": \"のらくらり。\",\n        \"noraneko koubou\": \"ノラ猫工房\",\n        \"noranoma\": \"noranoma\",\n        \"noraya\": \"のら屋\",\n        \"nori tokumori\": \"海苔特盛\",\n        \"noriajou\": \"のりあ城\",\n        \"norihee ginjou\": \"のりへぇ吟醸\",\n        \"norinori seika\": \"のりのり製菓\",\n        \"noritama-gozen\": \"のりたま御膳\",\n        \"north carolina power\": \"NORTH CAROLINA POWER\",\n        \"north70\": \"North70\",\n        \"nosebleed\": \"NOSEBLEED\",\n        \"nosekichiku\": \"野石竹\",\n        \"noshiki\": \"の式\",\n        \"nostalgic syndrome\": \"ノスタルジックシンドローム\",\n        \"not\": \"NOT\",\n        \"notari\": \"のたり\",\n        \"notears\": \"NoTears\",\n        \"notes.\": \"Notes.\",\n        \"nothing-plan\": \"Nothing-Plan\",\n        \"notonote\": \"NOTONOTE\",\n        \"notorious\": \"NOTORIUS\",\n        \"nottaya\": \"のっ田屋\",\n        \"noujiru teishokuya\": \"のぅじる定食屋\",\n        \"nounai ekijiru\": \"脳内液汁\",\n        \"nounai pg\": \"脳内PG\",\n        \"nounai zayaku\": \"脳内座薬\",\n        \"nounaihokan\": \"脳内補完\",\n        \"nounanka sedai\": \"脳軟化世代\",\n        \"noushuku kangen\": \"脳縮還元\",\n        \"nouzui majutsu\": \"脳髄魔術\",\n        \"novia\": \"Novia\",\n        \"nowhere\": \"NOWHERE\",\n        \"noxious plant\": \"noxious plant\",\n        \"noyau\": \"noyau\",\n        \"nozarashi\": \"のざらし\",\n        \"nozubeya\": \"野図部屋\",\n        \"nozzo gt\": \"のっつぉGT\",\n        \"np virus jouryuusho\": \"NPウイルス蒸留所\",\n        \"ns2k\": \"ns2k\",\n        \"dondondon\": \"どんどんどん\",\n        \"nt confess\": \"NTconfess\",\n        \"ntlabo\": \"NTラボ\",\n        \"ntr king\": \"NTR キング\",\n        \"ntr suishin iinkai\": \"NTR推進委員会\",\n        \"ntr system\": \"NTRシステム\",\n        \"ntrbear\": \"Ntrbear\",\n        \"nu\": \"Nu\",\n        \"nui gohan\": \"ぬいごはん\",\n        \"nuigurumiya-san\": \"ぬいぐるみやさん\",\n        \"nuit\": \"nuit\",\n        \"nuite amore\": \"抜いて☆アモーレ!\",\n        \"nukarumi\": \"泥濘\",\n        \"nukidamari\": \"ヌキダマリ\",\n        \"nukidokoro.\": \"ぬきどころ。\",\n        \"nukkoru\": \"ぬっこる\",\n        \"nukomashi dou\": \"ぬこまし堂\",\n        \"nukotigura\": \"ぬこちぐら\",\n        \"nukoya\": \"ぬこや\",\n        \"nul neverland\": \"ヌルネバーランド\",\n        \"null mayu\": \"NULLまゆ\",\n        \"null poplus\": \"ぬるぽぷらす\",\n        \"num\": \"#NUM!\",\n        \"numachi\": \"沼地\",\n        \"numadax\": \"ヌマダックス\",\n        \"number 910\": \"910号室\",\n        \"nun\": \"ヌン\",\n        \"nuno no ie\": \"布の家\",\n        \"nuno to kami\": \"布と紙\",\n        \"nupuryu no sato\": \"ぬぷ竜の里\",\n        \"nurebairo\": \"濡羽色\",\n        \"nurume\": \"ぬるめ\",\n        \"nurunuru 30 percent\": \"ぬるぬる30%\",\n        \"nurunurunerune\": \"ぬるぬるねるね\",\n        \"nv3offline\": \"NV3OFFLINE\",\n        \"nw-project\": \"NW-project\",\n        \"nwa\": \"nWa\",\n        \"nwonyo pasun\": \"んをんよ・ぱすん\",\n        \"nxcthermit\": \"N×Cてるみっと\",\n        \"nyaa nyaa koushinjo\": \"にゃ～にゃ～興信所\",\n        \"nyaa. to hidamari\": \"にゃー。とひだまり\",\n        \"nyagos\": \"にゃごズ\",\n        \"nyake\": \"NYAKE\",\n        \"nyakko-ya\": \"にゃっこ屋\",\n        \"nyala ponga\": \"ニャリャポンガ\",\n        \"nyamo nyamo\": \"にゃもにゃも\",\n        \"nyan nyan festival\": \"ニャンニャンフェスティバル\",\n        \"nyan nyan nyan\": \"にゃんにゃんにゃん!\",\n        \"nyan-nyan-hanten\": \"娘娘飯店\",\n        \"nyanderful vegitarian\": \"にゃんだふるべじたりあん\",\n        \"nyanko no me\": \"にゃんこの目\",\n        \"nyankopi\": \"にゃんこぴぃ\",\n        \"nyankoromochimochi\": \"にゃんころもちもち\",\n        \"nyanmilla\": \"ニャンミラ\",\n        \"nyannyan club\": \"娘々倶楽部\",\n        \"nyanpunibocchi\": \"にゃんぷにぼっち\",\n        \"nyaro kizoku\": \"にゃろ貴族\",\n        \"nyawatesou\": \"にゃわて荘\",\n        \"nylon 100\": \"ナイロン100%\",\n        \"nymph\": \"Nymph\",\n        \"nymphy fine fresh\": \"Nymphy Fine Fresh\",\n        \"nyoninka kenkyuujo\": \"女人化研究所\",\n        \"nyoro junction\": \"にょろじゃんくしょん\",\n        \"nyotai kougaku kenkyuujo\": \"女体光学研究所\",\n        \"nyotaian\": \"女体庵\",\n        \"nyuuface\": \"乳ふぇいす\",\n        \"nyuuseihin\": \"乳性貧\",\n        \"o-penguin\": \"俺企鵝\",\n        \"o.riginal brand\": \"O.RIginal brand\",\n        \"o157\": \"O157\",\n        \"oasis plus\": \"Oasis+\",\n        \"oba-q honpo qt\": \"OBA-Q HONPO QT\",\n        \"obake candle\": \"おばけキャンドル\",\n        \"oberkochen\": \"オーバーコッヘン\",\n        \"oboro\": \"朧\",\n        \"oboro hyakuhachishiki\": \"朧百八式\",\n        \"obsession.\": \"おぶせっしょん!\",\n        \"obsidian order\": \"Obsidian Order\",\n        \"obumanjuu\": \"おぶまんじゅう\",\n        \"oc5\": \"oC5\",\n        \"ocarina\": \"おかりな\",\n        \"occhoko-cho\": \"OCCHOKO-CHO\",\n        \"ocelot\": \"オセロット\",\n        \"ochadukeya sandaime\": \"お茶漬け屋三代目\",\n        \"ochaocha honpo\": \"おちゃおちゃ本舗\",\n        \"ochawannomushi\": \"おちゃわんのむし\",\n        \"ochaya\": \"御茶屋\",\n        \"ochigan\": \"堕ち玩\",\n        \"ochikochitei\": \"おちこち亭\",\n        \"ochitsu daisensei\": \"おちつ大先生\",\n        \"ocojoco\": \"ocojoco\",\n        \"odaku\": \"oda九\",\n        \"oden sensei\": \"汚電せんせい\",\n        \"oden-ya\": \"おでんや\",\n        \"odenden\": \"おでんでん\",\n        \"odin\": \"odin\",\n        \"odoshiro canvas\": \"おどしろキャンバス\",\n        \"oekaki seikatsu nikki\": \"お絵かき生活日記\",\n        \"oeuf\": \"Oeuf\",\n        \"off side\": \"OFF SIDE\",\n        \"offaria\": \"offaria\",\n        \"office amagasa\": \"雨傘日傘事務所\",\n        \"office baku\": \"オフィス・バク\",\n        \"office fairy\": \"office fairy\",\n        \"office neko\": \"Office猫\",\n        \"ofuro works\": \"おふろワークス\",\n        \"ofuroya\": \"オフロ屋\",\n        \"ofuzake tale\": \"お巫山戯テイル\",\n        \"ogagaga-sou\": \"おががが荘\",\n        \"ogawa jinguu\": \"小川神宮\",\n        \"ogawaya\": \"小河屋\",\n        \"ogeretsu-dan\": \"おげれつ団\",\n        \"ogerwillow\": \"オーガウィロウ\",\n        \"ogofwitch\": \"OgOfWitch\",\n        \"ogura tankenka\": \"小倉探検家\",\n        \"oguradou\": \"小倉堂\",\n        \"oh-banzai studio\": \"おばんざい☆スタジオ\",\n        \"ohagi.\": \"おはぎ。\",\n        \"ohakotomeno\": \"おはことめの\",\n        \"oharaibako\": \"御祓箱\",\n        \"ohige\": \"おひげ\",\n        \"ohka works\": \"おーかわーくす!\",\n        \"ohnegs\": \"オーネグス\",\n        \"ohsaka spirits\": \"大坂魂\",\n        \"oideyasu honpo\": \"おいでやす本舗\",\n        \"oilan\": \"oilan\",\n        \"oimoto\": \"おいもと\",\n        \"oinari summer\": \"お稲荷Summer\",\n        \"oishii oniku\": \"おいしいお肉\",\n        \"oishii oniku.\": \"おいしいお肉。\",\n        \"oishii udon\": \"おいしいうどん\",\n        \"oiyoko\": \"オイヨコ\",\n        \"ojin koukoku\": \"オジン公国\",\n        \"ojmomo\": \"OJmomo\",\n        \"okachimentaiko\": \"おかちめんたいこ\",\n        \"okameya honpo\": \"おかめや本舗\",\n        \"okami kaikou\": \"おかみかいこう\",\n        \"okashi na denpa\": \"お可視な電波\",\n        \"okashi no ie\": \"お瑕疵の家\",\n        \"okashi senmonten\": \"おかしせんもんてん\",\n        \"okashimo\": \"おかしも\",\n        \"okatoraya\": \"岡虎屋\",\n        \"okayushop\": \"OkayuShop\",\n        \"okazu club\": \"Okazu Club\",\n        \"okazu company\": \"おかずカンパニー\",\n        \"okazu musume\": \"オカズ娘\",\n        \"okett\": \"okett\",\n        \"okina flying factory\": \"Okina Flying Factory\",\n        \"okina keikaku\": \"翁計画\",\n        \"okina utsuwa\": \"大きな器\",\n        \"okinawa chinkosuu\": \"沖縄ちんこすう\",\n        \"okinawa taieki gunjinkai\": \"沖縄体液軍人会\",\n        \"oko-san\": \"おこさん\",\n        \"okojo no machi\": \"オコジョの街\",\n        \"okojodou\": \"御娘女堂\",\n        \"okome rice don\": \"おこめライス丼\",\n        \"okosama lunch\": \"お子様ランチ\",\n        \"okosama pancake\": \"お子様パンケーキ\",\n        \"okosamastar company\": \"オコサマ・スター社\",\n        \"okottei\": \"おこっ亭\",\n        \"okt\": \"OKT!\",\n        \"oktm\": \"OKTM\",\n        \"oku no hosomichi\": \"奥の細道\",\n        \"ol\": \"OL\",\n        \"old school academy\": \"オールドスクールアカデミー\",\n        \"old weapon\": \"おーるどうぇぽん\",\n        \"oldwiseman\": \"Oldwiseman\",\n        \"ole-m\": \"OLE-M\",\n        \"om\": \"おっえむ\",\n        \"omame cyokueitenn\": \"おまめ直営店\",\n        \"omaru bokujou\": \"おまる牧場\",\n        \"omega 2-d\": \"OMEGA 2-D\",\n        \"omega circuit\": \"おめがさーきっと\",\n        \"omega house\": \"おめがはうす\",\n        \"omikidokkuri\": \"オミキドックリ\",\n        \"omizuya\": \"おみずや\",\n        \"ommed\": \"オムメド\",\n        \"omocha kaden\": \"玩具家電\",\n        \"omochaya meguri\": \"おもちゃやめぐり\",\n        \"omochi bazooka\": \"おもち☆バズーカ\",\n        \"omochi soft\": \"おもちそふと\",\n        \"omochibako no text log\": \"おもちばこのテキストログ\",\n        \"omodume\": \"想詰め\",\n        \"omoiukabi enikki\": \"思い浮かび絵日記\",\n        \"omoshiro burger\": \"おもしろバーガー\",\n        \"omoshiro usagi\": \"オモシロウサギ\",\n        \"omoya\": \"母屋\",\n        \"on my way\": \"on my way\",\n        \"on your mark\": \"ON YOUR MARK\",\n        \"on-show\": \"怨床\",\n        \"onagoya\": \"おなご屋\",\n        \"onaka ga suita\": \"おなかがすいた\",\n        \"onbundou\": \"音文堂\",\n        \"once only\": \"Once Only\",\n        \"one week holiday\": \"One Week Holiday\",\n        \"one-seven\": \"ONE-SEVEN\",\n        \"one-shot\": \"ONE-SHOT\",\n        \"one-up\": \"One-up\",\n        \"oneashi\": \"オネアシ\",\n        \"oneekyou\": \"御姉狂\",\n        \"oneforall\": \"わんふぉーおーる\",\n        \"onegross\": \"ONEGROSS\",\n        \"onemu hormone\": \"おねむホルモン\",\n        \"ongr\": \"ongr\",\n        \"oni kizoku\": \"鬼貴族\",\n        \"onigiriz\": \"ONIGIRIズ\",\n        \"onikibitou\": \"鬼きび党\",\n        \"oninoe\": \"鬼ノ餌\",\n        \"onna ni yoru onna e no ryoujoku\": \"女による女への陵辱\",\n        \"onnanoko himitsu seisan koujou\": \"女の子秘密生産工場\",\n        \"onnanoko payapaya\": \"女の子パヤパヤ\",\n        \"onoderasanchi\": \"おのでらさん家\",\n        \"onoe network\": \"小乃枝電網\",\n        \"onomatopoeia\": \"オノマトピア\",\n        \"onpuman\": \"オンプマン\",\n        \"onsoku ebifly\": \"音速エビフライ\",\n        \"onsoku soukou\": \"音速走行\",\n        \"onsoku ubaguruma\": \"音速うばぐるま\",\n        \"onyitei\": \"鬼ぃ亭\",\n        \"onzskds\": \"御曹司ください\",\n        \"ooarai nourakudou\": \"大洗能楽堂\",\n        \"oobae toudai\": \"オオバエ灯台\",\n        \"oobeya potechi house\": \"大部屋ポテチハウス\",\n        \"oogane farm\": \"大金ファーム\",\n        \"ooitei\": \"大井亭\",\n        \"oojinushi\": \"おおじ主\",\n        \"ookami shoujo yuugi dan\": \"狼少女遊戯団\",\n        \"ookina kodomo no omocha bako\": \"大きな子供のおもちゃ箱\",\n        \"oomorian\": \"大森庵\",\n        \"ootsuku shouji\": \"大津久商事(有)\",\n        \"oozora kaiko\": \"大空カイコ\",\n        \"operating room\": \"Operating Room\",\n        \"operation\": \"operatioN\",\n        \"operation panel\": \"操作パネル\",\n        \"oppai baibai\": \"おっぱいばいばい\",\n        \"oppai click\": \"おっぱいクリック\",\n        \"oppai guild\": \"ぱいギル\",\n        \"oppai mochi\": \"おっぱい餅\",\n        \"opt\": \"OPT\",\n        \"optimism small country\": \"楽観主義小国\",\n        \"oracle eggs\": \"Oracle Eggs\",\n        \"orange blossom\": \"おれんじ☆ぶろっさむ\",\n        \"orange chocolat\": \"Orange Chocolat\",\n        \"orange crown\": \"Orange Crown\",\n        \"orange gallery henshuubu\": \"オレンジ・ギャラリー編集部\",\n        \"orange girl\": \"orange girl\",\n        \"orange mill\": \"オレンジミル\",\n        \"orange peel\": \"Orange Peel\",\n        \"orange piece\": \"Orange Piece\",\n        \"orange powder\": \"おらんげぱうだー\",\n        \"orange typhoon\": \"オレンジタイフーン\",\n        \"orangelepsy\": \"オレンジレプシー\",\n        \"ore dake ga tokusuru onsei koubou\": \"俺だけが得する音声工房\",\n        \"ore jon\": \"俺JON\",\n        \"oreaji\": \"俺味\",\n        \"oregun\": \"俺軍\",\n        \"oreichigo\": \"俺苺\",\n        \"oremuha x\": \"オレムハX\",\n        \"orenjiru\": \"おれんジル\",\n        \"oretachi misnon ikka\": \"俺たちミスノン一家\",\n        \"oreteki shikou\": \"俺的嗜好\",\n        \"organico\": \"おるがにこ\",\n        \"orgasmpotential\": \"orgasmpotential\",\n        \"oriental lattice\": \"Oriental Lattice\",\n        \"origami farm\": \"折纸牧场\",\n        \"orihime-bunko\": \"織姫文庫\",\n        \"orubara\": \"オルバラ\",\n        \"orukaniumu-labo\": \"orukaniumu-labo\",\n        \"orz\": \"orz\",\n        \"orz commushoz\": \"Orzコミュショーズ\",\n        \"os tokku\": \"OS特区\",\n        \"osaka lucha libre\": \"大阪ルチャリブレ\",\n        \"osakana planet\": \"おさかなプラネット\",\n        \"osakana tabeyo\": \"おさかなたべよ\",\n        \"osanagokoro no kimi ni\": \"幼心の君に\",\n        \"osaru no noumiso\": \"お猿の脳みそ\",\n        \"osaru-san panic\": \"おさるさんパニック\",\n        \"oshigoto no jikan\": \"おしごとのぢかん\",\n        \"oshikko channel\": \"おしっ娘ちゃんねる\",\n        \"oshiruko kan\": \"おしるこ缶\",\n        \"oshiruko sentimental\": \"おしるこセンチメンタル\",\n        \"oshisyo-san\": \"おししょーさんっ\",\n        \"osiri\": \"osiri\",\n        \"osiris\": \"オシリス\",\n        \"osova\": \"おそば\",\n        \"osterei\": \"OSTEREi\",\n        \"osu to mesu\": \"♂×♀オスとメス\",\n        \"ota office\": \"OTA OFFICE\",\n        \"otafukutei\": \"おたふく亭\",\n        \"otaku no youjinbou\": \"オタクの用心棒\",\n        \"ote\": \"お手っ\",\n        \"otenkiya\": \"おてんき屋\",\n        \"otentomaru\": \"オテント丸\",\n        \"othello ice\": \"オセロアイス\",\n        \"oto\": \"OTO\",\n        \"otogi no kuni no soapland\": \"おとぎの国のソープランド\",\n        \"otogiya\": \"御伽屋\",\n        \"otohime\": \"おとひめ\",\n        \"otohime 49-gou\": \"オトヒメ49号\",\n        \"otohimedou\": \"乙姫堂\",\n        \"otoko no roman\": \"男のROMAN\",\n        \"otokonoko club\": \"おとこの娘倶楽部\",\n        \"otokonoko daisuki iinchou\": \"男の娘大好き委員長\",\n        \"otokonoko soft\": \"男の娘ソフト\",\n        \"otokonoko to onnanoko\": \"男の子と女の子\",\n        \"otome half line\": \"乙女ハーフライン\",\n        \"otome no eden\": \"乙女のエデン\",\n        \"otomeza\": \"処女座\",\n        \"otona no douraku\": \"大人の道楽\",\n        \"otona no youchien\": \"大人の幼恥園\",\n        \"otona teikoku\": \"オトナテイコク\",\n        \"otoreko\": \"OTOREKO\",\n        \"otousan\": \"尾刀産\",\n        \"otto\": \"OTTO\",\n        \"otukimidango\": \"お月見団子\",\n        \"oudon shikoshiko\": \"おうどん☆シコシコ\",\n        \"ougi production\": \"扇プロダクション\",\n        \"ougi ranmaru\": \"扇蘭丸\",\n        \"ougon no yofuke dan\": \"黄金の夜更け団\",\n        \"oumi shouan\": \"近江小庵\",\n        \"ourakutei\": \"王烙亭\",\n        \"ourindou\": \"王林堂\",\n        \"out of mind\": \"Out of Mind\",\n        \"out of service\": \"OUT of SERVICE\",\n        \"out-of-date\": \"アウトオブデイト\",\n        \"outflow\": \"OUTFLOW\",\n        \"outrate\": \"アウトレート\",\n        \"outroad\": \"あうとろーど\",\n        \"ovacas\": \"OVACAS\",\n        \"over drive\": \"OVER DRIVE\",\n        \"over3\": \"Over3\",\n        \"overcrowd\": \"オーバークラウド\",\n        \"overdose\": \"オーバードーズ\",\n        \"overflow\": \"オーバーフロー\",\n        \"overgrown generations\": \"OVERGROWN GENERATIONS\",\n        \"overload\": \"おーばーろーど\",\n        \"owatasha\": \"おわた社\",\n        \"oxg\": \"OXG\",\n        \"oxide.lab\": \"OXIDE.Lab\",\n        \"oxydan\": \"おきし団\",\n        \"oyajiji gumi\": \"オヤジジ組\",\n        \"oyakodon\": \"親子丼\",\n        \"oyasumi disco\": \"おやすみDISCO\",\n        \"oyasumi kobe gyuu\": \"おやすみ神戸牛\",\n        \"oyasumi switch\": \"オヤスミスイッチ\",\n        \"oyasuminasai\": \"おやすみなさい\",\n        \"oyatsukan\": \"おやつ缶\",\n        \"oz project\": \"Oz Project\",\n        \"ozashiki\": \"オザ式\",\n        \"ozawa kobo\": \"緒沢工房\",\n        \"ozen shiryoushitsu\": \"御前資料室\",\n        \"ozone\": \"おぞね\",\n        \"p freak\": \"Pふりーく\",\n        \"p herb\": \"Pハーブ\",\n        \"p kikaku\": \"P企画\",\n        \"p-850\": \"P-850\",\n        \"p-forest\": \"P-FOREST\",\n        \"p-lemo\": \"ぴぃれも\",\n        \"p-me\": \"P-ME\",\n        \"p-point\": \"P-POINT\",\n        \"p.a. project\": \"P.A.Project\",\n        \"p.p.p\": \"P.P.P\",\n        \"p2paramount\": \"P2Paramount\",\n        \"pa-pu-\": \"ぱーぷー\",\n        \"pa.da.wan\": \"Pa・Da・ワン\",\n        \"pachipachi soft\": \"ぱちぱちそふと\",\n        \"pag-pag-magu\": \"ぱぐぱぐまぐぅ\",\n        \"pagumiee\": \"パグミィ\",\n        \"paintingbird\": \"PaintingBird\",\n        \"pairesshu\": \"Paiれっしゅ\",\n        \"pajamas ex\": \"ぱじゃまエクスタシー\",\n        \"pajamas soft\": \"ぱじゃまソフト\",\n        \"pakupaku\": \"ぱくぱく\",\n        \"pakupikubon\": \"パクピクボン\",\n        \"palace village ke\": \"パレスヴィレッジ家\",\n        \"pale scarlet\": \"Pale Scarlet\",\n        \"palette\": \"ぱれっと\",\n        \"palette enterprise\": \"Palette Enterprise\",\n        \"pallet box\": \"Pallet Box\",\n        \"palm sunday\": \"パームサンデー\",\n        \"palpiteria\": \"パルピテリア\",\n        \"pamunosu\": \"ぱむの巣\",\n        \"pan 2\": \"パン2\",\n        \"pan koubou\": \"パン工房\",\n        \"pan no mimi\": \"パンノミミ\",\n        \"pan to butterfly.\": \"パンとバタフライ。\",\n        \"panbai\": \"PANBAI\",\n        \"panda 4gou\": \"パンダ4号\",\n        \"panda pro\": \"ぱんだぷろ\",\n        \"panda scanners\": \"パンダスキャナーズ\",\n        \"panicerr\": \"パニッカー\",\n        \"panier\": \"パニエ\",\n        \"panjandrum\": \"Panjandrum\",\n        \"pankoppe\": \"ぱんこっぺ\",\n        \"pannacotta\": \"Pannacotta\",\n        \"panoramakan\": \"ぱのらま館\",\n        \"panorama tsuushinkyoku\": \"パノラマ通信局\",\n        \"panteitei\": \"PanTei亭\",\n        \"pantie party project\": \"Pantie Party Project\",\n        \"pantsu kakumei.\": \"パンツ革命。\",\n        \"pantsu koubou\": \"ぱんつ工房\",\n        \"pantwo\": \"pantwo\",\n        \"panty stocking\": \"Panty Stocking\",\n        \"panya no enzo\": \"パン屋のエンツォ\",\n        \"pao pao\": \"PAO・PAO\",\n        \"paopaship\": \"ぱぉぱしっぷ\",\n        \"papamilk\": \"Papamilk\",\n        \"papaya milk\": \"ぱぱいや・みるく\",\n        \"papepox2\": \"PAPEPOX2\",\n        \"paper cup and adult key\": \"Paper Cup and Adult Key\",\n        \"paper-doll\": \"Paper-Doll\",\n        \"papercrown\": \"ぺぱくら\",\n        \"papered armor\": \"紙装甲\",\n        \"parade\": \"Parade\",\n        \"paradigm conflict\": \"PARADIGM CONFLICT\",\n        \"paradis\": \"PaRaDis\",\n        \"paradise city\": \"ぱらだいすCity\",\n        \"paradise d products\": \"PARADISED PRODUCTS\",\n        \"paradise jack\": \"パラダイスジャック\",\n        \"paradise lost\": \"パラダイス・ロスト\",\n        \"paradisegom\": \"ParadiseGom\",\n        \"paraiso\": \"ぱらいそ\",\n        \"paraiso saigu\": \"ぱらゐそ祭具\",\n        \"paraiso shugi\": \"パライソ主義\",\n        \"parallel area\": \"パラレルエリア\",\n        \"parameter\": \"パラミター\",\n        \"parasol\": \"Parasol\",\n        \"paret\": \"paret\",\n        \"parin to wareru\": \"パリンと割れる\",\n        \"pariparicandy\": \"ぱりぱりきゃんでぃー\",\n        \"parity nyuu\": \"ぱりてぃー・にゅー\",\n        \"park popcorn\": \"パークポップコーン\",\n        \"part k\": \"Part K\",\n        \"parthenon\": \"パルテノン\",\n        \"particle\": \"ぱーてぃくる\",\n        \"party nights\": \"パーリィナイツ\",\n        \"parukusu\": \"ぱるくす\",\n        \"parupunte\": \"ぱるぷんて\",\n        \"passing shower\": \"ぱっしんぐしゃわー\",\n        \"past\": \"Past\",\n        \"pastel bitch\": \"パステルビッチ\",\n        \"patio canvas\": \"ぱてぃお☆きゃんばす\",\n        \"patoto\": \"PATOTO\",\n        \"patricide\": \"PATRICIDE\",\n        \"pavington\": \"Pavington\",\n        \"pazooka\": \"Pazooka\",\n        \"pazzo s.p.\": \"Pazzo S.P.\",\n        \"pe theta\": \"Peθ\",\n        \"pe.\": \"ぺ。\",\n        \"peach cat\": \"PEACH CAT\",\n        \"peach fox\": \"peach fox\",\n        \"peach kupaa\": \"ピーチクパァ\",\n        \"peach palette\": \"ぴーちパレット\",\n        \"peach store\": \"ぴーちストア\",\n        \"peachbooks hachinohe-ten\": \"PEACHBOOKS八戸店\",\n        \"peachbreath\": \"PeachBreath\",\n        \"peachpulsar\": \"peachpulsar\",\n        \"peaky\": \"ピーキー\",\n        \"pecan\": \"ピーカン\",\n        \"peco poco\": \"ぺこぽこ\",\n        \"peeping phantom\": \"Peeping Phantom\",\n        \"pegasisters\": \"ペガシスターズ\",\n        \"peke no hima\": \"ぺけの閑\",\n        \"peko renmei\": \"ぺこ連盟\",\n        \"pekoe\": \"Pekoe\",\n        \"pell-mell works\": \"PELL-MELL WORKS\",\n        \"pelpan omt\": \"ぺるぱんOMT\",\n        \"peneya\": \"ぺね屋\",\n        \"penguin teikoku\": \"ペンギン帝国\",\n        \"penguindou\": \"筆吟堂\",\n        \"penpen mushi no koucha\": \"ぺんぺん虫の紅茶\",\n        \"penpengusa club\": \"ペンペン草くらぶ\",\n        \"penteru kohboh\": \"ぺんてる工房\",\n        \"peony\": \"ピオニー\",\n        \"peperoncino\": \"ぺぺろんちーの\",\n        \"perceptron\": \"ぱーせぷとろん\",\n        \"perestroika\": \"ピリストローイカ\",\n        \"perfect sea\": \"PERFECT SEA\",\n        \"performance\": \"パーフォーマンス\",\n        \"perilab\": \"ぺりラボ\",\n        \"pero\": \"Pero\",\n        \"peromuji-ya\": \"ぺろむじ屋\",\n        \"perosikos\": \"ペロシコス\",\n        \"persicaria eater\": \"persicaria eater\",\n        \"personal color\": \"PERSONAL COLOR\",\n        \"personal space\": \"personal space\",\n        \"pervert\": \"pervert\",\n        \"petapan\": \"ぺたパン\",\n        \"petica\": \"ペチカ\",\n        \"petit bunny\": \"Petit Bunny\",\n        \"petit ego\": \"ぷちえご!\",\n        \"petit machiya\": \"ぷち町屋\",\n        \"petite x cerisier\": \"Petite＊Cerisier\",\n        \"petit pack\": \"Petit Pack\",\n        \"peto-ya\": \"ぺと屋\",\n        \"pets\": \"PETS\",\n        \"pettanko\": \"ペッたんコっ!\",\n        \"pez.\": \"pez.\",\n        \"pfactory\": \"Pfactory\",\n        \"phantom vibration syndrome\": \"幻想振動症候群\",\n        \"phantomcross\": \"ファントムクロス\",\n        \"phantomsoft\": \"ファントムソフト\",\n        \"phase nine\": \"PHASE NINE\",\n        \"phenomena\": \"PHENOMENA\",\n        \"pheromone lover 358\": \"フェロモンラバー358\",\n        \"philippiana honpo\": \"フィリピアナ本舗\",\n        \"phlodexy\": \"Phlodexy\",\n        \"phoenix project\": \"PHOENIX PROJECT\",\n        \"photonix\": \"PHOTONIX\",\n        \"physalis\": \"PHYSALIS\",\n        \"pi o 2\": \"πO2\",\n        \"pianissimo\": \"ピアニッシモ\",\n        \"piccalilli\": \"ピッカリリ\",\n        \"piccolo studio\": \"ピッコロ工房\",\n        \"pichi pichi garou r\": \"ぴちぴち画廊R\",\n        \"pickled teishoku\": \"ピクルス定食\",\n        \"pico pico labyrinth\": \"ピコピコ★ラビリンス\",\n        \"picopicosoft\": \"PICOPICOSOFT\",\n        \"picosolenodon\": \"ピコソレノドン\",\n        \"picotama.\": \"ぴこたま。\",\n        \"picricacid\": \"ぴくりんさん\",\n        \"pictlier\": \"ぴくとりえ\",\n        \"piepillow\": \"ピエピロー\",\n        \"pierre\": \"PIERRE\",\n        \"pierrot\": \"Pierrot\",\n        \"pigeon blood\": \"鳩血\",\n        \"piggstar\": \"PIGGSTAR\",\n        \"pignon\": \"pignon\",\n        \"pihii shobou\": \"ぴひー書房\",\n        \"pikopiko saber\": \"ピコピコサーベル\",\n        \"pikopikotei\": \"ぴこぴこ亭\",\n        \"pil-vamp\": \"PIL-VAMP\",\n        \"pile driver\": \"PILE DRIVER\",\n        \"pilen\": \"PileN\",\n        \"pillow works\": \"PILLOW WORKS\",\n        \"pilotstar\": \"Pilotstar\",\n        \"pin-13\": \"ピンのワンスリー\",\n        \"pin-point\": \"ピンポイント\",\n        \"pinacotheca\": \"Pinacotheca\",\n        \"pine\": \"ぱいん\",\n        \"pine candy\": \"PINE CANDY\",\n        \"pineapple candy\": \"パイナップルキャンディ\",\n        \"pinpoint\": \"ピンポイント\",\n        \"pink bat\": \"ピンクバット\",\n        \"pink cherry cocktail\": \"Pink Cherry Cocktail\",\n        \"pink chuchu\": \"PINK CHUCHU\",\n        \"pink cloud\": \"ピンククラウド\",\n        \"pink december\": \"Pink December\",\n        \"pink kitten\": \"ぴんくのこねこ\",\n        \"pink no chao\": \"PINKのCHAO!\",\n        \"pink no jaguchi\": \"ピンクの蛇口\",\n        \"pink pepper\": \"Pink pepper\",\n        \"pink pineapple\": \"ピンクパイナップル\",\n        \"pink poison\": \"PINK POISON\",\n        \"pink revolver\": \"ピンクリボルバー\",\n        \"pink rose\": \"PINK ROSE\",\n        \"pink thin cellophane\": \"pink thin cellophane\",\n        \"pink tissue\": \"Pink Tissue\",\n        \"pink-noise\": \"pink-noise\",\n        \"pink.in black\": \"PINK.in BLACK\",\n        \"pinkbell software\": \"PINKBELL SOFTWARE\",\n        \"pinke\": \"ぴんけ\",\n        \"pinkharlem\": \"PinkHarlem\",\n        \"pinkjoe\": \"pinkjoe\",\n        \"pinktips.info\": \"pinktips.info\",\n        \"pinky girl\": \"PINKY GIRL\",\n        \"pintsize\": \"ぱいんとさいず\",\n        \"pipapipa9\": \"pipapipa9\",\n        \"pipasuta\": \"ぴぱスタ\",\n        \"pipiya\": \"ぴぴや\",\n        \"pirates patrol\": \"パイレーツパトロール\",\n        \"pirisyuga\": \"ぴりしゅが\",\n        \"piropiro\": \"PIROPIRO\",\n        \"piropiro-go\": \"ぴろぴろごー\",\n        \"pirorunchi\": \"ぴろるんち\",\n        \"piruporo\": \"ぴるぽろー\",\n        \"pisces\": \"ぴすけす\",\n        \"pish lover\": \"ピシュ☆ラバ\",\n        \"piss\": \"PISS\",\n        \"pistonpower\": \"Pistonpower\",\n        \"pit\": \"PiT\",\n        \"pit.ra.bit\": \"pit.ra.bit\",\n        \"pixel cot.\": \"Pixel Cot.\",\n        \"pixel mint\": \"PIXEL MINT\",\n        \"pixel works\": \"Pixel Works\",\n        \"pixy bell\": \"ピクシーベル\",\n        \"piyo project\": \"ぴよぷろじぇくと\",\n        \"piyokoya\": \"ぴよこ屋\",\n        \"piyopit\": \"PiyoPit\",\n        \"piyopiyo teikoku\": \"ピヨピヨ帝国\",\n        \"piyotama\": \"ぴよたま\",\n        \"pizzaizm\": \"PIZZAIZM\",\n        \"placre\": \"プラクリ\",\n        \"plain ghost\": \"Plain Ghost\",\n        \"planariatei\": \"ぷらなりあ亭\",\n        \"planet\": \"プラネット\",\n        \"planet maris\": \"PLANET MARIS\",\n        \"planet matier\": \"Planet Matier\",\n        \"planet piece\": \"PLANET PIECE\",\n        \"planetary\": \"Planetary\",\n        \"plantain\": \"plantain\",\n        \"plastics\": \"plastics\",\n        \"plato.\": \"plato.\",\n        \"platonica\": \"PLATONiCA\",\n        \"please continue\": \"please continue\",\n        \"pleats time\": \"プリーツたいむ\",\n        \"pleco\": \"PLECO\",\n        \"pleiades fortune\": \"PLEIADES☆FORTUNE\",\n        \"plott\": \"Plott\",\n        \"plum factory\": \"Plum Factory\",\n        \"plume works\": \"PLUME WORKS\",\n        \"plumzero\": \"PlumZERO\",\n        \"plus donburi\": \"+丼\",\n        \"plus elegy\": \"+Elegy\",\n        \"plus house\": \"Plus house\",\n        \"plus10\": \"Plus Ten\",\n        \"plus810\": \"+810\",\n        \"pluto\": \"プルート\",\n        \"pm02 colon 00\": \"pm02:20\",\n        \"pno group\": \"PNO グループ\",\n        \"pno.\": \"PNO.\",\n        \"pnp\": \"ピィーエヌピィー\",\n        \"pocket\": \"POCKET\",\n        \"pocket drop\": \"ポケットドロップ\",\n        \"poco\": \"!POCO\",\n        \"poco poco\": \"POCO POCO\",\n        \"pocorit\": \"ぽこりっと\",\n        \"poga\": \"Poga*\",\n        \"poifull\": \"ぽいふる\",\n        \"point m\": \"Point M\",\n        \"points\": \"Points\",\n        \"poison\": \"POISON\",\n        \"poison breath\": \"ポイズンブレス\",\n        \"poison gray\": \"Poison Gray\",\n        \"poison squid\": \"ポイズンスクイッド\",\n        \"poisonblues\": \"POISONBLUES\",\n        \"poiyo dimension\": \"ポイヨディメンション\",\n        \"pokopen-honpo\": \"ぽこぺん本舗\",\n        \"pokotou\": \"ぽことう\",\n        \"polaris\": \"POLARIS\",\n        \"polbockle\": \"polbockle\",\n        \"pollinosis\": \"ぽりのしす\",\n        \"polorinken\": \"ポロリン軒\",\n        \"pom\": \"PoM\",\n        \"pomato-ya\": \"ぽまと屋\",\n        \"pomegranate\": \"ぽめぐら\",\n        \"pomelanian\": \"Pomelanian\",\n        \"pometeor\": \"ぽメテオ\",\n        \"pon de ushi\": \"ポン・デ・ウシ\",\n        \"poncho mojah\": \"PONCHO MOJAH\",\n        \"pondemix\": \"PONDEMIX\",\n        \"poniponi\": \"poniponi\",\n        \"poniteke zoku\": \"ポニテケ族\",\n        \"ponkotsu box\": \"ぽんこつ×ぼっくす\",\n        \"ponkotsu damashii\": \"ポンコツ魂\",\n        \"ponkotsu teikoku\": \"ポンコツ帝国\",\n        \"ponkotsu-ki\": \"ぽんこつ紀\",\n        \"ponkotsudou\": \"凡骨道\",\n        \"ponkotuna potunoya\": \"ぽんこつなぽつの屋\",\n        \"ponpon-o\": \"ぽんぽんお\",\n        \"ponte\": \"Ponte\",\n        \"pony farm\": \"仔马牧场\",\n        \"pony roll\": \"PONY ROLL\",\n        \"ponyfarm\": \"ポニー牧場\",\n        \"ponys bridle\": \"PONY'S BRIDLE\",\n        \"ponz.info\": \"ponz.info\",\n        \"ponzoom\": \"ぽんずーむ\",\n        \"ponzu ame\": \"ぽんずアメ\",\n        \"pooca\": \"pooca\",\n        \"popcorn koujou\": \"ポップコーン工場\",\n        \"popcorn lamp\": \"にゃじらんぷ\",\n        \"popeo\": \"ぽぺお\",\n        \"popin rabbit\": \"popin'rabbit\",\n        \"popo candy\": \"ぽぽきゃんでぃ\",\n        \"popo doctrine\": \"ポポドクトリン\",\n        \"popoin\": \"ぽぽいん\",\n        \"poppozu\": \"ポッポーズ\",\n        \"popship\": \"ポップシップ\",\n        \"popshot\": \"POPSHOT\",\n        \"popularplus\": \"popularplus\",\n        \"porika\": \"ポリカ\",\n        \"poritabe.\": \"ポリたべ。\",\n        \"porno maker\": \"ぽるのめーかー\",\n        \"pornostar\": \"ポルノ★スター\",\n        \"portion\": \"Portion\",\n        \"porygon137\": \"PORYGON137\",\n        \"potage\": \"Potage\",\n        \"potato salad\": \"ぽてとさらだ\",\n        \"potato seikatsu\": \"ポテト生活\",\n        \"potch pocket\": \"ぽっちぽけっと\",\n        \"poteto-chips\": \"poteto-chips\",\n        \"potosu koubou\": \"ポトス工房\",\n        \"poulain\": \"poulain\",\n        \"powderskin\": \"PowderSkin\",\n        \"power gradation\": \"パワーグラデイション\",\n        \"power of maca\": \"power of maca\",\n        \"power skill\": \"パワースキル\",\n        \"power slide\": \"パワースライド\",\n        \"power step\": \"Power Step\",\n        \"powerful soft\": \"ぱわふるソフト\",\n        \"powerplay\": \"POWERPLAY\",\n        \"praetorium-somnus\": \"プラエトーリウム=ソムヌス\",\n        \"prahapripa\": \"ぷらはぷりぱ\",\n        \"pravo713\": \"PRAVO713\",\n        \"prekano\": \"プレカノ\",\n        \"pretty maids\": \"PRETTY☆MAIDS\",\n        \"pretty penis\": \"プリティペニス\",\n        \"prettydolls\": \"prettydolls\",\n        \"prick\": \"PRICK\",\n        \"prickly ash\": \"プリックリーアッシュ\",\n        \"pride zero\": \"プライドZERO\",\n        \"prima stella\": \"Prima Stella\",\n        \"primal gleam\": \"Primal Gleam\",\n        \"primal gym\": \"Primal Gym\",\n        \"primavista\": \"Primavista\",\n        \"prime-f\": \"Prime-F\",\n        \"princess cage\": \"Princess Cage\",\n        \"princess heart\": \"Princess Heart\",\n        \"princess sugar\": \"Princess Sugar\",\n        \"princia\": \"プリンシア\",\n        \"prism eye\": \"Prism eye\",\n        \"prism silhouette\": \"ぷりずむ しるえっと\",\n        \"prism store\": \"Prism Store\",\n        \"prismatic\": \"PRISMATIC\",\n        \"pritannia\": \"ぷりたにあ\",\n        \"pro-tec\": \"Pro-tec\",\n        \"prodrug\": \"PRODRUG\",\n        \"production n.g\": \"PRODUCTION N.G\",\n        \"progretrance\": \"プログレトランス\",\n        \"project 345\": \"Project 345\",\n        \"project d\": \"ぷろじぇくとD\",\n        \"project freaks\": \"project フリークス\",\n        \"project fw\": \"プロジェクトFW\",\n        \"project harakiri\": \"PROJECTハラキリ\",\n        \"project of dr.q\": \"Project of Dr.Q\",\n        \"project-11\": \"Project-11\",\n        \"projectgs\": \"ProjectGS\",\n        \"proom\": \"Proom\",\n        \"propeller\": \"propeller\",\n        \"protmind\": \"PROTMIND\",\n        \"prymary\": \"prymary\",\n        \"przm star\": \"Przm Star\",\n        \"psy-chs\": \"Psy-chs\",\n        \"psy-force-project\": \"Psy-Force-Project\",\n        \"psy-walken\": \"Psy-Walken\",\n        \"psychetangle\": \"サイケタングル\",\n        \"psycho\": \"Psycho\",\n        \"psychosteak\": \"PSYCHOSTEAK\",\n        \"psycodelicious\": \"PSYCODELICIOUS\",\n        \"ptd\": \"PTD\",\n        \"ptislands\": \"ptislands\",\n        \"public planet\": \"ぱぶりっくぷらねっと\",\n        \"pucchies\": \"ぷっち~ず\",\n        \"pucchu\": \"ぷっちゅ\",\n        \"puchi momo club\": \"ぷちもも倶楽部\",\n        \"puchi parfait\": \"ぷちぱるふぇ\",\n        \"puchi-ya\": \"ぷち屋\",\n        \"pudding delices\": \"プディングデリス\",\n        \"pukupukumanbow\": \"PUKUPUKUMANBOW\",\n        \"pulin nabe\": \"PULIN Nabe\",\n        \"pulltop\": \"PULLTOP\",\n        \"pulltop latte\": \"PULLTOP LATTE\",\n        \"pulp sector\": \"パルプセクタ\",\n        \"pulpox\": \"Pulpox\",\n        \"pulupulu punch\": \"pulupulu punch\",\n        \"pumpkin\": \"ぱんぷきん\",\n        \"pumpkin freaks\": \"PUMPKIN FREAKS\",\n        \"puni puni kikaku\": \"ぷにぷに企画\",\n        \"puni-douraku\": \"ぷに道楽\",\n        \"puni-soft\": \"ぷにソフト\",\n        \"puniiyu\": \"ぷにいゆ\",\n        \"puniponya\": \"ぷにぽんや\",\n        \"punipuni doka-n\": \"ぷにぷにどか～ん♪\",\n        \"punipunikan\": \"ぷにぷに館\",\n        \"punisher punishment\": \"ぱにっしゃーぱにっしゅめんと\",\n        \"punyanica\": \"ぷにゃニカ\",\n        \"puppy biscuit\": \"ぱぴービスケット\",\n        \"puralinedou\": \"puraline堂\",\n        \"puratina no sakana\": \"プラチナのサカナ\",\n        \"pure cruel\": \"PureCruel\",\n        \"pure light\": \"ぴゅあらいと\",\n        \"pure more\": \"pure more\",\n        \"pure-liquid\": \"Pure-Liquid\",\n        \"purehime\": \"PUREHIME\",\n        \"pureskip\": \"PureSkip\",\n        \"pureslider\": \"PureSlider\",\n        \"purge\": \"purge\",\n        \"purgic i.m.o\": \"Purgic I.M.O\",\n        \"purikura\": \"プリクラ\",\n        \"purimomo\": \"ぷり桃\",\n        \"purin dou\": \"ぷりん堂\",\n        \"purin house\": \"ぷりんはうす\",\n        \"purin yokochou\": \"ぷりん横丁\",\n        \"purincho.\": \"ぷりんちょ。\",\n        \"puripoyo pudding\": \"ぷりぽょぷりん\",\n        \"purple dream\": \"パープルドリーム\",\n        \"purple haze\": \"PURPLE HAZE\",\n        \"purple kiss\": \"ぱーぷるきっす\",\n        \"purple sky\": \"パープルスカイ\",\n        \"purple software\": \"パープルソフトウェア\",\n        \"purpleclover\": \"PurpleClover\",\n        \"purumetal\": \"ぷるめたる\",\n        \"purupuru finale\": \"ぷるぷるフィナーレ!!\",\n        \"pururun\": \"ぷるるん\",\n        \"push pop\": \"ぷっしゅぽっぷ\",\n        \"pussy cat\": \"Pussy・CAT\",\n        \"pussy.cat seisaku iinkai\": \"Pussy・CAT制作委員会\",\n        \"pussymark\": \"Pussymark\",\n        \"puzzle74\": \"PUZZLE74\",\n        \"puzzlebox\": \"パズルボックス\",\n        \"px-real\": \"PX-REAL\",\n        \"pyonpyororin\": \"ぴょんぴょろりん\",\n        \"pyramid house\": \"ピラミッドハウス\",\n        \"q kikaku ankoku kiheidan\": \"Q企画暗黒奇兵団\",\n        \"q.o.n\": \"Q.O.N\",\n        \"qcumber\": \"QCUMBER\",\n        \"qlapz\": \"クラプス\",\n        \"qoobrand\": \"Qoobrand\",\n        \"qqq\": \"QQQ\",\n        \"qross\": \"QRoss\",\n        \"quad prime\": \"Quad Prime\",\n        \"qualia\": \"qualia\",\n        \"qualia cheese\": \"くおりあちーず\",\n        \"quarter.\": \"QUARTER.\",\n        \"quartierlatin\": \"カルチェラタン\",\n        \"quartzshow\": \"晶\",\n        \"quda\": \"Q.U.D.A.\",\n        \"queen of vanilla\": \"Queen Of VANILLA\",\n        \"queen soft\": \"クィーンソフト\",\n        \"question\": \"QUESTION?\",\n        \"quick kick lee\": \"Quick kick Lee\",\n        \"quintallagosta\": \"QuintalLagosta\",\n        \"quo vadis\": \"Quo Vadis\",\n        \"quotation\": \"Quotation\",\n        \"qureate\": \"qureate\",\n        \"r equals birth\": \"R=birth\",\n        \"r style\": \"R*style\",\n        \"r-blue\": \"R・blue\",\n        \"r-deco\": \"R-Deco\",\n        \"r-type nirvana\": \"R-Type Nirvana\",\n        \"r-works\": \"R-WORKS\",\n        \"r.a.n.software\": \"ランソフトウェア\",\n        \"r.c.i\": \"R.C.I\",\n        \"r.c.w.d\": \"R.c.W.d\",\n        \"r.e.c\": \"R.E.C\",\n        \"r.h.d\": \"R・H・D\",\n        \"r.i.s factory\": \"r.i.s factory\",\n        \"r.o.c\": \"R.O.C\",\n        \"r1\": \"r;1\",\n        \"r18\": \"R18\",\n        \"r2\": \"R2\",\n        \"r2a\": \"r2A\",\n        \"r55 kyouwakoku\": \"R55共和国\",\n        \"ra-raradan\": \"らーらら団\",\n        \"rabbit beat\": \"Rabbit Beat\",\n        \"rabbit company\": \"ラビットカンパニー\",\n        \"rabbit house\": \"ラビットハウス\",\n        \"rabbit hutch\": \"Rabbit Hutch\",\n        \"rabbit kuukan\": \"ラビット空間\",\n        \"rabbit sniper\": \"ラビットスナイパー\",\n        \"rabbit syndrome\": \"rabbit syndrome\",\n        \"rabbits\": \"らびっつ\",\n        \"rabbits foot\": \"ラビッツフット\",\n        \"raccoon\": \"ラクーン\",\n        \"ractica\": \"RACTICA\",\n        \"radial engine\": \"ラジアルエンジン\",\n        \"radiant slash h plus\": \"radiant/H+\",\n        \"radical dash\": \"RADICAL DASH\",\n        \"rafflesia\": \"らふれしあ\",\n        \"rafoguramu\": \"裸フォグラ夢\",\n        \"ragho\": \"らぐほ\",\n        \"rahue kojo\": \"らふ絵工場\",\n        \"raiden labo\": \"らいでんらぼ\",\n        \"raigekitai\": \"らいげきたい\",\n        \"raijinoh\": \"雷迅皇\",\n        \"raijuu shoujo\": \"雷獣少女\",\n        \"rain drop\": \"Rain*drop\",\n        \"rain rainbow\": \"Rain Rainbow\",\n        \"rain shot\": \"Rain Shot\",\n        \"rainbow cyc\": \"Rainbow Cyc\",\n        \"rainbow force\": \"RAINBOW FORCE\",\n        \"rairai rakuraku\": \"らいらいらくらく\",\n        \"raising staff\": \"Raising Staff\",\n        \"rakdo\": \"落童\",\n        \"rakka sokudo 2.5\": \"落下速度2.5\",\n        \"rakkasei\": \"ラッカセイ\",\n        \"rakubi\": \"楽日\",\n        \"rakuen koubou\": \"楽園工房\",\n        \"rakuen no sora\": \"楽園の空\",\n        \"rakuen tiramisu\": \"楽園ティラミス\",\n        \"rakugaki drops\": \"RAKUGAKI DROPS\",\n        \"rakugaki evo\": \"らくがきEVO\",\n        \"rakugaki ippentou\": \"らくがき一辺倒\",\n        \"rakugaki omochabako\": \"らくがきおもちゃばこ\",\n        \"rakugaki switch\": \"らくがきスイッチ\",\n        \"rakuichimonji\": \"楽一文字\",\n        \"rakukisa\": \"ラクキサ\",\n        \"rakutoa\": \"ラクトア\",\n        \"ramble cat\": \"Ramble Cat\",\n        \"rame\": \"ラメ\",\n        \"ramen half price 280 yen\": \"ラーメン半額280円\",\n        \"ramen rice\": \"らーめんらいす\",\n        \"rampancy\": \"Rampancy\",\n        \"rampant\": \"Rampant\",\n        \"ramubi koubou\": \"らむびー工房\",\n        \"ramune button\": \"ラムネボタン\",\n        \"random parts\": \"ランダムパーツ\",\n        \"ranmado\": \"乱馬堂\",\n        \"ranranpop\": \"らんらんぽっぷ\",\n        \"ranshi to kimi to.\": \"乱視と君と。\",\n        \"rapurando\": \"らぷらんど\",\n        \"rare okowa\": \"レアおこわ\",\n        \"rasa house\": \"らさはうす\",\n        \"rascou\": \"らすこう\",\n        \"rasen kyuuri\": \"螺旋きゅうり\",\n        \"rasinban\": \"Rasinban\",\n        \"rask\": \"RASK\",\n        \"raspberry\": \"Raspberry\",\n        \"raspberry galette\": \"raspberry galette\",\n        \"rat tail\": \"RAT TAIL\",\n        \"ratio1\": \"レシオ1\",\n        \"rauhreif\": \"ラウライフ\",\n        \"raving phantom\": \"RAVING PHANTOM\",\n        \"rayroh\": \"玲瓏\",\n        \"raytrec\": \"RAYTREC\",\n        \"razchoco\": \"RazChoco\",\n        \"rbooks\": \"rbooks\",\n        \"re clel\": \"Re_Clel\",\n        \"re cre at tors\": \"Re:Cre@tors\",\n        \"re set\": \"Re:Set\",\n        \"re-bidou\": \"Re-BI堂\",\n        \"re-fire\": \"リファイア\",\n        \"re-tale\": \"Re-tale\",\n        \"re-vival\": \"Re-vival\",\n        \"real\": \"real\",\n        \"reason\": \"Reason\",\n        \"rebecca\": \"REBECCA\",\n        \"rebirth\": \"rebirth\",\n        \"recaroya\": \"れかろ屋\",\n        \"recette\": \"Recette\",\n        \"rectorica\": \"Rectorica\",\n        \"red\": \"RED\",\n        \"red axis\": \"Red Axis\",\n        \"red bean milk tea\": \"小豆ミルクティー\",\n        \"red chuck\": \"レッドチャック\",\n        \"red delicious\": \"レッドデリシャス\",\n        \"red etude\": \"赤のエチュード\",\n        \"red label\": \"レッドレーベル\",\n        \"red paprika\": \"RED Paprika\",\n        \"red rebel\": \"レッドレベル\",\n        \"red ribbon\": \"RED RIBBON\",\n        \"red ribbon revenger\": \"RED RIBBON REVENGER\",\n        \"red x blue\": \"Red×Blue\",\n        \"red-uguisu\": \"RED-UGUISU\",\n        \"red-zone\": \"RED-ZONE\",\n        \"redbell\": \"れっどべる\",\n        \"reds\": \"Reds!\",\n        \"redsquid\": \"REDSQUID\",\n        \"ref\": \"ref\",\n        \"reflectia\": \"Reflectia\",\n        \"reflection\": \"リフレクション\",\n        \"regnenshower\": \"Regnenshower\",\n        \"regulus\": \"レグルス\",\n        \"rei no tokoro\": \"例の所\",\n        \"reien\": \"黎en\",\n        \"reika-doh\": \"麗華堂\",\n        \"reimonya\": \"礼門屋\",\n        \"reitou cafe terrace\": \"冷凍カフェテラス\",\n        \"rekka\": \"烈火\",\n        \"reku kuukan\": \"れく空間\",\n        \"rela factory\": \"Rela Factory\",\n        \"relpam\": \"りるぱむ\",\n        \"rem9\": \"REM9\",\n        \"remagi\": \"リメイジ\",\n        \"remationmade\": \"リメーションメイド\",\n        \"remnants\": \"Remnants\",\n        \"remonsan project\": \"Remonsan Project\",\n        \"remora field\": \"remora field\",\n        \"remora works\": \"remora works\",\n        \"remorse\": \"Remorse\",\n        \"ren\": \"Ren\",\n        \"ren-ai\": \"REN-AI\",\n        \"rena koubou\": \"レナ工房\",\n        \"renainou\": \"恋愛脳\",\n        \"rengeza\": \"蓮華座\",\n        \"rennyuu aquarium\": \"練乳アクアリウム\",\n        \"renrakumou ami doujin section\": \"連絡網ＡＭＩ同人セクション\",\n        \"renrendou\": \"漣々堂\",\n        \"rensei\": \"連星\",\n        \"rensougyo\": \"蓮双魚\",\n        \"rental senkan\": \"レンタル戦艦\",\n        \"renyaa hearts\": \"レンヤーハーツ\",\n        \"reparation\": \"レパラシオン\",\n        \"replicailia\": \"レプリカイリア\",\n        \"resemble blue\": \"Resemble Blue\",\n        \"resident of iii\": \"Resident of III\",\n        \"respect\": \"リスペクト\",\n        \"ressentiment\": \"ルさんちまん\",\n        \"retasuya\": \"れたす屋\",\n        \"retro star\": \"レトロスター\",\n        \"rev3\": \"Rev3\",\n        \"reverie\": \"REVERIE\",\n        \"revoeme\": \"れぼえめ\",\n        \"revorious\": \"RevoRious\",\n        \"rh\": \"あーるえいち\",\n        \"rh minus\": \"RHまいなす\",\n        \"rhein no mamori shoukai\": \"ラインの守り商会\",\n        \"ribbon super kikaku\": \"リボンスーパー企画\",\n        \"ribons nights\": \"リボーンズナイツ\",\n        \"riboshika unit\": \"Riboshika Unit\",\n        \"rice\": \"Rice\",\n        \"rice ball\": \"らいすぼ～る\",\n        \"ricecandy\": \"RiceCandy\",\n        \"ricering\": \"RiceRing\",\n        \"ricky-tick\": \"RICKY-TICK\",\n        \"rico project\": \"リコプロジェクト\",\n        \"riddle soft\": \"リドルソフト\",\n        \"rideshion\": \"りでしおん\",\n        \"riff-racket\": \"リフラケット\",\n        \"right hand\": \"ライトハンド\",\n        \"riki\": \"RIKI\",\n        \"rikomam\": \"RIKOMAM\",\n        \"rikudou juku\": \"六道塾\",\n        \"rikudoukan\": \"六道館\",\n        \"rikudouya\": \"六道屋\",\n        \"rima cafe\": \"Rima Cafe\",\n        \"rin\": \"RIN\",\n        \"rinarina\": \"RINARINA\",\n        \"rinfin\": \"りんふぃん\",\n        \"ring a bell\": \"リングアベル\",\n        \"ring memo\": \"Ring memo\",\n        \"ringo doumei\": \"りんご同盟\",\n        \"ringo koucha\": \"りんご紅茶\",\n        \"ringo no kisetsu.\": \"りんごの季節。\",\n        \"ringoya\": \"リンゴヤ\",\n        \"rinji party\": \"臨時PT\",\n        \"rinkandou\": \"輪漢堂\",\n        \"rinkichibu\": \"りんキチぶ\",\n        \"rinne\": \"りんね\",\n        \"rinnetensei\": \"輪廻転生\",\n        \"rinrin\": \"倫鈴\",\n        \"rio grande\": \"リオグランデ\",\n        \"ripel egg\": \"らいぷるえっぐ\",\n        \"rippadou\": \"立派堂\",\n        \"ripton sabo\": \"りぷとん☆茶房\",\n        \"ririadoll\": \"リリアドール\",\n        \"ririmat\": \"りりまっと\",\n        \"riroland\": \"RIROLAND\",\n        \"rising sun\": \"らいじんぐさん\",\n        \"risoukyou\": \"理ソウ郷\",\n        \"rissuinoti\": \"立錐之地\",\n        \"ritard.a2\": \"ritard.A2\",\n        \"rivajima\": \"リバ島\",\n        \"rix\": \"RIX\",\n        \"rizaru forest.\": \"リザルフォレスト。\",\n        \"rj\": \"RJ\",\n        \"rkaffy\": \"アールカフィ\",\n        \"rm kikaku\": \"RM企画\",\n        \"road\": \"ロード\",\n        \"road equals road\": \"Road=ロード=\",\n        \"road map\": \"Road map\",\n        \"road side roman\": \"Road Side Roman\",\n        \"roam\": \"roam\",\n        \"robayan no mori\": \"ロバヤンの森\",\n        \"robazoku\": \"ロバ族\",\n        \"robo ittetsu\": \"ロボ一徹\",\n        \"robo moe kenkyuujo\": \"ロボ萌え研究所\",\n        \"roboko teikoku\": \"ろぼこ帝国\",\n        \"rocca\": \"ROCCA\",\n        \"rock clime\": \"ROCK CLIME\",\n        \"rock steady\": \"ろっくすてでぃ\",\n        \"rocket kyoudai\": \"ロケット兄弟\",\n        \"rocket nenryou 21\": \"ロケット燃料★21\",\n        \"rockinchair\": \"ROCK`inChair\",\n        \"rocomani\": \"ろこまに\",\n        \"rocoroto\": \"ロコロト\",\n        \"rodeo\": \"■RODEO\",\n        \"rodiura.\": \"ろぢうら。\",\n        \"rohgun kyoh\": \"老眼郷\",\n        \"rojiko\": \"ロジコ\",\n        \"rojiura holic\": \"路地裏Holic\",\n        \"rojiura jack\": \"路地裏JACK\",\n        \"rojiurakinema\": \"路地裏キネマ\",\n        \"rokugatsu no kashiwamochi\": \"六月の柏餅\",\n        \"rokugatsu no reizouko\": \"六月の冷蔵庫\",\n        \"rokujinchuu\": \"六人柱\",\n        \"rokumen roppi\": \"ろくめん・ろっぴ\",\n        \"rokuroku sanjuuroku\": \"ロクロクサンジューロク\",\n        \"rokusyoku mikan\": \"緑色みかん\",\n        \"rollin thunder\": \"ろーりんさんだー\",\n        \"rolling box\": \"Rolling box\",\n        \"rolling haiena\": \"Rollingハイエナ\",\n        \"romantic london\": \"Romantic London\",\n        \"romantic ren-ai mode\": \"ロマンティック恋愛モード\",\n        \"romantic shinjuu\": \"浪漫的心中\",\n        \"romeo dash\": \"ROMEO DASH\",\n        \"ronpaia\": \"ろんぱいあ\",\n        \"room guarder\": \"ルームガーダー\",\n        \"room0016\": \"Room0016\",\n        \"rope island\": \"ろーぷあいらんど\",\n        \"roppongi shinjuu\": \"六本木神獣\",\n        \"rorerore-ya\": \"ろれろれ屋\",\n        \"rorioiru\": \"ろりおいる\",\n        \"roritora\": \"ロリとら!!\",\n        \"rorororomo\": \"ロロロロモ\",\n        \"rose liese\": \"Rose Liese\",\n        \"rose tiara\": \"ローズティアラ\",\n        \"rose water\": \"ROSE WATER\",\n        \"rosebud\": \"Rosebud\",\n        \"rosemarygarden\": \"RosemaryGarden\",\n        \"roshiman\": \"ろしまん\",\n        \"rotary engine\": \"ろ～たり～Engine\",\n        \"rotten apple\": \"ろってんあっぷる\",\n        \"roubai-tei\": \"狼狽亭\",\n        \"rouge\": \"ルージュ\",\n        \"rough love\": \"ラフラブ\",\n        \"round-house\": \"ROUND-HOUSE\",\n        \"round-o\": \"round-O\",\n        \"rouseiya\": \"狼星屋\",\n        \"route08\": \"ROUTE08\",\n        \"royal\": \"ROYAL\",\n        \"royal crown\": \"ROYAL CROWN\",\n        \"royal maya\": \"Royal Maya\",\n        \"royal moon\": \"Royal Moon\",\n        \"royal.s\": \"ロイヤル・S\",\n        \"royalwatts\": \"ROYALWATTS\",\n        \"rr kenkyuukai\": \"RR研究会\",\n        \"rro\": \"RRO\",\n        \"rrr\": \"RRR\",\n        \"rsag\": \"RSAG\",\n        \"ru-vic\": \"RU-VIC\",\n        \"rubber cup boys\": \"ラバーカップボーイズ\",\n        \"rubbish selecting squad\": \"RUBBISH選別隊\",\n        \"rubens tinctura\": \"Rubens Tinctura\",\n        \"rubicon\": \"ルビコン\",\n        \"ruby eye\": \"Ruby Eye\",\n        \"ruby fruit\": \"RUBY FRUIT\",\n        \"ruf\": \"ruf\",\n        \"ruikotsu\": \"泪骨\",\n        \"ruki ruki exiss\": \"るきるきEXISS\",\n        \"rukruk\": \"RukRuk\",\n        \"ruler shot\": \"Ruler Shot\",\n        \"rumbling heart\": \"らんぶりんぐはあと\",\n        \"rune\": \"ルーン\",\n        \"runner bean\": \"runner bean\",\n        \"runway\": \"Runway\",\n        \"rupinasu touzokudan\": \"るぴなす盗賊団\",\n        \"ruri ringo\": \"瑠璃りんご\",\n        \"ruruna and nimunimu\": \"るるな＆にむにむ\",\n        \"rururairai\": \"縷々来来\",\n        \"rush\": \"RUSH\",\n        \"rush rise line\": \"Rush Rise Line\",\n        \"rushimaru dou\": \"るしまる堂\",\n        \"russia cake\": \"Russia cake\",\n        \"russian neko\": \"ロシアン猫\",\n        \"russiapan\": \"ロシアパン\",\n        \"rustic house\": \"RUSTIC HOUSE\",\n        \"rxr renmei\": \"あるある連盟\",\n        \"ryanhan shibari\": \"二飜縛り\",\n        \"rycanthropy\": \"RYCANTHROPY\",\n        \"ryokucha combo\": \"緑茶コンボ\",\n        \"ryonas station\": \"Ryona's Station\",\n        \"ryoujoku kagekidan\": \"陵辱過激団\",\n        \"ryousangata ponyta\": \"量産型ポニテ\",\n        \"ryu no abara\": \"りゅうのあばら\",\n        \"ryujya dou\": \"竜蛇道\",\n        \"ryuknigthia\": \"リュナイティア\",\n        \"ryuu no yadorigitei\": \"竜の宿り木亭\",\n        \"ryuukisha\": \"隆起社\",\n        \"ryuukotsusan\": \"龍骨山\",\n        \"ryuukuujou\": \"竜宮城\",\n        \"ryuuryokukakou.\": \"りゅうりょくかこう。\",\n        \"ryuusei koubou\": \"流星工房\",\n        \"ryuushikei\": \"粒子系\",\n        \"ryuutai rikigaku\": \"流体力学\",\n        \"ryuutai urinal\": \"流体ユリナアル\",\n        \"s shoten\": \"エス書店\",\n        \"s-14\": \"S-14\",\n        \"s-core\": \"S-Core\",\n        \"s-flake\": \"S-FLAKE\",\n        \"s-force\": \"S-FORCE\",\n        \"s-g.h.\": \"S-G.H.\",\n        \"s-ram\": \"S-Ram\",\n        \"s.\": \"S.\",\n        \"s.c.c.\": \"S.C.C\",\n        \"s.d.works\": \"S・D・Works\",\n        \"s.k.\": \"S.K\",\n        \"s.n.l\": \"S.N.L\",\n        \"s.s.l\": \"S.S.L\",\n        \"saba down\": \"鯖DOWN\",\n        \"sabai shuppan\": \"さばーい出版\",\n        \"sabakunosakura\": \"サバクノサクラ\",\n        \"sabamiso\": \"さばみそ\",\n        \"saberfish\": \"セイバーフィッシュ\",\n        \"sabo-p\": \"SABO-P\",\n        \"saboriguse syndrome\": \"サボリ癖症候群\",\n        \"saboten\": \"サボテン\",\n        \"saboten binta\": \"サボテンビンタ\",\n        \"saboten sankaku\": \"サボテンさんかく\",\n        \"saboten-dou honpo\": \"仙人掌堂本舗\",\n        \"sabusukatchi\": \"サブスカッチ\",\n        \"sadakichi-tei\": \"定吉亭\",\n        \"sadakichidou\": \"定吉堂\",\n        \"sadistic alice\": \"Sadistic Alice\",\n        \"sadistic green\": \"SADISTIC GREEN\",\n        \"sadistic mary\": \"SADISTIC MARY\",\n        \"sae\": \"冴\",\n        \"safire\": \"SAFIRE\",\n        \"saga angel\": \"SAGA Angel\",\n        \"sagamani.\": \"サガマニ。\",\n        \"sagano line\": \"さがのせん\",\n        \"sage\": \"Sage\",\n        \"saicoro chick\": \"サイコロちっく\",\n        \"saigo made anko tappuri\": \"最後まであんこたっぷり\",\n        \"saigo no rakuen -the perfect world-\": \"最後の楽園-the perfect world-\",\n        \"saihate\": \"最果て\",\n        \"saikaihatsu\": \"催開発\",\n        \"saikasou seiteki shoudou kenkyuukai\": \"最下層性的衝動研究会\",\n        \"saikawa youzyo\": \"さぃヵゎ♡ょぅι゛ょ\",\n        \"saiki industrial\": \"佐伯重工\",\n        \"saiko smiling show\": \"サイコすまいりんぐショウ\",\n        \"saikyo gakuen\": \"最強学園\",\n        \"sail-ring on\": \"Sail-ring on\",\n        \"sailor q2\": \"SAILOR Q2\",\n        \"saimin sushiya\": \"催眠すし屋\",\n        \"sainometei\": \"賽の目亭\",\n        \"saint seiya\": \"聖性屋\",\n        \"saipin\": \"さいピン\",\n        \"sairo publishing\": \"豺狼出版\",\n        \"saisons\": \"SaiSonS\",\n        \"saita tsuushin\": \"才田通信\",\n        \"saitei no butagoya\": \"最低の豚小屋\",\n        \"saito-penguin\": \"西東ペンギン\",\n        \"saitou satou\": \"斎藤さとー\",\n        \"saitou teikoku\": \"齋藤帝國\",\n        \"saitoukai\": \"斉藤会\",\n        \"saitouya\": \"斎藤屋\",\n        \"saka muke\": \"さか☆むけ\",\n        \"sakaiya\": \"境屋\",\n        \"sakamusiya\": \"さかむし屋\",\n        \"sakanahen\": \"サカナヘン\",\n        \"sakasadorirakka\": \"逆さ鳥落下\",\n        \"sakasama clover\": \"さかさまクローバー\",\n        \"sakazuki-tei\": \"さかずき亭\",\n        \"sakeitiba\": \"サケ市場\",\n        \"sake no sanran\": \"鮭の産卵\",\n        \"sakekan memorial\": \"鮭缶メモリアル\",\n        \"saketanuki no kakushigura\": \"酒たぬきの隠し蔵\",\n        \"saketoba meshi\": \"鮭とば飯\",\n        \"sakiyama bakufu\": \"sakiyama幕府\",\n        \"sakomicho\": \"さこみちょ\",\n        \"sakotsu no kuni\": \"鎖骨ノ国\",\n        \"saku saku circle\": \"さくさくさーくる\",\n        \"sakuko seisakusho\": \"作呼製作所\",\n        \"sakumaya\": \"さくま屋\",\n        \"sakura garden\": \"さくらがーでん\",\n        \"sakura koubou\": \"さくら工房\",\n        \"sakura mochi\": \"桜餅\",\n        \"sakura no hanabira\": \"桜の花びら\",\n        \"sakura prin\": \"さくらぷりん\",\n        \"sakura zensen\": \"さくら前線\",\n        \"sakuraen\": \"櫻園\",\n        \"sakurai dai energy\": \"櫻井台エネルギー\",\n        \"sakurairo etranger\": \"桜色エトランゼ\",\n        \"sakuraito\": \"サクライト\",\n        \"sakurakan\": \"さくら缶\",\n        \"sakurako\": \"さくら庫\",\n        \"sakurakusa\": \"サクラクサ\",\n        \"sakuraminto\": \"桜眠都\",\n        \"sakuramochi\": \"さくらもち\",\n        \"sakuramouse\": \"SAKURAMOUSE\",\n        \"sakuranbo\": \"桜桃\",\n        \"sakuranbo little\": \"さくらんぼりとる\",\n        \"sakurapink\": \"sakuraPINK\",\n        \"sakurasake\": \"桜鮭\",\n        \"sakurasaku koubou\": \"桜咲く工房\",\n        \"sakurautage\": \"櫻宴\",\n        \"sakurawhite\": \"SAKURAWHITE\",\n        \"sakuraya\": \"SAKURAYA\",\n        \"sakurazuki\": \"桜月\",\n        \"sakuri uchuu model\": \"サクリ宇宙モデル\",\n        \"sakusaku kangen noushuku\": \"サクサク還元濃縮\",\n        \"sakusakusakuchan\": \"さくさくさくちゃん\",\n        \"sakuya no hakoniwa\": \"昨夜の箱庭\",\n        \"sakuya17sai\": \"咲耶17歳\",\n        \"sakyuu\": \"砂丘\",\n        \"salad abura\": \"サラダ油\",\n        \"salmon daisuki club\": \"サーモンだいすきクラブ\",\n        \"salt peanuts\": \"Salt Peanuts\",\n        \"salvage kouboh\": \"サルヴェージ工房\",\n        \"samalimi\": \"samalimi\",\n        \"sameno soft cream\": \"鮫野ソフトクリーム\",\n        \"samgyetang\": \"サムゲタン\",\n        \"samonaberu\": \"サモナベール\",\n        \"samugakupetti\": \"SGPT\",\n        \"samurai\": \"侍\",\n        \"samurai shipmaru\": \"さむらいシップ丸\",\n        \"sunora\": \"さんおれ\",\n        \"sana house\": \"Sana House\",\n        \"sanazura doujinshi hakkoujo\": \"さなづら同人誌発行所\",\n        \"sanb.\": \"さんびー。\",\n        \"sanbai kaiouken\": \"3倍界王軒\",\n        \"sanban yashiki\": \"三番屋敷\",\n        \"sanchi chokusou maguro dan\": \"産地直送マグロ団\",\n        \"sancho panda\": \"さんちょぱんだ\",\n        \"sandal nyan\": \"サンダルニャン\",\n        \"sandansu\": \"sandansu\",\n        \"sandglass\": \"sandglass\",\n        \"sangatsu no lion\": \"三月のライオン\",\n        \"sangatsu no osakai\": \"三月のお茶会\",\n        \"sangenkaidou\": \"三弦回胴\",\n        \"sangenshokudou\": \"三原色堂\",\n        \"sangeriya\": \"サンゲリ屋\",\n        \"sangria\": \"さんぐりあ\",\n        \"sangria kyuuden\": \"サングリア宮殿\",\n        \"sankaku apron\": \"さんかくエプロン\",\n        \"sankaku doumei\": \"さんかく同盟\",\n        \"sanketsushuu\": \"酸欠集\",\n        \"sankyaku rasen\": \"三脚ラセン\",\n        \"sannyuutei\": \"三乳亭\",\n        \"sanolemoon\": \"Sanolemoon\",\n        \"sanryuu club\": \"三流倶楽部\",\n        \"sanryuu kaigishitsu\": \"三流会議室\",\n        \"sansei biyori\": \"賛成日和\",\n        \"sanshodou\": \"山椒堂\",\n        \"sansui\": \"泉泉泉\",\n        \"sansuisha\": \"散水社\",\n        \"santa fe radio\": \"Santa Fe Radio\",\n        \"santarose\": \"サンタローズ\",\n        \"santonana\": \"サントナナ\",\n        \"sanukiya\": \"讃岐屋\",\n        \"sanyongo\": \"三四五\",\n        \"sanzoku no uta\": \"山賊の唄\",\n        \"saomako\": \"さおまこ\",\n        \"saotome-laboratory\": \"早乙女けんきゅう所\",\n        \"saperon black\": \"さぺろんブラック\",\n        \"sardnix\": \"サードニックス\",\n        \"sardonyx\": \"sardonyx\",\n        \"sarfatation\": \"sarfatation\",\n        \"sark\": \"SARK\",\n        \"sarobetsu ginga\": \"サロベツ銀河\",\n        \"sarpaccio\": \"サルパッチョ\",\n        \"sartaiz\": \"さぁたいず\",\n        \"sarurururu\": \"サルルルル\",\n        \"sasa chaya\": \"ささ茶屋\",\n        \"sasainamono\": \"ささいなもの\",\n        \"sasakama box\": \"笹かまボックス\",\n        \"sasaki maru\": \"ささきまる\",\n        \"sasaki muu shouten\": \"佐々木無宇商店\",\n        \"sasaki yasiki\": \"佐々木屋敷\",\n        \"sasami no maruyaki\": \"ささみの丸焼き\",\n        \"sasanoha toro\": \"笹乃葉とろ\",\n        \"sasha forest\": \"サーシア・フォレスト\",\n        \"sashimi choco\": \"さしみチョコ\",\n        \"sashimi no wife\": \"サシミノワイフ\",\n        \"sasumata seven\": \"さすまたせぶん\",\n        \"sasurai no manbou\": \"さすらいのマン棒\",\n        \"sata cleaning\": \"さたクリーニング\",\n        \"satei\": \"砂亭\",\n        \"satellite na spark\": \"サテライトなスパーク\",\n        \"satellites\": \"Satellites\",\n        \"sato samitt\": \"サトサミット\",\n        \"satoimo bokujou\": \"さといも牧場\",\n        \"satomachine.\": \"satomachine.\",\n        \"satooya\": \"さとうや\",\n        \"satori gozen\": \"悟リ御膳\",\n        \"satou furo\": \"砂糖風呂\",\n        \"satou to shio\": \"砂糖と塩\",\n        \"satouseika\": \"サトウ製菓\",\n        \"satsukiimonet\": \"satsukiimonet\",\n        \"satsukinchi\": \"サツキん家\",\n        \"saturday night special\": \"Saturday Night Special\",\n        \"aurorasoft\": \"AuroraSoft\",\n        \"sausage koubou\": \"ソーセージ工房\",\n        \"savageland\": \"SavageLand\",\n        \"sawa chaya\": \"さわ茶屋\",\n        \"sawaraya shoten\": \"佐原屋書店\",\n        \"sayakata kouchakan\": \"さやかた紅茶館\",\n        \"sayonara hornet\": \"サヨナラホーネット\",\n        \"sayupot\": \"さゆぽっと\",\n        \"sayuu-hanten\": \"サユウハンテン\",\n        \"sazameki dori\": \"さざめき通り\",\n        \"sazanka no yado\": \"山茶花の宿\",\n        \"sazareito\": \"さざれいと\",\n        \"sbd\": \"SBD\",\n        \"sbi\": \"SBI\",\n        \"scale garden\": \"スケイルガーデン\",\n        \"scape alice\": \"Scape Alice\",\n        \"scarabe\": \"scarabe\",\n        \"scarlet beast\": \"Scarlet Beast\",\n        \"scarlet leaf\": \"Scarlet Leaf\",\n        \"schatz\": \"Schatz\",\n        \"schenkel union\": \"Schenkel Union\",\n        \"schoolzone\": \"schoolzone\",\n        \"schwarz libelle\": \"シュバルツ･リベレ\",\n        \"schwester\": \"しゅべすた\",\n        \"sco.labo\": \"SCO.LABO\",\n        \"score\": \"スコア\",\n        \"scotchy\": \"すこっちぃ\",\n        \"scp-mio slash\": \"SCP-MiO/\",\n        \"scramble yourouin\": \"スクランブル養老院\",\n        \"screaming dog\": \"Screaming DOG\",\n        \"scrotum\": \"scrotum\",\n        \"scrum hitori\": \"スクラムヒトリ\",\n        \"sddy\": \"SDDY\",\n        \"se-ri\": \"セーリ\",\n        \"seacloud\": \"SEACLOUD\",\n        \"seafox\": \"SeaFox\",\n        \"seamanz\": \"seamanz\",\n        \"search-light\": \"サーチライト\",\n        \"searchlight missing\": \"サーチライトミッシング\",\n        \"sebas\": \"sebas\",\n        \"sec44\": \"sec44\",\n        \"second color\": \"セカンドカラー\",\n        \"second point\": \"Second Point\",\n        \"secreder\": \"SECREDER\",\n        \"secret cure\": \"Secret Cure\",\n        \"secret dmain\": \"Secret Dmain\",\n        \"secret milk\": \"secret milk\",\n        \"secretgarden\": \"secretgarden\",\n        \"section-11\": \"SECTION-11\",\n        \"seduce\": \"SEDUCE\",\n        \"segue laboratory\": \"セグエラボラトリー\",\n        \"sei kuroneko kishidan\": \"聖クロネコ騎士団\",\n        \"seibunkaken\": \"性文化研\",\n        \"seigadou\": \"勢画堂\",\n        \"seigakukan\": \"性学館\",\n        \"seigi no chikubi\": \"正義のちくび\",\n        \"seigi no yakata\": \"セイギノヤカタ\",\n        \"seigou\": \"せいごう\",\n        \"seiheki master\": \"セイヘキマスター\",\n        \"seikan hitchhiker\": \"星間ヒッチハイカー\",\n        \"seikatsu seshishou\": \"性活窃視症\",\n        \"seikinkan\": \"星菫館\",\n        \"seinen shinshi doumei\": \"青年紳士同盟\",\n        \"seishimentai\": \"せいしめんたい\",\n        \"seishinkan eikyuu\": \"星神官永級\",\n        \"seisyun katsusand\": \"青春カツサンド\",\n        \"seisyun to strategy.\": \"青春と戦略。\",\n        \"seiteijin\": \"井庭人\",\n        \"seiwa kanmu\": \"せいわかんむ\",\n        \"seiyou tanka\": \"西洋短歌\",\n        \"seizousha\": \"性造社\",\n        \"sekai chizu wa chi no ato\": \"世界地図は血の跡\",\n        \"sekai kakumei club\": \"世界革命俱乐部\",\n        \"sekai no hate ni hanataba o.\": \"世界の果てに花束を。\",\n        \"sekai no tomizawa\": \"世界のTOMIZAWA\",\n        \"sekai saiko\": \"世界最古\",\n        \"seken no katasumi\": \"世間の片隅\",\n        \"sekichou\": \"赤蝶\",\n        \"sekidou nakama\": \"赤道仲間\",\n        \"sekigaiken\": \"赤外圏\",\n        \"sekilala\": \"せ・き・ら・ら\",\n        \"sekimen shoujo\": \"赤面少女\",\n        \"sekipan\": \"石板\",\n        \"sekishoku vanilla\": \"赤色バニラ\",\n        \"sekitan bukuro\": \"石炭袋\",\n        \"selen\": \"Selen\",\n        \"selene\": \"Selene\",\n        \"sem colon\": \"SEM;COLON\",\n        \"semakute kurai\": \"狭くて暗い\",\n        \"semedain g\": \"セメダインG\",\n        \"semimogura\": \"せみもぐら\",\n        \"sen\": \"煎\",\n        \"sen ka\": \"SEN_KA\",\n        \"sen.exe\": \"sen.exe\",\n        \"senarinko\": \"senarinko\",\n        \"senba kitchen\": \"船場きっちん\",\n        \"senbata rom\": \"せんばたROM\",\n        \"senbata-rom\": \"せんばたROM\",\n        \"senbon knock zadankai\": \"千本ノック座談会\",\n        \"senbunritsu\": \"千分率\",\n        \"sendankaisen\": \"千段櫂船\",\n        \"sengoku joketsu emaki\": \"戦国女傑絵巻\",\n        \"seniman kartun\": \"セニマンカルタン\",\n        \"senju\": \"千寿\",\n        \"senkou campanella\": \"閃光カンパネラ\",\n        \"senmatu-chaya\": \"千松茶屋\",\n        \"sennen comodo\": \"千年コモド\",\n        \"sennen ookami\": \"千年狼\",\n        \"sennohi.\": \"センノヒ.\",\n        \"senri no dou\": \"千里ノ洞\",\n        \"sentou kaiiki\": \"戦闘海域\",\n        \"sentou yousei\": \"仙桃妖星\",\n        \"senya sabou\": \"千夜茶房\",\n        \"senyen\": \"SENYEN\",\n        \"senzendou\": \"仙々堂\",\n        \"sepia\": \"SEPIA\",\n        \"sepia concerto\": \"セピアコンチェルト\",\n        \"sequence\": \"し～くえんす\",\n        \"sequence breaker\": \"シークエンスブレイカー\",\n        \"seraphim\": \"せらぴん\",\n        \"serenta\": \"Serenta\",\n        \"serious graphics\": \"serious graphics\",\n        \"sero-sero\": \"SERO-SERO\",\n        \"service boy\": \"SERVICE BOY\",\n        \"sesame\": \"セサミ\",\n        \"seseragi no machikado\": \"せせらぎの街角\",\n        \"sesso minus\": \"節操マイナス\",\n        \"setouchi pharm\": \"瀬戸内製薬\",\n        \"setsugetsuka\": \"雪月花\",\n        \"setsunasamidare\": \"せつなさみだれ\",\n        \"seven gods\": \"SEVEN GODS!\",\n        \"seven sea star\": \"SEVEN SEA STAR\",\n        \"seven wonder\": \"SEVEN WONDER\",\n        \"sevens magajin\": \"セブンズマガジン\",\n        \"seventh heaven\": \"SEVENTH HEAVEN\",\n        \"sevirey\": \"セビレィ\",\n        \"sexpet project j\": \"sexpet project J\",\n        \"sextant\": \"SEXTANT\",\n        \"sf-l\": \"SF-L\",\n        \"sg\": \"SG\",\n        \"sgsix\": \"SGsix\",\n        \"shadow garden\": \"Shadow Garden\",\n        \"shadow sorceress communication protocol\": \"影法師通訊協定\",\n        \"shagbase\": \"Shadbase\",\n        \"shagwell\": \"SHAGWELL\",\n        \"shakestyle\": \"shakestyle\",\n        \"shallow sleep plus plus\": \"Shallow Sleep++\",\n        \"shamontei\": \"沙門亭\",\n        \"shamrock.\": \"Shamrock.\",\n        \"shan maryland\": \"シャンメリーランド\",\n        \"shanghai honey bee\": \"上海蜜蜂\",\n        \"shangrila\": \"シャングリラ\",\n        \"shanhai kaijou koushi\": \"上海海上公司\",\n        \"sharuru hunter\": \"シャルルハンター\",\n        \"shay-cone\": \"SHAY-CONE\",\n        \"sheep cat\": \"しーぷきゃっと\",\n        \"sheepcloud\": \"SHEEPCLOUD\",\n        \"sherbet soft\": \"シャーベットソフト\",\n        \"shi shi shijimi\": \"SHI SHI しじみ\",\n        \"shi-kugakari saru\": \"飼育係さる\",\n        \"shian\": \"紫庵\",\n        \"shiashiya\": \"しあし屋\",\n        \"shiawase kanmiryou\": \"しあわせ甘味料\",\n        \"shiawase kyouwakoku\": \"幸せ共和国\",\n        \"shiawase manjuu\": \"しあわせまんじゅう\",\n        \"shiawase pudding dou\": \"しあわせプリン堂\",\n        \"shibafu cement\": \"芝生セメント\",\n        \"shibaneko hungry\": \"芝猫はんぐりー!\",\n        \"shibou suitei jikoku\": \"志望推定時刻\",\n        \"shibubu shibubushi\": \"しぶぶしぶぶし\",\n        \"shichirin taisha\": \"七輪大社\",\n        \"shichiyou\": \"七陽\",\n        \"shichiyou souryuujin\": \"七曜蒼龍陣\",\n        \"shigaraki ceramic\": \"シガラキセラミック\",\n        \"shigunyan\": \"しぐにゃん\",\n        \"shigure ebi\": \"しぐれえび\",\n        \"shigureya\": \"しぐれや\",\n        \"shihai shoujo\": \"支配少女\",\n        \"shiina club\": \"しいなくらぶ\",\n        \"shiinotomoshibitake\": \"しいのともしびたけ\",\n        \"shiitake\": \"椎茸\",\n        \"shijima\": \"しじま\",\n        \"shijou misaki\": \"紙上岬\",\n        \"shikaku to sankaku\": \"しかくとさんかく\",\n        \"shiki hanana\": \"紫木はなな\",\n        \"shikibu\": \"式部\",\n        \"shikimisan keiro\": \"シキミ酸経路\",\n        \"shikioriori\": \"シキオリオリ\",\n        \"shikitenshi\": \"色天使\",\n        \"shikkoku no hekireki\": \"漆黒の霹靂\",\n        \"shikkoku no tsubasa\": \"漆黒の翼\",\n        \"shikkoku no voltecker\": \"漆黒のボルテッカー\",\n        \"shikkokuno j.p.s.\": \"漆黒のJ.P.S.\",\n        \"shiko neru mix\": \"シコ寝るミックス\",\n        \"shikunikiwa\": \"しくにきわ\",\n        \"shima hitsuji\": \"しまひつじ\",\n        \"shima kneesocks tayoutai\": \"縞ニーソックス多様体\",\n        \"shimane no inugoya\": \"島根の犬小屋\",\n        \"shimanto seiryuu\": \"四万十清流\",\n        \"shimapanicecandy\": \"しまぱんアイスキャンディー\",\n        \"shimarisutei\": \"しまりす亭\",\n        \"shimashima stripe\": \"しましますとらいぷ\",\n        \"shimashima-pnt\": \"しましまPNT\",\n        \"shimeji777\": \"Shimeji777\",\n        \"shimekiri sanpunmae\": \"〆切り3分前\",\n        \"shimerike\": \"シメリケ\",\n        \"shimoboard\": \"シモボード\",\n        \"shimoda nekomaru\": \"霜田猫丸\",\n        \"shimofuri green meat\": \"しもふりグリーンミート\",\n        \"shimofuritei\": \"霜降亭\",\n        \"shimofutaketa zorome\": \"下二桁ぞろ目\",\n        \"shimokuniya\": \"シモクニヤ\",\n        \"shimotarou\": \"下太郎\",\n        \"shin-chan carnival\": \"Shin-Chan Carnival !?\",\n        \"shinachiku castella\": \"しなちくかすてぃーら\",\n        \"shinanoya\": \"信濃屋\",\n        \"shinba oolong cha\": \"神葉烏龍茶\",\n        \"shinchara\": \"しんきゃら\",\n        \"shinderarejou\": \"しんでられ城\",\n        \"shine nabyss\": \"シャイン・ナビス\",\n        \"shine no syoujyo\": \"シャインの少女\",\n        \"shinimonogurui\": \"しにものぐるい\",\n        \"shining\": \"SHINING\",\n        \"shining star\": \"Shining Star\",\n        \"shinjae iinkai\": \"死んじゃえ委員会\",\n        \"shinjuku koma gekijou\": \"新宿狛劇場\",\n        \"shinkai\": \"深海\",\n        \"shinkai hikou\": \"深海飛行\",\n        \"shinkai saboten\": \"深海サボテン\",\n        \"shinkai seizu\": \"深海星図\",\n        \"shinkan ochimashita\": \"新刊堕ちました\",\n        \"niitakayama tozantai\": \"新高山登山队\",\n        \"shinkuraiku\": \"しんくらいく\",\n        \"shinmichikai\": \"真道会\",\n        \"shinnihon pepsitou\": \"新日本ペプシ党\",\n        \"shinobi no yakata\": \"忍ノ館\",\n        \"shinobi rocket\": \"シノビロケット\",\n        \"shinohara heavy industry\": \"篠原重工営業部\",\n        \"shinpakusu teika\": \"心拍数低下\",\n        \"shinsei shoujo nyuugyou\": \"神聖少女乳業\",\n        \"shinsekai manga kenkyuukai\": \"新世界漫画研究会\",\n        \"shinsen gokuraku\": \"新鮮極楽\",\n        \"shinshi zaibatsu\": \"紳士財閥\",\n        \"shinshunshantonshou\": \"新春山東省\",\n        \"shiodome project\": \"汐留project\",\n        \"shiohama\": \"SHIOHAMA\",\n        \"shioji\": \"しおじ\",\n        \"shionoya\": \"しおのや\",\n        \"shiotsuki suien\": \"汐月水園\",\n        \"shioya\": \"塩屋\",\n        \"shioya abu tsuushin\": \"塩屋虻通信\",\n        \"sioyaki\": \"しおやき\",\n        \"sioyude\": \"しおゆで\",\n        \"shippo banchou\": \"しっぽ番長\",\n        \"shippuudotou\": \"疾風怒濤\",\n        \"shirakaba doori\": \"白樺通り\",\n        \"shiraki no kobeya\": \"白木の小部屋\",\n        \"shiranai ouchi\": \"しらないおうち\",\n        \"shirasagisou\": \"しらさぎ荘\",\n        \"shirasu an\": \"しらす庵\",\n        \"shirasugayu\": \"白子粥\",\n        \"shiratama\": \"しらたま\",\n        \"shiratamarch\": \"しらたまーち\",\n        \"shirayuki shoujodan\": \"白雪少女団\",\n        \"shirikageru taberu\": \"シリカゲルタベル\",\n        \"shiritsu sakuranbo shougakkou\": \"私立さくらんぼ小学校\",\n        \"shiro anmitsu\": \"しろあんみつ\",\n        \"shiro gas koujou\": \"白瓦斯工場\",\n        \"shiro kuro soft\": \"シロクロソフト\",\n        \"shiro no kigen\": \"白の起源\",\n        \"shiroboshi koubou\": \"白星工房\",\n        \"shiroganean\": \"白金庵\",\n        \"shiroi famicon\": \"しろいファミコン\",\n        \"shiroi kitsune no sumu yashiro\": \"白い狐の住む社\",\n        \"shiroi shinoshino\": \"しろいしのしの\",\n        \"shiroi tentoumushi\": \"白い天道虫\",\n        \"shiroi yami\": \"白い闇\",\n        \"shiroino.\": \"白いの。\",\n        \"shiroiro\": \"しろいろ\",\n        \"shiroiro ribbon\": \"しろ色りぼん\",\n        \"shirojia\": \"シロジア\",\n        \"shirokarasuya\": \"白からす屋\",\n        \"shirokuro panda\": \"白黒ぱんだ\",\n        \"shirokurofuurinkou\": \"しろくろ風鈴刻\",\n        \"shirokyuuketsuki\": \"白吸血鬼\",\n        \"shiromitsu nyuugyou\": \"白蜜乳業\",\n        \"shiromitsuya\": \"しろみつ屋\",\n        \"shironegiya\": \"白ネギ屋\",\n        \"shironeko ichizoku\": \"白猫一族\",\n        \"shirorika\": \"シロリカ\",\n        \"shirotsumekusa\": \"シロツメクサ\",\n        \"shis laboratory\": \"SHi's Laboratory\",\n        \"shishamo house\": \"ししゃもハウス\",\n        \"shishamo teikoku\": \"ししゃも帝国\",\n        \"shishamotei\": \"ししゃも亭\",\n        \"shishigami\": \"ししがみ\",\n        \"shishimaruya\": \"獅子丸屋\",\n        \"shishunki\": \"思春棄\",\n        \"shishunki paradigm\": \"思春期パラダイム\",\n        \"shisshin chuudoku\": \"失神中毒\",\n        \"shitsuji no kumaana\": \"シツジノクマアナ\",\n        \"shiwodou.\": \"しを堂。\",\n        \"shiya\": \"志屋\",\n        \"shiyou kougen\": \"四葉弘彦\",\n        \"shiyouka.\": \"しようか。\",\n        \"shizendou\": \"四然堂\",\n        \"shizuka no umi\": \"静香の海\",\n        \"shizuoka kakusei shoujo\": \"静岡覚醒少女\",\n        \"shm\": \"SHM\",\n        \"shobocon\": \"しょぼコン\",\n        \"shocoratie\": \"ショコラティエ!\",\n        \"shokkakuya\": \"食客屋\",\n        \"shokumu taiman\": \"職務タイマン\",\n        \"shokushu mind\": \"触手mind\",\n        \"shokuzai\": \"贖罪\",\n        \"shonen shojo tai\": \"少年少女隊\",\n        \"shonnaka-dou\": \"しょんなか堂\",\n        \"shore\": \"ショアー\",\n        \"shosekido\": \"硝石堂\",\n        \"shoshi magazine hitori\": \"書肆マガジンひとり\",\n        \"shoshinsha crossover\": \"初心者クロスオーバー\",\n        \"shota scratch jikkou iinkai\": \"スクラッチ実行委員会\",\n        \"shotafes junbikai\": \"ショタフェス準備会\",\n        \"shoudansha\": \"笑談者\",\n        \"shouga udon\": \"枯葉\",\n        \"shoujo aigan club\": \"少女愛玩倶楽部\",\n        \"shoujo ex\": \"少女EX\",\n        \"shoujo idenshi\": \"少女遺伝子\",\n        \"shoujo kaihatsu shitsu\": \"少女開発室\",\n        \"shoujo katharsis.\": \"少女カタルシス。\",\n        \"shoujo kousaku\": \"少女交錯\",\n        \"shoujo no dangan\": \"少女の弾丸\",\n        \"shoujo no mori\": \"少女の杜\",\n        \"shoujo no youni\": \"少女のように\",\n        \"shoujo seiyaku\": \"少女製薬\",\n        \"shoujo shumi.\": \"少女趣味。\",\n        \"shoujo zukin\": \"少女頭巾\",\n        \"shounan oshinobi club\": \"湘南おしのびCLUB\",\n        \"shounen byoukan\": \"少年病監\",\n        \"shounen x shoujo\": \"少年×少女\",\n        \"shounen yuuichirou\": \"少年ゆういちろう\",\n        \"shounen-h\": \"少年H\",\n        \"shounendan\": \"少年団\",\n        \"shounin eden\": \"聖人エデン\",\n        \"shouwa kara heisei e\": \"昭和から平成へ\",\n        \"shouwa prism\": \"昭和プリズム\",\n        \"showa saishuu sensen\": \"昭和最終戦線\",\n        \"shouyu gohan\": \"しょうゆごはん\",\n        \"syowajukou\": \"昭和重工\",\n        \"shrine\": \"SHRINE\",\n        \"shudoushiki denki jidousha\": \"手動式電気自動車\",\n        \"shukketsu kansatsu nikki\": \"出血観察日記\",\n        \"shumisen jiru\": \"シュミセンジル\",\n        \"shun shun shouten\": \"しゅん々商店\",\n        \"shungabu\": \"春画部\",\n        \"shuniku 2\": \"しゅにく2\",\n        \"shunran\": \"春蘭\",\n        \"shuraba keikaku\": \"修羅場計画\",\n        \"shuuchuugouu keihou\": \"集中豪雨警報\",\n        \"shuukan freaks\": \"収監フリークス\",\n        \"shuukyuu itsukasei\": \"週休五日制\",\n        \"shuusei patch 3gb\": \"修正パッチ3GB\",\n        \"shyness over drive\": \"SHYNESS OVER DRIVE\",\n        \"shyo chiku bai\": \"笑畜売\",\n        \"side buy side\": \"Side Buy Side\",\n        \"side m\": \"Side:M\",\n        \"side-a\": \"SIDE-A\",\n        \"sideoff\": \"サイドオフ\",\n        \"sigamitsuki mizuhiki\": \"しがみつきみずひき\",\n        \"sigma-plan\": \"∑-PLAN\",\n        \"sigmanica\": \"SIGMANICA\",\n        \"signal go\": \"SIGNaL_GO\",\n        \"signal group\": \"シグナルグループ\",\n        \"signalred\": \"SignalRed\",\n        \"signal yellow\": \"しぐなるいえろー\",\n        \"signares jigen\": \"シグナレス次元\",\n        \"signstandard\": \"サインスタンダード\",\n        \"sikosiko network\": \"SIKOSIKO NETWORK\",\n        \"sikouya\": \"試行屋\",\n        \"silent hill\": \"SILENT HILL\",\n        \"silent4\": \"サイレント4\",\n        \"silicon jichou\": \"シリコン自重\",\n        \"silky to yukai na nakama-tachi\": \"しるきーと愉快な仲間たち\",\n        \"silmaril\": \"しるまりる\",\n        \"silver bloom\": \"SILVER BLOOM\",\n        \"silver bullet\": \"Silver Bullet\",\n        \"silver way\": \"銀色宇宙(仮)\",\n        \"silverfox\": \"銀狐\",\n        \"silverrice\": \"シルバーライス\",\n        \"silverstone\": \"SilverStone\",\n        \"simasima system\": \"しましましすてむ\",\n        \"simfrill\": \"シンプリル\",\n        \"simokentarous\": \"しもケンタロス\",\n        \"simotsukekai\": \"下野会\",\n        \"simple house\": \"SIMPLE HOUSE\",\n        \"sin-maniax\": \"sin-maniax\",\n        \"singleton\": \"Singleton\",\n        \"sinistra\": \"シニストラ\",\n        \"sinizon\": \"SINIZON\",\n        \"sinkirou\": \"心輝楼\",\n        \"sinonome\": \"シノノメ\",\n        \"sinoriya\": \"しのり屋\",\n        \"sinosino\": \"しのしの\",\n        \"sion\": \"SION\",\n        \"siooninco\": \"塩おにんこ\",\n        \"siop\": \"単一統合作戦計画\",\n        \"sippo-soft\": \"SIPPO-SOFT\",\n        \"siratama nikukyuu\": \"しらたま肉球\",\n        \"siratamadon\": \"白玉井\",\n        \"sirius.\": \"SIRIUS.\",\n        \"sirojio\": \"白塩\",\n        \"siropome\": \"しろぽめ\",\n        \"sirotaruto\": \"しろたると\",\n        \"sirotateto\": \"しろたてと\",\n        \"sirousagicafe\": \"しろうさぎカフェ\",\n        \"sister screaming i die\": \"SISTER SCREAMING I DIE\",\n        \"sister soft\": \"しすたーそふと\",\n        \"sisui sisters\": \"しすいシスターズ\",\n        \"sittori oblaat\": \"しっとりオブラート\",\n        \"situation laboratory\": \"シチュラボ\",\n        \"sk01\": \"SK01\",\n        \"skeleton scape\": \"skeleton scape\",\n        \"sketch-book\": \"落描帳\",\n        \"skew\": \"SKEW\",\n        \"skirt tsuki\": \"スカートつき\",\n        \"sklabel\": \"SKlabel\",\n        \"skug\": \"SKUG\",\n        \"skunks\": \"スカンクス\",\n        \"sky daruton gyokuza\": \"天空怠豚玉座\",\n        \"sky lounge garden\": \"Sky Lounge Garden\",\n        \"sky walk\": \"Sky Walk\",\n        \"skycolours\": \"SkycolourS\",\n        \"skyworks\": \"SKYワークス\",\n        \"sl\": \"SL\",\n        \"slaman bokujou\": \"すらまん牧場\",\n        \"slamp\": \"すらんぷ\",\n        \"slap-stick\": \"スラップスティック\",\n        \"slapstickstrike\": \"SlapStickStrike\",\n        \"slavedoll\": \"SlaveDoll\",\n        \"slavenir\": \"スレイブニール\",\n        \"sledgehammerout\": \"SledgehammerOut!\",\n        \"sleeper\": \"Sleeper\",\n        \"sleeping helianthus\": \"Sleeping Helianthus\",\n        \"sleepwatch.ex\": \"寝ヲチEX\",\n        \"slice wakame\": \"スライスわかめ\",\n        \"slime eer\": \"スライムイール\",\n        \"slime mint\": \"すらいむみんと\",\n        \"slime teishoku\": \"スライム定食\",\n        \"slimy alpha\": \"スライミーアルファ\",\n        \"slip bounds\": \"Slip Bounds\",\n        \"sludge\": \"sludge\",\n        \"slump life\": \"すらんぷらいふ\",\n        \"slw\": \"SLW\",\n        \"small dog\": \"Small Dog\",\n        \"small gift\": \"Small Gift\",\n        \"smat.\": \"smat.\",\n        \"smocle\": \"smocle\",\n        \"smokin sick style\": \"Smokin' Sick Style\",\n        \"smooth\": \"smooth\",\n        \"sms\": \"SMS\",\n        \"smuggler\": \"SMUGGLER\",\n        \"smysle\": \"SMYSLE\",\n        \"snack factory\": \"スナック・ファクトリー\",\n        \"snack yoshie\": \"スナックよし江\",\n        \"snake foot\": \"Snake foot\",\n        \"sniff dogs\": \"Sniff Dogs\",\n        \"snob nerd works\": \"SNOB NERD WORKS\",\n        \"snow child\": \"Snow child\",\n        \"snow ice\": \"Snow Ice\",\n        \"snow ring\": \"Snow Ring\",\n        \"snowdance\": \"SNOWDANCE\",\n        \"snowgale\": \"SnowGale\",\n        \"snowrich\": \"すのーりっち\",\n        \"so much in luv\": \"sO mUCH iN LUV\",\n        \"so-matou\": \"そーま党\",\n        \"soar\": \"Soar\",\n        \"soba to mayo\": \"蕎麦とマヨ\",\n        \"soba udon\": \"そばうどん\",\n        \"sobabu\": \"蕎麦部\",\n        \"sobakara\": \"そばから\",\n        \"sobalabo\": \"sobalabo\",\n        \"sobaworks\": \"sobaworks\",\n        \"socarrat\": \"socarrat\",\n        \"soda batake\": \"苏打畑\",\n        \"soda rain\": \"Soda Rain\",\n        \"sodenosumi\": \"袖の墨\",\n        \"sodomutogomora\": \"ソドムトゴモラ\",\n        \"soft circle courreges\": \"ソフトさ～くるクレージュ\",\n        \"soft on omanko\": \"SOFT ON OMANKO\",\n        \"soft thigh\": \"Soft Thigh\",\n        \"soitsu wa yabee\": \"そいつはヤベェ!\",\n        \"soket equals pocket\": \"そけっと=ぽけっと\",\n        \"soko\": \"倉庫\",\n        \"sokotsuya baker\": \"粗忽屋ベイカー\",\n        \"sokuochi neurosis\": \"即堕ちノイローゼ\",\n        \"solala\": \"solala\",\n        \"solar milk soft\": \"そらみるソフト\",\n        \"solarray\": \"ソーラレイ\",\n        \"soleil\": \"Soleil\",\n        \"solex\": \"SOLEX\",\n        \"solid air\": \"SOLID AIR\",\n        \"soloistick\": \"ソリスティック\",\n        \"soloship\": \"ソロシップ\",\n        \"some leaves\": \"SOME LEAVES\",\n        \"somnia\": \"somnia\",\n        \"sondake.\": \"そんだけ。\",\n        \"sonei danchi\": \"村営団地\",\n        \"sonflower\": \"sonflower\",\n        \"sonic\": \"そにっく\",\n        \"sonic star\": \"SONIC STAR\",\n        \"sonic winter\": \"SONIC WINTER\",\n        \"sonnet\": \"Sonnet\",\n        \"sonograph\": \"sonograph\",\n        \"sonohigurashi\": \"その日ぐらし\",\n        \"sonotaozey\": \"その他大勢\",\n        \"sora mint\": \"ソラミント\",\n        \"sora no colors\": \"空のCOLORS\",\n        \"sora no sakura\": \"そらのさくら\",\n        \"sora osen nantai neko\": \"空汚染軟体猫\",\n        \"sora wa chimidoro\": \"空は血みどろ\",\n        \"sorabatake\": \"そらばたけ\",\n        \"soragokoro\": \"そらごころ\",\n        \"soragoto\": \"空言\",\n        \"sorahima\": \"そらひま\",\n        \"sorairo march\": \"空色まーち\",\n        \"sorairo panda\": \"空色パンダ\",\n        \"sorairo telephone\": \"ソライロテレフォン\",\n        \"soramimi\": \"そらみみ\",\n        \"soramune\": \"そらむね\",\n        \"sorasore\": \"そらそれ\",\n        \"soratobu mighty python\": \"空飛ぶマイティ・パイソン\",\n        \"soratobu umeboshi\": \"空飛ぶうめぼし\",\n        \"sorekara\": \"それから\",\n        \"soreya\": \"其レ屋\",\n        \"soronosanchi\": \"そろのさん家\",\n        \"sorudeia\": \"そるでいあ\",\n        \"soseidoh\": \"想成堂\",\n        \"sosl\": \"SOSL\",\n        \"sou soul\": \"Sou Soul\",\n        \"souchou bazooka\": \"早朝バズーカ\",\n        \"souchou no koubou\": \"曹長の工房\",\n        \"sougetsutei\": \"双月亭\",\n        \"souju\": \"蒼樹\",\n        \"souka sentou\": \"双花仙桃\",\n        \"soukai fusso\": \"蒼海☆フッ素\",\n        \"soukentyaya\": \"想見茶屋\",\n        \"souko\": \"倉庫\",\n        \"soukuu\": \"蒼空\",\n        \"soukyuutendou\": \"蒼穹天堂\",\n        \"soul magic\": \"そうるまぢっく\",\n        \"soulfly\": \"SOULFLY\",\n        \"soulsonic\": \"soulsonic\",\n        \"souma books\": \"SOUMA BOOKS\",\n        \"sound milk\": \"SOUND MILK\",\n        \"sounds good\": \"Sounds Good\",\n        \"soundvillage\": \"SoundVillage\",\n        \"sousaku sekkei benran\": \"創作設計便覧\",\n        \"souseiji\": \"創精児\",\n        \"southern blue sky\": \"サザンブルースカイ\",\n        \"souzai soft\": \"そうざいそふと\",\n        \"soy-darake\": \"SOYだらけ\",\n        \"soyoking\": \"ソヨキング\",\n        \"space baron\": \"宇宙男爵\",\n        \"space cat\": \"スペースキャット\",\n        \"space whale\": \"スペースくじら\",\n        \"special action force\": \"SPECIAL ACTION FORCE\",\n        \"speed\": \"SPEED\",\n        \"speed of sound\": \"Speed of Sound\",\n        \"spelflare\": \"すぺるふれあ\",\n        \"spellcaster.\": \"spellcaster.\",\n        \"spermagic\": \"スペルマジック\",\n        \"spermaniax\": \"スペルマニアックス\",\n        \"spermation\": \"スペルメーション\",\n        \"sphere garden\": \"SPHERE GARDEN\",\n        \"spica\": \"♡Spica\",\n        \"spicia\": \"すぱぃしあ\",\n        \"spiciacrow\": \"SpiciaCrow\",\n        \"spicy daisakusen\": \"スパイシー大作戦\",\n        \"spicy loves heaven\": \"スパイシーラブスヘブン\",\n        \"spiel\": \"spiel\",\n        \"spika07\": \"spika07\",\n        \"spinergy\": \"SPINERGY\",\n        \"spira mirabilis\": \"スピラ・ミラビリス\",\n        \"spiral\": \"すぱいらる\",\n        \"spirit-edge\": \"Spirit-Edge\",\n        \"splush wave\": \"SPLUSH WAVE\",\n        \"spongehead\": \"スポンジヘッド\",\n        \"spookyhouse\": \"spookyhouse\",\n        \"spread happiness\": \"Spread Happiness\",\n        \"sprechchor\": \"シュプレヒコール\",\n        \"spring castle\": \"spring castle\",\n        \"springlove\": \"SpringLOVE\",\n        \"sprinkler of calpis\": \"Sprinkler of かるぴす\",\n        \"sprout\": \"SPROUT\",\n        \"spt\": \"SPT\",\n        \"spunk\": \"Spunk!\",\n        \"sputnik\": \"すぷーとにく\",\n        \"spy\": \"SPY\",\n        \"squall\": \"Squall\",\n        \"sr inma no mori\": \"SR 淫魔ノ森\",\n        \"srats\": \"SRATS\",\n        \"ssb\": \"SSB\",\n        \"ssc\": \"SSC\",\n        \"ssdl\": \"SSDL\",\n        \"ssize\": \"Ssize\",\n        \"sst\": \"SST\",\n        \"st 3point\": \"St 3point\",\n        \"st. different\": \"St. Different\",\n        \"st. ochappa\": \"St.おちゃっぱ\",\n        \"st. rio\": \"聖＝リオ\",\n        \"staffing\": \"スタッフィング\",\n        \"stain.\": \"Stain.\",\n        \"stakhanovite movement\": \"スタハノフ運動\",\n        \"stametch\": \"STAMETCH!\",\n        \"stand erection\": \"スタンドエレクション\",\n        \"stand play\": \"STAND PLAY\",\n        \"star berry\": \"STAR BERRY\",\n        \"star fall\": \"STAR FALL\",\n        \"star parlor\": \"STAR PARLOR\",\n        \"stargazer\": \"STARGAZER\",\n        \"starlit sky\": \"Starlit Sky\",\n        \"starmine18\": \"Starmine18\",\n        \"starry sky\": \"Starry Sky\",\n        \"starworks\": \"STARWORKS\",\n        \"stasis\": \"ステイシス\",\n        \"state of see\": \"ステートオブシー\",\n        \"statice\": \"スターチス\",\n        \"status doku\": \"ステータスどく\",\n        \"stay gold\": \"STAY GOLD\",\n        \"steam bread factory\": \"すちーむぶれっどふぁくとりー\",\n        \"steel mayonnaise\": \"Steel Mayonnaise\",\n        \"steelact\": \"STEELACT\",\n        \"stellar\": \"STELLAR\",\n        \"stencil step\": \"ステンシルステップ\",\n        \"steppen wolf\": \"STEPPEN WOLF\",\n        \"stew ni gohan\": \"シチューにごはん\",\n        \"stick number\": \"ステック なんばー\",\n        \"still\": \"Still\",\n        \"stk\": \"STK\",\n        \"stm\": \"STM\",\n        \"stoic romance\": \"Stoic Romance\",\n        \"stone heads\": \"STONE HEADS\",\n        \"stonecake\": \"stonecake\",\n        \"stonemason\": \"stonemason\",\n        \"stop-ten\": \"STOP店\",\n        \"storm\": \"STORM\",\n        \"storm hammer\": \"STORM HAMMER\",\n        \"straight\": \"Straight\",\n        \"strand kyokusen gai\": \"ストランド曲線街\",\n        \"strange beast\": \"ストレンジビースト\",\n        \"strange coquetry\": \"ストレンジコケットリー\",\n        \"strange pop\": \"STRANGE POP\",\n        \"strangesagittarius\": \"StrangeSagittarius\",\n        \"stratos\": \"STRATOS\",\n        \"stratosphere\": \"ストラトスフィア\",\n        \"strawberry\": \"すとろべりー\",\n        \"strawberry and tea\": \"いちごと紅茶\",\n        \"strawberry nipple\": \"ストロベリーにっぷる\",\n        \"strawberry shower\": \"すとろべりーシャワー\",\n        \"straymoon\": \"StrayMoon\",\n        \"stream of creek\": \"STREAM OF CREEK\",\n        \"strega\": \"STREGA\",\n        \"stripe orange\": \"stripe orange\",\n        \"stripeg\": \"stripeg\",\n        \"stroll in the woods\": \"STROLL IN THE WOODS !! -森林浴-\",\n        \"strong7\": \"STRONG7\",\n        \"sts\": \"宇宙旅行協会\",\n        \"studio 7\": \"Studio 7\",\n        \"studio americ\": \"スタジオアメリック\",\n        \"studio anshin\": \"STUDIOあんしん\",\n        \"studio anteros\": \"スタジオ・アンテロス\",\n        \"studio aqa\": \"Studio AQA\",\n        \"studio awake\": \"スタジオ★アオーク\",\n        \"studio b9\": \"Studio B9\",\n        \"studio baki\": \"STUDIO BAKI\",\n        \"studio bass line\": \"STUDIO BASS LINE\",\n        \"studio berserk\": \"Studioベルセック\",\n        \"studio boto-master\": \"すたじおぼとますたあ\",\n        \"studio cardamom\": \"STUDIO カルダモン\",\n        \"studio charen\": \"すたじおちゃれん\",\n        \"studio claim\": \"STUDIO CLAIM\",\n        \"studio cute\": \"Studio Cute\",\n        \"studio d-suke\": \"STUDIO D-Suke\",\n        \"studio daiya\": \"スタジオ・ダイヤ\",\n        \"studio daiya alt\": \"スタジオ・ダイヤ・オルタ\",\n        \"studio dellforce\": \"STUDIOデルフォース\",\n        \"studio dia\": \"スタジオ・ダイア\",\n        \"studio diamond\": \"スタジオ・ダイヤ\",\n        \"studio dimple\": \"スタジオDimple\",\n        \"studio erohouse\": \"スタジオエロハウス\",\n        \"studio f\": \"スタジオ・エフ\",\n        \"studio fatality\": \"STUDiO FATALITY\",\n        \"studio fng\": \"studio FNG\",\n        \"studio fuck\": \"STUDIO FUCK\",\n        \"studio gaudi\": \"Studio Gaudi\",\n        \"studio gomasenbe\": \"STUDIO GOMASENBE\",\n        \"studio gorenuke\": \"スタジオGORENUKE\",\n        \"studio hamachigumi\": \"STUDIOはまち組\",\n        \"studio hamburg\": \"すたじおはんばーぐ\",\n        \"studio hofu-na kaihou sen2\": \"STUDIOホフーナ解放戦線\",\n        \"studio hoshiwatari\": \"Studio 星渡\",\n        \"studio hp plus\": \"STUDIO HP+\",\n        \"studio implant\": \"Studio Implant\",\n        \"studio insane\": \"Studio Insane\",\n        \"studio ipponzeoi\": \"スタジオ一本背負い\",\n        \"studio jam\": \"STUDIO JAM\",\n        \"studio jaren\": \"STUDIO 邪恋\",\n        \"studio jibeta\": \"studio jibeta\",\n        \"studio jikkenshitsu\": \"すたじお実験室\",\n        \"studio k\": \"すたぢおK\",\n        \"studio kakinoha-zaka\": \"STUDIO柿ノ葉坂\",\n        \"studio kame\": \"スタジオ カメ\",\n        \"studio katsudon\": \"スタジオかつ丼\",\n        \"studio kimigabuchi\": \"スタジオKIMIGABUCHI\",\n        \"studio kom\": \"スタジオコム\",\n        \"studio kyawn\": \"スタジオきゃうん\",\n        \"studio lood\": \"STUDIO LOOD\",\n        \"studio loud in school\": \"STUDIO LOUD IN SCHOOL\",\n        \"studio m nda pon\": \"スタジオMんだPON\",\n        \"studio mark ii\": \"スタジオMARKII\",\n        \"studio min\": \"STUDIO Min\",\n        \"studio miris\": \"すたじおみりす\",\n        \"studio mukon\": \"スタジオ夢魂\",\n        \"studio n.ball\": \"スタジオN・BALL\",\n        \"studio nadeshiko\": \"スタジオナデシコ\",\n        \"studio narazuke\": \"スタジオ奈良漬\",\n        \"studio naze\": \"スタジオ名瀬\",\n        \"studio neko kick\": \"スタジオねこキック\",\n        \"studio neko punch\": \"スタジオねこぱんち\",\n        \"studio neo black\": \"Studio Neo Black\",\n        \"studio nunchaku\": \"スタジオヌンチャク\",\n        \"studio omg\": \"スタジオOMG\",\n        \"studio orca\": \"studioオルカ\",\n        \"studio p.m.y\": \"Studio P.M.Y\",\n        \"studio pakira\": \"Studio PAKIRA\",\n        \"studio paradise\": \"STUDIO PARADISE\",\n        \"studio parfe\": \"すたじおぱふぇ\",\n        \"studio parm\": \"Studio★ParM\",\n        \"studio pastel\": \"Studio Pastel\",\n        \"studio pelqurappe\": \"STUDIOぺるくらっぺ\",\n        \"studio pork\": \"スタジオポーク\",\n        \"studio q\": \"すたぢおQ\",\n        \"studio r\": \"すたじおあ～る\",\n        \"studio rakkyou\": \"スタジオらっきょう\",\n        \"studio retake\": \"スタジオリテイク\",\n        \"studio runaway wolf\": \"STUDIO RUNAWAY WOLF\",\n        \"studio ryokucha\": \"すたじお緑茶\",\n        \"studio-sakura\": \"Studio-Sakura\",\n        \"studio sample\": \"Studio SAMPLE\",\n        \"studio sepia\": \"スタジオセピア\",\n        \"studio sfc\": \"スタジオSFC\",\n        \"studio sharaku\": \"STUDIO写裸苦\",\n        \"studio skb\": \"スタジオSKB\",\n        \"studio southpaw\": \"スタジオサウスポー\",\n        \"studio strike\": \"スタジオストライク\",\n        \"studio sunadokei\": \"studio砂時計\",\n        \"studio sushi kui-ne\": \"すたじお寿司くいねぇ\",\n        \"studio tagata\": \"studio TAGATA\",\n        \"studio tamo\": \"スタジオTAMO\",\n        \"studio tapa tapa\": \"すたじお☆たぱたぱ\",\n        \"studio tar\": \"スタジオた～\",\n        \"studio the devil\": \"Studio The DEVIL\",\n        \"studio tiamat\": \"STUDIO TIAMAT\",\n        \"studio triumph\": \"STUDIO TRIUMPH\",\n        \"studio ubai\": \"スタジオ奪\",\n        \"studio walk\": \"studio WALK\",\n        \"studio woruto\": \"すたぢおヲルト\",\n        \"studio z-agnam\": \"スタジオZ-AGNAM\",\n        \"studio z.m\": \"STUDIO Z.M\",\n        \"studio zonzai\": \"STUDIOぞんざい\",\n        \"studio-74\": \"Studio-74\",\n        \"studio.h.a.o\": \"Studio.好\",\n        \"studio187\": \"studio187\",\n        \"studio309\": \"Studio309\",\n        \"studio30neko\": \"Studio30NEKO\",\n        \"studios\": \"StudioS\",\n        \"stuntmans\": \"スタントマンズ\",\n        \"style-c3\": \"スタイルシースリー\",\n        \"stylish marunage\": \"スタイリッシュ丸投げ\",\n        \"styworks\": \"STYworks\",\n        \"subachikyu\": \"すばちきゅ!\",\n        \"subapai-jigyobu\": \"すばパイ事業部\",\n        \"subaruen himawarigumi\": \"すばる園ひまわり組\",\n        \"subcontract studio\": \"SUBCONTRACT STUDIO\",\n        \"subesube tsukiyo\": \"すべすべ月夜\",\n        \"subesube1kg\": \"すべすべ1kg\",\n        \"subliminal daikaiten\": \"サブリミナル大回転\",\n        \"subsonic factor\": \"Subsonic Factor\",\n        \"succubus\": \"Succubus\",\n        \"sucharaka knight\": \"すちゃらか騎士!\",\n        \"suck drop bambies\": \"Suck Drop Bambies\",\n        \"sudachic\": \"すだちっく\",\n        \"sudou factory\": \"すどーファクトリー\",\n        \"suedama\": \"スヱダマ\",\n        \"suezen\": \"据えZEN\",\n        \"sugahouse\": \"スガハウス\",\n        \"sugar house\": \"シュガーハウス\",\n        \"sugar maple\": \"SUGAR MAPLE\",\n        \"sugar star\": \"Sugar Star\",\n        \"sugareya shouten\": \"すがれや商店\",\n        \"sugarspot\": \"SUGAR(S)POT\",\n        \"sugiya\": \"杉屋\",\n        \"sugofire\": \"SUGOFIRE\",\n        \"sugoi ikioi de\": \"すごい勢いで\",\n        \"sugusoko\": \"すぐそこ\",\n        \"suhamaya\": \"洲浜屋\",\n        \"sui sui works\": \"スイスイワークス\",\n        \"suichuu white\": \"水中ホワイト\",\n        \"suika dokei\": \"すいか時計\",\n        \"suikanotane\": \"すいかのたね\",\n        \"suinose\": \"すいのせ\",\n        \"suiren\": \"翠憐\",\n        \"suishoku sendan\": \"翠色戦団\",\n        \"suiteibuin\": \"推定部員\",\n        \"suitekiya\": \"水滴屋\",\n        \"suizokukan\": \"睡族館\",\n        \"sukapon-do\": \"スカポン堂\",\n        \"sukaradog\": \"SUKARADOG\",\n        \"sukebe time\": \"SUKEBE TIME\",\n        \"sukerasparo\": \"SukeraSparo\",\n        \"suketamaya\": \"スケタ魔屋\",\n        \"sukidarake\": \"すきだらけ\",\n        \"sukiiro sekai\": \"スキイロセカイ\",\n        \"sukima sangyou\": \"スキマ産業\",\n        \"sukimakaze honpo\": \"スキマ風本舗\",\n        \"sukinishitai\": \"すきにし隊\",\n        \"sukoburumers\": \"すこぶるまぁズ\",\n        \"sukoyaka collagen\": \"すこやかコラーゲン\",\n        \"sukuri umu\": \"すくりうむ\",\n        \"sumeragi designs\": \"皇DESIGNS\",\n        \"sumicco.\": \"すみっこ。\",\n        \"sumikko\": \"すみっこ\",\n        \"sumire club\": \"スミレ倶楽部\",\n        \"sumisumi dou\": \"スミスミ堂\",\n        \"summer child\": \"SUMMER CHILD\",\n        \"sumomo dou\": \"すもも堂\",\n        \"sunadokei to enpitsu\": \"砂時計と鉛筆\",\n        \"sunagimo.\": \"すなぎも。\",\n        \"sunday shower\": \"SUNDAY SHOWER\",\n        \"sunezumi fauvism\": \"素鼠フォーヴィスム\",\n        \"sunomono purin\": \"すのもの☆ぷりん\",\n        \"sunroad travellers\": \"Sunroad Travellers\",\n        \"sunset dreamer\": \"サンセットドリーマー\",\n        \"sunsetmoon\": \"SunsetMoon\",\n        \"sunsun lab\": \"サンサンLAB\",\n        \"sunyiru\": \"すにぃる\",\n        \"super colorful\": \"スーパーカラフル\",\n        \"super ichigo-chan\": \"スーパーイチゴチャン\",\n        \"super sentou\": \"スーパー銭湯\",\n        \"super usagi comic\": \"スーパーウサギコミック\",\n        \"superbad\": \"スーパーバッド\",\n        \"supplement\": \"サプリメント\",\n        \"supplemental\": \"サプリメンタル\",\n        \"supposo\": \"スッポソ\",\n        \"supurabi\": \"すぷらび\",\n        \"suraimu no youna nanika\": \"すらいむのような何か\",\n        \"surface\": \"Surface\",\n        \"surface tension\": \"Surface Tension\",\n        \"suriko gi\": \"すりこギ部\",\n        \"surumenium\": \"スルメニウム\",\n        \"survive\": \"survive\",\n        \"sus\": \"SUS\",\n        \"susano arashi\": \"スサノアラシ\",\n        \"sushi-go-round\": \"回転寿司\",\n        \"sushi-ya\": \"寿司屋\",\n        \"sushiya.\": \"スシヤ。\",\n        \"sutaco rider\": \"スタコライダー\",\n        \"suteiburus\": \"すていぶるず\",\n        \"suvwave\": \"SUVWAVE\",\n        \"suwatteru\": \"座ってる\",\n        \"suzome\": \"酢ぞめ\",\n        \"suzuki shouten\": \"鈴木商店\",\n        \"suzukure\": \"涼暮\",\n        \"suzume no miya\": \"雀の宮\",\n        \"suzumeno\": \"すずめの\",\n        \"suzumeya\": \"すずめや\",\n        \"suzunaridou\": \"鈴鳴堂\",\n        \"suzune rai chikashitsu\": \"鈴根らい地下室\",\n        \"suzuneiro\": \"すずねいろ\",\n        \"suzuneya ni youkoso\": \"スズネ屋にようこそ\",\n        \"suzupony\": \"すずぽに\",\n        \"suzuran\": \"鈴蘭\",\n        \"suzushirodou\": \"蘿蔔堂\",\n        \"swan\": \"スワン\",\n        \"swan mania\": \"スワンマニア\",\n        \"swastika\": \"SWASTIKA\",\n        \"sweet candle\": \"Sweet Candle\",\n        \"sweet devil\": \"すいーとでびる\",\n        \"sweet girls\": \"Sweet Girls\",\n        \"sweet jasmine\": \"sweet☆jasmine\",\n        \"sweet pea\": \"スイートピー\",\n        \"sweet princess\": \"Sweet Princess\",\n        \"sweet raspberry\": \"スウィートラズベリー\",\n        \"sweet taste\": \"SWEET TASTE\",\n        \"sweetedda\": \"SweetEdda\",\n        \"sweets spaghetti\": \"スイーツスパゲティ\",\n        \"sweetsprite\": \"SweetSprite\",\n        \"swims\": \"SwimS\",\n        \"sxs\": \"SXS\",\n        \"syamisen koubou\": \"三味線工房\",\n        \"sylphian ruby\": \"Sylphian Ruby\",\n        \"sylvia\": \"SYLVIA\",\n        \"symphony\": \"シンフォニー\",\n        \"synchrose\": \"シンクローズ\",\n        \"synthetic garden\": \"Synthetic Garden\",\n        \"syoku\": \"SYOKU\",\n        \"syosyo yakkyoku\": \"処々薬局\",\n        \"syoujyo complete\": \"少女コンプリート\",\n        \"syounen heroine\": \"少年Heroine\",\n        \"syouryu yasui-kai\": \"昇竜安井会\",\n        \"sys3.6.3.\": \"sys3.6.3.\",\n        \"system gzzy\": \"SYSTEM GZZY\",\n        \"syukurin\": \"シュクリーン\",\n        \"syunkasyuutou iinkai\": \"春夏秋冬委員会\",\n        \"syuntyu\": \"春昼\",\n        \"t-court\": \"T-court\",\n        \"t-north\": \"T-NORTH\",\n        \"t-press\": \"T-Press\",\n        \"t-project\": \"T-Project\",\n        \"t-zone\": \"T-ZONE\",\n        \"t.a.k.k.\": \"T.A.K.K.\",\n        \"t.cop\": \"T.cop\",\n        \"t.k.h.k\": \"T・K・H・K\",\n        \"t2 unit\": \"T2 UNIT\",\n        \"t2000\": \"T2000\",\n        \"tabidori\": \"旅鳥\",\n        \"tabisuke to panda\": \"旅輔とパンダ\",\n        \"tabito\": \"旅人\",\n        \"tabitoya\": \"旅人屋\",\n        \"tablet\": \"TABLET\",\n        \"tachikawa juukougyou\": \"タチカワ重工業\",\n        \"tachimukau\": \"タチムカウ\",\n        \"tachineko miya\": \"タチネコ宮\",\n        \"tachinomi-ya\": \"立呑屋\",\n        \"tackle box\": \"たっくるぼっくす\",\n        \"tactical notes\": \"タクティカルノーツ\",\n        \"tadaichidono\": \"ただ一度の\",\n        \"tagamesou\": \"タガメ槽\",\n        \"tai kamaboko\": \"鯛かまぼこ\",\n        \"tai no okashira\": \"鯛のおかしら\",\n        \"taifuu biyori\": \"台風日和\",\n        \"taikan kyohougumi\": \"大鑑巨砲組\",\n        \"taiki ken club\": \"たいけん部!\",\n        \"taiko no tsuki\": \"太古の月\",\n        \"taiku yamori\": \"対空ヤモリ\",\n        \"taikuu works\": \"滞空ワークス\",\n        \"tail\": \"tail\",\n        \"tail of nearly\": \"てーるおぶにやりー\",\n        \"tail spot\": \"ているすぽっと\",\n        \"tailbell\": \"TailBell\",\n        \"tainaikaiki\": \"tainaikaiki\",\n        \"tainone takikomi gohan\": \"たいのね炊き込みご飯\",\n        \"taira mune suki iinkai\": \"平胸好き委員会\",\n        \"tairagi\": \"TAIRAGI\",\n        \"tairyo-tei\": \"大呂亭\",\n        \"taisenshadou kenkyuukai\": \"対戦車道研究会\",\n        \"taishokukannoirowze\": \"大食漢のいろうぜ\",\n        \"taiwan shuppan\": \"タイワン出版\",\n        \"taiyaki\": \"たいやき\",\n        \"taiyaki yaketa\": \"たいやきやけた\",\n        \"taiyako takoyaki\": \"たいやこタコヤキ\",\n        \"taiyosin\": \"太陽神\",\n        \"taiyou no megumi\": \"太陽の恵み\",\n        \"taiyoukei kaihatsu kikou\": \"太陽系開発機構\",\n        \"tak in wonderland\": \"Tak In Wonderland\",\n        \"taka no dan\": \"鷹ノ団\",\n        \"takadoya-tei\": \"たかどや亭\",\n        \"takahamaya\": \"高浜屋\",\n        \"takahashi record-ten\": \"高橋レコード店\",\n        \"takaiwerks\": \"TAKAIWERKS\",\n        \"takamagaharahouraku\": \"高天ヶ原崩落\",\n        \"takane no hanazono\": \"たかねの花園\",\n        \"takaneko\": \"たかねこ\",\n        \"takanicle\": \"てかにくる\",\n        \"takashita-ya\": \"たかした屋\",\n        \"takatans waffen-ss\": \"Takatan's Waffen-SS\",\n        \"takatobiya\": \"タカトビヤ\",\n        \"takaya\": \"たか屋\",\n        \"takayashiki kaihatsu\": \"高屋敷開発\",\n        \"take-chan island\": \"タケチャンアイランド\",\n        \"take-dake\": \"TAKE-DAKE\",\n        \"take3\": \"TAKE3\",\n        \"takeda syouten\": \"武田商店\",\n        \"takedake\": \"武田家\",\n        \"takemaruya\": \"竹○屋\",\n        \"takeout\": \"Takeout!\",\n        \"takeritake daishuukakusai\": \"猛茸大収穫祭\",\n        \"takesatorispa\": \"たけさとりすぱ\",\n        \"taketombo\": \"竹とんぼ\",\n        \"takeuma no tomo\": \"竹馬の友\",\n        \"takeya\": \"たけ家\",\n        \"takeyabu\": \"タケヤブ\",\n        \"takeyamaya\": \"茸山屋\",\n        \"takimoto doujou\": \"滝本道場\",\n        \"takion melo\": \"瀧音MELO\",\n        \"takitate\": \"炊きたて\",\n        \"takkyudou\": \"達急堂\",\n        \"takotsubo club\": \"たこつぼ倶楽部\",\n        \"takotsuboya\": \"蛸壷屋\",\n        \"takoya honpo\": \"多胡屋本舗\",\n        \"takoyaki-batake\": \"たこ焼き畑\",\n        \"taku-tama\": \"たくたま\",\n        \"takuan\": \"たくあん\",\n        \"takumi na muchi\": \"たくみなむち\",\n        \"takumiya\": \"匠屋\",\n        \"tama center\": \"たまセンター\",\n        \"tamafull\": \"tamaFull\",\n        \"tamafuwa\": \"たまふわ\",\n        \"tamagawa enema\": \"多摩川エネマ\",\n        \"tamagobou\": \"玉子房\",\n        \"tamagomura\": \"タマゴ村\",\n        \"tamakakeya\": \"たまかけ屋\",\n        \"tamakiya\": \"環屋\",\n        \"tamakuraya\": \"玖蔵屋\",\n        \"tamamo soft\": \"玉藻ソフト\",\n        \"tamaran koujou\": \"たまらん工場\",\n        \"tamarun\": \"タマラン\",\n        \"tamashii max\": \"魂MAX\",\n        \"tamashu\": \"珠秋\",\n        \"tamatebako\": \"珠手箱\",\n        \"tameshigaki\": \"ためしがき\",\n        \"tamokuteki hall\": \"たもくてきほーる\",\n        \"tamokuteki kuukan\": \"多目的空間\",\n        \"tanaka shouten\": \"田中商店\",\n        \"tanakana\": \"たなかな\",\n        \"tanaura honpo\": \"棚裏本舗\",\n        \"tanbo\": \"田圃\",\n        \"tanden shuzou\": \"丹田酒蔵\",\n        \"tanetsuke ichinengo\": \"種付け一年後\",\n        \"tange kentou club\": \"丹下拳闘倶楽部\",\n        \"tangerine\": \"Tangerine\",\n        \"tangerine ward\": \"Tangerine Ward\",\n        \"tanmatsu ijou\": \"端末異常\",\n        \"tanoma-project\": \"たのまーproject\",\n        \"tanoshiitake\": \"たのしいたけ\",\n        \"tanpanizm\": \"タンパニズム\",\n        \"tanpatsu kikaku\": \"短髪企画\",\n        \"tanpatsuism\": \"短髪イズム\",\n        \"tanpopo\": \"■■■たんぽぽ■■■\",\n        \"tanpopo suisan\": \"たんぽぽ水産\",\n        \"tansan senbei\": \"タンサンセンベイ\",\n        \"tanuki ichiba\": \"たぬき市場\",\n        \"tanuki no sato\": \"狸の里\",\n        \"tanuki no takarabako\": \"たぬきの宝箱\",\n        \"tanuki riot\": \"たぬき・らいおっと\",\n        \"tanukian\": \"たぬき庵\",\n        \"tanuking sleep\": \"たぬきんぐすりーぷ\",\n        \"taob\": \"TAOB\",\n        \"tapioca box\": \"タピオカボックス\",\n        \"tarako cream\": \"たらこクリーム\",\n        \"tarako koubou\": \"たらこ工房\",\n        \"tarakospa\": \"タラコスパ\",\n        \"taranbo\": \"タランボ\",\n        \"tarapo\": \"TARAPO\",\n        \"tarchi\": \"Tarchi\",\n        \"taromochian\": \"太呂餅庵\",\n        \"tarots\": \"TAROTS\",\n        \"tarugun\": \"たるぐん\",\n        \"tata\": \"TATA\",\n        \"tatazumai\": \"タタズマイ\",\n        \"tate\": \"殺陣\",\n        \"tate-a-tate\": \"tate-A-tate\",\n        \"tateana juukyo\": \"竪穴住居\",\n        \"tategami 5tyoume\": \"たてがみ5丁目\",\n        \"tatesima.\": \"タテシマ。\",\n        \"tateyama engineering\": \"館山エンジニアリング\",\n        \"tatintotarte\": \"たたんとたると\",\n        \"tatsu no otoshigo\": \"たつのおとしご\",\n        \"tatsumaki koutei\": \"たつまき皇帝\",\n        \"tatsunoyorozuya\": \"辰ノ万屋\",\n        \"taurin 1 oku\": \"タウリン1億\",\n        \"tax inn\": \"Tax inn\",\n        \"tayo\": \"たよ\",\n        \"tayutaya\": \"たゆた屋\",\n        \"tbk\": \"TBK\",\n        \"tcl art 178-2\": \"TCL ART 178-2\",\n        \"tcnc\": \"tcnc\",\n        \"tdtk\": \"TDTK\",\n        \"tea bullet\": \"TEA BULLET\",\n        \"teabreak scriptea\": \"混沌レディースタジオ\",\n        \"team almond\": \"Team Almond\",\n        \"team crepe sucre\": \"Team Crepe Sucre\",\n        \"team harenchi\": \"Teamはれんち\",\n        \"team ibm\": \"Team IBM\",\n        \"team inazuma\": \"Team Inazuma\",\n        \"team kihara\": \"チームキハラ\",\n        \"team oto deli\": \"Teamおと♂デリ\",\n        \"team plus-y\": \"チームプラスY\",\n        \"team princess\": \"TEAM PRINCESS\",\n        \"team sazandora\": \"チームサザンドラ\",\n        \"team shuffle\": \"TEAM SHUFFLE\",\n        \"team tanabe\": \"田辺組\",\n        \"team twin devils\": \"Team Twin Devils\",\n        \"team zero\": \"TEAM ZERO\",\n        \"team-weak tail\": \"Team-weak tail\",\n        \"team.mk\": \"Team.MK\",\n        \"teamjoker\": \"TeamJOKER\",\n        \"teamtgs\": \"teamTGs\",\n        \"tecchitecchi\": \"テッチテッチ\",\n        \"technibuster\": \"TECHNIBUSTER\",\n        \"techno break izonshou\": \"テクノブレイク依存症\",\n        \"technobrake\": \"TechnoBrake\",\n        \"technomics.\": \"てくのみくす。\",\n        \"technos a\": \"テクノスA\",\n        \"tecmet\": \"TECMET\",\n        \"tedaingu\": \"てだいんぐ\",\n        \"teddy-plaza\": \"TEDDY-PLAZA\",\n        \"teemonk\": \"てえもんく\",\n        \"tei hanpatsu purin\": \"低反発ぷりん\",\n        \"teihatu syouzyo titai\": \"剃髪少女地帯\",\n        \"teikoku uchugun\": \"帝国宇宙軍\",\n        \"teiltype\": \"TEILTYPE\",\n        \"teionyakedo\": \"低音火傷\",\n        \"teisoku sonic\": \"低速ソニック\",\n        \"teito bouei ryodan\": \"帝都防衛旅団\",\n        \"teketo\": \"TEKETO\",\n        \"tekireiki ni shokuchuudoku\": \"適齢期に食中毒\",\n        \"tekitou\": \"適当\",\n        \"tekkamaki\": \"鉄華巻\",\n        \"tekken dynamite\": \"鉄拳ダイナマイト\",\n        \"tekken neko gourmet\": \"鉄拳ねこグルメ\",\n        \"tekkou girls\": \"鉄甲ガールズ\",\n        \"tekokids\": \"てこきっず\",\n        \"telenet japan\": \"日本テレネット\",\n        \"telluru\": \"telluru\",\n        \"telomerena\": \"てろめあな\",\n        \"temaemiso-koubou\": \"手前みそ工房\",\n        \"temari cat\": \"てまりきゃっと\",\n        \"temparing\": \"テンパりんぐ\",\n        \"tempest\": \"てんぺすと\",\n        \"temple\": \"TEMPLE\",\n        \"ten\": \"TEN\",\n        \"ten no katsuraya\": \"天のカツラ屋\",\n        \"ten plus aku\": \"てん+あく\",\n        \"tenburi\": \"てんぶり\",\n        \"tenchuugumi\": \"天誅組\",\n        \"tenda\": \"TENDA\",\n        \"tendou\": \"てん堂\",\n        \"tendou kikaku\": \"天童企画\",\n        \"tendoushi\": \"天堂紙\",\n        \"tengai aku juumonji\": \"天外悪十文字\",\n        \"tengallonhat\": \"Tengallonhat\",\n        \"tengohambre\": \"tengohambre\",\n        \"tengu kotengu\": \"テングコテング\",\n        \"tengu no tsuzura\": \"天狗のつづら\",\n        \"tengu syoukougun\": \"天狗症候群\",\n        \"tengudou\": \"テング堂\",\n        \"tenguren\": \"天愚連\",\n        \"tengusa\": \"テングサ\",\n        \"tengsten\": \"テングステン\",\n        \"tenhaii\": \"天海一\",\n        \"tenjo kakuhen\": \"天井確変\",\n        \"tenjou renge\": \"天上蓮華\",\n        \"tenju-rengoku\": \"天樹恋獄\",\n        \"tenkafubu rengou\": \"天下布武連合\",\n        \"tenkigumi\": \"てんきぐみ\",\n        \"tenku-dou\": \"纏苦堂\",\n        \"tenkuu bokujou\": \"天空牧場\",\n        \"tennen doumei\": \"天然同盟\",\n        \"tennen menbou\": \"てんねん綿棒\",\n        \"tennentagayasan\": \"天然たがやさん\",\n        \"tenny le tai\": \"テニーレ隊\",\n        \"tenohira tambourine\": \"てのひらタンバリン\",\n        \"tenotsukyu\": \"天乙宮\",\n        \"tenpura kobo\": \"てんぷら工房\",\n        \"tenrake chaya\": \"てんらけ茶屋\",\n        \"tenshi syndrome\": \"天子震度籠娘\",\n        \"tenshindo\": \"天津堂\",\n        \"tentendou\": \"てんてん堂\",\n        \"tenya wanya\": \"てんやわんや\",\n        \"tenyati\": \"TenYati\",\n        \"tenzan koubou\": \"天山工房\",\n        \"terada naoko\": \"寺田尚子\",\n        \"teraoka digital works\": \"寺岡デジタルワークス\",\n        \"terebi-san\": \"てれびさん\",\n        \"terios\": \"テリオス\",\n        \"teriyaki-sabo\": \"てりやき茶房\",\n        \"terminus aqua\": \"ターミナスアクア\",\n        \"ternotte\": \"ternotte\",\n        \"terolin soft\": \"てろりんソフト\",\n        \"terralunar\": \"テラルナ\",\n        \"terrarium\": \"Terrarium\",\n        \"terrorize\": \"てららいず\",\n        \"teruo haruo\": \"てるおはるお\",\n        \"teruterubocchi\": \"てるてるぼっち\",\n        \"tesla pod\": \"てすらpod\",\n        \"tesuri no post\": \"手すりのポスト\",\n        \"tetchan hato\": \"てっちゃんハト\",\n        \"tete a tete fragile\": \"tete a tete fragile\",\n        \"tete-a-tete\": \"tete-a-tete\",\n        \"tetrapod\": \"Tetrapod\",\n        \"tetrara\": \"TETRARA\",\n        \"tetrascope\": \"TetraScope\",\n        \"tetratech\": \"テトラテック\",\n        \"tetravortex\": \"テトラボルテックス\",\n        \"tetrodotoxin\": \"TETRODOTOXIN\",\n        \"tetsu no otoshigo\": \"てつのおとしご\",\n        \"tetsugakuteki zombie\": \"哲学的ゾンビ\",\n        \"tetsukazuno ao.\": \"手つかずの青。\",\n        \"tetsukuzuya\": \"鉄屑屋\",\n        \"tex-mex\": \"TEX-MEX\",\n        \"tga\": \"TGA\",\n        \"th4\": \"Throttle/4\",\n        \"the flyers\": \"THE FLYERS\",\n        \"the fuckin toyzaras\": \"The Fuckin Toyzaras\",\n        \"the gentry\": \"The Gentry\",\n        \"the giveup pose\": \"もうだめぽ\",\n        \"the horizon\": \"The HORIZON\",\n        \"the hyperman\": \"THE HYPERMAN\",\n        \"the knight of the pants\": \"パンツ騎士団\",\n        \"the latest engine\": \"fujiyama takashi\",\n        \"the mistress of the adriatic\": \"アドリア海の女王\",\n        \"the monthly istanbul\": \"月刊イスタンブール\",\n        \"the rettoukan\": \"THE 劣等感\",\n        \"the saturn\": \"THE SATURN\",\n        \"the seventh sign\": \"The Seventh Sign\",\n        \"theeshakya\": \"ザ借家\",\n        \"the super dimension dirty empire\": \"超時空猥褻帝国\",\n        \"the world\": \"The World\",\n        \"the-franken\": \"THE・FRANKEN\",\n        \"the-paper\": \"THE-PAPER\",\n        \"theory of heaven\": \"Theory of HEAVEN\",\n        \"third brand\": \"THIRD BRAND\",\n        \"third foot\": \"サードフット\",\n        \"thisarmor\": \"ThisArmor\",\n        \"thompon\": \"とむぽん\",\n        \"three m\": \"すりーえむ\",\n        \"threecords\": \"スリーコーズ\",\n        \"threshold\": \"スレッショルド\",\n        \"thrylos\": \"Thrylos\",\n        \"thw.jp\": \"THW.jp\",\n        \"tiare\": \"ティアラ\",\n        \"tick\": \"擽—Tick—\",\n        \"tico tico\": \"TICO TICO\",\n        \"ticotico\": \"TICOTICO\",\n        \"tiger 79\": \"Tiger☆79\",\n        \"tiger roman\": \"タイガーロマン\",\n        \"timatima\": \"ちまちま\",\n        \"time-leap\": \"time-leap\",\n        \"timplu\": \"ティンプラ\",\n        \"tinkerbell\": \"てぃんかーべる\",\n        \"tinkle position\": \"Tinkle Position\",\n        \"tiny potato\": \"Tiny potato\",\n        \"tinyking\": \"TinyKing\",\n        \"tipoplaza\": \"ティポプラーザ\",\n        \"tiramisu\": \"Tiramisu\",\n        \"tiramisu tart\": \"てぃらみすたると\",\n        \"tirolcat\": \"TirolCat\",\n        \"tistrya\": \"ティシュトリ屋\",\n        \"titancolor brand\": \"チタンカラーブランド\",\n        \"titania\": \"てぃたーにあ\",\n        \"titano-makhia\": \"ティタノマキア\",\n        \"tiusan kingdom\": \"ちうさんキングダム\",\n        \"tk jesus\": \"TKジーザス\",\n        \"tk-brand\": \"TK-Brand\",\n        \"tk-bros\": \"TK-BROS\",\n        \"tkciao\": \"tkciao\",\n        \"tkspower\": \"TKSpower\",\n        \"tlg\": \"ねこのこね\",\n        \"tmg\": \"TMG\",\n        \"tmtkdou\": \"TMTK堂\",\n        \"tnc.\": \"TNC.\",\n        \"toaster\": \"トースター\",\n        \"tobatya2ke\": \"とばちゃづけ\",\n        \"tobihizageri\": \"とびひざげり\",\n        \"tobuchikara\": \"飛ぶちから\",\n        \"toculitoc\": \"とくりとっこ\",\n        \"todd special\": \"トッドスペシャル\",\n        \"tofu on fire\": \"Tofu On Fire\",\n        \"tofu soft\": \"TOFU SOFT\",\n        \"togijiru\": \"とぎじる\",\n        \"toha spiral\": \"とーはスパイラル\",\n        \"tohoippun\": \"徒歩一分\",\n        \"tohoorin\": \"TOHOORIN\",\n        \"toiro no iro\": \"といろのいろ\",\n        \"toitoikai\": \"対々会\",\n        \"tojora-men\": \"東条らーめん\",\n        \"tokachi no kuni\": \"とかちのくに\",\n        \"tokaeshina koubou\": \"トカエシナ工房\",\n        \"tokage 3gou\": \"とかげ3号\",\n        \"tokage juukou\": \"蜥蜴重工\",\n        \"tokage mori\": \"トカゲ森\",\n        \"tokage no shippo\": \"トカゲのしっぽ\",\n        \"tokei to kan co-hi-\": \"時計と缶コーヒー\",\n        \"tokemashita.\": \"とけました。\",\n        \"toketou no bansan\": \"とけとうの晩餐\",\n        \"toki nokogiri\": \"トキノコギリ\",\n        \"tokimigumi\": \"時美組\",\n        \"tokinochaya\": \"時乃茶屋\",\n        \"tokinoseisyo\": \"トキノセイショ\",\n        \"tokkuriya\": \"徳利屋\",\n        \"toko-ya\": \"床子屋\",\n        \"tokohana\": \"とこはな\",\n        \"tokonoma\": \"トコノマ\",\n        \"tokoroten\": \"ところてん\",\n        \"tokoroten house\": \"トコロテンハウス\",\n        \"toku yakusou\": \"特薬草\",\n        \"tokuda\": \"とくだ\",\n        \"tokumei tentai\": \"匿名天体\",\n        \"tokusen ohinasama\": \"特選おひなさま\",\n        \"tokyo bungeling bay yokohama\": \"東京バンゲリングベイ横浜\",\n        \"tokyo circuit\": \"Tokyoサーキット\",\n        \"tokyo continent\": \"東京大陸\",\n        \"tokyo gamachannel\": \"東京ガマチャンネル\",\n        \"tokyo glider\": \"東京グライダー\",\n        \"tokyo lemon\": \"東京檸檬\",\n        \"tokyo ponpon dou\": \"東京ポンポン堂\",\n        \"tokyo tomodachi kouen\": \"東京友達公園\",\n        \"tokyo tsunamushi land\": \"東京つなむしランド\",\n        \"tokyo-rozewomond club\": \"東京ロゼヲモンド倶楽部\",\n        \"tokyusen\": \"東九線\",\n        \"tololinco\": \"とろりんこ\",\n        \"toluene ittokan\": \"トルエン一斗缶\",\n        \"tomas\": \"TOMAS\",\n        \"tomato company\": \"TOMATO COMPANY\",\n        \"tomato kanzume\": \"トマト缶詰\",\n        \"tomato namaashi\": \"トマト生足\",\n        \"tomaya no taki\": \"苫屋の滝\",\n        \"tombstone\": \"Tombstone\",\n        \"tomcat\": \"TomCat\",\n        \"tomofuku\": \"とも福\",\n        \"ton toro\": \"とんとろ\",\n        \"tonari no dagashiya-san\": \"となりの駄菓子屋さん\",\n        \"tondemo awabihime\": \"とんでもあわび姫\",\n        \"tondesu\": \"トンデス\",\n        \"tonkotsu fuumi\": \"とんこつふうみ\",\n        \"tonkotsu yama\": \"トンコツ山\",\n        \"tonnerre gakuen\": \"トネール学園\",\n        \"tonoya\": \"との屋\",\n        \"tonpuuratei\": \"とんぷぅら亭\",\n        \"tonteki teishoku\": \"トンテキ定食\",\n        \"tonten\": \"トンテン\",\n        \"tonton byoushi\": \"とんとんびょーし\",\n        \"tontoro daiyokujou\": \"豚トロ大浴場\",\n        \"tooku no sora\": \"とおくのそら\",\n        \"toon worker\": \"トゥーンワーカー\",\n        \"tooya\": \"十矢\",\n        \"top\": \"TOP\",\n        \"topcat\": \"トップキャット\",\n        \"topgun\": \"TOPGUN\",\n        \"tora koubou\": \"寅工房\",\n        \"tora tamatama\": \"とらたまたま\",\n        \"toragoyashiki\": \"虎小屋敷\",\n        \"toraisix\": \"とらいしっくす\",\n        \"torajima-shi kouhouka\": \"寅島市広報課\",\n        \"torano ori\": \"寅乃檻\",\n        \"toranoe no makimono\": \"とらのえのまきもの\",\n        \"torara studio\": \"トララスタジオ\",\n        \"toratanuza\": \"とらたぬ座\",\n        \"toratepotto\": \"とらてぽっと\",\n        \"toraya\": \"トラ屋\",\n        \"tore\": \"蕩れ\",\n        \"torenia\": \"torenia\",\n        \"tori no oishii tokoro\": \"とりのおいしいところ\",\n        \"tori no sanpomichi\": \"トリの散歩道\",\n        \"tori no ya\": \"鳥の屋\",\n        \"toriaezu kari\": \"とりあえず(仮)\",\n        \"toriaezu nama\": \"とりあえず、生!\",\n        \"toriaridou\": \"トリ有リ堂\",\n        \"toribako\": \"toribako\",\n        \"toriihime\": \"鳥居姫\",\n        \"torimeshi\": \"とり飯\",\n        \"torinabe\": \"Tori鍋\",\n        \"toriniku seikatsu\": \"鶏肉生活\",\n        \"toriwasabi\": \"とりわさび\",\n        \"toriya\": \"トリ屋\",\n        \"toro toro resistance\": \"とろとろレジスタンス\",\n        \"torochidan\": \"とろーち団\",\n        \"toromilk\": \"トロみるく\",\n        \"toroniku yukke\": \"とろにくゆっけ\",\n        \"tororoimo\": \"とろろいも\",\n        \"tortesoft\": \"とるてそふと\",\n        \"toruneko chaya\": \"獲る猫茶屋\",\n        \"torya\": \"TORYA!\",\n        \"tosyoen\": \"凍傷炎\",\n        \"totem pole\": \"トーテムポール\",\n        \"totemo zako\": \"とても雑魚\",\n        \"toto max\": \"toto MAX\",\n        \"toto-taste\": \"ととていすと\",\n        \"totocal land\": \"ととかるLAND\",\n        \"totoki kikaku\": \"十時企画\",\n        \"totonishi\": \"ととにし\",\n        \"totoya\": \"トト屋\",\n        \"totsugasa\": \"凸傘\",\n        \"totsugeki tonarino jo-galbi\": \"突撃!となりの上カルビ\",\n        \"totsugeki wolf\": \"突撃ウルフ\",\n        \"tottemodaiji\": \"とってもだいじ\",\n        \"tottorou\": \"totto廊\",\n        \"tottototomekichi\": \"とっとととめきち\",\n        \"touch\": \"TOUCH\",\n        \"touchable\": \"TOUCHABLE\",\n        \"touchin hanten\": \"東珍飯店\",\n        \"toudori no su\": \"トウドリの巣\",\n        \"touenketsu\": \"桃园结\",\n        \"toufuya\": \"燈風屋\",\n        \"tougall kai\": \"東ガル会\",\n        \"touge mine\": \"峠峰\",\n        \"tougechaya\": \"峠茶屋\",\n        \"tougenkyo\": \"桃源郷\",\n        \"tougesakuraya\": \"峠桜屋\",\n        \"touhi kuukan\": \"逃避空間\",\n        \"touhou marupondou\": \"当方丸宝堂\",\n        \"touka biyori\": \"桃花日和\",\n        \"toukaidou\": \"東海堂\",\n        \"toumei kousoku\": \"透明光速\",\n        \"toumei tsuushin\": \"透明通信\",\n        \"tousoku chokusen undou\": \"等速直線運動\",\n        \"toutaku tuyagadou\": \"董卓艶画堂\",\n        \"touyoko surfrider\": \"東横サーフライダー\",\n        \"touyou zatsugidan\": \"東洋雑技団\",\n        \"toxic\": \"toxic\",\n        \"toxic love\": \"ときしっくらぶ\",\n        \"toxic store\": \"Toxic Store\",\n        \"toybox\": \"といぼっくす\",\n        \"tozan bu\": \"TOZAN:BU\",\n        \"tp\": \"tp!\",\n        \"tra-tama ry\": \"トラたま(略)\",\n        \"tracklisko\": \"とらっくりすこ\",\n        \"trample rigger\": \"Trample Rigger\",\n        \"tranceg\": \"TRANCEG\",\n        \"tranquility\": \"Tranquility\",\n        \"trans\": \"トランス\",\n        \"trans soft\": \"トランスソフト\",\n        \"trans tribune\": \"トランス・トリビューン\",\n        \"transgenics.\": \"遺伝子組換え\",\n        \"transient melody\": \"Transient Melody\",\n        \"transistor angel\": \"Transistor Angel\",\n        \"transistor baby\": \"トランジスタベイビィ\",\n        \"transonic\": \"TRANSONIC\",\n        \"transpot\": \"TranSpot\",\n        \"trap\": \"TRAP\",\n        \"trauma\": \"虎馬\",\n        \"trauma2g\": \"trauma2g\",\n        \"traumatize\": \"Traumatize\",\n        \"treat me nice\": \"Treat me nice\",\n        \"tree ga muttsu\": \"ツリーがむっつ\",\n        \"treetop helper\": \"TREETOP Helper\",\n        \"tremolo works\": \"トレモロワークス\",\n        \"trend kill\": \"TREND KILL\",\n        \"tri-k soft\": \"tri-k soft\",\n        \"triad\": \"TRAID\",\n        \"triage tag\": \"TRIAGE TAG\",\n        \"trial3\": \"TriaL3\",\n        \"tribo\": \"TRIBO\",\n        \"trick dream\": \"Trick Dream\",\n        \"trick-color\": \"Trick-Color\",\n        \"tricklot\": \"TrickLot\",\n        \"tridisaster\": \"Tridisaster\",\n        \"trifle\": \"とらいふる\",\n        \"triflehouse\": \"とらいフルハウス\",\n        \"triflingbook\": \"TriflingBook\",\n        \"trigger.m\": \"trigger.m\",\n        \"trinitron cg\": \"トリニトロンCG\",\n        \"trinity kyoudan\": \"トリニティ教団\",\n        \"trinitysaber\": \"トリニティセイバー\",\n        \"trip dancer\": \"TRIP DANCER\",\n        \"trip drip\": \"trip drip\",\n        \"triple luck\": \"Triple Luck\",\n        \"triple n\": \"TRIPLE N\",\n        \"triple pinch\": \"とりぷるぴんち!\",\n        \"triplebunny\": \"TripleBunny\",\n        \"troid-oh\": \"トロイ堂\",\n        \"trok\": \"TRoK\",\n        \"trompeloeil\": \"TROMPELOEILL\",\n        \"troopingout\": \"TROOPINGOUT\",\n        \"tropical sudachi\": \"トロピカルすだち\",\n        \"trough-bird\": \"Trough-Bird\",\n        \"trubka\": \"trubka\",\n        \"true ride\": \"True RIDE\",\n        \"true-bell\": \"True-Bell\",\n        \"trueblue\": \"trueblue\",\n        \"trush\": \"トラッシュ\",\n        \"truth child\": \"Truth Child\",\n        \"tryset break\": \"TRYSET Break\",\n        \"ts naienki\": \"TS内燃機\",\n        \"ts revolver\": \"TSリボルバー\",\n        \"ts-complex2nd\": \"ts-complex2nd\",\n        \"tsk\": \"TSK\",\n        \"tsk-bar\": \"TSK-BAR\",\n        \"tsm\": \"TSM\",\n        \"tsu ga mittsu.\": \"「つ」がみっつ。\",\n        \"tsubo\": \"TSUBO\",\n        \"tsubo r\": \"つぼR\",\n        \"tsuboya\": \"つぼや\",\n        \"tsubuan doumei\": \"つぶあん同盟\",\n        \"tsuchinoko bokujou\": \"つちのこ牧場\",\n        \"tsuinte\": \"ついんて!\",\n        \"tsujigiri cross chop\": \"辻斬りクロスチョップ\",\n        \"tsujikaidou\": \"辻街道\",\n        \"tsukareno\": \"つかれの\",\n        \"tsukasa bullet\": \"司弾\",\n        \"tsuki no kurai bubun\": \"霸\",\n        \"tsuki no mizu kikaku\": \"月の水企画\",\n        \"tsuki to koori no\": \"ツキトコオリノ\",\n        \"tsuki wa koyoi mo kurikaesu\": \"つきはこよいもくりかえす\",\n        \"tsukigami zukan\": \"月神図鑑\",\n        \"tsukiguni\": \"月国\",\n        \"tsukikusa koubou\": \"月草工房\",\n        \"tsukimachi soft\": \"つきまちそふと\",\n        \"tsukimigusa\": \"月見草\",\n        \"tsukimitake\": \"つきみたけ\",\n        \"tsukino chikake ikoku\": \"つきのちかけいこく\",\n        \"tsukinoyuki\": \"つきのゆき\",\n        \"tsukisame koubou\": \"月鮫工房\",\n        \"tsukitake\": \"Tsukitake\",\n        \"tsukiyo no yume\": \"ツキヨノユメ\",\n        \"tsukiyogarasu\": \"月夜鴉\",\n        \"tsukkumo mattoron\": \"つっくもまっとろん!\",\n        \"tsukudani no sato\": \"つくだにの里\",\n        \"tsukune-ya\": \"つくね屋\",\n        \"tsukupare\": \"つくぱれ\",\n        \"tsumarimashita\": \"詰まりました\",\n        \"tsumasaki label\": \"ツマサキレーベル\",\n        \"tsumayoji\": \"つまようじ\",\n        \"tsundere oniku\": \"ツンデレお肉\",\n        \"tsuniverse\": \"tsuniverse\",\n        \"tsunken\": \"ツン研\",\n        \"tsupan\": \"ツパン\",\n        \"tsurezurezuki\": \"徒然月\",\n        \"tsurimura\": \"ツリムラ\",\n        \"tsurugashima heights\": \"鶴ヶ島ハイツ\",\n        \"tsurumachi\": \"鶴町\",\n        \"tsurumiku\": \"つるみく\",\n        \"tsurupeta kenkyuusho\": \"つるぺた研究所\",\n        \"tsurutsuru ippai\": \"つるつるいっぱい\",\n        \"tsurutsuru pain\": \"つるつるぱいん\",\n        \"tsutakazura mau mau\": \"ツタカズラまうまう\",\n        \"tsutsumorien\": \"筒森園\",\n        \"tsxy\": \"tsxy\",\n        \"ttsy\": \"TTSY\",\n        \"tubasa\": \"翼\",\n        \"tuck cross\": \"Tuck Cross\",\n        \"tuiteyukenuyo\": \"ついてゆけぬよ\",\n        \"tukamori club\": \"ツカモリ倶楽部\",\n        \"tukibuto\": \"TUKIBUTO\",\n        \"tukimi atelier\": \"ツキミアトリエ\",\n        \"tumble weed\": \"TUMBLE WEED\",\n        \"tuned by aiu\": \"Tuned by AIU\",\n        \"tunnel\": \"とんねる\",\n        \"tunnel love letter\": \"Tunnel Love Letter\",\n        \"turbanist\": \"たーばにすと\",\n        \"turing game\": \"Turing Game\",\n        \"turning point\": \"Turning Point\",\n        \"turtle cookies\": \"Turtle Cookies\",\n        \"twin heart\": \"TWIN HEART\",\n        \"twin magnet\": \"ツインマグネット\",\n        \"twin tail\": \"TWIN TAIL\",\n        \"twinbunny\": \"Twinbunny\",\n        \"twinkle hearts\": \"twinkle hearts\",\n        \"twinkle snows\": \"twinkle snows\",\n        \"twinkle teacher\": \"てぃんくる☆ティーチャー\",\n        \"twinklestar\": \"ティンクルスター\",\n        \"twinscatear\": \"ついんずかてぃあ\",\n        \"twintel\": \"TWINTEL\",\n        \"two tone color\": \"－・～\",\n        \"two-handed axe\": \"Two-handed Axe\",\n        \"twocraft\": \"TwoCraft\",\n        \"tyatsune\": \"茶常\",\n        \"tyongera kenkyuujo\": \"ちょんげら研究所\",\n        \"type-57\": \"TYPE-57\",\n        \"type-g\": \"Type-G\",\n        \"type-spare\": \"TYPE-SPARE\",\n        \"u-me soft\": \"U・Me SOFT\",\n        \"u-ral\": \"うーらる\",\n        \"u-room\": \"U-ROOM\",\n        \"u-type\": \"U-Type\",\n        \"u.m.e.project\": \"U.M.E.Project\",\n        \"u.r.c\": \"U.R.C\",\n        \"u.zoo\": \"U.ZOO\",\n        \"ua\": \"UA\",\n        \"ub\": \"UB\",\n        \"ubiquitous\": \"ユビキタス\",\n        \"uchinon\": \"うちのん\",\n        \"uchiwa ryou nagon\": \"団扇涼納言\",\n        \"uchizum\": \"UCHIZUM\",\n        \"uchoten\": \"有頂天\",\n        \"uchu\": \"Uchu\",\n        \"uchuu neko-juu kougyou\": \"宇宙猫獣工業\",\n        \"uchuu porta\": \"宇宙☆ポルタ\",\n        \"uchuusen shoujigou\": \"宇宙船庄司号\",\n        \"ucyu-kago\": \"宇宙カゴ\",\n        \"udon-ya\": \"うどんや\",\n        \"uzukikan\": \"卯月館\",\n        \"ueda-san.\": \"ウエダさん。\",\n        \"ugaya 74th\": \"ウガヤ74th\",\n        \"uge connection\": \"UGEコネクション\",\n        \"ugeman\": \"うげ漫\",\n        \"ugokuna pharmacy theta\": \"うごくな薬局θ\",\n        \"ugou no shuu\": \"烏合ノ衆\",\n        \"uguisu kagura\": \"ウグイスカグラ\",\n        \"uguisuya\": \"莺屋\",\n        \"uhii\": \"うひい\",\n        \"uirokai\": \"ういろうかい\",\n        \"uji\": \"蛆\",\n        \"uk-works\": \"UK-WORKS\",\n        \"ukikusaya\": \"うきくさ屋\",\n        \"ultimania\": \"アルティマニア\",\n        \"ultimate works\": \"アルティメットワークス\",\n        \"ultra one\": \"ULTRA ○NE\",\n        \"ultra siccative\": \"ウルトラシッカチーフ\",\n        \"ultra violet\": \"ULTRA Violet\",\n        \"ululun\": \"UluluN\",\n        \"uma goya\": \"UMA小屋\",\n        \"uma no are\": \"うまのあれ\",\n        \"uma no hone\": \"うまのほね\",\n        \"umakatei\": \"うまか亭\",\n        \"umami zeitaku dashi\": \"うまみ贅沢出汁\",\n        \"umanori kishidan\": \"うまのり騎士団\",\n        \"umari-ya\": \"埋まり屋\",\n        \"umasugiyu\": \"うますぎゆ\",\n        \"umaya\": \"厩\",\n        \"umbrella.corp\": \"UMBRELLA.CORP\",\n        \"ume-nyan-tei\": \"うめにゃん亭\",\n        \"umeboshi\": \"梅ぼし\",\n        \"umehimeden\": \"梅姫殿\",\n        \"umekkodo\": \"うめっこ堂\",\n        \"umenonukaduke\": \"うめのぬかづけ\",\n        \"umesuke\": \"梅助\",\n        \"umigarasu madoushi dan\": \"海烏魔道士団\",\n        \"umihan\": \"うみはん\",\n        \"umikaidou\": \"海貝堂\",\n        \"uminari\": \"ウミナリ\",\n        \"uminekotei\": \"うみねこ亭\",\n        \"uminoie hamanasu\": \"海の家はまなす\",\n        \"uminouie\": \"海納家\",\n        \"umipro\": \"umiプロ\",\n        \"un gallo\": \"Un gallo\",\n        \"un-moto shoko\": \"云元書庫\",\n        \"unagi no nedoko\": \"うなぎの寝床\",\n        \"unaginobori\": \"うなぎのぼり\",\n        \"uncats\": \"UNCATS\",\n        \"unceder\": \"アンシーダー\",\n        \"undead\": \"Undead\",\n        \"undel\": \"あんでる\",\n        \"under colony\": \"Under Colony\",\n        \"under control\": \"UNDER CONTROL\",\n        \"underground campaign\": \"Underground Campaign\",\n        \"undermoon\": \"アンダームーン\",\n        \"underwhite\": \"Underwhite\",\n        \"undouken\": \"雲洞軒\",\n        \"uneune-kissa\": \"うねうね喫茶\",\n        \"unfixed\": \"UNFIXED\",\n        \"ungrofish\": \"地下魚!\",\n        \"unholy production\": \"アンホリ☆プロダクション\",\n        \"uni\": \"UNI\",\n        \"unicorn-a\": \"unicorn-a\",\n        \"unimayo chuubou\": \"ウニマヨ厨房\",\n        \"union of the snake\": \"Union of the Snake\",\n        \"unique\": \"ゆにきゅう\",\n        \"unisonshift\": \"ユニゾンシフト\",\n        \"unit cheese\": \"ゆにっとちーず\",\n        \"unitonasubi\": \"うにとなすび\",\n        \"uniuni\": \"uniuni\",\n        \"uniya\": \"雲丹屋\",\n        \"uniyaa\": \"うに屋あ\",\n        \"unizo\": \"うに蔵\",\n        \"unknown\": \"アンノウン\",\n        \"unlucky strike\": \"アンラッキーストライク\",\n        \"unmei no ikasumi\": \"運命のイカスミ\",\n        \"unnunkannun\": \"うんぬんかんぬん\",\n        \"unreal\": \"UNreal\",\n        \"unshuu sakuramochi\": \"温州桜餅\",\n        \"unyarara daihanten\": \"うにゃらら大飯店\",\n        \"uohaman\": \"魚歯満\",\n        \"uotatsu18kinshiten\": \"魚辰一八金支店\",\n        \"uozanoko\": \"うお座の子\",\n        \"upsp\": \"UPSP\",\n        \"ura fmo\": \"裏FMO\",\n        \"ura kent no himitsu kichi\": \"裏KENTの秘密基地\",\n        \"ura makura\": \"裏まくら\",\n        \"ura meshiya\": \"裏飯屋\",\n        \"ura no hikidashi\": \"うらのひきだし\",\n        \"ura no kami\": \"裏のカミ\",\n        \"ura urethan\": \"裏ウレタン\",\n        \"ura.\": \"URA.\",\n        \"urabashi seisaku\": \"裏橋製作\",\n        \"urabb28 gou\": \"uraBB28号\",\n        \"uradoori no nukemichi\": \"裏通りの抜け道\",\n        \"uradora mangan\": \"裏ドラ満貫\",\n        \"uragiri no doukutsu\": \"うらぎりのどうくつ\",\n        \"urahushigi\": \"裏不思議\",\n        \"urainutei\": \"裏イヌ亭\",\n        \"urakaryuu\": \"裏火竜\",\n        \"uraken\": \"うらけん\",\n        \"urakusog\": \"urakusoG\",\n        \"urama mejirushi\": \"裏間目印\",\n        \"uramac\": \"うらまっく\",\n        \"uraniwa\": \"ウラニワ\",\n        \"uraroji\": \"ウラロジ\",\n        \"uraryon kikaku\": \"うらりょん企画\",\n        \"urasazan\": \"うらさざん\",\n        \"urawa anime festa\": \"浦和アニメフェスタ\",\n        \"uraya\": \"ura屋\",\n        \"urban doujin magazine\": \"街中同人誌會\",\n        \"uresen\": \"熟れ専\",\n        \"uresuji awabi\": \"熟レ筋アワビ\",\n        \"ureure kaikai\": \"嬉嬉怪怪\",\n        \"uribox\": \"ウリボックス\",\n        \"urimarutei\": \"うりまる亭\",\n        \"uritz\": \"Uritz\",\n        \"uro\": \"URO\",\n        \"uropyon\": \"うろぴょん☆\",\n        \"urumin\": \"うるみん\",\n        \"ururuc\": \"URURUC\",\n        \"urusai kokuen\": \"うるさい黒鉛\",\n        \"urushiya seitai jikkenshitsu\": \"漆屋生態実験室\",\n        \"us\": \"US\",\n        \"usa gunbu\": \"USA軍部\",\n        \"usaburo\": \"うさブロ！\",\n        \"usacastle\": \"Usacastle\",\n        \"usaden\": \"うさでん\",\n        \"usagi ame\": \"うさぎあめ\",\n        \"usagi no ana\": \"ウサギの穴\",\n        \"usagi no shippo\": \"うさぎのしっぽ\",\n        \"usagi paradise\": \"うさぎパラダイス\",\n        \"usagi purin\": \"うさぎプリン\",\n        \"usagi to kame\": \"うさぎとかめ\",\n        \"usagi youchien\": \"うさぎ幼稚園\",\n        \"usagi youjinbou\": \"うさぎ用心棒\",\n        \"usagigoya\": \"うさぎ小屋\",\n        \"usagijiru\": \"うさぎじる\",\n        \"usagizadou\": \"兎座堂\",\n        \"usamimi syndrome\": \"うさみみしんどろーむ\",\n        \"usanamaco\": \"うさなまこ\",\n        \"usaneri island\": \"うさねり★アイランド\",\n        \"usendou plus 1\": \"優先度+1\",\n        \"ushichichi bokujou\": \"うしちち牧場\",\n        \"ushinokokumairi\": \"ウシノコクマイリ\",\n        \"ushitora-dou\": \"丑寅堂\",\n        \"uso\": \"噓\",\n        \"uso kara makoto\": \"うそからまこと\",\n        \"uso seisakusho\": \"うそ製作所\",\n        \"usoppu land\": \"ウソップランド\",\n        \"usotsuki honey\": \"うそつきHONEY\",\n        \"usui hon hitori roudoku kai\": \"薄い本一人朗読会\",\n        \"usukawa kintsuba\": \"薄皮きんつば\",\n        \"usume sanchi\": \"うすめ産地\",\n        \"utachan honpo\": \"ウタチャンホンポ\",\n        \"utadokei\": \"ウタドケイ\",\n        \"utage\": \"宴\",\n        \"utahime\": \"うたひめ\",\n        \"utakata gentou-ya\": \"泡沫幻燈屋\",\n        \"utakata.\": \"うたかた。\",\n        \"utaneya\": \"うたね屋\",\n        \"utanone dou\": \"うたのね堂\",\n        \"utataneyashiki\": \"転寝屋敷\",\n        \"utinotyutai\": \"ウチの中隊\",\n        \"utsumuki garden\": \"うつむきガーデン\",\n        \"utsusemi shuu\": \"空蝉衆\",\n        \"utsutsutsutsu.\": \"うつつつつ。\",\n        \"uu-zone\": \"UU-ZONE\",\n        \"uwasa no ero radiohead\": \"噂のエロレディオヘッド\",\n        \"uwd\": \"UWD\",\n        \"uxmal\": \"Uxmal\",\n        \"uzigaya\": \"氏賀屋\",\n        \"uzomzo\": \"UZOMZO\",\n        \"uzumaki shikenkan\": \"うずまき試験管\",\n        \"v. hercules\": \"V・ヘラクレス\",\n        \"v muscle\": \"Vまっする\",\n        \"v112cr\": \"ぶい112CR\",\n        \"vachicalist\": \"Vachicalist\",\n        \"vadass\": \"Vadass\",\n        \"vagina dentata\": \"有齒女陰\",\n        \"valiant\": \"VALIAN党\",\n        \"valkyria\": \"わるきゅ～れ\",\n        \"valrhona\": \"VALRHONA\",\n        \"valssu\": \"valssu\",\n        \"vampire berry\": \"Vampire*Berry\",\n        \"vanadis\": \"Vanadis\",\n        \"vanilla sky\": \"VANILLA SKY\",\n        \"vanilla tenrankai\": \"バニラ展覧会\",\n        \"vanilla type\": \"バニラタイプ\",\n        \"vanilla-dou max\": \"バニラ堂MAX\",\n        \"vanishing point.\": \"Vanishing Point.\",\n        \"vanity press\": \"Vanity Press\",\n        \"vashadow\": \"VASHADOW\",\n        \"vegas project\": \"VEGAS PROJECT\",\n        \"velvet rose\": \"Velvet Rose\",\n        \"venus\": \"VENUS\",\n        \"venuspunk\": \"VENUSPUNK\",\n        \"ver.mimizuk\": \"Ver.みみずく\",\n        \"ver9\": \"Ver9\",\n        \"verdant force\": \"Verdant Force\",\n        \"vermiculite\": \"ばーみきゅらいと\",\n        \"vermilion\": \"ばみりおん\",\n        \"verydrop\": \"Verydrop\",\n        \"veto\": \"VETO\",\n        \"viento campanilla\": \"Viento Campanilla\",\n        \"viewness\": \"Viewness\",\n        \"vincent\": \"ヴィンセント\",\n        \"vinegar mackerel\": \"Vinegar Mackerel\",\n        \"violence club\": \"ばいおれんす倶楽部\",\n        \"violet order\": \"VIOLET ORDER\",\n        \"violetstar\": \"Violetstar\",\n        \"vip games\": \"VIP Games\",\n        \"virginal\": \"VIRGINAL\",\n        \"virophilia\": \"virophilia\",\n        \"viscaria\": \"VISCARIA\",\n        \"vista\": \"VISTA\",\n        \"visual biscuits\": \"Visual Biscuits\",\n        \"vitamin gohan\": \"ビタミンごはん\",\n        \"vitamin soft\": \"ビタミン\",\n        \"viva mikinosuke\": \"ビバ・みきのすけ\",\n        \"vivid dot\": \"vivid_dot\",\n        \"vivid flag\": \"Vivid Flag\",\n        \"vivido\": \"ヴィヴィ堂\",\n        \"vm500\": \"VM500\",\n        \"vogelschwein\": \"フォーゲルシュヴァイン\",\n        \"vogue\": \"VOGUE\",\n        \"voice of flower\": \"Voice of flower\",\n        \"voisin\": \"VOISIN\",\n        \"vollmond\": \"VOLLMOND\",\n        \"voltcompany.\": \"VOLTCOMPANY.\",\n        \"volutes\": \"VOLUTES\",\n        \"volvox\": \"VOLVOX\",\n        \"vpans extasy\": \"Vパン'sエクスタシー\",\n        \"vulcannu\": \"ヴぁるかん濡\",\n        \"vulgar bull\": \"VULGAR BULL\",\n        \"vyowolf\": \"vyowolf\",\n        \"w-room\": \"W-ROOM\",\n        \"waage\": \"Waage\",\n        \"wabi sabi wasabi\": \"ワビサビワサビ\",\n        \"wag the dog\": \"Wag The Dog\",\n        \"wagamama dou\": \"我儘堂\",\n        \"wagarashiya\": \"和がらし屋\",\n        \"wagashi-ya\": \"わがし屋\",\n        \"wagaya no kurorekishi\": \"我が家の黒歴史\",\n        \"wainable\": \"ワイナブル\",\n        \"wakamaker\": \"wakamaker\",\n        \"wakayotareso\": \"わかよたれそ\",\n        \"waki waki koubou\": \"わきわき工房\",\n        \"wakusei nostalgia\": \"惑星ノスタルジー\",\n        \"wakusei-teki shukou\": \"惑星的趣向\",\n        \"wakuseiburo\": \"ワクセイブロ\",\n        \"wakuwaku shotaland\": \"わくわくショタランド\",\n        \"walpurgisnacht\": \"Walpurgisnacht\",\n        \"wamusho\": \"わむショ\",\n        \"wando wando\": \"ワンドワンド\",\n        \"wanko-tei\": \"わんこ亭\",\n        \"wankoroya\": \"わんころ屋\",\n        \"wannyan club\": \"ワンニャン倶楽部\",\n        \"wanpaku brothers\": \"わんぱくブラザーズ\",\n        \"wanpaku shoujo\": \"腕白少女\",\n        \"wanton land kumiai\": \"とわんとんランド組合\",\n        \"wanwan oukoku\": \"わんわん王国\",\n        \"wanwan teikoku\": \"わんわん帝国\",\n        \"wanwanhouse\": \"わんわんはうす\",\n        \"wanwano\": \"わんわんお\",\n        \"wappoi\": \"わっぽい\",\n        \"warainaki festa\": \"ワライナキフェスタ\",\n        \"ware pon\": \"われPON\",\n        \"wareago\": \"ワレアゴ\",\n        \"waribashi kouka\": \"割り箸効果\",\n        \"warukuriya\": \"ワルクリ屋\",\n        \"wasabi mochi\": \"わさびもち\",\n        \"wasabiberry jam\": \"Wasabiberry JAM\",\n        \"wasei nekohime\": \"和製猫姫\",\n        \"wasre kaban\": \"忘れカバン\",\n        \"wasshoi koubou\": \"ワッショイ☆工房\",\n        \"waste\": \"Waste\",\n        \"wastepapermarket\": \"WastePaperMarket\",\n        \"wasukoro\": \"わすころ\",\n        \"wasuraruru tegami\": \"忘らるる手紙\",\n        \"watanuki shinguten\": \"綿貫寝具店\",\n        \"watanuki tanuki\": \"わたぬきたぬき\",\n        \"wataridori\": \"わたりどり\",\n        \"wataridori no rakuen\": \"渡り鳥の楽園\",\n        \"watashinchi\": \"わたしンち\",\n        \"water beryl\": \"ウォーターベリル\",\n        \"water closet\": \"water closet\",\n        \"water garden\": \"水の庭\",\n        \"water valley\": \"うぉ～た～ばれ～\",\n        \"watosato\": \"ワトサト\",\n        \"wave\": \"うぇ～ぶ\",\n        \"wawomidasu\": \"和を乱su\",\n        \"wchees\": \"Wchees\",\n        \"web knight\": \"ウェブ乃藤\",\n        \"webstudioofflimits\": \"WebStudioOffLimits\",\n        \"wechselhaft\": \"ヴェクセルハフト\",\n        \"wednesday\": \"Wednesday\",\n        \"wendybell\": \"ウェンディベル\",\n        \"west island\": \"ウエストアイランド\",\n        \"west vision\": \"ウエストビジョン\",\n        \"wheel\": \"ホイール\",\n        \"whirl pool\": \"WHIRL POOL\",\n        \"white clover\": \"ほわいとくろーばー\",\n        \"white croaker\": \"White croaker\",\n        \"white cross\": \"ホワイトクロス\",\n        \"white elephant\": \"WHITE ELEPHANT\",\n        \"white garden\": \"WHITE GARDEN\",\n        \"white heart\": \"WHITE HEART\",\n        \"white identity\": \"White Identity\",\n        \"white lolita\": \"White Lolita\",\n        \"white moon\": \"WHITE MOON\",\n        \"white note\": \"ホワイトノート\",\n        \"white out\": \"WHITE OUT\",\n        \"white roots\": \"white roots\",\n        \"white sail\": \"ホワイトセイル\",\n        \"white spring\": \"White Spring\",\n        \"whiteapple\": \"whiteapple\",\n        \"whitecheese\": \"ほわいとちぃず\",\n        \"whitecute\": \"WhiteCute\",\n        \"whitemoor\": \"WhiteMoor\",\n        \"whitepink\": \"ホワイトピンク\",\n        \"whitewill\": \"WHITEWILL\",\n        \"wi-fe hacker\": \"Wi-Fe hacker\",\n        \"wild duck\": \"WILD DUCK\",\n        \"wild heart\": \"ワイルドハート\",\n        \"will be well\": \"WILL BE WELL\",\n        \"will tame\": \"ウィルテイム\",\n        \"win win\": \"win win\",\n        \"wind mail\": \"WIND MAIL\",\n        \"windfall\": \"WINDFALL\",\n        \"windmill\": \"ういんどみる\",\n        \"windmill oasis\": \"ういんどみるOasis\",\n        \"windtone\": \"うぃんどとーん\",\n        \"windwave\": \"WINDWAVE\",\n        \"windy wing\": \"WiNDY WiNG\",\n        \"wing hero\": \"ウィングヒーロー\",\n        \"wing kyanite\": \"Wing Kyanite\",\n        \"wingbinta\": \"ウイングビンタ\",\n        \"winsuka.\": \"うぃんすか。\",\n        \"winter garden\": \"Winter Garden\",\n        \"wishdou\": \"うぃっしゅ堂\",\n        \"wisteria\": \"Wisteria\",\n        \"witchflame\": \"WitchFlame\",\n        \"withdrop\": \"ウィズドロップ\",\n        \"withsoda\": \"withsoda\",\n        \"wizaldx\": \"WizaldX\",\n        \"wlc soft\": \"WLCソフト\",\n        \"wolfs tail radio station\": \"Wolf's Tail Radio Station\",\n        \"wolkenkratzer\": \"Wolkenkratzer\",\n        \"wonder fool\": \"Wonder Fool\",\n        \"wonderful life\": \"Wonderful Life\",\n        \"wonderful one\": \"WONDERFUL ONE\",\n        \"wonderia\": \"わんだりあ\",\n        \"wordgear\": \"WordGear\",\n        \"words worth\": \"ワーズワース\",\n        \"works makes evolution\": \"Works makes evolution\",\n        \"workstation r\": \"ワークステーションR\",\n        \"world box\": \"WORLD BOX\",\n        \"world lover\": \"world lover\",\n        \"woshiro\": \"をしろ\",\n        \"wotona no namae\": \"をとなのなまえ\",\n        \"woyoyo\": \"ヲヨヨ\",\n        \"wrench studio\": \"WRENCH STUDIO\",\n        \"wriggle souzeme tomonokai\": \"リグル総攻め友の会\",\n        \"ws.\": \"WS.\",\n        \"wxy comics\": \"WXY COMICS\",\n        \"x model\": \"X∞MODEL\",\n        \"x-10sion\": \"X-10SION\",\n        \"x-bangbang\": \"X-bangbang\",\n        \"x-tei\": \"えっくす亭\",\n        \"x-toys\": \"X-TOYS\",\n        \"x.t.c\": \"X.T.C\",\n        \"xain\": \"XAIN\",\n        \"xenoms\": \"Xenoms\",\n        \"xephs artwork\": \"Xeph's Artwork\",\n        \"xikyougumi\": \"賽響組\",\n        \"xpanda\": \"Xpanda\",\n        \"xration\": \"Xration\",\n        \"xuse\": \"ザウス\",\n        \"xxkorori\": \"××コロリ\",\n        \"xxx\": \"トリプルエックス\",\n        \"xyzyroh\": \"朱儒楼\",\n        \"y no shokutaku\": \"Yの食卓\",\n        \"y-nrg system\": \"Y-NRG SYSTEM\",\n        \"ya-ho-games\": \"ya-ho-games\",\n        \"ya-zy\": \"YA-ZY\",\n        \"yaboudo project\": \"野望堂PROJECT\",\n        \"yabougumi\": \"野望組\",\n        \"yabuno seisakusho\": \"やぶの製作所\",\n        \"yabure kabure\": \"やぶれかぶれ\",\n        \"yaburi dokoro\": \"破り処\",\n        \"yachan coffee\": \"やちゃん珈琲\",\n        \"yachu onsen\": \"やちゅ温泉\",\n        \"yadapot\": \"やだぽっと\",\n        \"yadokani daikaiten\": \"やどかに大回転\",\n        \"yagami hyakka\": \"八神百科\",\n        \"yagezawa bunko\": \"やげざわ文庫\",\n        \"yagiya\": \"山羊屋\",\n        \"yah-yah-doh\": \"YAH-YAH-DOH\",\n        \"yajinsei ra-men\": \"野人性ラーメン\",\n        \"yajirushi key\": \"矢印キー\",\n        \"yajiya\": \"八至屋\",\n        \"yajuu kazoku\": \"野獣家族\",\n        \"yakan hikou\": \"夜間飛行\",\n        \"yakan honpo\": \"薬缶本舗\",\n        \"yakata\": \"館\",\n        \"yaki lemon\": \"焼きレモン\",\n        \"yaki tomahawk steak\": \"烧きトマホークステーキ\",\n        \"yakihata nyuugyou\": \"焼畑乳業\",\n        \"yakihebi\": \"やきへび\",\n        \"yakimisomura\": \"ヤキミソ村\",\n        \"yakimorokoshi\": \"やきもろこし\",\n        \"yakinasu teishoku\": \"焼き茄子定食\",\n        \"yakiniku teishoku\": \"焼肉定食\",\n        \"yakinikuya yusi\": \"焼肉屋由史\",\n        \"yakisaba teishoku\": \"焼鯖定食\",\n        \"yakisaketeishoku\": \"焼鮭定食\",\n        \"yakisoba rengo\": \"やきそば連合\",\n        \"yakitate jamaica\": \"焼きたてジャマイカ\",\n        \"yakou chaofan\": \"夜光チャーハン\",\n        \"yakousei fan club\": \"夜行性ファンクラブ\",\n        \"yakouyousei\": \"夜光幼性\",\n        \"yakusoku no kaigansen\": \"約束の海岸線\",\n        \"yakutsk tokkoutai\": \"ヤクーツク特攻隊\",\n        \"yama momo kajitsu\": \"山桃果実\",\n        \"yamaboshike\": \"山星家\",\n        \"yamaburoya\": \"やまぶろ屋\",\n        \"yamada air base\": \"YAMADA AIR BASE\",\n        \"yamada factory\": \"山田ファクトリー\",\n        \"yamada ichizoku.\": \"山田一族。\",\n        \"yamada koubou\": \"山田工房\",\n        \"yamadake\": \"山田家\",\n        \"yamadaya\": \"山田屋\",\n        \"yamagarasu\": \"やまガラス\",\n        \"yamagiwa art cg studio\": \"ヤマギワアート CG STUDIO\",\n        \"yamago house\": \"山後ハウス\",\n        \"yamaguchi print\": \"やまぐちぷりんと\",\n        \"yamaguchirou\": \"やまぐち楼\",\n        \"yamakawa denenhuukei\": \"山川田園風景\",\n        \"yamami no yado\": \"やまみの宿\",\n        \"yamaori\": \"YAMAORI\",\n        \"yamato nadeshiko tei\": \"大和なでしこ亭\",\n        \"yamato soft\": \"大和ソフト\",\n        \"yamazakura\": \"山櫻\",\n        \"yami kaiten zushi\": \"闇回転寿司\",\n        \"yami ni ugomeku\": \"闇に蠢く\",\n        \"yami no naka\": \"闇の中\",\n        \"yaminabe daiichi kantai\": \"闇鍋第一艦隊\",\n        \"yamotodou rakugakiichi\": \"矢本堂落書市\",\n        \"yanagi-tei\": \"やなぎ亭\",\n        \"yanagigaeru\": \"ヤナギガエル\",\n        \"yanagisegawa\": \"柳瀬川\",\n        \"yancha club\": \"やんちゃ倶楽部\",\n        \"yaneura tv\": \"屋根裏TV\",\n        \"yanonoshiya\": \"やののし屋\",\n        \"yaoya\": \"やお屋\",\n        \"yapis company\": \"YAPIS COMPANY\",\n        \"yappari ao ga suki\": \"やっぱり青が好き\",\n        \"yappy-yappy\": \"ヤッピーヤッピー\",\n        \"yarakashidan\": \"やらかし団\",\n        \"yareba dekiru ko.\": \"やればできる娘。\",\n        \"yariiya\": \"枪衣屋\",\n        \"yaritaihodai.\": \"やりたいほうだい。\",\n        \"yasakanomagatama\": \"八坂の勾玉\",\n        \"yashiromori\": \"ヤシロモリ\",\n        \"yashiroya\": \"やしろ屋\",\n        \"yasrin-do\": \"やすりん堂\",\n        \"yasudanchi\": \"ヤスダンチ\",\n        \"yasunaoz\": \"安直Z\",\n        \"yasuomi-craft\": \"Yasuomi-Craft\",\n        \"yasutakeya\": \"ヤスタケ屋\",\n        \"yasyokutei\": \"夜食亭\",\n        \"yatagarasu\": \"八咫烏\",\n        \"yatsufusa koubou\": \"八房工房\",\n        \"yatsugami ryouriten\": \"八ツ神料理店\",\n        \"yatsukaan\": \"夜束庵\",\n        \"yawaragi bin\": \"やわらぎ瓶\",\n        \"yawaraka gate\": \"やわらかGATE\",\n        \"yawaraka kougyou\": \"やわらか工業\",\n        \"yawaraka okashiya\": \"やわらか御菓子屋\",\n        \"yawaraka taiyou\": \"やわらか太陽\",\n        \"yaya hinata-ya\": \"稍日向屋\",\n        \"yayoi fantasy zone\": \"やよいファンタジーゾーン\",\n        \"yayui\": \"やゆい\",\n        \"yeast house\": \"いーすとはうす\",\n        \"yellow apple\": \"YELLOW☆APPLE\",\n        \"yellow tag\": \"YELLOW TAG\",\n        \"yellowcotton\": \"yellowcotton\",\n        \"yes sir.\": \"Yes sir.\",\n        \"yggdrasil\": \"イグドラシル\",\n        \"ylang-ylang\": \"イランイラン\",\n        \"ymc\": \"YMC\",\n        \"ymi factory\": \"YMI factory\",\n        \"yo wa okazu wo shomou shiteoru\": \"余はおかずを所望しておる\",\n        \"yoake andon\": \"ヨアケ行燈\",\n        \"yoban left\": \"よばんれふと\",\n        \"yogurt\": \"yogurt\",\n        \"yohanemu\": \"よはねむ\",\n        \"yohitama\": \"Yohitama\",\n        \"yoidore rodeo\": \"酔いどれロデオ\",\n        \"yoidore usagitei\": \"酔いどれ兎亭\",\n        \"yoiko books\": \"よい子ブックス\",\n        \"yojouhan\": \"四畳半\",\n        \"yojouhan factory\": \"四畳半ファクトリー\",\n        \"yojouhan toshi\": \"四畳半都市\",\n        \"yokainosu\": \"ヨーカイノス\",\n        \"yokazetei\": \"夜風亭\",\n        \"yoke\": \"Yoke\",\n        \"yokohama junky\": \"Yokohama Junky\",\n        \"yokohama zza koubou\": \"横浜ZZA工房\",\n        \"yokoshima\": \"ヨコシーマ\",\n        \"yokoshimanchi.\": \"横島んち。\",\n        \"yokoyamagumi\": \"横山組\",\n        \"yokubou no tou\": \"欲望の塔\",\n        \"yolki palki\": \"ヨールキ・パールキ\",\n        \"yomamagoto\": \"夜ままごと\",\n        \"yomiji hyakki yakou\": \"黄泉路百鬼夜行\",\n        \"yomo zakkaten\": \"四方雑貨店\",\n        \"yomoda yomo japan\": \"よもだよもJAPAN\",\n        \"yomogi\": \"よもぎ\",\n        \"yomogiya\": \"よもぎや\",\n        \"yomosue doukoukai\": \"ヨモスエ同好会\",\n        \"yomosugara\": \"よもすがら\",\n        \"yomothuhirasaka\": \"黄泉比良坂\",\n        \"yomoyama sand\": \"よもやまサンド\",\n        \"yonakiya\": \"よなきや\",\n        \"yonmasuya\": \"四桝屋\",\n        \"yorimichi\": \"よりみち\",\n        \"yorozuya miyakotei\": \"よろず屋みやこ亭\",\n        \"yoru no benkyoukai\": \"夜の勉強会\",\n        \"yorugumi\": \"よるぐみ。\",\n        \"yoruyama no kyuukeijo\": \"夜山の休憩所\",\n        \"yosei yumeshiko\": \"酔セイ夢シコ\",\n        \"yoshida gorou shoukai\": \"吉田悟郎商會\",\n        \"yoshida kingdom\": \"ヨシダキングダム\",\n        \"yoshiga dokoro\": \"吉賀所\",\n        \"yoshii tech sha\": \"吉井テック社\",\n        \"yoshitakashi athletic\": \"吉丘アスレチック\",\n        \"yotayota honpo\": \"よたよた本舗\",\n        \"yotogizousi\": \"夜伽草紙\",\n        \"yotsumi works\": \"よつみわーくす\",\n        \"yottanchi\": \"よったんち\",\n        \"you you tsuushin\": \"遊遊通信\",\n        \"you2hp\": \"YOU2HP\",\n        \"youchien\": \"妖痴艶\",\n        \"yougekisya\": \"幼撃舎\",\n        \"youjo sentai loliconger\": \"幼女戦隊口リコンジャー\",\n        \"youjo teishoku\": \"Youjo定食\",\n        \"youkai ankake\": \"妖怪あんかけ\",\n        \"youmu no shio\": \"ようむのしお\",\n        \"youmusya\": \"遥夢社\",\n        \"yousei allergen\": \"幼性アレルゲン\",\n        \"yousei imagination\": \"幼性Imagination\",\n        \"youseimangasya\": \"妖精漫画社\",\n        \"youtou oniku\": \"妖刀お肉\",\n        \"youtoujirushi\": \"洋燈印\",\n        \"youtsuu rock\": \"腰痛ROCK\",\n        \"youyoumu\": \"妖幼夢\",\n        \"yozorairodrops\": \"夜空色ドロップ\",\n        \"ytoh2\": \"YtoH2\",\n        \"yu-gure yane\": \"ゆうぐれ屋根\",\n        \"yu-ta.18\": \"YU-TA.18\",\n        \"yu-topia\": \"佑とぴあ\",\n        \"yu-yake spectrum\": \"夕焼スペクトル\",\n        \"yu-yu tei\": \"YU-YU TEI\",\n        \"yu.\": \"ゆ。\",\n        \"yuasa rengou\": \"ゆあさ連合\",\n        \"yubeshi\": \"甘菓子\",\n        \"yude tamago\": \"ゆで卵\",\n        \"yudenakya nama-beer\": \"ゆでなきゃ生ビール\",\n        \"yudenonno\": \"ゆでのんの\",\n        \"yuga\": \"yuga\",\n        \"yuiumiya\": \"結海屋\",\n        \"yukagenikaga\": \"湯加減いかが?\",\n        \"yukan high zakura\": \"有閑high桜\",\n        \"yukari\": \"縁 -yukari-\",\n        \"yukarita\": \"ゆかりた\",\n        \"yukemuri froster\": \"ゆけむりフロスター\",\n        \"yukemuri inferno\": \"湯けむりインフェルノ\",\n        \"yuki mango\": \"ゆきマンゴー\",\n        \"yuki no hitohira\": \"ユキノヒトヒラ\",\n        \"yuki no iori\": \"ユキノ庵\",\n        \"yuki sumi iori\": \"雪墨庵\",\n        \"yuki-iro\": \"YuKi-IRo\",\n        \"yukidaruma kumiai\": \"ゆきだるま組合\",\n        \"yukima honpo\": \"雪間本舗\",\n        \"yukimi honpo\": \"ゆきみ本舗\",\n        \"yukimi onsen\": \"雪見温泉\",\n        \"yukirins\": \"YUKIRINS\",\n        \"yukisizuku\": \"ゆきしずく\",\n        \"yukisora\": \"ユキソラ\",\n        \"yukitenkan\": \"雪天館\",\n        \"yukyou\": \"ゆきょう\",\n        \"yukyu-kyuka\": \"悠久休暇\",\n        \"yume no kakera\": \"ユメノカケラ\",\n        \"yume no manimani\": \"夢のまにまに\",\n        \"yume no niwatori goya\": \"夢のニワトリ小屋\",\n        \"yumeiro-goromo\": \"ゆめいろごろも\",\n        \"yumeizukosya\": \"夢何処社\",\n        \"yumekakiya\": \"夢かき屋\",\n        \"yumemi\": \"yumemi\",\n        \"yumemigaoka\": \"ユメミガオカ\",\n        \"yumemigokoti\": \"夢見ごこち\",\n        \"yumemushi\": \"ユメムシ\",\n        \"yumenamakon\": \"ゆめなまこん\",\n        \"yumenekoya\": \"夢ねこ屋\",\n        \"yumeno miya\": \"夢乃宮\",\n        \"yumeoikyounouta\": \"夢追狂の謳\",\n        \"yumetoki\": \"ユメトキ\",\n        \"yumeya honpo\": \"夢屋本舗\",\n        \"yumiharizuki\": \"弓張月\",\n        \"yunomata\": \"♨ゆのまた\",\n        \"yunte\": \"yunte\",\n        \"yuraraka koubou\": \"ゆららか工房\",\n        \"yurari biyori\": \"ゆらり日和\",\n        \"yurei yashiki\": \"ゆーれーやしき\",\n        \"yureika\": \"ゆれいか\",\n        \"yurerutikuwabu\": \"ゆれるちくわぶ\",\n        \"yuri equal 18l\": \"百合=18L\",\n        \"yuririn no moto\": \"ゆりりんの素\",\n        \"yurufuwa megane\": \"ゆるふわ☆めがね\",\n        \"yuruhuwa-kinniku\": \"ゆるふわ筋肉\",\n        \"yururuka-dou\": \"ゆるるか堂\",\n        \"yurusu\": \"許す\",\n        \"yurutto pocket\": \"ゆるっとポケット\",\n        \"yusuzumi\": \"夕涼み\",\n        \"yutakadou\": \"豊堂\",\n        \"yutori-nu\": \"ゆとりーぬ\",\n        \"yuu adashino suisan\": \"(有)化野水産\",\n        \"yuu heya\": \"ゆう部屋\",\n        \"yuubeno gakuensai\": \"ユウベノ学園祭\",\n        \"yuuen floor\": \"遊園ふろあ\",\n        \"yuugai tosho kikaku\": \"有害図書企画\",\n        \"yuugatou\": \"誘蛾党\",\n        \"yuugen jikkou\": \"有言実行\",\n        \"yuugengaisha mach spin\": \"有限会社マッハスピン\",\n        \"yuugensangyou sukimakaze\": \"有限産業すきま風\",\n        \"yuuhodou\": \"遊歩堂\",\n        \"yuuhoku.\": \"ゆーほく。\",\n        \"yuuji wonder\": \"ゆうじワンダー\",\n        \"yuujiro\": \"遊字路\",\n        \"yuuk web\": \"yuuk web\",\n        \"yuukai kinshi\": \"誘拐禁止\",\n        \"yuukakumin\": \"遊廓民\",\n        \"yuukan madam\": \"勇敢マダム\",\n        \"yuukari soft\": \"ゆ～かりそふと\",\n        \"yuuki nyuugyou\": \"ゆーき乳業\",\n        \"yuuki ryu\": \"結城流\",\n        \"yuukyuu shinden\": \"悠久神殿\",\n        \"yuunagisou\": \"夕凪荘\",\n        \"yuuriko\": \"ユウリコ\",\n        \"yuusei honpo\": \"遊星本舗\",\n        \"yuuseian\": \"遊星庵\",\n        \"yuusha kandenchi\": \"勇者乾電池\",\n        \"yuusha-sama go-ikkou\": \"勇者様御一行\",\n        \"yuhshiki\": \"憂式\",\n        \"yuuyami sabou\": \"夕闇茶房\",\n        \"yuuyami tokeidai\": \"ゆうやみとけいだい\",\n        \"yuuyaminabe club\": \"夕闇鍋倶楽部\",\n        \"yuuzen animal dou\": \"友禅あにまる堂\",\n        \"yuyake box\": \"ゆうやけボックス\",\n        \"yuzucha\": \"ゆず茶\",\n        \"yuzucha biyori\": \"柚子茶日和\",\n        \"yuzuen\": \"柚子苑\",\n        \"yuzuhoge.\": \"Yuzuhoge.\",\n        \"yuzumikan\": \"ゆずみかん\",\n        \"yuzumonaka\": \"ゆずもなか\",\n        \"yuzupon\": \"YUZUPON\",\n        \"yuzuriha\": \"譲葉\",\n        \"yuzurihaya\": \"譲葉屋\",\n        \"yuzuya\": \"ゆずや\",\n        \"yuzuyu\": \"ゆず湯\",\n        \"yz plus\": \"YZ+\",\n        \"z jirushi\": \"Z印\",\n        \"z-front\": \"Z-FRONT\",\n        \"z-less\": \"Z-Less\",\n        \"z-s-e\": \"z-s-e\",\n        \"z-tabukuroneko house\": \"Zた袋猫はうす\",\n        \"zabuton makura\": \"ざぶとんまくら\",\n        \"zaclock\": \"ZacLock\",\n        \"zahhatorute\": \"ざっはとるて\",\n        \"zakkin heiki seizou koujou\": \"雑菌兵器製造工場\",\n        \"zakogoya\": \"ざこ小屋\",\n        \"zakuro an\": \"柘榴庵\",\n        \"zandaka-77yen\": \"残高77円\",\n        \"zangyaku koui teate\": \"残虐行為手当\",\n        \"zankirow\": \"斬鬼楼\",\n        \"zankoku doumei\": \"残酷同盟\",\n        \"zankoku ondo\": \"残酷音頭\",\n        \"zanmai\": \"三昧-zanmai-\",\n        \"zarigani arms\": \"ザリガニARMS\",\n        \"zashiki-neco\": \"ざしきねこ\",\n        \"zassou\": \"雑草\",\n        \"zassoubatake\": \"雑草畑\",\n        \"zatouichi\": \"座頭市\",\n        \"zatsunen koubou\": \"雑念工房\",\n        \"zatsuyou elixir\": \"雑用エリクサー\",\n        \"zattou keshiki\": \"雑踏景色\",\n        \"zawameki jambo\": \"ざわめきじゃんぼ\",\n        \"zeiniku shoujotai\": \"ぜいにく少女隊\",\n        \"zenmai-shiki kouchuusen\": \"ゼンマイ式航宙船\",\n        \"zenmain\": \"ZENMAIN\",\n        \"zennihon haeteru kai\": \"全日本生えてる會\",\n        \"zenos\": \"Zenos\",\n        \"zenpou chuugaeri kick\": \"前方宙返りキック\",\n        \"zenpou fuchuui\": \"前方不注意\",\n        \"zenpou kouenhun\": \"前方後円墳\",\n        \"zenryoku back dash\": \"全力バックダッシュ\",\n        \"zensekai yakenohara doumei\": \"全世界焼野原同盟\",\n        \"zenshuu bougyo\": \"ゼンシュウボウギョ\",\n        \"zensoku punks\": \"喘息パンクス\",\n        \"zensoku zenkai.\": \"喘息全快。\",\n        \"zensyuui\": \"全周囲\",\n        \"zero\": \"ゼロ\",\n        \"zero calorie\": \"ゼロカロリ\",\n        \"zero-sen\": \"zero戦\",\n        \"zero-xx\": \"ZERO・XX\",\n        \"zeroinfinityone\": \"0∞1\",\n        \"zeros factory\": \"零’sふぁくとりー\",\n        \"zetonpoison\": \"ゼトンポイソン\",\n        \"zettai bluenoid\": \"絶対ブルーノイド\",\n        \"zettai yarumoni\": \"絶対やるもに\",\n        \"zetubou\": \"zetubou\",\n        \"zi\": \"Zi\",\n        \"zi0topia\": \"ジ○トピア\",\n        \"ziggy star dust\": \"Ziggy STAR Dust\",\n        \"zigzag\": \"ZIGZAG\",\n        \"zigzag company\": \"ジグザグカンパニー\",\n        \"zinzin\": \"ジンジン\",\n        \"zion\": \"ZION\",\n        \"ziploc\": \"Ziploc\",\n        \"zipper wrist\": \"ジッパリスト\",\n        \"zircon prime\": \"じるこんプライム\",\n        \"zitadelle\": \"Zitadelle\",\n        \"zmey no soukutsu\": \"ズメイの巣窟\",\n        \"zng\": \"ZNG\",\n        \"znn\": \"ZNN\",\n        \"zoal\": \"ZOAL\",\n        \"zokubutsu.zip\": \"俗物.zip\",\n        \"zombie team\": \"Zombie Team\",\n        \"zooerastia\": \"ZOOERASTIA\",\n        \"zooko\": \"Zooko\",\n        \"zou no ran\": \"象の檻\",\n        \"zouri no sato\": \"ゾウリの里\",\n        \"zozalist\": \"ゾザリスト\",\n        \"zubunure lab\": \"ずぶ濡れラボ\",\n        \"zugaikotsu marudashi\": \"ズガイコツマルダシ\",\n        \"zukaishiki\": \"ずかいしき\",\n        \"zuukoku shoukai\": \"ずぅこく商会\",\n        \"zuwaigani beam\": \"ズワイガニビーム\",\n        \"zweidrei\": \"zweidrei\",\n        \"zyulokuya\": \"十録屋\",\n        \"zyx\": \"ジックス\",\n        \"ajito529\": \"アジト529\",\n        \"miomix\": \"miomix;\",\n        \"hinobashi seifukukan\": \"日野橋制服館\",\n        \"hoshii koubou\": \"星井工房\",\n        \"ascii media works\": \"ASCII Media Works\",\n        \"mitsume no mitsumame\": \"みつ目のみつ豆\",\n        \"rhf migite no tomo sha\": \"RHF=右手の友社\",\n        \"jurei no mori\": \"呪霊の杜\",\n        \"tsukitate-koubou\": \"つきたて工房\",\n        \"aramaa\": \"あらまあ\",\n        \"kazamidori\": \"かざみどり\",\n        \"m3\": \"M3\",\n        \"hiwa izumo taisha\": \"秘話出雲大社\",\n        \"caisson\": \"CAISSON\",\n        \"tuberose\": \"月化香\",\n        \"naga to yappari yukai na nakama-tachi\": \"nagaとやっぱり愉快な仲間たち\",\n        \"attakai inu no yoru de\": \"暖かい淫雨の夜で\",\n        \"nikoushikou\": \"に向思考\",\n        \"anata wa onaka ga suiteiru\": \"あなたはお腹がすいている\",\n        \"yurushite ochinti kyo\": \"許しておちんち教\",\n        \"seiheki kenkyuujo bravo han\": \"性癖研究所 ブラボー班\",\n        \"icchao murasakiimoren new\": \"いっちゃお♪紫芋れんnew\",\n        \"otokonoko de asobou\": \"男の子で遊ぼう\",\n        \"babaa no mitsuboshi restaurant\": \"ババアの三ツ星レストラン\",\n        \"mugisabou\": \"麦茶房\",\n        \"dessert soft\": \"DESSERT Soft\",\n        \"akatukiya\": \"赤月屋\",\n        \"metacorapusu\": \"めたこらぷす\",\n        \"hana q studio\": \"花Qスタジオ\",\n        \"shinsen shiboritate nama gyuunyuu.\": \"新鮮、搾りたて生牛乳。\",\n        \"shota mangaya-san\": \"ショタ漫画屋さん\",\n        \"kana note\": \"Kana Note\",\n        \"pirio destruction\": \"ピリオデストラクション\",\n        \"mauve\": \"mauve\",\n        \"tiguhagu metronome\": \"ちぐはぐメトロノーム\",\n        \"daisan-keitai\": \"第3形態\",\n        \"ray n maker\": \"Ray N' Maker\",\n        \"ijou higan sensen\": \"异常彼岸战线\",\n        \"shinkaihuyu\": \"深海浮遊\",\n        \"dull zodesadehai\": \"ダル・ゾデサデハーイ\",\n        \"fetishism pocket\": \"フェチズムポケット\",\n        \"kantou dougakai\": \"关东动画会\",\n        \"fusuma cafe\": \"ふすま喫茶\",\n        \"platinum kinoko\": \"プラチナきのこ\",\n        \"lunaberry\": \"Lunaberry\",\n        \"sakura no tomoru hie\": \"桜の灯る日へ\",\n        \"xx koubou\": \"××工房\",\n        \"hengen monogatari\": \"変幻物語\",\n        \"straight lemon kajuu 100\": \"ストレートレモン果汁100\",\n        \"gekidan 375\": \"劇団375\",\n        \"ryuuka hanten\": \"龍華飯店\",\n        \"hakumaidokoro\": \"白米所\",\n        \"dandakadan\": \"ダンダカダン\",\n        \"shikoshiko biyori\": \"しこしこ日和\",\n        \"ohige no shishimai\": \"お髭の獅子舞\",\n        \"damenahidou\": \"だめなひ堂\",\n        \"petanko bokujo\": \"ぺたんこ牧場\",\n        \"chanbara kishidan\": \"ちゃんばら騎士団\",\n        \"gensou kagetourou\": \"幻想影燈籠\",\n        \"chou rojiura gasshuukoku\": \"超路地裏合衆国\",\n        \"random footwork\": \"ランダムフットワーク\",\n        \"chabatake ni haeta takenoko\": \"茶畑に生えた筍\",\n        \"mizuyakinko\": \"水屋金库\",\n        \"namagaki\": \"生牡蛎\",\n        \"chouzankai\": \"超斩开\",\n        \"kirin planet\": \"キリンプラネット\",\n        \"sonpuushi\": \"村夫子\",\n        \"koushoku na reichourui\": \"好色な霊長類\",\n        \"yukinko okeya\": \"雪ん娘おけ屋\",\n        \"momonomi plus\": \"もものみプラス\",\n        \"metsuki warui kyoudan\": \"目つき悪い教団\",\n        \"chinpan-bu\": \"チンパン部\",\n        \"mondomura tomo no kai\": \"蒙德村友会\",\n        \"pirori kingdom\": \"PiRORI KINGDOM\",\n        \"kinomiki no mama\": \"木の幹のまま\",\n        \"raise wa futanari bishoujo\": \"来世是扶她美少女\",\n        \"kakuzatou\": \"角砂糖\",\n        \"gyuunyuu shoujo seisakusho\": \"牛乳少女制作所\",\n        \"abukumadou\": \"阿武隈堂\",\n        \"hakutamayu\": \"白玉汤\",\n        \"nodomaru biyori\": \"のどまる日和\",\n        \"itabira yasai\": \"イタビラ野菜\",\n        \"maria planet\": \"マリアプラネット\",\n        \"uishiro\": \"初代\",\n        \"140km slash h\": \"140km/h\",\n        \"shirokuma terepasu\": \"白熊テレパス\",\n        \"nipa nipa company\": \"NIPA NIPA COMPANY\",\n        \"omochi box\": \"OMOCHI BOX\",\n        \"kinokko\": \"きのっ子\",\n        \"dark horse comics\": \"黑马漫画\",\n        \"mt.sushi\": \"Mt.Sushi\",\n        \"milk lamp\": \"ミルクランプ\",\n        \"germanium detroit\": \"ゲルマニウム・デトロイト\",\n        \"suiren no yado\": \"水莲之宿\",\n        \"tariki honganji\": \"他力本愿寺\",\n        \"ebisujima misato\": \"戎島実里\",\n        \"jikahatsudensho\": \"自家発電処\",\n        \"signal violet\": \"Signal:Violet\",\n        \"me no sato\": \"芽の里\",\n        \"shuukyuu 8-ka\": \"週休8日\",\n        \"sagamiokiva\": \"さがみおきば\",\n        \"bochi bochi no ki\": \"ぼちぼちの木\",\n        \"pham\": \"PHAM!\",\n        \"henry plaza\": \"半里プラザー\",\n        \"shirokuroino\": \"白黒いの\",\n        \"riku no kotoutei\": \"陆の孤岛亭\",\n        \"kuniku no saku\": \"狗肉の策\",\n        \"taipeijin\": \"台北人\",\n        \"shinya koujou\": \"深夜工場\",\n        \"alpaca bokujou\": \"里アルパカ牧场\",\n        \"pink sakuhin okiba\": \"ピンク作品置き場\",\n        \"oden usagi\": \"おでんうさぎ\",\n        \"omochiya-san\": \"おもちやさん\",\n        \"shitsuren restaurant for men\": \"失恋レストラン FOR MEN\",\n        \"makuragi zabuton\": \"枕木ざぶとん\",\n        \"koko de chikubi o hitotsumami\": \"ここで乳首をひとつまみ\",\n        \"noumusai\": \"浓雾菜\",\n        \"nyoroman shouji\": \"にょろまん商事\",\n        \"praha keisanki\": \"プラハ計算機\",\n        \"mosoya\": \"毛想屋\",\n        \"mikamishi juukou\": \"三神氏重工\",\n        \"kudamonoichizu\": \"果物一途\",\n        \"mimitako seijin\": \"耳タコ星人\",\n        \"nukunuku jima\": \"ぬくぬく島\",\n        \"amagami honpo\": \"甘啮本铺\",\n        \"jyuu sensya usagitai\": \"重战车兔队\",\n        \"lv426\": \"LV426\",\n        \"circle mizusane\": \"サークルみづさね\",\n        \"milk farm tanaka\": \"ミルクファーム田中\",\n        \"agartha houeikyoku\": \"アガルタ放映局\",\n        \"menbou renpou\": \"めんぼーれんぽー\",\n        \"dukeyushimagurodon\": \"漬けゆしまぐろ丼\",\n        \"solo play\": \"そろぷれい\",\n        \"niji-teru\": \"虹照\",\n        \"kokumaro chousei tounyuu\": \"こくまろちょうせい豆乳\",\n        \"noya\": \"乃屋\",\n        \"touhikou\": \"陶惹好\",\n        \"yorunobando\": \"夜のバンド\",\n        \"shiba no shippo\": \"しばのしっぽ\",\n        \"futsu-no-tapioca-yasan\": \"ふつうのタピオカやさん\",\n        \"ushinomaruyaki\": \"ウシノマルヤキ\",\n        \"silver dog\": \"シルバードッグ\",\n        \"aburanabeshiki\": \"油锅式\",\n        \"gahahahahahaha\": \"がはははははは!\",\n        \"marshmalloya\": \"ましゅまろや\",\n        \"nanadou\": \"七堂\",\n        \"ayawasuca\": \"文忘蚊\",\n        \"sugomori bird\": \"巣ごもりバード\",\n        \"gensou pump\": \"幻想ポンプ\",\n        \"elizabeth collar\": \"エリザベスカラー\",\n        \"toropucchi\": \"とろぷっち\",\n        \"satou mitsu\": \"さとうみつ\",\n        \"mannen dokodoko dondodoko\": \"まんねんドコドコドンドドコ\",\n        \"uruudoki\": \"うるうどき\",\n        \"shironekoya\": \"白猫屋\",\n        \"mugen karaage\": \"無限からあげ\",\n        \"yonaka works\": \"ヨナカWorks\",\n        \"touketsu shamen\": \"卜ウケツ斜面\",\n        \"koutetsu shabon dama\": \"钢铁しゃぼん玉\",\n        \"hogeramu\": \"ほげらむ\",\n        \"mizushirazu\": \"みずしらず\",\n        \"yakitori teishoku\": \"焼きトリ定食\",\n        \"dakkoku kidoutai s.a.c\": \"脱壳机动队 S.A.C\",\n        \"mitsumitsuniku\": \"ミツミツにく\",\n        \"akirerushoujo\": \"アキレルショウジョ\",\n        \"fuzume\": \"ふずめ\",\n        \"hitakamoya\": \"ひたかもや\",\n        \"kasokuiki\": \"過疎区域\",\n        \"khaos distance\": \"カオス距離\",\n        \"tohosanhun\": \"徒歩三分\",\n        \"morunchi\": \"モルチ\",\n        \"gutsutoma\": \"ぐつとま\",\n        \"kaiten paradogs\": \"回転ParaDOGs\",\n        \"umi no sachi teishoku\": \"海の幸定食\",\n        \"tennensuidousui\": \"天然水道水\",\n        \"sorairo koubou\": \"空色工房\",\n        \"kakuran operetta\": \"攪乱オペレッタ\",\n        \"hikoushiki\": \"飞行式\",\n        \"toyoko daisyouten\": \"东横大赏典\",\n        \"maimu maimu\": \"まいむ～まいむ\",\n        \"yakimeshi modoki\": \"やきめしもどき\",\n        \"nananto\": \"ななんと\",\n        \"gogatsu souzaiten\": \"五月惣菜店\",\n        \"syunichi kansuu\": \"しゅにち関数\",\n        \"edamametei\": \"えだまめ亭\",\n        \"texteater\": \"Texteater\",\n        \"evolment tycoon\": \"EVOLMENT TYCOON\",\n        \"utsusumi onsen\": \"うつすみおんせん\",\n        \"dorayakiya\": \"どらやきや\",\n        \"kazumiya\": \"かずみ屋\",\n        \"high land\": \"HIGH:LAND\",\n        \"shibasaki shouji\": \"柴崎障子\",\n        \"ecchi ecchi daifuku\": \"えちえち大福\",\n        \"hoyhoy colo\": \"ホイホイこーろ\",\n        \"higashinodou\": \"東ノ堂\",\n        \"imagescript\": \"イメージscript\",\n        \"kawaiso nanoha nukeru\": \"かわいそうなのは抜ける\",\n        \"jinsei saboribu\": \"人生サボり部\",\n        \"mori no michi\": \"森の道\",\n        \"studio yama roman\": \"スタジオ山ロマン\",\n        \"inu ha sakana\": \"犬は鱼\",\n        \"mizukani\": \"みずかに\",\n        \"one hit wonder\": \"ONE HIT WONDER\",\n        \"fuwafuwa palette\": \"ふわふわパレット\",\n        \"marble dog\": \"MARBLE DOG\",\n        \"annbrellahouse\": \"あんぶれらはうす\",\n        \"citric acid1350\": \"クエン酸1750\",\n        \"tissue bako\": \"ティッシュ箱\",\n        \"mushoku muho\": \"無色ムホ\",\n        \"kushidatelier\": \"クシダトリエ\",\n        \"shiono room\": \"SHIONO ROOM\",\n        \"nanao heavy industries\": \"七尾重工\",\n        \"hoshoku shoujo\": \"捕食少女\",\n        \"mirakoku\": \"みら国\",\n        \"usonoki\": \"ウソノキ\",\n        \"tuyuiri kakinotane\": \"梅雨入り柿の種\",\n        \"ueshita\": \"UESHITA\",\n        \"minmintaro\": \"みんみんたろう\",\n        \"haimitsutou\": \"廃蜜灯\",\n        \"mrm lab\": \"MRMラボ\",\n        \"monkees\": \"モンキーズ\",\n        \"jalapeno chips\": \"ハラペーニョチップス\",\n        \"yattemiyou\": \"ヤッてみよう!\",\n        \"nekonokarintou\": \"ねこのかりんとう\",\n        \"chikara koso power\": \"力こそパワー\",\n        \"chachanako\": \"茶茶ナコ\",\n        \"shiro no ie\": \"シロの家\",\n        \"sankaku button\": \"三角ボタン\",\n        \"geppei bunchou\": \"月餅文蝶\",\n        \"nullspace\": \"NULLSPACE\",\n        \"sys-lila\": \"シスリラ\",\n        \"kaisendon\": \"カイセンドン\",\n        \"dandan dango\": \"段々団子\",\n        \"mobumomu ntr\": \"モブモムNTR\",\n        \"ice to choco\": \"あいすとちょこ\",\n        \"sakura suishou\": \"桜水晶\",\n        \"nekomimi to kuro mask\": \"猫耳と黒マスク\",\n        \"champion soft\": \"Champion Soft\",\n        \"dojiro books\": \"どじろーブックス\",\n        \"alwayshp1\": \"いつも死にかけ\",\n        \"shurashushushu\": \"しゅらしゅしゅしゅ\",\n        \"channel zakuro\": \"チャンネルざくろ\",\n        \"kitsune komachi\": \"きつねこまち\",\n        \"kaitendon\": \"海転丼\",\n        \"cre no monookiba\": \"シーレの物置場\",\n        \"studio park\": \"スタジオぱーく\",\n        \"donut church\": \"ドーナツ教会\",\n        \"netsuko\": \"ネツ湖\",\n        \"milkdou shoukai\": \"みるく堂商会\",\n        \"airimiash\": \"アイリミアーシュ\",\n        \"mokkorihan\": \"もっこりはん\",\n        \"zenjidou shimoneta seizou machine\": \"全自动下ネタ制造マシーン\",\n        \"shachi\": \"しゃち\",\n        \"mittsuman\": \"みっつまん\",\n        \"zyougesayuu\": \"上下左右\",\n        \"rakuenya\": \"乐园屋\",\n        \"torinoya\": \"とりの屋\",\n        \"gomikasu tarou\": \"五味滓太郎\",\n        \"kaoinshou zero\": \"顔印象零\",\n        \"yasudajuku\": \"保田塾\",\n        \"mahou no kinoko\": \"魔法のキノコ\",\n        \"suihanya\": \"炊飯屋\",\n        \"climbcrown\": \"クライムクラウン\",\n        \"takahiro no ie\": \"たかひろの家\",\n        \"shiosai\": \"潮騒\",\n        \"touzainanboku\": \"とうざいなんぼく\",\n        \"arijigoku\": \"蚁地狱\",\n        \"tianoblue\": \"ティアノブルー\",\n        \"nerimono koujou\": \"練り物工場\",\n        \"marosaan\": \"まろ茶庵\",\n        \"pachypodium\": \"ぱきぽぢうむ\",\n        \"europia\": \"ゆーろぴあ\",\n        \"iinchou no yabai yatsu\": \"委員長のやばいヤツ\",\n        \"gotarou no all night fuck\": \"ゴ太郎\",\n        \"ruri-iro special room\": \"瑠璃色特別室\",\n        \"harmonear\": \"HarmoNeaR\",\n        \"higedokoro\": \"ひげどころ\",\n        \"shinjiroya\": \"信じろや\",\n        \"pontaroya\": \"ぽんたろ家\",\n        \"watochip melonpan\": \"わとちっぷめろんぱん\",\n        \"miraiha kireini\": \"ミライハキレイニ\",\n        \"otonagokko iinkai\": \"おとなごっこ委員会\",\n        \"elica\": \"ELICA\",\n        \"gojihan\": \"五时半\",\n        \"netorare no tami\": \"ネトラレの民\",\n        \"7 rensa\": \"7连锁\",\n        \"citrusniper\": \"シトラスナイパー\",\n        \"unadon\": \"うなどぅーむ\",\n        \"torii-za\": \"鳥居座\",\n        \"sokuochi shoujo\": \"即オチ少女\",\n        \"nora nee-sama\": \"Nora姉様\",\n        \"ochaban\": \"お茶番\",\n        \"shaft\": \"SHAFT\",\n        \"kagayaku hoshizuna\": \"輝く星砂\",\n        \"chikyuujin\": \"ちきゅうじん\",\n        \"nyum production\": \"にゅむproduction\",\n        \"heppoko usagi cafe\": \"へっぽこうさぎ＊cafe\",\n        \"asakasha doujin\": \"朝花社同人\",\n        \"maisou no soko\": \"埋葬ノ底\",\n        \"kyuryo koen\": \"丘陵公園\",\n        \"chairoiyatsu\": \"ちゃいろいやつ\",\n        \"surudoiman no irutokoro\": \"するどいマンのいるところ\",\n        \"kinkai 100 kg\": \"金塊100kg\",\n        \"mukyou no utopia\": \"梦境的\",\n        \"nomiyagumi\": \"ノミヤ組\",\n        \"manaita koujou\": \"まな板工場\",\n        \"choukenkouya\": \"超健康屋\",\n        \"namekuzu\": \"なめくず\",\n        \"yuujikouji\": \"ゆうじこうじ\",\n        \"kuwaiya\": \"くわい屋\"\n    },\n    \"artist\": {\n        \"2\": \"2\",\n        \"7\": \"7\",\n        \"8\": \"8\",\n        \"13\": \"13\",\n        \"20\": \"廿\",\n        \"23\": \"23\",\n        \"24\": \"24\",\n        \"41\": \"41\",\n        \"66\": \"66\",\n        \"68\": \"68\",\n        \"76\": \"七六\",\n        \"88\": \"88\",\n        \"144\": \"144\",\n        \"222\": \"222\",\n        \"254\": \"254\",\n        \"346\": \"346\",\n        \"445\": \"445\",\n        \"543\": \"543\",\n        \"581\": \"581\",\n        \"691\": \"ムクイ\",\n        \"892\": \"八9二\",\n        \"961\": \"𝟡𝟞𝟙\",\n        \"1103\": \"1103\",\n        \"3104\": \"3104\",\n        \"7010\": \"7010\",\n        \"8000\": \"8000\",\n        \"33297\": \"33297\",\n        \"pop\": \"POP\",\n        \"oouso\": \"大嘘\",\n        \"peko\": \"ぺこ（かにビーム）\",\n        \"akaza\": \"あかざ\",\n        \"ishikei\": \"石惠\",\n        \"endou hiroto\": \"远藤弘土\",\n        \"happoubi jin\": \"八宝备仁\",\n        \"fujisaki hikari\": \"藤崎ひかり\",\n        \"ichiri\": \"イチリ\",\n        \"satou kibi\": \"さとうきび\",\n        \"nanpuu\": \"なんぷぅ\",\n        \"yukiu con\": \"雪雨こん\",\n        \"land sale\": \"兰户せる\",\n        \"emily\": \"emily\",\n        \"chiri\": \"ちり\",\n        \"kantoku\": \"监督\",\n        \"sayori\": \"Sayori\",\n        \"ideolo\": \"ideolo\",\n        \"sky\": \"SKY | Sky-FreeDom\",\n        \"m.vv\": \"M.vv\",\n        \"miyahara ayumu\": \"宫原步\",\n        \"nishikawa kou\": \"西川康\",\n        \"narusawa kei\": \"なるさわ景\",\n        \"akatsuki myuuto\": \"赤月みゅうと\",\n        \"kisaragi gunma\": \"如月群真\",\n        \"ohtomo takuji\": \"大友卓二\",\n        \"yamada no seikatu ga daiichi\": \"山田の性活が第一\",\n        \"asamura hiori\": \"朝丛志描\",\n        \"matsukawa\": \"松河\",\n        \"mmm\": \"暗黑えむ将军\",\n        \"facominn\": \"ふぁこみん\",\n        \"great mosu\": \"ぐれーともす\",\n        \"ringo sui\": \"りんご水\",\n        \"kanzaki muyu\": \"神崎むゆ\",\n        \"mizuyan\": \"みずやん\",\n        \"ranyues\": \"仴\",\n        \"horonamin\": \"ホロナミン\",\n        \"chiyami\": \"ちやみ\",\n        \"hanahanamaki\": \"花花卷\",\n        \"sousouman\": \"草草馒\",\n        \"muk\": \"MUK\",\n        \"ore p 1-gou\": \"俺P1号\",\n        \"menyoujan\": \"めんようじゃん\",\n        \"hodumi kaoru\": \"八月朔日珈瑠\",\n        \"watsuki rumi\": \"わつきるみ\",\n        \"soramoti\": \"そらモチ\",\n        \"blastbeat\": \"BLASTBEAT\",\n        \"takashina at masato\": \"高阶@圣人\",\n        \"shibayuki\": \"しばゆき\",\n        \"newmen\": \"NeWMeN\",\n        \"miyasaka miyu\": \"宫坂みゆ\",\n        \"miyasaka naco\": \"宫坂なこ\",\n        \"shimahara\": \"40原\",\n        \"hayakawa akari\": \"早川あかり\",\n        \"masaharu\": \"まさはる\",\n        \"ail\": \"あいる\",\n        \"saigado\": \"彩画堂\",\n        \"nanase meruchi\": \"ななせめるち\",\n        \"marushin\": \"丸新\",\n        \"amamiya mizuki\": \"雨宫ミズキ\",\n        \"mibu natsuki\": \"みぶなつき\",\n        \"ogata zen\": \"尾形全\",\n        \"himura kiseki\": \"比村奇石\",\n        \"cle masahiro\": \"吴マサヒロ\",\n        \"nakajima yuka\": \"なかじまゆか\",\n        \"fujima takuya\": \"藤真拓哉\",\n        \"hisasi\": \"Hisasi\",\n        \"akizora momidi\": \"秋空もみぢ\",\n        \"yuunagi sesina\": \"夕凪セシナ\",\n        \"ippongui\": \"一本杭\",\n        \"sekine hajime\": \"咳寝はじめ\",\n        \"mura osamu\": \"ムラオサム\",\n        \"sody\": \"Sody\",\n        \"fujiwara shunichi\": \"藤原俊一\",\n        \"ohigetan\": \"尾髭丹\",\n        \"kisaragi-mic\": \"如月みっく\",\n        \"kisaragi-ice\": \"如月あいす\",\n        \"takanashi rei\": \"小鸟游レイ\",\n        \"kawakami rokkaku\": \"川上六角\",\n        \"niro\": \"にろ\",\n        \"okuri banto\": \"送り万都\",\n        \"runrun\": \"るんるん\",\n        \"zonda\": \"ぞんだ\",\n        \"bekkankou\": \"べっかんこう\",\n        \"santa matsuri\": \"さんた茉莉\",\n        \"quick wiper\": \"クイック賄派\",\n        \"jigoku ouji\": \"地狱王子\",\n        \"kobayashi youkoh\": \"小林由高\",\n        \"saeki tatsuya\": \"佐伯达也\",\n        \"mamo williams\": \"まもウィリアムズ\",\n        \"koga nozomu\": \"古我望\",\n        \"shinokawa arumi\": \"篠川あるみ\",\n        \"ichio\": \"イチオ\",\n        \"shimada fumikane\": \"岛田文金\",\n        \"ryohka\": \"凉香\",\n        \"shinkai makoto\": \"新海诚\",\n        \"benet\": \"ベネット\",\n        \"ponpon\": \"ぽんぽん\",\n        \"tetsujin\": \"铁人\",\n        \"hiyoko\": \"ひよさん\",\n        \"syukurin\": \"シュクリーン\",\n        \"araki kanao\": \"あらきかなお\",\n        \"nagiyama\": \"那岐山\",\n        \"kittsu\": \"キッツ\",\n        \"neko toufu\": \"猫豆腐\",\n        \"nagare hyo-go\": \"流ひょうご\",\n        \"mizuki gyokuran\": \"瑞姬玉兰\",\n        \"tenchisouha\": \"天地争霸\",\n        \"arui ryou\": \"あるい椋\",\n        \"sasamori tomoe\": \"笹森トモエ\",\n        \"sasai saji\": \"笹井さじ\",\n        \"okazaki takeshi\": \"岡崎武士\",\n        \"harukaze soyogu\": \"春风ソヨグ\",\n        \"kasi\": \"华师\",\n        \"cheru\": \"ちぇる\",\n        \"umedama nabu\": \"梅玉奈部\",\n        \"aranmaru\": \"亚兰丸\",\n        \"tachibana omina\": \"立花オミナ\",\n        \"ibuki ren\": \"伊吹莲\",\n        \"uran\": \"URAN | 雨兰\",\n        \"billion\": \"Billion\",\n        \"nanao\": \"ななお\",\n        \"pirontan\": \"ピロンタン\",\n        \"tokyo yamane\": \"东京0ヤマネ\",\n        \"yuki higasinakano\": \"ゆーき東中野\",\n        \"nosada\": \"乃定\",\n        \"yukibuster z\": \"ユキバスターZ\",\n        \"roga\": \"RoGa\",\n        \"bonnari\": \"ぼんなり\",\n        \"komone ushio\": \"相音うしお\",\n        \"yuriko\": \"白河子\",\n        \"nanno koto\": \"南野琴\",\n        \"minazuki mikka\": \"水无月三日\",\n        \"minazuki juuzou\": \"水无月十三\",\n        \"minazuki tooru\": \"水无月彻\",\n        \"minazuki no-mu\": \"水无月のーむ\",\n        \"minazuki satoshi\": \"水无月サトシ\",\n        \"minazuki futago\": \"みなづきふたご\",\n        \"minazuki tsuyuha\": \"水无月露叶\",\n        \"minaduki kanna\": \"水无月神奈\",\n        \"karaage tarou\": \"からあげ太郎\",\n        \"okumori boy\": \"奥森ボウイ\",\n        \"sahara wataru\": \"砂原涉\",\n        \"amano kazumi\": \"天乃一水\",\n        \"ichiyo moka\": \"一叶モカ\",\n        \"naturalton\": \"なちゅらるとん\",\n        \"aono ribbon\": \"青野りぼん\",\n        \"hidaka toworu\": \"ヒダカトヲル\",\n        \"rara8\": \"らら8\",\n        \"medaka kenichi\": \"目高健一\",\n        \"kanna\": \"かん奈\",\n        \"kazabuki poni\": \"风吹ぽに\",\n        \"ouma tokiichi\": \"逢魔刻壹\",\n        \"momonoki fum\": \"百乃木富梦\",\n        \"miito shido\": \"三糸シド\",\n        \"motomiya mitsuki\": \"もとみやみつき\",\n        \"interstellar\": \"Interstellar\",\n        \"mikeou\": \"みけおう\",\n        \"hinata nao\": \"日向奈尾\",\n        \"sakurazaka tsuchiyu\": \"樱坂つちゆ\",\n        \"yamakaze ran\": \"やまかぜ嵐\",\n        \"anko\": \"あん子 | あんこ\",\n        \"kohaku.\": \"こはく。\",\n        \"kousaka jun\": \"香坂纯\",\n        \"gerotan\": \"げろたん\",\n        \"kozakura kumaneko\": \"小樱クマネコ\",\n        \"distance\": \"DISTANCE\",\n        \"kawaraya a-ta\": \"瓦屋A太\",\n        \"usou\": \"雨草\",\n        \"awayume\": \"淡梦\",\n        \"shiroo\": \"しろー\",\n        \"ryokucha\": \"绿茶\",\n        \"niimaru yuu\": \"ニイマルユウ\",\n        \"simon\": \"さいもん\",\n        \"tanaka aji\": \"田中あじ\",\n        \"unadon\": \"うな井\",\n        \"otakumin\": \"オタクミン\",\n        \"muneshiro\": \"むねしろ\",\n        \"haruki genia\": \"はるきゲにあ\",\n        \"ikegami tatsuya\": \"池上龙矢\",\n        \"pony r\": \"ポニーR\",\n        \"sakura yuu\": \"さくら★ゆう\",\n        \"yan-yam\": \"Yan-Yam\",\n        \"watanabe kenpo\": \"渡边宪法\",\n        \"kamiya zuzu\": \"神谷ズズ\",\n        \"tsumumaru hifu\": \"纺丸ひふ\",\n        \"yasakani an\": \"ヤサカニ·アン\",\n        \"ayachi\": \"あやち\",\n        \"kurori\": \"くろり\",\n        \"suwa izumo\": \"诹访出云\",\n        \"ishigami kazui\": \"石神一威\",\n        \"kamogawa tanuki\": \"鸭川狸\",\n        \"shiruka bakaudon\": \"知るかバカうどん\",\n        \"amekosame\": \"雨小雨\",\n        \"kiira\": \"きぃら～☆\",\n        \"kanoe\": \"庚\",\n        \"daichi kouta\": \"大地巧太\",\n        \"kylin\": \"Kylin\",\n        \"morishima kon\": \"森岛コン\",\n        \"mdo-h\": \"无道睿智\",\n        \"ginyou haru\": \"银曜晴\",\n        \"shiina\": \"シイナ\",\n        \"mikuta\": \"みくた\",\n        \"shibasaki syouzi\": \"柴崎しょうじ（柴崎ショージ）\",\n        \"tempo gensui\": \"天蓬元帅\",\n        \"mafuyu\": \"真冬\",\n        \"kakugari kyoudai\": \"カクガリ兄弟\",\n        \"matsumomo mahiru\": \"松百まひる\",\n        \"aoi masami\": \"苍海\",\n        \"itou life\": \"伊东life\",\n        \"taniguchi-san\": \"谷口さん\",\n        \"amou mari\": \"天羽真理\",\n        \"tsuttsu\": \"つっつ\",\n        \"minarai zouhyou\": \"见习杂兵\",\n        \"aya\": \"AYA | 蓝夜\",\n        \"oi shibako\": \"しばこ（司马淳子）\",\n        \"sato-satoru\": \"さとーさとる\",\n        \"gengorou\": \"源五郎\",\n        \"rokuyo ten\": \"六曜テン\",\n        \"mitsuru\": \"みつる\",\n        \"rage\": \"らげ\",\n        \"chouzetsu bishoujo mine\": \"超绝美少女mine\",\n        \"fried\": \"ふりいど\",\n        \"kouji\": \"孝治\",\n        \"sanada\": \"さなだ\",\n        \"shikei\": \"しけー\",\n        \"ruri\": \"ルリ | るり | 瑠璃\",\n        \"kohata tsunechika\": \"小旗つねちか\",\n        \"carn\": \"夏庵\",\n        \"okada kou\": \"冈田コウ\",\n        \"neko pantsu\": \"ねこパンツ\",\n        \"suzunone rena\": \"铃音れな\",\n        \"miyabi\": \"美矢火\",\n        \"pochi.\": \"ぽち。\",\n        \"hayami jun\": \"早见纯\",\n        \"katou chakichi\": \"加藤茶吉\",\n        \"taono kinoko\": \"汰尾乃きのこ\",\n        \"aikawa monako\": \"あいかわモナコ\",\n        \"tenma femio\": \"天马ふぇみお\",\n        \"kurusumin\": \"来须眠\",\n        \"chobi\": \"ちょび\",\n        \"norakuro nero\": \"野良黑ネロ\",\n        \"izumi yuujiro\": \"泉ゆうじろ～\",\n        \"itameshi\": \"炒饭\",\n        \"hiraoka ryuichi\": \"平冈龙一\",\n        \"maguro teikoku\": \"まぐろ帝国\",\n        \"pote\": \"ぽて\",\n        \"karakuchi choucream\": \"辛口しゅーくりーむ\",\n        \"mafen\": \"マフェン\",\n        \"kuroda kuro\": \"黑田クロ\",\n        \"ooooalikui\": \"おおおおありくい\",\n        \"juna juna juice\": \"ジュナジュナジュース\",\n        \"hiro hiroki\": \"ひろひろき\",\n        \"yone kinji\": \"与根金次\",\n        \"zankuro\": \"ザンクロー\",\n        \"wa\": \"WA\",\n        \"satou kuuki\": \"左藤空气\",\n        \"kouzuki hajime\": \"香月一花\",\n        \"furukawa remon\": \"古川れもん\",\n        \"nukunuku batten\": \"ぬくぬくばってん\",\n        \"sadokko\": \"さどっこ\",\n        \"izumi\": \"和泉\",\n        \"reizei\": \"冷泉\",\n        \"petenshi\": \"ペテン师\",\n        \"maruwa tarou\": \"丸和太郎\",\n        \"fujishima sei1go\": \"藤岛制1号\",\n        \"nanotsuki\": \"なのつき\",\n        \"norutaru\": \"のるたる\",\n        \"koi\": \"Koi\",\n        \"koishi chikasa\": \"小石ちかさ\",\n        \"koikawa minoru\": \"恋河ミノル\",\n        \"koiko irori\": \"恋小いろり\",\n        \"koi nobori\": \"Koiのぼり\",\n        \"koiken\": \"こいけん\",\n        \"koizumi hitsuji\": \"小泉ひつじ\",\n        \"hormone koijirou\": \"ホルモン恋次郎\",\n        \"koinu\": \"こいぬ\",\n        \"kinnotama\": \"またのんき▼\",\n        \"suka\": \"すか\",\n        \"amazon\": \"雨存\",\n        \"milk jam\": \"みるくジャム\",\n        \"isami nozomi\": \"伊佐美ノゾミ\",\n        \"souryuu\": \"双龙\",\n        \"umi suzume\": \"雨美すずめ\",\n        \"michiking\": \"米奇王\",\n        \"otabe sakura\": \"おたべさくら\",\n        \"ryo\": \"RYO\",\n        \"minori kenshirou\": \"实验四郎\",\n        \"umemura\": \"梅村\",\n        \"peter mitsuru\": \"ペーター・ミツル\",\n        \"tennouji kitsune\": \"天王寺狐\",\n        \"shikishima tenki\": \"敷岛天气\",\n        \"shikishima shoutarou\": \"敷岛昭太郎\",\n        \"siina yuuki\": \"椎名悠輝\",\n        \"manami tatsuya\": \"真未たつや\",\n        \"miharu\": \"美春 | ミハル\",\n        \"mush\": \"むっしゅ\",\n        \"haneinu\": \"跳犬\",\n        \"misaki takahiro\": \"三崎高博\",\n        \"sada ko-ji\": \"さだこーじ\",\n        \"mikami mika\": \"三上ミカ\",\n        \"nagare ippon\": \"流一本\",\n        \"hicoromo kyouichi\": \"绯衣响一\",\n        \"akaze kidai\": \"亚风纪代\",\n        \"yuuki\": \"悠宇树\",\n        \"ohkami ryosuke\": \"狼亮辅\",\n        \"jitsuma\": \"儿妻\",\n        \"kawaisaw\": \"可哀想\",\n        \"alpha alf layla\": \"α・アルフライラ\",\n        \"tori hrami\": \"鳥ハラミ\",\n        \"mori marimo\": \"もりまりも\",\n        \"fujisaka lyric\": \"藤坂リリック\",\n        \"mori kouichirou\": \"杜講一郎\",\n        \"sakura akami\": \"さくらあかみ\",\n        \"hatomugi munmun\": \"鳩麦月々\",\n        \"gegera toshikazu\": \"げげら俊和\",\n        \"eromame\": \"えろ豆\",\n        \"momoya chika\": \"桃屋チカ\",\n        \"ooshima tomo\": \"大岛智\",\n        \"hinemosu notari\": \"ひねもすのたり\",\n        \"kurasawa makoto\": \"倉澤まこと\",\n        \"bokujou nushi k\": \"牧场主K\",\n        \"youta\": \"夜歌 | よう太\",\n        \"tsumugi kyuuta\": \"紬きゅうた\",\n        \"minaga tsukune\": \"水賀つくね\",\n        \"cha mirai\": \"茶みらい\",\n        \"serizawa\": \"芹泽\",\n        \"toono suika\": \"远野西瓜\",\n        \"pierre yoshio\": \"ピエ～ル☆よしお\",\n        \"shinji mao\": \"真慈真雄\",\n        \"aoi manabu\": \"あおいまなぶ\",\n        \"izumi tsubasu\": \"和泉つばす\",\n        \"sakai hamachi\": \"堺はまち\",\n        \"kannazuki nem\": \"神無月ねむ\",\n        \"sakurabe notos\": \"桜部のとす\",\n        \"misaki kurehito\": \"深崎暮人\",\n        \"kuroya shinobu\": \"黑谷忍\",\n        \"san sheng wan\": \"三生万\",\n        \"el\": \"える\",\n        \"mango pudding\": \"まんごープリン\",\n        \"wakamiya santa\": \"若宫参太\",\n        \"shungiku tenudon\": \"春菊天うどん\",\n        \"mikaduki neko\": \"三日月ネコ\",\n        \"aihara shouta\": \"相原翔太\",\n        \"mimofu\": \"みもふ\",\n        \"takatuki nato\": \"鷹月ナト\",\n        \"shiratama\": \"白玉\",\n        \"nohara hiromi\": \"野原ひろみ\",\n        \"higashino mikan\": \"東野みかん\",\n        \"dr.bug\": \"Dr.阿虫\",\n        \"ameto yuki\": \"あめとゆき\",\n        \"kenkou cross\": \"健康クロス\",\n        \"yanagawa rio\": \"やながわ理央\",\n        \"kakuzatou\": \"核座头\",\n        \"kaminagi\": \"神凪\",\n        \"twinbox\": \"TwinBox\",\n        \"izuminoaru\": \"イズミノアル\",\n        \"nora shinji\": \"白野じん\",\n        \"shihachiro\": \"しはちろ\",\n        \"daikoukoku shinbun\": \"大広告新聞\",\n        \"yuuki hagure\": \"憂姫はぐれ\",\n        \"paru\": \"パル\",\n        \"rikatan\": \"利华炭☆\",\n        \"jackdempa\": \"弱电波\",\n        \"hiyama izumi\": \"火山一角\",\n        \"kazuma muramasa\": \"和马村政\",\n        \"amatsuka china\": \"天使ちな\",\n        \"denki shougun\": \"电气将军\",\n        \"gibuchoko\": \"ぎヴちょこ\",\n        \"sinbo tamaran\": \"神保玉兰\",\n        \"kaenuco\": \"かえぬこ\",\n        \"arikawa satoru\": \"有河サトル\",\n        \"yui toshiki\": \"唯登诗树\",\n        \"kitahara tomoe\": \"北原朋萌。\",\n        \"kizaki yuuri\": \"树崎祐里\",\n        \"shio kazunoko\": \"塩かずのこ\",\n        \"muska\": \"むすか\",\n        \"amaduyu tatsuki\": \"甘露树\",\n        \"kawata hisashi\": \"カワタヒサシ\",\n        \"mitsumi misato\": \"みつみ美里\",\n        \"nakamura takeshi\": \"なかむらたけし\",\n        \"minase syu\": \"水濑修\",\n        \"yoshiura kazuya\": \"由浦カズヤ\",\n        \"erect sawaru\": \"エレクトさわる\",\n        \"katsurai yoshiaki\": \"桂井よしあき\",\n        \"sanazura hiroyuki\": \"さなづらひろゆき\",\n        \"takamura wamu\": \"高村わむ\",\n        \"menoko\": \"めの子\",\n        \"tamon\": \"たもん\",\n        \"haruaki\": \"明彰\",\n        \"oomori yoshiharu\": \"おおもりよしはる\",\n        \"amedamacon\": \"飴玉コン\",\n        \"eisen\": \"英战\",\n        \"harigane shinshi\": \"针金绅士\",\n        \"kazuhiro\": \"一弘\",\n        \"lobster\": \"ロブ☆スター\",\n        \"magifuro konnyaku\": \"magifuro蒟蒻\",\n        \"ueda john\": \"うえだジョン\",\n        \"wenajii\": \"ヱナジー\",\n        \"zeno\": \"是乃\",\n        \"imizu\": \"威未図\",\n        \"shindou hajime\": \"新道一\",\n        \"type.90\": \"TYPE.90\",\n        \"bu-chan\": \"ぶーちゃん\",\n        \"sasahiro\": \"笹弘\",\n        \"haikawa hemlen\": \"灰川ヘムレン\",\n        \"harasho\": \"はらしょ\",\n        \"nishimu\": \"にしむ\",\n        \"narita koh\": \"成田コウ\",\n        \"shiden\": \"しでん\",\n        \"mira\": \"みら | 未镜\",\n        \"fuusen club\": \"風船クラブ\",\n        \"shioroku\": \"シオロク\",\n        \"kaname aomame\": \"要青豆\",\n        \"kouno yukiyo\": \"こうのゆきよ\",\n        \"seno fumiki\": \"濑野文希\",\n        \"shimuu\": \"しゃむ\",\n        \"rie-chan 14-sai\": \"りえちゃん14歳\",\n        \"fukori\": \"フコリ\",\n        \"shinyashiki\": \"新屋敷\",\n        \"kanzume\": \"KANZUME\",\n        \"kishimen\": \"きしめん\",\n        \"ken-1\": \"Ken-1\",\n        \"midoh tsukasa\": \"御堂つかさ\",\n        \"oyama yasunaga\": \"尾山泰永\",\n        \"kino hitoshi\": \"鬼ノ仁\",\n        \"tam-u\": \"Tam-U\",\n        \"lunaluku\": \"るなるく\",\n        \"shiokonbu\": \"しおこんぶ\",\n        \"mon-mon\": \"MON-MON\",\n        \"kohoshi moe\": \"小星萌\",\n        \"kurumiko\": \"胡桃子\",\n        \"hirari\": \"ひらり\",\n        \"aoi nagisa\": \"葵渚\",\n        \"alde hyde\": \"アルデヒド\",\n        \"mutsuno hexa\": \"六ツ野へきさ\",\n        \"takenokoya\": \"筍屋\",\n        \"ankoku tiger\": \"暗黒タイガー\",\n        \"kakkii\": \"かっきー\",\n        \"shizuki shuya\": \"紫月秋夜\",\n        \"himukai kyousuke\": \"日向恭介\",\n        \"fuyutugu\": \"冬嗣\",\n        \"mogudan\": \"モグダン\",\n        \"100yen locker\": \"100円ロッカー\",\n        \"hana hook\": \"华フック\",\n        \"taki minashika\": \"滝美梨香\",\n        \"hirame\": \"ヒラメ | 比目鱼\",\n        \"minakami rinka\": \"水上凛香\",\n        \"andou shuki\": \"安藤周记\",\n        \"nakata shunpei\": \"中田春平\",\n        \"kurun\": \"くるん\",\n        \"inuzumi masaki\": \"戌角柾\",\n        \"kurashima tomoyasu\": \"仓岛丈康\",\n        \"hanamo daiou\": \"はなも大王\",\n        \"mizu gokiburi\": \"水ゴキブリ\",\n        \"kazumu\": \"一梦\",\n        \"rentb\": \"Rentb\",\n        \"ren\": \"REN\",\n        \"kotera\": \"コテラ\",\n        \"fei\": \"飞燕\",\n        \"miyano kintarou\": \"宫野金太郎\",\n        \"sumino yuuji\": \"速野悠二\",\n        \"shouji ayumu\": \"小路步\",\n        \"maka fushigi\": \"魔訶不思議\",\n        \"draw2\": \"土狼弐\",\n        \"muronaga chaashuu\": \"室永叉烧\",\n        \"sawao\": \"さわお\",\n        \"kudou hiroshi\": \"工藤洋\",\n        \"tsurui\": \"鹤井\",\n        \"okiraku nic\": \"お気楽ニック\",\n        \"kanten\": \"寒天\",\n        \"usubeni sakurako\": \"うすべに桜子\",\n        \"nori\": \"糊\",\n        \"mitsugi\": \"ミツギ\",\n        \"seura isago\": \"濑浦沙悟\",\n        \"tsukudani norio\": \"佃煮のりお\",\n        \"kasugano tobari\": \"春日野トバリ\",\n        \"hisaka hazara\": \"檜坂はざら\",\n        \"sumiyao\": \"すみやお\",\n        \"ikkyuu\": \"一休\",\n        \"hasemi ryo\": \"长谷见亮\",\n        \"summer\": \"サマー\",\n        \"tokitsu mika\": \"都月十佳\",\n        \"arigase shinji\": \"ありがせしんじ\",\n        \"arisaka k\": \"有坂K\",\n        \"asakaze abyss\": \"朝風あびす\",\n        \"youki akira\": \"优希辉\",\n        \"matsuda k\": \"マツダK\",\n        \"amanatsu aki\": \"甘夏あき\",\n        \"magukappu\": \"马克杯\",\n        \"michiyon\": \"みちよん\",\n        \"hijiri tsukasa\": \"圣☆司\",\n        \"tsukino jyogi\": \"月野定规\",\n        \"gotou junji\": \"后藤润二\",\n        \"nogi makoto\": \"のぎまこと\",\n        \"shinonome ryu\": \"东云龙\",\n        \"nikusyo\": \"弐駆緒\",\n        \"shimanto youta\": \"四万十曜太\",\n        \"sugou hiroyuki\": \"菅生博倖\",\n        \"bow rei\": \"某零\",\n        \"inochi wazuka\": \"命わずか\",\n        \"hiduki yayoi\": \"ひづき夜宵\",\n        \"komori kei\": \"こもりけい\",\n        \"toyama teiji\": \"戸山テイジ\",\n        \"komiya hitoma\": \"こみやひとま\",\n        \"hitsuji takako\": \"ひつじたかこ\",\n        \"mizoro tadashi\": \"深泥正\",\n        \"q-gaku\": \"Q-Gaku\",\n        \"kemigawa mondo\": \"検見川もんど\",\n        \"tadano akira\": \"只野あきら\",\n        \"kaisen chuui\": \"开栓注意\",\n        \"ozy\": \"オジィ\",\n        \"sakurai shizuku\": \"桜井雫\",\n        \"kokutou nikke\": \"黒糖ニッケ\",\n        \"makuwauni\": \"まくわうに\",\n        \"seki\": \"赤\",\n        \"monorino\": \"モノリノ\",\n        \"tomohiro kai\": \"智弘カイ\",\n        \"kuribayashi chris\": \"栗林クリス\",\n        \"nagai wataru\": \"长井わたる\",\n        \"suzuhane suzu\": \"すずはねすず\",\n        \"tanaka decilitre\": \"田中竕\",\n        \"yahiro\": \"黑小枝\",\n        \"sabamu\": \"鲭梦\",\n        \"fujise akira\": \"藤瀬あきら\",\n        \"shouryuu\": \"升龙\",\n        \"kisaragi wataru\": \"如月わたる\",\n        \"mizone\": \"みぞね\",\n        \"herokey\": \"ヒーローキィ\",\n        \"mikanuji\": \"みかん氏\",\n        \"honda arima\": \"ほんだありま\",\n        \"oshiki hitoshi\": \"御敷仁\",\n        \"shimaji\": \"しまじ\",\n        \"tenro aya\": \"天路あや\",\n        \"meme50\": \"メメ50\",\n        \"menea the dog\": \"メネア・ザ・ドッグ\",\n        \"makibe kataru\": \"牧部かたる\",\n        \"ikeshita maue\": \"池下真上\",\n        \"ikuhana niro\": \"几花にいろ\",\n        \"c.r\": \"しーあーる\",\n        \"chimosaku\": \"ちもさく\",\n        \"otoo\": \"ぉとぉ\",\n        \"belu\": \"BeLu\",\n        \"yotsuba chika\": \"四葉チカ\",\n        \"hashimoto takashi\": \"桥本隆\",\n        \"suzuhira hiro\": \"铃平广\",\n        \"nishimata aoi\": \"西又葵\",\n        \"hadumi rio\": \"羽純りお\",\n        \"matsushita makako\": \"松下まかこ\",\n        \"sakura hanpen\": \"桜はんぺん\",\n        \"hatori piyoko\": \"羽鳥ぴよこ\",\n        \"naenae\": \"なえなえ\",\n        \"takayaki\": \"たかやKi\",\n        \"uonuma yuu\": \"うおぬまゆう\",\n        \"amamine\": \"あまみね\",\n        \"niki\": \"にき\",\n        \"rokudou itsuki\": \"六九導イツキ\",\n        \"rubi-sama\": \"るび様\",\n        \"wori\": \"ヲリ\",\n        \"mura\": \"むら\",\n        \"tsurusaki takahiro\": \"鹤崎贵大\",\n        \"fusataka sikibu\": \"ふさたか式部\",\n        \"kutani\": \"九手児\",\n        \"takei masaki\": \"竹井正树\",\n        \"yamaki rin\": \"山木铃\",\n        \"shokushu-san\": \"触手さん\",\n        \"wazakita\": \"わざきた\",\n        \"erodezain koubou\": \"エロデザイン工房\",\n        \"coffee-kizoku\": \"咖啡贵族\",\n        \"rindou\": \"龙胆\",\n        \"iruma kamiri\": \"いるまかみり\",\n        \"zakkin\": \"杂菌\",\n        \"aotsu umihito\": \"蒼津ウミヒト\",\n        \"shiina soutyou\": \"椎名总长\",\n        \"hikage eiji\": \"日阴影次\",\n        \"amakura\": \"アマクラ\",\n        \"ebi193\": \"えび193\",\n        \"shinama\": \"しなま\",\n        \"mars\": \"Mars\",\n        \"yuran\": \"ゆらん\",\n        \"toumi haruka\": \"遠海ハルカ\",\n        \"chris\": \"CHRIS\",\n        \"shiromaki mizuga\": \"みずが\",\n        \"alpine\": \"あるぴーぬ\",\n        \"yuuka nonoko\": \"夕華ののこ\",\n        \"hakuho\": \"白凤\",\n        \"ooshima ryou\": \"大嶋亮\",\n        \"aeba fuchi\": \"飨庭渊\",\n        \"hakka yuki\": \"薄荷ゆき\",\n        \"derauea\": \"でらうえあ\",\n        \"rurukichi\": \"るるキチ\",\n        \"unasaka\": \"うなさか\",\n        \"anmi\": \"Anmi\",\n        \"kishizuka kenji\": \"木静谦二\",\n        \"kanenomori sentarou\": \"金ノ森銭太郎\",\n        \"hazuki kaoru\": \"八月薫\",\n        \"kenzaki mikuri\": \"犬崎みくり\",\n        \"kofunami\": \"こふなみ\",\n        \"touma itsuki\": \"东磨树\",\n        \"asaba yuu\": \"浅葉ゆう\",\n        \"akizuki ryou\": \"秋月亮\",\n        \"nanigawa rui\": \"名仁川るい\",\n        \"ohkura kazuya\": \"大藏一也\",\n        \"psycocko\": \"碎骨子\",\n        \"hanainu\": \"花犬\",\n        \"madoutei\": \"魔童贞\",\n        \"ra\": \"RA\",\n        \"yohane\": \"ヨハネ\",\n        \"akiduki tsukasa\": \"秋月つかさ\",\n        \"hanamiya natsuka\": \"花宮なつか\",\n        \"nagayama yuunon\": \"永山ゆうのん\",\n        \"sakura denbu\": \"樱田麸\",\n        \"sin-go\": \"Sin-Go\",\n        \"tsunagami\": \"つながみ\",\n        \"yassy\": \"YASSY\",\n        \"rokuwata tomoe\": \"六羽田トモエ\",\n        \"souma\": \"相马\",\n        \"annekuma\": \"ANNEKUMA\",\n        \"108 gou\": \"108号\",\n        \"akazawa red\": \"あかざわRED\",\n        \"r-koga\": \"あ～る・こが\",\n        \"ashimoto yoika\": \"あしもと☆よいか\",\n        \"awaji himeji\": \"あわじひめじ\",\n        \"itou\": \"いトう\",\n        \"usashiro mani\": \"うさ城まに\",\n        \"ookami uo\": \"オオカミうお\",\n        \"kawady max\": \"カワディMAX\",\n        \"kimio tamako\": \"きみおたまこ\",\n        \"quzilax\": \"クジラックス\",\n        \"gorgeous takarada\": \"ゴージャス宝田\",\n        \"zaki zaraki\": \"ザキザラキ\",\n        \"tamachi yuki\": \"たまちゆき\",\n        \"bar peachpit\": \"バー・ぴぃちぴっと\",\n        \"higashiyama show\": \"东山翔\",\n        \"yoshino\": \"よしの\",\n        \"minion\": \"みにおん\",\n        \"nishikibasami\": \"二式鋏\",\n        \"onizuka naoshi\": \"鬼束直\",\n        \"hayashibara hikari\": \"林原ひかり\",\n        \"suzuki kyoutarou\": \"铃木狂太郎\",\n        \"nekogen\": \"猫玄\",\n        \"kiya shii\": \"木谷椎\",\n        \"molokonomi\": \"平屋のぼり\",\n        \"maeshima ryou\": \"前岛龙\",\n        \"yamazaki kazuma\": \"山崎かずま\",\n        \"momonosuke\": \"桃之助\",\n        \"murian\": \"无有利安\",\n        \"mutou mato\": \"武藤まと\",\n        \"kobayashi oukei\": \"小林王桂\",\n        \"tanabe kyou\": \"田边京\",\n        \"kiai neko\": \"樺島あきら\",\n        \"charu\": \"茶琉\",\n        \"tamahagane\": \"たまはがね\",\n        \"nakani\": \"なかに\",\n        \"mizuryu kei\": \"水龙敬\",\n        \"oyari ashito\": \"大枪苇人\",\n        \"hagiya masakage\": \"はぎやまさかげ\",\n        \"siina tai\": \"椎名鲷\",\n        \"greenteaneko\": \"GreenTeaNeko\",\n        \"kuroshiro neko\": \"黑白音子\",\n        \"dean\": \"ディーン\",\n        \"mizutani rin\": \"みずたにりん\",\n        \"ayakase chiyoko\": \"綾枷ちよこ\",\n        \"ayakase riberi\": \"綾枷りべり\",\n        \"yuasa\": \"ゆあさ\",\n        \"genzaburoh\": \"Genzaburoh\",\n        \"smac\": \"SMAC\",\n        \"hie himiko\": \"日枝御子\",\n        \"hisakawa tinn\": \"久川ちん\",\n        \"mizuhara yuu\": \"水原优\",\n        \"hasumi milk\": \"はすみみるく\",\n        \"karasu\": \"空巢\",\n        \"akiha at\": \"あきは@\",\n        \"amagiri mio\": \"雨雾MIO\",\n        \"bifidus\": \"ビフィダス\",\n        \"ice\": \"ICE\",\n        \"kumoemon\": \"くもえもん\",\n        \"kuro fn\": \"クロFn\",\n        \"lorica\": \"Lorica\",\n        \"nakayama tetsugaku\": \"中山哲学\",\n        \"nisepakuman-san\": \"偽パクマンさん\",\n        \"oobayashi mori\": \"大林森\",\n        \"piero\": \"PIえろ\",\n        \"saida kazuaki\": \"さいだ一明\",\n        \"sayryu\": \"性龙\",\n        \"tsukasawa\": \"塚泽\",\n        \"yukiguni omaru\": \"雪國おまる\",\n        \"asakura mitsuru\": \"朝仓满\",\n        \"hase tsubura\": \"长谷圆\",\n        \"herohero tom\": \"へろへろTom\",\n        \"hoshino ryuichi\": \"星野龙一\",\n        \"inoue nanaki\": \"井上七树\",\n        \"macaroni and cheese\": \"マカロニandチーズ\",\n        \"mozu k\": \"もずK\",\n        \"natsuka q-ya\": \"奈塚Q弥\",\n        \"sakaki utamaru\": \"榊歌丸\",\n        \"yontarou\": \"よんたろう\",\n        \"hamada yoshikadu\": \"浜田よしかづ\",\n        \"meowwithme\": \"MeowWithMe\",\n        \"nishizaki eimu\": \"西崎えいむ\",\n        \"mutsumi masato\": \"むつみまさと\",\n        \"samerupa\": \"さめるぱ\",\n        \"yumemi\": \"ゆめみ\",\n        \"watsuki ayamo\": \"わつき彩雲\",\n        \"yataro\": \"やたろー\",\n        \"poco\": \"ポコ\",\n        \"mucha\": \"むちゃ\",\n        \"fujimaru\": \"藤丸\",\n        \"gechu\": \"ゲッチュ\",\n        \"owanta\": \"Owanta\",\n        \"mikan\": \"みかん\",\n        \"amanatsu mero\": \"甘夏メロ\",\n        \"sayika\": \"Sayika\",\n        \"rihito akane\": \"りひと茜\",\n        \"abe inori\": \"阿部いのり\",\n        \"akuochisukii sensei\": \"アクオチスキー先生\",\n        \"ameyama denshin\": \"雨山电信\",\n        \"aoyama mayama\": \"青山まやま\",\n        \"bitch goigostar\": \"ビッチ☆ゴイゴスター\",\n        \"danbo\": \"ダンボ\",\n        \"dunga\": \"ドゥンガ\",\n        \"musashi daichi\": \"武蔵ダイチ\",\n        \"nukunuku orange\": \"ヌクヌクオレンジ\",\n        \"onikubo hirohisa\": \"鬼窪浩久\",\n        \"sagattoru\": \"サカッとる\",\n        \"tamaki\": \"TAMAKI\",\n        \"ahemaru\": \"アヘ丸\",\n        \"akikusa peperon\": \"秋草ぺぺろん\",\n        \"drachef\": \"ドラチェフ\",\n        \"hikage hinata\": \"日陰ひなた\",\n        \"kijima daisyarin\": \"鬼岛大车轮\",\n        \"minikoara\": \"瑞稀樱花\",\n        \"nanairo\": \"ナナイロ\",\n        \"ryuuta\": \"竜太\",\n        \"shomu\": \"しょむ\",\n        \"sunagawa tara\": \"砂川多良\",\n        \"amahara\": \"天原\",\n        \"arino hiroshi\": \"ありのひろし\",\n        \"cheewts\": \"ちいうつ\",\n        \"katsura airi\": \"桂あいり\",\n        \"koori\": \"粉织\",\n        \"red-rum\": \"RED-RUM\",\n        \"ryoh-zoh\": \"椋藏\",\n        \"shouji nigou\": \"庄司二号\",\n        \"henrybird\": \"半里バード9\",\n        \"homing\": \"ホーミング\",\n        \"kageno illyss\": \"影乃いりす\",\n        \"katou jun\": \"加藤じゅん\",\n        \"kuroda ariake\": \"黑田有明\",\n        \"miyabi tatsuto\": \"みやびたつと\",\n        \"mizuki eimu\": \"みずきえいむ\",\n        \"momon kooji\": \"ももんこーじ\",\n        \"monogusa wolf\": \"ものぐさうるふ\",\n        \"moroha\": \"乙\",\n        \"naitou satoshi\": \"乃藤悟志\",\n        \"oonuki makuri\": \"大貫まくり\",\n        \"sabashi renya\": \"左桥レンヤ\",\n        \"t.k-1\": \"T.K-1\",\n        \"tachibana surimu\": \"橘すりむ\",\n        \"takahashi kobato\": \"高橋こばと\",\n        \"takashita takashi\": \"たかしたたかし\",\n        \"yokoi rego\": \"横井レゴ\",\n        \"amayumi\": \"あまゆみ\",\n        \"ameya kirica\": \"飴屋きりか\",\n        \"arsenal\": \"アーセナル\",\n        \"asagi ryu\": \"あさぎ龍\",\n        \"hayano rinta\": \"早野りんた\",\n        \"jenigata\": \"ジェニガタ\",\n        \"mita kurumi\": \"みたくるみ\",\n        \"mutsuki\": \"睦月\",\n        \"shinobu tanei\": \"志乃武丹英\",\n        \"cuzukago\": \"くずかご\",\n        \"kojima miu\": \"儿岛未生\",\n        \"kokudakaya\": \"こくだかや\",\n        \"kuroishi ringo\": \"黒石りんご\",\n        \"mokuzou\": \"杢臓\",\n        \"suitekiya yuumin\": \"水滴家悠民\",\n        \"takasugi kou\": \"タカスギコウ\",\n        \"uramac\": \"うらまっく\",\n        \"isawa nohri\": \"いさわのーり\",\n        \"kinomoto anzu\": \"木之本杏\",\n        \"misumi tsubaki\": \"三澄ツバキ\",\n        \"nekodanshaku\": \"猫男爵\",\n        \"oosawa ofuda\": \"大沢おふだ\",\n        \"ryoumoto hatsumi\": \"岭本八美\",\n        \"salad\": \"さらだ\",\n        \"sawayaka samehada\": \"さわやか鮫肌\",\n        \"ueda yuu\": \"上田裕\",\n        \"usakun\": \"兔君\",\n        \"chiguchi miri\": \"チグチミリ\",\n        \"fuyuno mikan\": \"冬野みかん\",\n        \"hikoma hiroyuki\": \"彦馬ヒロユキ\",\n        \"imotoka tsuyuki\": \"芋とか露木\",\n        \"natsuki kiyohito\": \"夏木きよひと\",\n        \"noise\": \"Noise\",\n        \"nukkoru\": \"ぬっこる\",\n        \"ponsuke\": \"ポンスケ\",\n        \"satuyo\": \"さつよ\",\n        \"soine\": \"添い寝\",\n        \"takaoka motofumi\": \"高冈基文\",\n        \"sink\": \"SINK\",\n        \"warabino matsuri\": \"蕨野まつり\",\n        \"nandz\": \"NandZ\",\n        \"urakan\": \"U罗汉\",\n        \"shiwasu horio\": \"師走ほりお\",\n        \"pokachu\": \"ぽかちゅ\",\n        \"wasabi\": \"わさび | 和錆\",\n        \"naruko hanaharu\": \"鸣子花春\",\n        \"bosshi\": \"ぼっしぃ\",\n        \"inu\": \"犬\",\n        \"takeda hiromitsu\": \"武田弘光\",\n        \"shiwasu no okina\": \"师走之翁\",\n        \"shindol\": \"新堂エル\",\n        \"otono natsu\": \"音乃夏\",\n        \"yasui riosuke\": \"ヤスイリオスケ\",\n        \"kizuki aruchu\": \"鬼月あるちゅ\",\n        \"sameda koban\": \"さめだ小判\",\n        \"koume keito\": \"小梅京人\",\n        \"thomas\": \"藤ます\",\n        \"mutsutake\": \"睦茸\",\n        \"midori no rupe\": \"绿のルーペ\",\n        \"homunculus\": \"ホムンクルス\",\n        \"lunch\": \"らんち\",\n        \"inoue kiyoshirou\": \"胃之上奇嘉郎\",\n        \"namonashi\": \"无望菜志\",\n        \"oda non\": \"织田non\",\n        \"nemunemu\": \"ネムネム\",\n        \"makita masaki\": \"莳田真记\",\n        \"hoshiai hilo\": \"星逢ひろ\",\n        \"takase yuu\": \"鹰势优\",\n        \"hiiragi masaki\": \"柊柾葵\",\n        \"po-ju\": \"ぽ～じゅ\",\n        \"abu hyaku\": \"あぶひゃく\",\n        \"suehirogari\": \"末广雅里\",\n        \"kuritsu yoshihiro\": \"くりつよしひろ\",\n        \"guglielmo\": \"ぐりえるも\",\n        \"kusano yuu\": \"草野ゆぅ\",\n        \"matsuno susumu\": \"松野进\",\n        \"murasaki syu\": \"むらさき朱\",\n        \"nishi iori\": \"西安\",\n        \"ohara tometa\": \"小原トメ太\",\n        \"sakura koharu\": \"さくら小春\",\n        \"junkos\": \"淳子\",\n        \"hoshino lily\": \"星野リリィ\",\n        \"heriyama\": \"缘山\",\n        \"nasuyama\": \"茄子山\",\n        \"misasagi task\": \"陵たすく\",\n        \"oyu no kaori\": \"お湯の香り\",\n        \"kojima saya\": \"小岛纱\",\n        \"mitsuki sakura\": \"美月樱\",\n        \"tmzf\": \"TMZF\",\n        \"kamikaze makoto\": \"神风诚\",\n        \"saikawa akoya\": \"斎川あこや\",\n        \"saikawa yusa\": \"さいかわゆさ\",\n        \"kita kaduki\": \"北かづき\",\n        \"mach ii\": \"まぁくII\",\n        \"tatsunami youtoku\": \"辰波要徳\",\n        \"tinkle\": \"Tinkle\",\n        \"kiriyama\": \"桐山\",\n        \"takatsu\": \"高津\",\n        \"gekkoji\": \"激昂寺\",\n        \"monety\": \"もねてぃ\",\n        \"hyji\": \"灰司\",\n        \"rokuichi\": \"六壹\",\n        \"yakumi benishouga\": \"药味红生姜\",\n        \"takeyuu\": \"タケユウ\",\n        \"pokka\": \"ぽっか\",\n        \"hiroshiki\": \"宏式\",\n        \"tonda\": \"Tonda\",\n        \"matsu takeshi\": \"松武\",\n        \"matsuzaki tsukasa\": \"松崎司\",\n        \"zootan\": \"ZooTAN\",\n        \"redlight\": \"REDLIGHT\",\n        \"yukie\": \"ゆき恵\",\n        \"raven\": \"RAVEN\",\n        \"sujoyushi\": \"酢醤油氏\",\n        \"date\": \"DATE\",\n        \"kase daiki\": \"加濑大辉\",\n        \"nakamura kumarin\": \"中村くまりん\",\n        \"masago\": \"まさご\",\n        \"ron\": \"RON\",\n        \"zounose\": \"ゾウノセ\",\n        \"suzuka sakito\": \"凉加早希兔\",\n        \"sugi g\": \"すぎぢー\",\n        \"kanzaki maguro\": \"潤咲まぐろ\",\n        \"sakagaki\": \"サカガキ\",\n        \"leslie brown\": \"Leslie Brown\",\n        \"satsuki imonet\": \"皋月芋网\",\n        \"chiyoko\": \"ちよこ\",\n        \"marui maru\": \"丸居まる\",\n        \"asuhiro\": \"アスヒロ\",\n        \"bomb\": \"ボム\",\n        \"eguchi jaws\": \"江口ジョーズ\",\n        \"eno yukimi\": \"榎ゆきみ\",\n        \"esuke\": \"えーすけ\",\n        \"gintarou\": \"ぎん太郎\",\n        \"hardboiled yoshiko\": \"ハードボイルドよし子\",\n        \"hinahara emi\": \"雛原えみ\",\n        \"hitori\": \"火鸟\",\n        \"karasuma yayoi\": \"乌丸弥生\",\n        \"napata\": \"なぱた\",\n        \"nokin\": \"のきん\",\n        \"savan\": \"SAVAN\",\n        \"sugaishi\": \"すがいし\",\n        \"sumiya\": \"スミヤ\",\n        \"takashi\": \"タカシ\",\n        \"ushino kandume\": \"牛野缶诘\",\n        \"yahiro pochi\": \"八寻ぽち\",\n        \"yanyo\": \"やんよ\",\n        \"yuzuha\": \"ユズハ\",\n        \"yamagara tasuku\": \"山雀たすく\",\n        \"zumikuni\": \"ズミクニ\",\n        \"juder\": \"Juder\",\n        \"nagase yutaka\": \"长濑ゆたか\",\n        \"yumeno owari\": \"ユメのオワリ\",\n        \"kamimiya kozue\": \"神宫梢\",\n        \"anzu\": \"庵ズ\",\n        \"lu renbing\": \"路人丙\",\n        \"takei ooki\": \"タケイオーキ\",\n        \"azuma tesshin\": \"东铁神\",\n        \"akagi asahito\": \"赤城あさひと\",\n        \"benimura karu\": \"红村かる\",\n        \"bota mochito\": \"牡丹もちと\",\n        \"cuvie\": \"Cuvie\",\n        \"hazuki yuto\": \"羽月ユウト\",\n        \"hinasaki yo\": \"雏咲叶\",\n        \"naruko\": \"鸣湖（平间ひろかず）\",\n        \"hishigata tomaru\": \"ひし形とまる\",\n        \"mokufu\": \"もくふう\",\n        \"okumoto yuuta\": \"オクモト悠太\",\n        \"regdic\": \"れぐでく\",\n        \"shiba nanasei\": \"柴七世\",\n        \"shimetta seiya\": \"湿った星夜\",\n        \"tsukitokage\": \"月蜥蜴\",\n        \"izumi yuhina\": \"いずみゆひな\",\n        \"akino sora\": \"あきのそら\",\n        \"yumeno tanuki\": \"梦乃狸\",\n        \"ichinomiya\": \"一ノ宮\",\n        \"kikuchi seiji\": \"菊池政治\",\n        \"yabuki gou\": \"矢吹豪\",\n        \"sanbun kyoden\": \"山文京传\",\n        \"takunomi\": \"たくのみ\",\n        \"1-gou\": \"1号\",\n        \"kadoi aya\": \"门井亚矢\",\n        \"doumeki bararou\": \"百目鬼蔷薇郎\",\n        \"umiushi\": \"うみうし\",\n        \"samidare setsuna\": \"五月雨せつな\",\n        \"shinobe\": \"しのべ\",\n        \"kamiya\": \"Kamiya | かみや\",\n        \"aduma ren\": \"あづま煉\",\n        \"akiya akira\": \"秋谷昭\",\n        \"ashiomi masato\": \"アシオミマサト\",\n        \"hamao\": \"Hamao\",\n        \"hyocorou\": \"ひょころー\",\n        \"ichimatsu\": \"いちまつ\",\n        \"ishikawa shisuke\": \"石川シスケ\",\n        \"itou ei\": \"いとうえい\",\n        \"karma tatsurou\": \"かるま龍狼\",\n        \"kizuka kazuki\": \"きづかかずき\",\n        \"koppori nama beer\": \"こっぽり生ビール\",\n        \"mojarin\": \"もじゃりん\",\n        \"momoko\": \"ももこ\",\n        \"netoromorikon\": \"ねとろもりこん\",\n        \"okara\": \"おから\",\n        \"reco\": \"Reco\",\n        \"zanzi\": \"暂时\",\n        \"hozumi kenji\": \"ほずみけんじ\",\n        \"mel\": \"Mel\",\n        \"getty\": \"Getty\",\n        \"ramjak\": \"Ramjak\",\n        \"the jinshan\": \"The Jinshan\",\n        \"yu-ta\": \"YU-TA\",\n        \"ooba nii\": \"大庭新\",\n        \"yuuki sei\": \"结城成\",\n        \"natsume eri\": \"なつめえり\",\n        \"kuroinu juu\": \"黑犬兽\",\n        \"bakutaso\": \"爆タソ\",\n        \"mda starou\": \"MだSたろう\",\n        \"tsuchigayu\": \"土粥\",\n        \"myu-po\": \"myu-po\",\n        \"nase\": \"名濑\",\n        \"noba\": \"の歯\",\n        \"shiki takuto\": \"史鬼匠人\",\n        \"sakagami umi\": \"坂上海\",\n        \"kuno touya\": \"九野十弥\",\n        \"sakurasawa yukino\": \"さくらさわゆきの\",\n        \"inomoto rikako\": \"井之本理佳子\",\n        \"mikemono yuu\": \"神毛物由宇\",\n        \"tsukioka kirio\": \"ツキオカキリオ\",\n        \"nishi\": \"弐肆 | にし | 西\",\n        \"chachaki noriyuki\": \"清山昌\",\n        \"abe morioka\": \"あべもりおか\",\n        \"akishima shun\": \"昭嶋しゅん\",\n        \"alexi laiho\": \"荒岸来步\",\n        \"dobato\": \"ドバト\",\n        \"fuyu mikan\": \"冬みかん\",\n        \"hatch\": \"ハッチ\",\n        \"inoue yoshihisa\": \"井上よしひさ\",\n        \"ken\": \"KEN | けん\",\n        \"kimura neito\": \"木村宁都\",\n        \"kir-rin\": \"きりりん\",\n        \"ootori ryuuji\": \"おおとりりゅうじ\",\n        \"suzunone kanata\": \"音々かなた\",\n        \"terada nuki\": \"寺田ぬき\",\n        \"wakana hanabi\": \"わかなはなび\",\n        \"amecha\": \"アメちゃ\",\n        \"tamano nae\": \"珠乃なえ\",\n        \"caviar\": \"きゃびあ\",\n        \"mojyako\": \"モジャコ\",\n        \"hammer\": \"ハマー\",\n        \"sugiyuu\": \"スギユウ\",\n        \"wox yang\": \"沃克羊\",\n        \"garland\": \"があらんど\",\n        \"homare\": \"ほまれ | 誉\",\n        \"amadume ryuuta\": \"甘诘留太（A・浪漫・我慢）\",\n        \"blade\": \"BLADE\",\n        \"itou seto\": \"イトウせと\",\n        \"tanno ran\": \"タンノらん\",\n        \"junk kameyoko\": \"JUNK龟横\",\n        \"mizutenka\": \"水点下\",\n        \"maro\": \"MARO\",\n        \"eb110ss\": \"EB110SS\",\n        \"equal\": \"イコール\",\n        \"hippopotamus\": \"ひぽぽたます\",\n        \"mikan r\": \"みかんR\",\n        \"sanezaki tsukiuo\": \"志崎月鱼\",\n        \"wang-pac\": \"わんぱく\",\n        \"arai taiki\": \"新井大器\",\n        \"ayano rena\": \"綾乃れな\",\n        \"chuunen\": \"中年\",\n        \"hanafuda sakurano\": \"花札さくらの\",\n        \"kaponco taroh\": \"かぽんこたろう\",\n        \"lockheart\": \"ロックハート\",\n        \"nasipasuta\": \"なしぱすた\",\n        \"poccora\": \"ぽっこら\",\n        \"puyocha\": \"ぷよちゃ\",\n        \"rakujin\": \"らくじん\",\n        \"syuuen\": \"终焉\",\n        \"harazaki takuma\": \"はらざきたくま\",\n        \"hashimura aoki\": \"桥村青树\",\n        \"malcorond\": \"まるころんど\",\n        \"marugari santarou\": \"丸刈参太郎\",\n        \"poncocchan\": \"ぽんこっちゃん\",\n        \"tetsuna\": \"テツナ\",\n        \"kazan no you\": \"火山の楊\",\n        \"mtu\": \"MtU\",\n        \"alp\": \"あるぷ\",\n        \"chiba toshirou\": \"チバトシロウ\",\n        \"choco pahe\": \"チョコぱへ\",\n        \"hal\": \"HAL\",\n        \"haruhisky\": \"春日喜欢\",\n        \"ichinomiya yuu\": \"一宫夕羽\",\n        \"inago\": \"INAGO\",\n        \"maki daikichi\": \"牧だいきち\",\n        \"raita\": \"来太\",\n        \"sasachinn\": \"ささちん\",\n        \"soushamoku\": \"桑柘木\",\n        \"suzuki akoni\": \"鈴月あこに\",\n        \"tachibana yuu\": \"橘由宇\",\n        \"takeda aranobu\": \"武田あらのぶ\",\n        \"jinnai\": \"ジンナイ\",\n        \"dhibi\": \"ディビ\",\n        \"fuuga\": \"枫牙\",\n        \"yoshimura tatsumaki\": \"吉村龙卷\",\n        \"hinokawa jun\": \"火の川純\",\n        \"womi\": \"WOMI\",\n        \"otsumami\": \"おつまみ\",\n        \"shiramayumi\": \"白真弓\",\n        \"chiro\": \"CHIRO | チろ\",\n        \"junny\": \"JUNNY\",\n        \"wakino keibun\": \"胁乃敬文\",\n        \"suzuneco\": \"Suzu猫。\",\n        \"utakata\": \"泡沫\",\n        \"yakou\": \"夜光\",\n        \"lambda\": \"Lambda\",\n        \"pon takahanada\": \"ポン贵花田\",\n        \"kazakura\": \"夏樱\",\n        \"rikka kai\": \"リッカー改\",\n        \"matsuryu\": \"松龙\",\n        \"suzutsuki kurara\": \"涼月くらら\",\n        \"naruhodo\": \"なるほど\",\n        \"hb\": \"HB\",\n        \"yamatogawa\": \"大和川\",\n        \"obiwan\": \"obiwan\",\n        \"xin\": \"xin\",\n        \"aratamaru\": \"改多丸\",\n        \"7zu7\": \"7zu7\",\n        \"atage\": \"あたげ\",\n        \"ebina ebi\": \"海老名えび\",\n        \"kisen\": \"奇仙\",\n        \"kyockcho\": \"局长\",\n        \"maumen\": \"まうめん\",\n        \"nukunuku\": \"ぬくぬく\",\n        \"sumiyoshi\": \"すみよし\",\n        \"umeko\": \"うめ子\",\n        \"yamada yuuya\": \"ヤマダユウヤ\",\n        \"yumoteliuce\": \"ユモテリウス\",\n        \"ichihaya\": \"いちはや\",\n        \"oboro\": \"胧\",\n        \"takayanagi katsuya\": \"高柳カツヤ\",\n        \"hori hiroaki\": \"堀博昭\",\n        \"yuugiri\": \"夕雾\",\n        \"eba\": \"EBA\",\n        \"kutibue\": \"くちぶえ\",\n        \"aoi shou\": \"葵抄\",\n        \"myougi kulaganosuke\": \"妙義倉賀ノ助\",\n        \"karatakewari\": \"からたけわり\",\n        \"mifune seijirou\": \"三船诚二郎\",\n        \"natsu no oyatsu\": \"夏のおやつ\",\n        \"homura subaru\": \"焰すばる\",\n        \"dakouin saburou\": \"蛇光院三郎\",\n        \"gura nyuutou\": \"ぐら乳頭\",\n        \"inomaru\": \"いのまる\",\n        \"iori yuzuru\": \"庵让\",\n        \"itaba hiroshi\": \"板场广志\",\n        \"james hotate\": \"ジェームスほたて\",\n        \"jamming\": \"じゃみんぐ\",\n        \"mitsuki rintarou\": \"水月林太郎\",\n        \"n.o. chachamaru\": \"N.O-茶々丸\",\n        \"naga\": \"な～が\",\n        \"nakamura nishiki\": \"中村锦\",\n        \"noq\": \"NOQ（下月重吾）\",\n        \"otonashi kyousuke\": \"音无响介\",\n        \"saki urara\": \"さきうらら\",\n        \"shinogi a-suke\": \"しのぎ鋭介\",\n        \"tonami satoshi\": \"となみさとし\",\n        \"yajima index\": \"矢岛Index\",\n        \"amano yoshitaka\": \"天野喜孝\",\n        \"aoba hachi\": \"青葉はち\",\n        \"minami\": \"みなみ\",\n        \"ouji hiyoko\": \"桜路ひよこ（ひなづか凉）\",\n        \"yoshiro\": \"夜士郎\",\n        \"urushihara satoshi\": \"漆原智志\",\n        \"yukijirushi\": \"逝印\",\n        \"riichu\": \"りいちゅ\",\n        \"momo no suidousui\": \"モモの水道水\",\n        \"kamitsurugi ouka\": \"神剑樱花\",\n        \"kantaka\": \"かんたか\",\n        \"katagiri hinata\": \"片桐雏太\",\n        \"kinosaki reisui\": \"城崎冷水\",\n        \"kuwada yuuki\": \"くわだゆうき\",\n        \"mayusaki yuu\": \"茧咲悠\",\n        \"natsuhiko\": \"夏彦\",\n        \"reita\": \"rei太\",\n        \"saeki hokuto\": \"さえき北都\",\n        \"shinozuka atsuto\": \"しのづかあつと\",\n        \"yatsuha kanan\": \"八叶香南\",\n        \"hashibiro kou\": \"桥广こう\",\n        \"koutarou\": \"こうたろう\",\n        \"piririnegi\": \"ぴりりねぎ\",\n        \"spiritus tarou\": \"スピリタス太郎\",\n        \"tel\": \"朝峰テル\",\n        \"tomomimi shimon\": \"ともみみしもん\",\n        \"mitsumomo mam\": \"蜜桃まむ\",\n        \"lolisin\": \"ろりしn\",\n        \"miyako hito\": \"ミヤコヒト\",\n        \"sola bozu\": \"空坊主\",\n        \"mimonel\": \"ミモネル\",\n        \"kloah\": \"Kloah\",\n        \"chirumakuro\": \"ちるまくろ\",\n        \"fumihiko\": \"ふみひこ\",\n        \"gustav\": \"ぐすたふ\",\n        \"matsuna hitoshi\": \"松名一\",\n        \"uekan\": \"うえかん\",\n        \"koga ryouichi\": \"古贺亮一\",\n        \"sakai nayuta\": \"坂井なゆ太\",\n        \"fan no hitori\": \"煌野一人\",\n        \"yuuzu tsushiro\": \"ゆうづつしろ\",\n        \"sendou hachi\": \"仙道八\",\n        \"saeki\": \"佐伯\",\n        \"cool kyou shinja\": \"クール教信者\",\n        \"hirasaka fuyu\": \"比良坂冬\",\n        \"joy\": \"じょい\",\n        \"kasuga souichi\": \"カスガソウイチ\",\n        \"kemonono\": \"けものの★\",\n        \"mameko\": \"まめこ\",\n        \"miyoshi\": \"みよし\",\n        \"neriume\": \"ねりうめ\",\n        \"odd\": \"Odd\",\n        \"otone\": \"音音\",\n        \"sakujirou\": \"咲次朗\",\n        \"torimushi\": \"鸟莉蒸师\",\n        \"ai ha muteki\": \"愛は無敵\",\n        \"kazetani yasunari\": \"风谷安成\",\n        \"amatarou\": \"天太郎\",\n        \"aoi hitori\": \"葵ヒトリ\",\n        \"aoten\": \"青点\",\n        \"clone ningen\": \"clone人間\",\n        \"dowman sayman\": \"道满晴明\",\n        \"kagura moromi\": \"神楽もろみ\",\n        \"mikaze takashi\": \"水风天\",\n        \"kurogane kenn\": \"玄铁绚\",\n        \"momo youkan\": \"ももようかん\",\n        \"musashimaru\": \"ムサシマル\",\n        \"nixinamo lens\": \"にびなも凸面体\",\n        \"osomatsu\": \"おそまつ\",\n        \"sanagi torajirou\": \"蛹虎次郎\",\n        \"eiichirou\": \"瑛一朗\",\n        \"izawa shinichi\": \"伊泽慎壹\",\n        \"kurumiya mashimin\": \"胡桃屋ましみん\",\n        \"miura takehiro\": \"みうらたけひろ\",\n        \"sena youtarou\": \"濑奈阳太郎\",\n        \"yumesaki sanjuro\": \"夢咲三十郎\",\n        \"sakomae aichi\": \"佐古前あいち\",\n        \"bakuya\": \"ばくや\",\n        \"c.meiko\": \"C.みーこ\",\n        \"eightman\": \"えいとまん\",\n        \"henoeno\": \"へのえの\",\n        \"kurofood\": \"くろふーど\",\n        \"momozukuku\": \"ももずくく\",\n        \"pija\": \"ピジャ\",\n        \"psycho\": \"さいこ\",\n        \"rico\": \"Rico\",\n        \"tomonaga kenji\": \"友永ケンジ\",\n        \"fukuyama naoto\": \"复八磨直兔\",\n        \"kurokawa otogi\": \"黒川おとぎ\",\n        \"satou takumi\": \"佐藤匠\",\n        \"shino\": \"シノ\",\n        \"shousan bouzu\": \"しょうさん坊主\",\n        \"yamabuki zarame\": \"山吹ざらめ\",\n        \"magatama\": \"マガタマ\",\n        \"mako kujira\": \"まこくじら\",\n        \"uesugi kyoushirou\": \"上杉响士郎\",\n        \"kai hiroyuki\": \"甲斐ひろゆき\",\n        \"kihiru\": \"きひる\",\n        \"kogaku kazuya\": \"虎顎かずや\",\n        \"kokonoki nao\": \"ここのき奈緒\",\n        \"naz\": \"NAZ\",\n        \"neriwasabi\": \"ねりわさび\",\n        \"yonyon\": \"よんよん\",\n        \"yugami goosyu\": \"由上ゴーシュ\",\n        \"pedocchi\": \"ぺどっち\",\n        \"hokou kikai\": \"补讲机械\",\n        \"papermania\": \"奴隶妇人\",\n        \"kawahagitei\": \"かわはぎ亭\",\n        \"kirieppa\": \"キリエっぱ\",\n        \"shohei\": \"将兵\",\n        \"kiyose\": \"KIYOSE\",\n        \"u-tom\": \"う~とむ\",\n        \"shiramori yuse\": \"白森ゆせ\",\n        \"bak hyeong jun\": \"朴亨濬\",\n        \"yanagihara mitsuki\": \"柳原ミツキ\",\n        \"ponkotsu works\": \"ぽんこつわーくす\",\n        \"nibo\": \"にぼ\",\n        \"mightyhonk\": \"MightyHonk\",\n        \"goldendawn\": \"Goldendawn\",\n        \"fatke\": \"FatKE\",\n        \"satsuki neko\": \"五月猫\",\n        \"akinashi yuu\": \"春夏冬ゆう\",\n        \"jakou nezumi\": \"じゃこうねずみ\",\n        \"nagi yuki\": \"凪居ユキ\",\n        \"kusui aruta\": \"久水あるた\",\n        \"tamanosuke\": \"たまのすけ\",\n        \"minamihama yoriko\": \"南浜よりこ\",\n        \"butcha-u\": \"ブッチャーU\",\n        \"nekomata naomi\": \"ねこまたなおみ\",\n        \"kiichi\": \"きいち\",\n        \"norve watanabe\": \"なーべ渡辺\",\n        \"jin\": \"Jin\",\n        \"luv p\": \"Luv P\",\n        \"rozer\": \"ROZER\",\n        \"mame danuki\": \"まめだぬき\",\n        \"lolicept\": \"Belko（LOLICEPT）\",\n        \"shiduki michiru\": \"しづきみちる\",\n        \"jet yowatari\": \"ジェット世渡り\",\n        \"jigeum\": \"지금\",\n        \"oyster\": \"オイスター\",\n        \"imachi\": \"いまち\",\n        \"momiyama\": \"もみやま\",\n        \"shimantogawa\": \"四万十川\",\n        \"zhen lu\": \"珍绿\",\n        \"devilhs\": \"Devil_HS\",\n        \"aina nana\": \"愛菜奈々\",\n        \"yokoshima takemaru\": \"邪武丸\",\n        \"hawa\": \"はわ\",\n        \"tomose shunsaku\": \"トモセシュンサク\",\n        \"reiha\": \"零覇\",\n        \"chimaq\": \"チマQ\",\n        \"magaki ryouta\": \"間垣りょうた\",\n        \"yukino minato\": \"雪野みなと\",\n        \"maruchang\": \"丸ちゃん。\",\n        \"sukiyo\": \"スキヨ\",\n        \"aiue oka\": \"爱上陆\",\n        \"rustle\": \"らする\",\n        \"calipur\": \"ｶﾘﾊﾟ−\",\n        \"dokurosan\": \"どくろさん\",\n        \"rebis\": \"Rebis\",\n        \"taihei tengoku\": \"太平天极\",\n        \"hitomaru\": \"人丸\",\n        \"kurozu\": \"くろず\",\n        \"unagimaru\": \"鳗丸\",\n        \"decarabia\": \"デカラビア\",\n        \"takurou\": \"たくろう\",\n        \"tsukimoto kizuki\": \"月本筑希\",\n        \"taigiakira\": \"タイギアキラ\",\n        \"ishikawa naoya\": \"石川直哉\",\n        \"takaku nozomu\": \"高玖のぞむ\",\n        \"oni-noboru\": \"Oni-noboru\",\n        \"hamo\": \"はも\",\n        \"satsumaage\": \"さつま揚げ\",\n        \"abu\": \"アブ | ABU\",\n        \"sinntarou\": \"心太朗\",\n        \"kotoba ai\": \"コトバアイ\",\n        \"strong bana\": \"Strong Bana\",\n        \"kuroadam\": \"黒葉だむ\",\n        \"midoriiro no shinzou\": \"緑色の心臓\",\n        \"kujou danbo\": \"九条だんぼ\",\n        \"kagiyama pandora\": \"鍵山ぱんどら\",\n        \"shitto mask\": \"嫉妬マスク\",\n        \"umitsubame\": \"うみつばめ\",\n        \"nanappe\": \"七っぺ\",\n        \"akeyama kitsune\": \"绯山狐\",\n        \"sakura\": \"樱\",\n        \"yakiniku king\": \"烧肉キング\",\n        \"nekoi hikaru\": \"猫伊光\",\n        \"inanaki shiki\": \"稻鸣四季\",\n        \"tohgarashi hideyu\": \"唐辛子ひでゆ\",\n        \"shinjinkun\": \"新人君\",\n        \"barlun\": \"ばーるん\",\n        \"kiyomiya ryo\": \"清宫凉\",\n        \"higata\": \"HIGATA\",\n        \"outou chieri\": \"无洗米\",\n        \"hoshizaki hikaru\": \"星崎ひかる\",\n        \"shinoda sanjuurou\": \"篠田参重郎\",\n        \"mimi mimizu\": \"実々みみず\",\n        \"takemura sesshu\": \"竹村雪秀\",\n        \"ishigami hajime\": \"石纸一\",\n        \"kawamori misaki\": \"かわもりみさき\",\n        \"nagashima chosuke\": \"ながしま超助\",\n        \"ozaki akira\": \"尾崎晶\",\n        \"shiomaneki\": \"シオマネキ\",\n        \"takebayashi takeshi\": \"武林武士\",\n        \"umemaru\": \"うめ丸\",\n        \"eo masaka\": \"EOまさか\",\n        \"hanabi\": \"HANABi\",\n        \"kakizaki kousei\": \"垣崎コウセイ\",\n        \"miyamoto issa\": \"宫元一佐\",\n        \"murasaki nyaa\": \"紫☆にゃ～\",\n        \"okyuuri\": \"おきゅうり\",\n        \"parabola\": \"ぱらボら\",\n        \"sugar milk\": \"シュガーミルク\",\n        \"tachibana aruto\": \"橘アルト\",\n        \"yamahata rian\": \"山畑璃杏\",\n        \"muoto\": \"むおと\",\n        \"emyo\": \"えみょ\",\n        \"nazuna\": \"ナズナ\",\n        \"mitsui jun\": \"三井纯\",\n        \"tsurugi hagane\": \"蔓木钢音\",\n        \"worin\": \"Worin\",\n        \"haeilian\": \"Haeilian\",\n        \"mayui yukisaki\": \"Mayui Yukisaki\",\n        \"asan\": \"あさん\",\n        \"akahige\": \"赤髭\",\n        \"nangou jingeru\": \"南郷じんげる\",\n        \"mitsurugi aoi\": \"能都くるみ\",\n        \"kuuchuu yousai\": \"空中幼彩\",\n        \"kotomi yo-ji\": \"ことみようじ\",\n        \"hirowa nagi\": \"广轮凪\",\n        \"kanehira morihito\": \"金平守人\",\n        \"kii takashi\": \"キイタカシ\",\n        \"kouzuki rio\": \"香月りお\",\n        \"matsusaka takeshi\": \"松阪刚志\",\n        \"nagai michinori\": \"永井道纪\",\n        \"nagisa minami\": \"渚ミナミ\",\n        \"alexi\": \"アレキシ\",\n        \"benantoka\": \"Beなんとか\",\n        \"dynamite moca\": \"ダイナマイトmoca\",\n        \"sakurafubuki nel\": \"桜吹雪ねる\",\n        \"urai tami\": \"浦井民\",\n        \"yusa\": \"ゆさ\",\n        \"gyuunyuu rinda\": \"牛乳リンダ\",\n        \"usagi nagomu\": \"うさぎなごむ\",\n        \"oohira sunset\": \"太平さんせっと\",\n        \"obui\": \"おぶい\",\n        \"amazeroth\": \"Amazeroth\",\n        \"batsu\": \"ばつ\",\n        \"campbell gichou\": \"キャンベル議長\",\n        \"hinotsuki neko\": \"日月ネコ\",\n        \"jake\": \"じぇいく\",\n        \"kamaboko red\": \"かまぼこRED\",\n        \"koharu nanakusa\": \"小春七草\",\n        \"kousuke\": \"交介\",\n        \"kuronomiki\": \"黒ノ樹\",\n        \"kurosawa kiyotaka\": \"黒澤清崇\",\n        \"misaki kaho.\": \"ミサキカホ。\",\n        \"ogura shuuichi\": \"小仓修一\",\n        \"yuuki homura\": \"结城焰\",\n        \"yamamoto\": \"山本\",\n        \"yamamoto yammy\": \"山本やみー\",\n        \"murakami maki\": \"村上真纪\",\n        \"ditama bow\": \"ぢたま(某)\",\n        \"yabuki kentarou\": \"矢吹健太朗\",\n        \"clamp\": \"CLAMP\",\n        \"kinoshita rei\": \"きのした黎\",\n        \"waero\": \"西野\",\n        \"modaetei anetarou\": \"闷亭姉太郎\",\n        \"modaetei imojirou\": \"闷亭妹次郎\",\n        \"fuckuma\": \"ふぁっ熊\",\n        \"itou daiku\": \"伊藤第九\",\n        \"kaiduka\": \"かいづか\",\n        \"moketa\": \"もけ太\",\n        \"nodame\": \"nod饴\",\n        \"sage joh\": \"sage・ジョー\",\n        \"utsutsu minoru\": \"うつつ＊みのる\",\n        \"isou doubaku\": \"位相同爆\",\n        \"kenshou izanamu\": \"剣匠イザナム\",\n        \"kotobuki kazuki\": \"琴吹かづき\",\n        \"mayumi daisuke\": \"真弓大介\",\n        \"nagano noriko\": \"永野のりこ\",\n        \"protonsaurus\": \"プロトンザウルス\",\n        \"sabe\": \"SABE\",\n        \"shibata masahiro\": \"柴田昌弘\",\n        \"youkihi\": \"阳气婢\",\n        \"kinoshita ichi\": \"木下壹\",\n        \"92m\": \"92M\",\n        \"kasukabe taro\": \"春日部太郎\",\n        \"zucchini\": \"ズッキーニ\",\n        \"shirane taito\": \"白根戴斗\",\n        \"morimi ashita\": \"森见明日\",\n        \"upanishi.\": \"うぱ西。\",\n        \"shimazu isami\": \"島津いさみ\",\n        \"arumajiki\": \"或真じき\",\n        \"uru\": \"Uru\",\n        \"higashitotsuka raisuta\": \"東戸塚らいすた\",\n        \"nizimoto hirok\": \"虹元ひろk\",\n        \"kinnikku\": \"キンニック\",\n        \"takepen\": \"タケペン\",\n        \"taikou\": \"タイコウ\",\n        \"aikawa touma\": \"藍川とうま\",\n        \"tamanoi peromekuri\": \"玉乃井ぺろめくり\",\n        \"shinozuka george\": \"筱塚酿二\",\n        \"miotama\": \"みおたま\",\n        \"kido keiji\": \"城户敬司\",\n        \"terada ochiko\": \"寺田落子\",\n        \"chimi\": \"ちみ\",\n        \"haruyukiko\": \"はるゆきこ\",\n        \"horitomo\": \"ほりとも\",\n        \"jun\": \"Jun\",\n        \"marneko\": \"まる寝子\",\n        \"miyamoto liz\": \"宮本りず\",\n        \"nanase mizuho\": \"七濑瑞穗\",\n        \"satou souji\": \"佐藤想次\",\n        \"shiina kazuki\": \"しいなかずき\",\n        \"sumisuzu\": \"すみすず\",\n        \"take\": \"タケ\",\n        \"yukiusagi.\": \"ゆきうさぎ。\",\n        \"clearite\": \"くれりて\",\n        \"makuro\": \"まくろ\",\n        \"bakugatou\": \"麦芽糖\",\n        \"nekohane ryou\": \"猫羽燎\",\n        \"gamang\": \"Gamang\",\n        \"kiryu reihou\": \"桐生玲峰\",\n        \"koutaro\": \"こうたろ\",\n        \"sasaoka gungu\": \"笹岡ぐんぐ\",\n        \"mikazuki akira\": \"みかづきあきら!\",\n        \"mikoshiro honnin\": \"みこしろ本人\",\n        \"ariko youichi\": \"有子瑶一\",\n        \"taira tsukune\": \"平つくね\",\n        \"monikano\": \"モニカノ\",\n        \"kayama rim\": \"香山リム\",\n        \"tomokichi\": \"友吉\",\n        \"nagi ichi\": \"凪市\",\n        \"ponz\": \"ぽん酢\",\n        \"arekusa mahone\": \"荒草まほん\",\n        \"akasa ai\": \"あかさあい\",\n        \"mizu umi\": \"瑞海\",\n        \"hisato\": \"ひさと\",\n        \"gyuunyuu nomio\": \"牛乳乃澪\",\n        \"konkichi\": \"绀吉\",\n        \"butcherboy\": \"ButcherBOY\",\n        \"aim\": \"AIM\",\n        \"sasakuma kyouta\": \"ささくまきょうた\",\n        \"tsujizen\": \"辻善\",\n        \"mizukoshi mayu\": \"水越まゆ\",\n        \"mitaonsya\": \"MITAONSYA\",\n        \"tokumi yuiko\": \"笃见唯子\",\n        \"dantetsu\": \"断铁（干支門三十四，〇タ）\",\n        \"inuboshi\": \"犬星\",\n        \"saitou tsukasa\": \"さいとうつかさ\",\n        \"shinkaida tetsuyarou\": \"新贝田铁也郎\",\n        \"sorimura youji\": \"そりむらようじ\",\n        \"yamamoto kazue\": \"山本和枝\",\n        \"natsuo monaka\": \"なつおもなか\",\n        \"binkan argento\": \"びんかんargento\",\n        \"minagiku\": \"みなぎく\",\n        \"landolt tamaki\": \"ランドルトたまき\",\n        \"kisaragi miyu\": \"如月みゆ\",\n        \"igumox\": \"井雲くす\",\n        \"kuune rin\": \"くうねりん\",\n        \"goto-beido\": \"ゴト・ベイドー\",\n        \"morikura en\": \"森仓圆\",\n        \"af kuro\": \"アフ黒\",\n        \"kaguyuzu\": \"カグユヅ\",\n        \"dsmile\": \"DSマイル\",\n        \"monoto\": \"ものと\",\n        \"snowmi\": \"すのみ\",\n        \"dozamura\": \"どざむら\",\n        \"kiryu\": \"Kiryu\",\n        \"kozakura nanane\": \"小桜菜々音\",\n        \"hazakura momo\": \"葉桜もも\",\n        \"sakura syoji\": \"咲良将司\",\n        \"hidiri rei\": \"ヒヂリレイ\",\n        \"nadeara bukichi\": \"抚荒武吉\",\n        \"qoopie\": \"Qoopie\",\n        \"kanbe chuji\": \"かんべ忠治\",\n        \"shuten douji\": \"酒呑童子\",\n        \"murlachrot\": \"みうらっは\",\n        \"tanaha\": \"棚叶\",\n        \"sakai minato\": \"坂井みなと\",\n        \"ijima yuu\": \"伊島ユウ\",\n        \"inari\": \"稻荷\",\n        \"momo-deary\": \"Momo-Deary\",\n        \"nonaka tama\": \"のなかたま\",\n        \"chinbotsu\": \"沈没\",\n        \"teterun\": \"ててるん\",\n        \"fuetakishi\": \"フエタキシ\",\n        \"purukogi\": \"プルコギ\",\n        \"sawaki koma\": \"沢木コマ\",\n        \"ohtsuki tohru\": \"大槻とおる\",\n        \"hidebou\": \"ひでぼう\",\n        \"kiyose kaoru\": \"キヨセ薫\",\n        \"asanagi\": \"朝凪\",\n        \"kikunyi\": \"菊にぃ\",\n        \"lasto\": \"らすと～\",\n        \"yoroduya hyakuhachi\": \"万屋百八\",\n        \"takapiko\": \"たかぴこ\",\n        \"kobayashi chisato\": \"小林ちさと\",\n        \"siomidu\": \"しおみづ\",\n        \"fudou ran\": \"不动乱\",\n        \"ikuya daikokudou\": \"几夜大黑堂\",\n        \"kaduchi\": \"カヅチ\",\n        \"sakurazuki masaru\": \"桜月マサル\",\n        \"uchuu teiou\": \"宇宙帝王\",\n        \"zundarepon\": \"ズンダレぽん\",\n        \"chokoboll mukakoi.\": \"チョコボール向囲。\",\n        \"majirou\": \"まじろー\",\n        \"nemui neru\": \"眠井ねる\",\n        \"takato kurosuke\": \"高遠くろ助\",\n        \"adachi takumi\": \"安达拓实\",\n        \"asamori mizuki\": \"朝森瑞季\",\n        \"azuma taira\": \"東タイラ\",\n        \"enoki tomoyuki\": \"榎木知之\",\n        \"fujisaka kuuki\": \"藤坂空树\",\n        \"grace ishikawa\": \"グレイス石川\",\n        \"harumi chihiro\": \"ハルミチヒロ\",\n        \"hiyama shuri\": \"ヒヤマシュリ\",\n        \"izumi yoshiki\": \"いづみよしき\",\n        \"maakou\": \"雅亚公\",\n        \"tsukioka reitarou\": \"月冈丽太朗\",\n        \"kurokawa kei\": \"くろかわ京\",\n        \"itachi\": \"いたち\",\n        \"aya shachou\": \"彩社长\",\n        \"fukumaaya\": \"ふくまーや\",\n        \"higashide irodori\": \"东出彩\",\n        \"hiura r\": \"火浦R\",\n        \"karube guri\": \"軽部ぐり\",\n        \"kusatsu terunyo\": \"草津てるにょ\",\n        \"mario\": \"まりお\",\n        \"puniiyu\": \"ぷにいゆ\",\n        \"kotengu\": \"コテング\",\n        \"otare mayu\": \"おたれまゆ\",\n        \"shirouzu myuuta\": \"白水ミュウタ\",\n        \"dosent\": \"Dosent\",\n        \"fuun daiki\": \"風雲だいき\",\n        \"satou saori\": \"佐藤沙绪理\",\n        \"takashina asahi\": \"たかしな浅妃\",\n        \"bkub\": \"Bkub\",\n        \"gemu555\": \"Gemu555\",\n        \"ichiren takushou\": \"一炼托生\",\n        \"katase minami\": \"カタセミナミ\",\n        \"masamune shirow\": \"士郎正宗\",\n        \"nikusoukyuu\": \"肉そうきゅー。\",\n        \"nimu\": \"ニム\",\n        \"okayusan\": \"おかゆさん\",\n        \"wakai ikuo\": \"若井いくお\",\n        \"z-ton\": \"Zトン\",\n        \"hanpera\": \"はんぺら\",\n        \"hirono azuma\": \"広乃あずま\",\n        \"ikeda matamune\": \"池田又心\",\n        \"kon-kit\": \"蒟吉人\",\n        \"ohsaka minami\": \"逢坂ミナミ\",\n        \"raymon\": \"RAYMON\",\n        \"shiroie mika\": \"白家ミカ\",\n        \"tes-mel\": \"tes_mel\",\n        \"toba yuga\": \"跳马游鹿\",\n        \"yoshida tobio\": \"吉田鸢牡\",\n        \"zero no mono\": \"ゼロの者\",\n        \"hige masamune\": \"ひげ政宗\",\n        \"h2o\": \"H2O\",\n        \"kekemotsu\": \"けけもつ\",\n        \"yom\": \"よむ\",\n        \"yuzugin\": \"柚银\",\n        \"akatsuki hiziri\": \"あかつき聖\",\n        \"chig\": \"Chig\",\n        \"tsumugie\": \"つむじぃ\",\n        \"maimu-maimu\": \"舞六まいむ\",\n        \"kotoyoshi yumisuke\": \"琴义弓介\",\n        \"mctek\": \"MCtek\",\n        \"hidaka sora\": \"日高空\",\n        \"mamabe mami\": \"眞々部まみ\",\n        \"sakusyaaya\": \"作者文\",\n        \"ruschuto\": \"るしゅーと\",\n        \"murata range\": \"村田莲尔\",\n        \"haguhagu\": \"はぐはぐ\",\n        \"reitou mikan\": \"れいとうみかん\",\n        \"ruuen rouga\": \"龙炎狼牙\",\n        \"kisaragi nana\": \"如月なな\",\n        \"adumi kazuki\": \"あづみ一樹\",\n        \"sasagawa iko\": \"佐々川いこ\",\n        \"wancho\": \"わんちょ\",\n        \"kajishima masaki\": \"梶岛正树\",\n        \"muririn\": \"梦璃凛\",\n        \"lilithlauda\": \"リリスラウダ\",\n        \"miyase mahiro\": \"宮瀬まひろ\",\n        \"tajima yuki\": \"田岛有纪\",\n        \"nyaito\": \"にゃいと\",\n        \"hitsuka no tsukimiko\": \"ひつかのつきみこ\",\n        \"nagami yuu\": \"永深ゆう\",\n        \"oda kenichi\": \"おだけんいち\",\n        \"toranoe\": \"トラノエ\",\n        \"kinoebi\": \"KinoeBi\",\n        \"nanashi\": \"774\",\n        \"yokoyama lynch\": \"横山私刑\",\n        \"tamposa\": \"たむポ～サ（TAM）\",\n        \"tatami\": \"叠\",\n        \"hoozuki shia\": \"鬼灯しあ\",\n        \"samantha whitten\": \"Samantha Whitten\",\n        \"romi\": \"ろみ\",\n        \"kamiya maneki\": \"かみやまねき\",\n        \"rella\": \"Rella\",\n        \"apaman\": \"あぱまん\",\n        \"takamin\": \"たかみん\",\n        \"pink taro\": \"ピンク太郎\",\n        \"tendou masae\": \"天道まさえ\",\n        \"numahana\": \"ヌマハナ\",\n        \"hino toshiyuki\": \"飞野俊之\",\n        \"yokkora\": \"ヨッコラ\",\n        \"ahen\": \"AHEN\",\n        \"kirishima satoshi\": \"桐島サトシ\",\n        \"kuroiwa madoka\": \"黒磐まどか\",\n        \"nanaroba hana\": \"ななろば華\",\n        \"ouma\": \"OUMA\",\n        \"irie jyunn\": \"入江jyunn\",\n        \"komeshiro kasu\": \"米白粕\",\n        \"gotou suzuna\": \"後藤スズナ\",\n        \"pettanp\": \"ペッタンP\",\n        \"nanashi noizi\": \"ななしのいぢ\",\n        \"koori nezumi\": \"冰鼠\",\n        \"fluff kevlar\": \"Fluff-Kevlar\",\n        \"mukka\": \"Mukka\",\n        \"harenchi tomeko\": \"はれんちとめこ\",\n        \"yukiji shia\": \"雪路时爱\",\n        \"mirin fu-ka\": \"味燐ふーか\",\n        \"toroshio\": \"とろしお\",\n        \"yuzuki\": \"柚木\",\n        \"kusaka souji\": \"久坂宗次\",\n        \"izumi banya\": \"和泉万夜\",\n        \"katzchen\": \"Kätzchen\",\n        \"kanden sky\": \"感电数寄\",\n        \"heiqing langjun\": \"黑青郎君\",\n        \"darkmaya\": \"Darkmaya\",\n        \"unini seven\": \"うにに☆せぶん\",\n        \"nekometaru\": \"ねこめたる\",\n        \"naoya\": \"直哉\",\n        \"sansyoku amido.\": \"三色网户。\",\n        \"yukiyanagi\": \"ゆきやなぎ\",\n        \"fujimoto ikura\": \"藤本いくら\",\n        \"ramiya ryou\": \"兰宫凉\",\n        \"tamiya akito\": \"田宫秋人\",\n        \"joy ride\": \"JOY RIDE\",\n        \"arima natsubon\": \"ありまなつぼん\",\n        \"ebi ebi\": \"エビエビ\",\n        \"gabyonuno\": \"ガビョ布\",\n        \"heppokokun\": \"へっぽこくん\",\n        \"honda aru\": \"翻田亚流\",\n        \"hoshino fuuta\": \"ほしのふうた\",\n        \"kani kani\": \"かにかに\",\n        \"katsumata kazuki\": \"かつまたかずき\",\n        \"kirihara kotori\": \"桐原小鸟\",\n        \"kokekokko coma\": \"こけこっこ☆こま\",\n        \"nagareboshi hikaru\": \"流星ひかる\",\n        \"mihara jun\": \"みはらじゅん\",\n        \"dpc\": \"DPC\",\n        \"urase shioji\": \"浦瀬しおじ\",\n        \"yakusho\": \"やくしょ\",\n        \"kedama keito\": \"毛玉ケヰト\",\n        \"kurai nao\": \"仓井尚\",\n        \"narutaki shin\": \"鳴滝しん\",\n        \"matasabu yarou\": \"またさぶ野郎\",\n        \"kagutsuchi\": \"カグツチ\",\n        \"nyuu\": \"にゅう\",\n        \"kani club\": \"蟹俱乐部\",\n        \"tabuchi\": \"たぶち\",\n        \"nora higuma\": \"野良ヒグマ\",\n        \"tohyama eight\": \"东山エイト\",\n        \"shakuhachi nameko\": \"尺八ナメコ\",\n        \"bai asuka\": \"呗飞鸟\",\n        \"bttamako\": \"豚たま子\",\n        \"eggplantex\": \"茄子EX\",\n        \"kouno aya\": \"煌乃あや\",\n        \"uzuki haruka\": \"卯月遥佳\",\n        \"rokudenashi\": \"ロクデナシ\",\n        \"mukoujima tenro\": \"むこうじまてんろ\",\n        \"kamitsuki manmaru\": \"上月まんまる\",\n        \"kaitou yuuhi\": \"快刀雄飞\",\n        \"danevan\": \"丹·艾凡\",\n        \"kakifly\": \"kakifly\",\n        \"go-it\": \"Go-It\",\n        \"ibuki haruhi\": \"一颯はるひ\",\n        \"beauty hair\": \"ビューティ・ヘア\",\n        \"yamamoto yoshifumi\": \"山本善文\",\n        \"yamano kitsune\": \"矢间野狐\",\n        \"yamanobe kitta\": \"やまのべきった\",\n        \"shishoku gankou\": \"紫色雁行\",\n        \"nakagawa you\": \"中川优\",\n        \"matsutou tomoki\": \"松任知基\",\n        \"kamakiri\": \"カマキリ\",\n        \"kurikara\": \"倶梨伽罗\",\n        \"lazy club\": \"LAZYCLUB\",\n        \"amano koyo\": \"天乃红叶\",\n        \"hindenburg\": \"ひんでんブルグ\",\n        \"kamidera chizu\": \"神寺千寿\",\n        \"kanou soukyuu\": \"狩野苍穹\",\n        \"kurokawa mio\": \"黒河澪\",\n        \"mizukami ranmaru\": \"水上兰丸\",\n        \"ogawa kanran\": \"小川甘蓝\",\n        \"orizumeda nyoizou\": \"折诘田如意三\",\n        \"tanaka juice\": \"田中十酢\",\n        \"tom tamio\": \"都夢たみお\",\n        \"tsukamoto miei\": \"塚本ミエイ\",\n        \"unno hotaru\": \"海野萤\",\n        \"watanabe wataru\": \"わたなべわたる\",\n        \"ikegami akane\": \"池上茜\",\n        \"gujira\": \"ぐじら\",\n        \"xierra099\": \"Xierra099\",\n        \"inazuma\": \"INAZUMA\",\n        \"tomatto\": \"とまっと\",\n        \"gabri-l\": \"雅舞罹-L\",\n        \"amagaeru\": \"あまがえる\",\n        \"batta\": \"Batta\",\n        \"cyocyo\": \"ちょちょ\",\n        \"emons\": \"えもんず\",\n        \"saryuu\": \"沙流\",\n        \"tamano kedama\": \"毛玉牛乳\",\n        \"yumano yuuki\": \"有間乃ユウキ\",\n        \"kink\": \"きんく\",\n        \"kamen no hito\": \"仮面之人\",\n        \"hakuyagen\": \"白夜弦\",\n        \"kugami angning\": \"九神杏仁\",\n        \"yanagi asahi\": \"夜凪朝妃\",\n        \"tanaka shoutarou\": \"田中松太郎\",\n        \"nuko yarou\": \"ぬこやろう\",\n        \"kaniya shiku\": \"蟹屋しく\",\n        \"suzushiro atsushi\": \"铃城敦\",\n        \"denjarasu yamada\": \"やまだ\",\n        \"sakura puchilo\": \"さくらぷちろー\",\n        \"shuko\": \"SHUKO\",\n        \"todoroki\": \"轰\",\n        \"kitamura kouichi\": \"奇田村光一\",\n        \"jabara tornado\": \"蛇腹トルネード\",\n        \"kuroda mutu\": \"黑田陆奥\",\n        \"hoyoyo\": \"ほよよ\",\n        \"aoi tiduru\": \"葵井ちづる\",\n        \"agawa ryo\": \"阿川椋\",\n        \"nise kurosaki\": \"偽くろさき\",\n        \"catapult\": \"かたぱると\",\n        \"kizuki akizuki\": \"きづきあきづき\",\n        \"low\": \"Low\",\n        \"murakami takashi\": \"村上隆史\",\n        \"natsukawa fuyu\": \"夏川冬\",\n        \"tetsu\": \"てつ\",\n        \"fuji shinobu\": \"藤忍\",\n        \"himehachi\": \"ひめはち\",\n        \"kurita yuugo\": \"栗田勇午\",\n        \"mihoshi kurage\": \"海星海月\",\n        \"mikage baku\": \"御影獏\",\n        \"sakurai uta\": \"樱井U太\",\n        \"ayase mai\": \"あやせまい\",\n        \"kishibe\": \"岸边\",\n        \"sake\": \"鲑\",\n        \"takizawa naia\": \"滝沢ナイア\",\n        \"hirugohan\": \"昼ごはん\",\n        \"izumi rin\": \"和泉凛\",\n        \"kamijou noboru\": \"上上上\",\n        \"matsutaka zon\": \"松鷹ぞん\",\n        \"mukaibi aoi\": \"向井弥・葵\",\n        \"takane nohana\": \"たかねのはな\",\n        \"yokoyama chicha\": \"よこやまちちゃ\",\n        \"yuuma\": \"祐马 | ゆーま\",\n        \"koide nao\": \"小出奈央\",\n        \"ueyama you\": \"Ueyama You\",\n        \"umino luka\": \"海野留珈\",\n        \"kabocha\": \"南瓜\",\n        \"kaidou kazuki\": \"海道阔毅\",\n        \"nishikawa kouto\": \"西川孔人\",\n        \"torosawa\": \"とろさわ\",\n        \"sekira ame\": \"せきらあめ\",\n        \"koayako\": \"コアヤアコ\",\n        \"yagami shuuichi\": \"八神秋一\",\n        \"aimaitei umami\": \"愛昧亭うまみ\",\n        \"ohara hiroki\": \"绪原博绮\",\n        \"hanaduka ryouji\": \"华塚良治\",\n        \"komine tsubasa\": \"小峯つばさ\",\n        \"arikawa katokichi\": \"ありかわかときち\",\n        \"branshea\": \"ブランシェア\",\n        \"hiruma kouji\": \"ひるまこうじ\",\n        \"kyon\": \"きょん\",\n        \"minami tomoko\": \"南智子\",\n        \"misaki yukihiro\": \"岬ゆきひろ\",\n        \"ajishio\": \"アジシオ\",\n        \"basara\": \"バサラ\",\n        \"terada zukeo\": \"寺田ヅケ夫\",\n        \"nekomaru\": \"猫丸\",\n        \"yuzumiya mono\": \"柚宫MoNo\",\n        \"ginhaha\": \"ぎんハハ\",\n        \"kiken shisou\": \"危险思想\",\n        \"dokokano aitsu\": \"何処乃アイツ\",\n        \"ginyoku screw\": \"銀欲スクリュー\",\n        \"hg chagawa\": \"HG茶川\",\n        \"john sitch-oh\": \"ジョン湿地王\",\n        \"kamitani\": \"カミタニ\",\n        \"nico pun nise\": \"笑花伪\",\n        \"okina saina\": \"冲那彩菜\",\n        \"sonomiya ponta\": \"想乃宮ぽん太\",\n        \"uziga waita\": \"氏賀Y太\",\n        \"araki kyouya\": \"荒木京也\",\n        \"bunchin\": \"ぶんちん\",\n        \"don shigeru\": \"DON繁\",\n        \"dorei jackie\": \"奴隷ジャッキー\",\n        \"drill murata\": \"ドリルムラタ\",\n        \"kira hiroyoshi\": \"吉良广义\",\n        \"koshow showshow\": \"故障少将\",\n        \"shiromi kazuhisa\": \"しろみかずひさ\",\n        \"yukarigawa yumiya\": \"紫川弓夜\",\n        \"eric w. schwartz\": \"Eric W. Schwartz\",\n        \"x pierrot\": \"Xぴえろ\",\n        \"minust\": \"minusT\",\n        \"irohakaede\": \"イロハカエデ\",\n        \"miwatari renge\": \"美渡れんげ\",\n        \"satofuji masato\": \"了藤诚仁\",\n        \"yoshi hyuuma\": \"吉飞雄马\",\n        \"yuri ai\": \"悠理爱\",\n        \"yamakumo\": \"山云\",\n        \"purin purin\": \"プリンプリン\",\n        \"aoki ume\": \"蒼樹うめ\",\n        \"nekosawaritai\": \"猫泽鲤鲷\",\n        \"raidon\": \"来钝\",\n        \"namaniku atk\": \"なまにくATK\",\n        \"kumaco\": \"くまこ\",\n        \"kuroshibe\": \"クロシベ\",\n        \"akise\": \"秋濑\",\n        \"fukuguri yuuto\": \"福栗悠斗\",\n        \"futaba yae\": \"双叶八重\",\n        \"koorizu\": \"コオリズ\",\n        \"kumataro\": \"隈太郎\",\n        \"mokkouyou bond\": \"木工用ボンド\",\n        \"mustang r\": \"マスタングR\",\n        \"nanakagi satoshi\": \"七键智志\",\n        \"saba ibaru\": \"佐羽いばる\",\n        \"takuwan\": \"たくわん\",\n        \"tsukiwani\": \"月わに\",\n        \"jyun\": \"JYUN\",\n        \"nokoppa\": \"のこっぱ\",\n        \"aru ra une\": \"アル・ラ・ウネ\",\n        \"aranasi\": \"新良梨\",\n        \"maki yoshitaka\": \"真木佳刚\",\n        \"kazuma g-version\": \"カズマ・G-VERSION\",\n        \"fangcat\": \"FangCat\",\n        \"wtk\": \"WTK\",\n        \"as109\": \"As109\",\n        \"jm\": \"JM\",\n        \"breakrabbit\": \"Breakrabbit\",\n        \"farg\": \"Farg\",\n        \"yamamoto zenzen\": \"山本善々\",\n        \"miyata ichimi\": \"宫田一海\",\n        \"kumak\": \"KUMAK\",\n        \"neneru\": \"ねねる\",\n        \"orange bull\": \"牛橘\",\n        \"ipuu\": \"伊菩\",\n        \"ohayou-san\": \"翁さい\",\n        \"nadeneko ponia\": \"撫狸ぽにあ\",\n        \"harukoubou norimaki\": \"春工房のりまき\",\n        \"forester\": \"ふぉれすた\",\n        \"metal owl\": \"Metal Owl\",\n        \"ozaki miray\": \"尾崎未来\",\n        \"madcat\": \"Madcat\",\n        \"shinooka homare\": \"篠岡ほまれ\",\n        \"uruujima call\": \"うるう島呼音\",\n        \"koizumi amane\": \"恋泉天音\",\n        \"stikyfinkaz\": \"StikyfinkaZ\",\n        \"shirasagi rokuwa\": \"白鹭六羽\",\n        \"sato daiji\": \"大慈\",\n        \"akeno minato\": \"绯野湊\",\n        \"hanabana tsubomi\": \"華々つぼみ\",\n        \"soyosoyo\": \"SOYOSOYO\",\n        \"sasorigatame\": \"さそりがため\",\n        \"chong wuxin\": \"虫无心\",\n        \"shiitakemiya donco\": \"椎茸宮どんこ\",\n        \"minase kuru\": \"水瀬くうる\",\n        \"miwa futaba\": \"三輪フタバ\",\n        \"arano oki\": \"荒野冲\",\n        \"nekotewi\": \"ねこてゐ\",\n        \"ohisashiburi\": \"お久しぶり\",\n        \"tsushima zan\": \"津嶋ザン\",\n        \"tsuda nanafushi\": \"津田七节\",\n        \"tokuni mirashichi\": \"戸国みらしち\",\n        \"ganari ryu\": \"がなり龍\",\n        \"ayuya\": \"あゆや\",\n        \"kagato\": \"加画都\",\n        \"ki-you\": \"贵勇\",\n        \"koujima tenro\": \"向島てんろ\",\n        \"natsume fumika\": \"夏目文花\",\n        \"potekoro\": \"ぽてころ\",\n        \"yukawa asami\": \"由河朝巳\",\n        \"alto seneka\": \"或十せねか\",\n        \"doi sakazaki\": \"土居坂崎\",\n        \"dowarukofu\": \"どわるこふ\",\n        \"isono toshiaki\": \"磯野としあき\",\n        \"kakogawa tarou\": \"加古川太郎\",\n        \"kokoromi shingon\": \"こころみ真言\",\n        \"komori ei\": \"古森詠\",\n        \"mashue\": \"Mashue\",\n        \"matsuzawa kei\": \"松沢慧\",\n        \"oohashi takayuki\": \"オオハシタカユキ\",\n        \"rollpan2\": \"Roll-Pants\",\n        \"rusty soul\": \"ラスティソウル\",\n        \"sakaki shiori\": \"さかき栞\",\n        \"shibahara gotyo\": \"しばはらごちょ\",\n        \"uyuu atsuno\": \"烏有あつの\",\n        \"iguchi sentarou\": \"井口千太郎\",\n        \"oborogumo takamitsu\": \"朧雲たかみつ\",\n        \"aoi kumiko\": \"葵久美子\",\n        \"noripachi\": \"のりパチ\",\n        \"hatokonro\": \"鳩こんろ\",\n        \"abe yoshitoshi\": \"安倍吉俊\",\n        \"son hee-joon\": \"손희준\",\n        \"herurun\": \"へるるん\",\n        \"hoshino\": \"星乃\",\n        \"zyugoya\": \"十五夜\",\n        \"yamaoka koutetsurou\": \"山冈钢铁郎\",\n        \"henreader\": \"へんりいだ\",\n        \"47agdragon\": \"47AgDragon\",\n        \"josho isamu\": \"城所委佐武\",\n        \"ogipote\": \"荻pote\",\n        \"marimofu\": \"まりもふ\",\n        \"alison\": \"ALISON\",\n        \"shimajirou\": \"岛次郎\",\n        \"kazuharu kina\": \"和遥キナ\",\n        \"ponta\": \"PoN太\",\n        \"akisora\": \"秋穹\",\n        \"tanishi mitsuru\": \"タニシミツル\",\n        \"mizuno koori\": \"水乃コオリ\",\n        \"akaiguppy\": \"全红白子\",\n        \"etuzan jakusui\": \"越山弱衰\",\n        \"eiji\": \"Eiジ\",\n        \"oryou\": \"おりょう\",\n        \"waguchi shouka\": \"和口昇火\",\n        \"tenzen miyabi\": \"天渐雅\",\n        \"windart\": \"WindArt\",\n        \"masaki kei\": \"真崎ケイ\",\n        \"mousou-kun\": \"もうそうくん\",\n        \"ooishi chuuni\": \"大石中二\",\n        \"mitsudoue\": \"みつどうえ\",\n        \"watanabe akio\": \"渡边明夫\",\n        \"kiyokawa nijiko\": \"虚川二次子\",\n        \"himuro serika\": \"冰室芹夏\",\n        \"nachisuke\": \"なちすけ\",\n        \"kasuga mayu\": \"春日まゆ\",\n        \"kirimoto yuuji\": \"桐下悠司\",\n        \"suihei sen\": \"水平线\",\n        \"yuunagi\": \"ユウナギ\",\n        \"jadenkaiba\": \"Jadenkaiba\",\n        \"legoman\": \"Legoman\",\n        \"staryume\": \"星遥ゆめ\",\n        \"kamifuji mikeko\": \"神藤みけこ\",\n        \"hekicha\": \"碧茶\",\n        \"nrr\": \"Nrr\",\n        \"inue shinsuke\": \"犬江しんすけ\",\n        \"onigirikun\": \"おにぎり君\",\n        \"nekosu\": \"ねこす\",\n        \"akahito\": \"赤人\",\n        \"hanada yanochi\": \"花田やのち\",\n        \"kinokomushi\": \"きのこむし\",\n        \"ichimura\": \"イチムラ\",\n        \"crimson\": \"クリムゾン\",\n        \"tanishi\": \"たにし\",\n        \"akizora sawayaka\": \"秋空さわやか\",\n        \"izumiya otoha\": \"いづみやおとは\",\n        \"minamida usuke\": \"南田U助\",\n        \"mizuyuki\": \"みずゆき\",\n        \"nise\": \"似せ\",\n        \"kojirou\": \"KOJIROU!\",\n        \"hidemaru\": \"英丸\",\n        \"hakkyou daioujou\": \"发狂大往生\",\n        \"blackshirtboy\": \"Blackshirtboy\",\n        \"xpray\": \"Xpray\",\n        \"shika yuno\": \"椎架ゆの\",\n        \"azarashi\": \"アザラシ\",\n        \"syamonabe\": \"シャモナベ\",\n        \"tyagama\": \"茶釜\",\n        \"tkp\": \"TKP\",\n        \"yakumo ginjirou\": \"八云银次郎\",\n        \"namamo nanase\": \"なまもななせ\",\n        \"pyon-kti\": \"ぴょん吉\",\n        \"azuki yui\": \"阿月唯\",\n        \"minato itoya\": \"ミナトイトヤ\",\n        \"shiraishinsuke\": \"白石Nスケ\",\n        \"soramame-san\": \"そら豆さん\",\n        \"wabara hiro\": \"羽原ヒロ\",\n        \"synchroaki\": \"しんくろあき\",\n        \"kin no tamamushi\": \"金ノ玉虫\",\n        \"yamamoto hyugo\": \"山本ひゅーご\",\n        \"lithium\": \"Lithium\",\n        \"athu\": \"Athu\",\n        \"kawarajima koh\": \"かわらじま晃\",\n        \"focke wolf\": \"ほっけうるふ\",\n        \"rukitsura.\": \"るきつら。\",\n        \"tsuchinoshita kaeru\": \"土ノ下かえる\",\n        \"nokobeya\": \"のこべや\",\n        \"ponfaz\": \"ぽんふぁーず\",\n        \"hihumi hajime\": \"一二三始\",\n        \"momoyama jirou\": \"桃山ジロウ\",\n        \"r5\": \"R5\",\n        \"c2\": \"C2\",\n        \"shitappa\": \"したっぱ\",\n        \"kanbayashi takaki\": \"神林タカキ\",\n        \"nyx\": \"にゅくす\",\n        \"akashia\": \"アカシア\",\n        \"shigeta\": \"しげた\",\n        \"uminori\": \"うみのり\",\n        \"yopparai oni\": \"酔っ払い鬼?\",\n        \"alpaca club\": \"あるぱかくらぶ\",\n        \"berosu\": \"べろす\",\n        \"silly\": \"しりー\",\n        \"sekiri\": \"せきり\",\n        \"midorino tanuki\": \"翠野タヌキ\",\n        \"kanna hisashi\": \"かんな久\",\n        \"kitahara eiji\": \"北原エイジ\",\n        \"aoi miharu\": \"蒼井ミハル\",\n        \"arinotowatari\": \"ありのとわたり\",\n        \"dagashi\": \"駄菓子\",\n        \"e-musu aki\": \"いーむす・アキ\",\n        \"himeno komomo\": \"姫野こもも\",\n        \"kamisiro ryu\": \"神代龙\",\n        \"kerorin\": \"けろりん\",\n        \"kenji\": \"けんじ\",\n        \"knuckle curve\": \"ナックルカーブ\",\n        \"koumo\": \"コーモ\",\n        \"mikarin\": \"ミカリン\",\n        \"minagiri\": \"ミナギリ\",\n        \"nijou katame\": \"二条かため\",\n        \"ouchi kaeru\": \"楝蛙\",\n        \"sexyturkey\": \"すたーきー\",\n        \"shikkarimono no takashi-kun\": \"しっかり者のタカシくん\",\n        \"survival knife\": \"サバイバル刃\",\n        \"kishiri toworu\": \"ヲルト\",\n        \"yakitomato\": \"八木户マト\",\n        \"ban kazuyasu\": \"伴カズヤス\",\n        \"kaneko toshiaki\": \"かねことしあき\",\n        \"labui\": \"羅ぶい\",\n        \"tanaka ginji\": \"田中银二\",\n        \"tetsuyama kaya\": \"鉄山かや\",\n        \"oota takeshi\": \"大田武志\",\n        \"sora inoue\": \"いのうえ空\",\n        \"tan jiu\": \"坛九\",\n        \"shigeru\": \"しげる\",\n        \"akata izuki\": \"亚方逸树\",\n        \"matsumori shou\": \"茉森晶\",\n        \"datarou\": \"だたろう\",\n        \"miso tya\": \"みそ茶\",\n        \"eirizo\": \"エイリゾ\",\n        \"ootomo yuuki\": \"大友ゆうき\",\n        \"sorai shinya\": \"空维深夜\",\n        \"muuba\": \"梦生场\",\n        \"orukaniumu\": \"おるかにうむ\",\n        \"izayoi no kiki\": \"十六夜のキキ\",\n        \"wada rco\": \"ワダアルコ\",\n        \"agobitch nee-san\": \"アゴビッチ姉さん\",\n        \"kito sakeru\": \"鬼头サケル\",\n        \"misa wasabi\": \"三左わさび\",\n        \"momoduki suzu\": \"桃月すず\",\n        \"picao\": \"ぴかお\",\n        \"girls number\": \"Girl's Number\",\n        \"asazuki norito\": \"浅月のりと\",\n        \"nodoka\": \"长闲\",\n        \"ajiichi\": \"アジイチ\",\n        \"aoihito\": \"蒼い人\",\n        \"namusoubyou\": \"名无双描\",\n        \"marushamo\": \"まるしゃも\",\n        \"haruhonya\": \"はるほんや\",\n        \"shinya\": \"しんや\",\n        \"yonban\": \"よんばん\",\n        \"nori-haru\": \"のりはる\",\n        \"neko totora\": \"ねこトトラ\",\n        \"wulazula\": \"うらずら\",\n        \"aian\": \"あいあん\",\n        \"nmo ezago\": \"ンモ=エザゴ\",\n        \"mikuni atsuko\": \"三国あつ子\",\n        \"nekousa\": \"猫兔\",\n        \"shown\": \"ショーン\",\n        \"shimakaze\": \"岛风\",\n        \"hamatyonn\": \"ハマちょん\",\n        \"fukufukuan\": \"福々餡\",\n        \"aikawa an\": \"愛川あん\",\n        \"nao takami\": \"尚たかみ\",\n        \"okuni yoshinobu\": \"小国由喜\",\n        \"oreiro\": \"オレイロ\",\n        \"ndc\": \"NDC\",\n        \"rocket monkey\": \"ロケットモンキー\",\n        \"a-teru haito\": \"A辉废都\",\n        \"kusumoto toka\": \"楠元とうか\",\n        \"utatane hiroyuki\": \"うたたねひろゆき\",\n        \"chuuka naruto\": \"中華なると\",\n        \"area\": \"Area\",\n        \"kruth666\": \"Kruth666\",\n        \"f4u\": \"F4U\",\n        \"higenamuchi\": \"ひげなむち\",\n        \"honryo hanaru\": \"本領はなる\",\n        \"ichigain\": \"一概\",\n        \"konchiki\": \"こんちき\",\n        \"namboku\": \"南北\",\n        \"tohzai\": \"东西\",\n        \"ogadenmon\": \"オガデンモン\",\n        \"sakuma tsukasa\": \"さくま司\",\n        \"arai togami\": \"荒居栂美\",\n        \"fujitsuna\": \"フジツナ\",\n        \"fukuroumori\": \"枭森\",\n        \"yukino koreyuki\": \"之之之之\",\n        \"momio\": \"もみお\",\n        \"vivian tian zong\": \"Vivian天纵\",\n        \"sugihara\": \"すぎはら\",\n        \"minagi umihito\": \"深凪ウミヒト\",\n        \"natsu no koucha\": \"夏の紅茶\",\n        \"prime\": \"Prime\",\n        \"tatekawa mako\": \"館川まこ\",\n        \"hrd\": \"hr津\",\n        \"choco-chip\": \"チョコ・チップ\",\n        \"sakurai makoto\": \"櫻井マコト\",\n        \"kuronyan\": \"くろニャン\",\n        \"moriyama yusuke\": \"森山雄介\",\n        \"son yohsyu\": \"孙阳州\",\n        \"ray-kbys\": \"Ray-Kbys\",\n        \"potato\": \"POTATO\",\n        \"ichihara hikari z\": \"位置原光Z\",\n        \"komezawa\": \"こめざわ\",\n        \"mozu\": \"もず\",\n        \"aoiro ichigou\": \"あお色一号\",\n        \"futamine kobito\": \"二峰跨人\",\n        \"gennari\": \"ゲンナリ\",\n        \"inukami\": \"いぬかみ\",\n        \"narumiya akira\": \"成宫亨\",\n        \"oosawara sadao\": \"大童贞男\",\n        \"sugarbt\": \"sugarBt\",\n        \"sunahama nosame\": \"砂浜のさめ\",\n        \"zakotsu\": \"佐骨\",\n        \"nidy-2d-\": \"Nidy-2D-\",\n        \"urico take\": \"瓜子たけ\",\n        \"tanohito\": \"たのひと\",\n        \"kouki kuu\": \"こうきくう\",\n        \"engawa suguru\": \"エンガワ卓\",\n        \"fuji-han\": \"ふじはん\",\n        \"hayashida toranosuke\": \"林田虎之助\",\n        \"buchou chinke\": \"部長ちんけ\",\n        \"asakura kukuri\": \"アサクラククリ\",\n        \"nanao naru\": \"七尾奈留\",\n        \"kirishima ayu\": \"雾岛鲇\",\n        \"keita naruzawa\": \"Keita Naruzawa\",\n        \"amami sen\": \"天观仙\",\n        \"juujou tatami\": \"十畳たたみ\",\n        \"ermuzibu\": \"Ermuzibu\",\n        \"gingami\": \"银河味\",\n        \"makino tomoe\": \"槇野ともえ\",\n        \"teppeki kyojin\": \"铁壁巨人\",\n        \"mimiyoshi\": \"みみよし\",\n        \"jinsuke\": \"甚助\",\n        \"mushoku santaro\": \"无色三太郎\",\n        \"tawara hiryuu\": \"俵绯龙\",\n        \"marugoshi\": \"まるごし\",\n        \"missbehaviour\": \"MissBehaviour\",\n        \"funsexydragonball\": \"Funsexydragonball\",\n        \"badonion\": \"BadOnion\",\n        \"hazuki ruka\": \"羽月るか\",\n        \"eno tato\": \"江野たと\",\n        \"daiaru\": \"ダイアル\",\n        \"mokusei zaijuu\": \"木星在住\",\n        \"kaga akuru\": \"加賀あくる\",\n        \"nekoaruko\": \"ねこ＠るこ\",\n        \"hari senbon\": \"针千本\",\n        \"bang-you\": \"BANG-YOU\",\n        \"bubuzuke\": \"ぶぶづけ\",\n        \"gentle sasaki\": \"ジェントル佐々木\",\n        \"kamina koharu\": \"神无小春\",\n        \"kei.\": \"刑。\",\n        \"mikoyan\": \"みこやん\",\n        \"nuezou\": \"ヌエゾウ\",\n        \"ribyuhki\": \"リブユウキ\",\n        \"sgk\": \"SGK\",\n        \"shinkuu tatsuya\": \"しんくうたつや\",\n        \"unou\": \"右脑\",\n        \"yuuki shin\": \"悠木しん\",\n        \"harumi\": \"春海\",\n        \"mirei\": \"みれい\",\n        \"miwa yoshikazu\": \"美和美和\",\n        \"wildcat\": \"ワイルドキャット\",\n        \"fujita yukihisa\": \"藤田幸久\",\n        \"l axe\": \"L Axe\",\n        \"s.m.o.k.e.\": \"S.M.O.K.E.\",\n        \"samurai\": \"さむらい\",\n        \"kureyon\": \"くれよん\",\n        \"broccoli takeda\": \"ブロッコリーたけだ\",\n        \"maatsu\": \"ま～つ\",\n        \"toumasu\": \"とーます\",\n        \"ishikawa sae\": \"石川沙绘\",\n        \"nagihashi coko\": \"なぎはしここ\",\n        \"u-jin\": \"游人\",\n        \"piripun\": \"ぴりぷん\",\n        \"akabashi\": \"アカバシ\",\n        \"mataro\": \"魔太郎\",\n        \"kekocha\": \"けこちゃ\",\n        \"mogiki hayami\": \"十はやみ\",\n        \"the amanoja9\": \"The Amanoja9\",\n        \"fumitsuki sou\": \"二三月そう\",\n        \"fuji hyorone\": \"藤ひょろね\",\n        \"hibimegane\": \"ヒビメガネ\",\n        \"dekosuke 18gou\": \"デコ助18号\",\n        \"geso smith\": \"ゲソスミス\",\n        \"hidarite tarou\": \"左手太郎\",\n        \"jagayamatarawo\": \"じゃが山たらヲ\",\n        \"kasei\": \"かせい\",\n        \"kayanoi ino\": \"茅乃井いの\",\n        \"kiiroi tamago\": \"黄色的蛋\",\n        \"kirihara you\": \"桐原湧\",\n        \"mdakoki\": \"M田K樹\",\n        \"ooyoko yamaame\": \"大横山饴\",\n        \"ryokuchaism\": \"緑茶イズム\",\n        \"shiden akira\": \"しでん晶\",\n        \"soborogo\": \"ソボロゴ\",\n        \"syoukaki\": \"消火器\",\n        \"1 equals 2\": \"1=2\",\n        \"zouo-san\": \"憎恶产\",\n        \"machida hiraku\": \"町田ひらく\",\n        \"mamezou\": \"まめぞう\",\n        \"yamaya oowemon\": \"山家大右卫门\",\n        \"yuizaki kazuya\": \"ユイザキカズヤ\",\n        \"shichimenchou\": \"しちめんちょう\",\n        \"bigshine\": \"ビッグシャイン\",\n        \"apoidea\": \"Apoidea\",\n        \"randou\": \"乱道\",\n        \"midoriiro\": \"緑いろ\",\n        \"koukou punch\": \"高校パンチ\",\n        \"arai kogane\": \"新井コガネ\",\n        \"aoin\": \"AOIN\",\n        \"takase asagiri\": \"鷹瀬あさぎり\",\n        \"ugaromix\": \"Ugaromix\",\n        \"aizawa hiroshi\": \"あいざわひろし\",\n        \"b-ginga\": \"B-银河\",\n        \"nanami\": \"七弥\",\n        \"narumi cristear note\": \"成海クリスティアーノート\",\n        \"saku usako\": \"佐久うさこ\",\n        \"aotsu karin\": \"蒼都かりん\",\n        \"mori airi\": \"森あいり\",\n        \"mimura zaja\": \"三村ざじゃ\",\n        \"itomugi-kun\": \"糸麦くん\",\n        \"aru urara\": \"あるうらら\",\n        \"sakura saku sakura\": \"佐倉さくさくら\",\n        \"akinaro\": \"あきなろ\",\n        \"hanakawa sugar\": \"花川シュガー\",\n        \"urabi\": \"紅吊うらび\",\n        \"kichirock\": \"キチロク\",\n        \"wes heartland smith\": \"ウェス·ハートランド·スミス\",\n        \"pochincoff\": \"ポチンコフ\",\n        \"shimeji nameko\": \"しめじなめこ\",\n        \"sakibashiri jiru\": \"先走汁\",\n        \"hayashi tugumi\": \"林つぐみ\",\n        \"tamura chii\": \"田村ちい\",\n        \"jagausa\": \"じゃがうさ\",\n        \"misuroma\": \"みすろま\",\n        \"kabe umari-ko\": \"壁埋まり子\",\n        \"crowly\": \"くろうり\",\n        \"sekiya asami\": \"关谷あさみ\",\n        \"nananana\": \"ナナナナ\",\n        \"cafekun\": \"cafekun\",\n        \"hataraki ari\": \"ハタラキ有\",\n        \"kilesha\": \"きれゐしゃ\",\n        \"spec\": \"SPEC\",\n        \"gogocherry\": \"GOGOCHERRY\",\n        \"kitajima yuuki\": \"北嶋ゆうき\",\n        \"renji\": \"练慈\",\n        \"wise speak\": \"ワイズスピーク\",\n        \"ayamy\": \"あやみ\",\n        \"cekonikova\": \"Cekonikova（ぐらら）\",\n        \"ke-ta\": \"ke-ta\",\n        \"roteri\": \"ろてり\",\n        \"kannaduki kanna\": \"神無月かんな\",\n        \"endou okito\": \"袁藤沖人\",\n        \"messy\": \"メッシィ\",\n        \"aomushi\": \"あおむし\",\n        \"zheng\": \"Zheng\",\n        \"yukimoto shuuji\": \"雪本愁二\",\n        \"omaru gyuunyuu\": \"牛乳うまお\",\n        \"futami paran\": \"二見パラン\",\n        \"torajima tao\": \"虎島タオ\",\n        \"mr.takealook\": \"Mr.takealook\",\n        \"isobe maki\": \"イソベマキ\",\n        \"sensouji kinoto\": \"浅草寺きのと\",\n        \"shinozuka yuuji\": \"篠塚裕志\",\n        \"shikishiro konomi\": \"色白好\",\n        \"sakurayu hal\": \"樱汤ハル\",\n        \"nanao yukiji\": \"七尾ゆきじ\",\n        \"herio\": \"ヘリを\",\n        \"aikawa arisa\": \"相川亚利砂\",\n        \"yamaishi juhachi\": \"山石18\",\n        \"rokkaku yasosuke\": \"六角八十助\",\n        \"tomono hiro\": \"友野ヒロ\",\n        \"yonekura kengo\": \"米倉けんご\",\n        \"yosuteinu\": \"世棄犬\",\n        \"hiyoshi hana\": \"日吉ハナ\",\n        \"tabigarasu\": \"旅乌\",\n        \"tsuge yasuna\": \"つげ安奈\",\n        \"hissatsukun\": \"ひっさつくん\",\n        \"ayakawa riku\": \"あやかわりく\",\n        \"yoshida inuhito\": \"吉田犬人\",\n        \"yuyama chika\": \"湯山チカ\",\n        \"kumakiti\": \"隈吉\",\n        \"umakuchi syouyu\": \"うまくち酱油\",\n        \"tokie hirohito\": \"刻江寻人\",\n        \"yuzuki n dash\": \"柚木N’\",\n        \"itou nanami\": \"井藤ななみ\",\n        \"porutan\": \"ぽるたん\",\n        \"kaitenfude\": \"回转笔\",\n        \"tachikawa negoro\": \"立川ねごろ\",\n        \"emine kendama\": \"遠峰犬玉\",\n        \"masami chie\": \"柾见ちえ\",\n        \"ryuuki yumi\": \"りゅうき夕海\",\n        \"nakano sora\": \"中乃空\",\n        \"napo\": \"ナポ\",\n        \"kazuki misaki\": \"数木美咲\",\n        \"nakata modem\": \"中田モデム\",\n        \"anzaki moral\": \"杏咲モラル\",\n        \"brother pierrot\": \"ブラザーピエロ\",\n        \"oltlo\": \"おるとろ\",\n        \"piromizu\": \"ピロ水\",\n        \"jorori\": \"じょろり\",\n        \"abe manabu\": \"安部マナブ\",\n        \"matsunami rumi\": \"松波留美\",\n        \"narita kyousha\": \"成田香車\",\n        \"arakure\": \"あらくれ\",\n        \"seto yuuki\": \"世徒ゆうき\",\n        \"yami kota\": \"やみこた\",\n        \"kakumayu\": \"カクマユ\",\n        \"sorairo len\": \"空色れん\",\n        \"yamiochi umekichi\": \"闇堕ち梅吉\",\n        \"namaribou nayonayo\": \"铅棒なよなよ\",\n        \"amasaka takashi\": \"天坂隆志\",\n        \"kazuma\": \"和真\",\n        \"uni8\": \"うにあはと\",\n        \"denchi\": \"电池\",\n        \"ono no imoko\": \"小野妹子\",\n        \"nishieda\": \"西E田\",\n        \"gomennasai\": \"御免なさい\",\n        \"ame arare\": \"雨あられ\",\n        \"abi kamesennin\": \"俺正读\",\n        \"futayami\": \"双暗\",\n        \"deadflow\": \"Deadflow（Б）\",\n        \"yukishizuku\": \"ユキシズク\",\n        \"mappa ninatta\": \"マッパニナッタ\",\n        \"ryuuto hisashi\": \"りゅうとひさし\",\n        \"tamazatou\": \"玉砂糖\",\n        \"tanaka yuuichi\": \"田中雄一\",\n        \"nakamura kuzuyu\": \"中村葛汤\",\n        \"bekotarou\": \"ベコ太郎\",\n        \"ayuma sayu\": \"あゆま紗由\",\n        \"fumi miyabi\": \"文雅\",\n        \"masuda\": \"枡田\",\n        \"nunnu\": \"ぬんぬ\",\n        \"shimanto shisakugata\": \"40010试作型\",\n        \"yuzuna hiyo\": \"柚子奈ひよ\",\n        \"kojiki ohji\": \"古事记王子\",\n        \"tamakake\": \"たまかけ\",\n        \"shiromochi sakura\": \"白もち桜\",\n        \"shimao kazu\": \"嶋尾和\",\n        \"kanou ryuuji\": \"叶竜児\",\n        \"yatanukikey\": \"やたぬき圭\",\n        \"maihara matsuge\": \"舞原マツゲ\",\n        \"genzou kokuto\": \"幻像黒兎\",\n        \"yamashita kurowo\": \"山下クロヲ\",\n        \"yanagi yuu\": \"ヤナギユウ\",\n        \"ponite korosuke\": \"ポニテコロ介\",\n        \"azuse\": \"あずせ\",\n        \"mameojitan\": \"まめおじたん\",\n        \"giuniu\": \"ぎうにう\",\n        \"sabusuka\": \"サブスカ\",\n        \"senji\": \"煎路\",\n        \"komowata haruka\": \"こもわた遥華\",\n        \"murakami suigun\": \"村上水軍\",\n        \"takanae kyourin\": \"高苗京鈴\",\n        \"shirabe shiki\": \"調四季\",\n        \"kobuichi\": \"小舞一\",\n        \"yaneko uta\": \"弥猫うた\",\n        \"kirisaki byakko\": \"雾咲白狐\",\n        \"bareisho\": \"马铃薯\",\n        \"wakadori nikomi\": \"若鶏にこみ\",\n        \"shikitani asuka\": \"色谷あすか\",\n        \"furisuku\": \"ふりすく\",\n        \"kosuke haruhito\": \"虎助遥人\",\n        \"tomoe yousuke\": \"巴八丞\",\n        \"tokita alumi\": \"鴇田アルミ\",\n        \"poshi\": \"ぽし\",\n        \"haguruma\": \"歯車\",\n        \"kanekiyo miwa\": \"兼清みわ\",\n        \"gayarou\": \"☆画野朗\",\n        \"yashiro seika\": \"八城惺架\",\n        \"tokiwa midori\": \"常磐緑\",\n        \"tsubaki jushirou\": \"椿十四郎\",\n        \"tukinowagamo\": \"月ノ輪ガモ\",\n        \"uron rei\": \"ウーロン・レイ\",\n        \"mushanokouji shizuka\": \"武者小路静香\",\n        \"emori uki\": \"江森うき\",\n        \"shindou\": \"しんどう\",\n        \"kikurage\": \"きくらげ\",\n        \"sanom\": \"鎖ノム\",\n        \"amagasa ikuta\": \"雨暈郁太\",\n        \"sukesaburou\": \"助三郎\",\n        \"jiraiya\": \"児雷也\",\n        \"kuromotokun\": \"黑本君\",\n        \"gomano lio\": \"胡麻乃りお\",\n        \"shiratama moti\": \"白玉もち\",\n        \"shiratama yomogi\": \"しらたま よもぎ\",\n        \"yoshida iyo\": \"吉田 依世\",\n        \"sakura oriko\": \"佐倉おりこ\",\n        \"hinata yuu\": \"ひなた悠\",\n        \"odawara hakone\": \"オダワラハコネ\",\n        \"ikari\": \"いかり\",\n        \"humuyun\": \"ふむゆん\",\n        \"watagashi yui\": \"わたがしゆい\",\n        \"kohinata hoshimi\": \"小日向ほしみ\",\n        \"yudzuki hina\": \"遊月ひな\",\n        \"sakura ani\": \"桜あに\",\n        \"tsukishima yuuko\": \"月嶋ゆうこ\",\n        \"tomoshibi hidekazu\": \"赤提灯\",\n        \"kamisyakujii yubeshi\": \"紙石神井ゆべし\",\n        \"kurosu gatari\": \"黑巢ガタリ\",\n        \"doku denpa\": \"毒でんぱ\",\n        \"dokiyuri\": \"どきゆり\",\n        \"tamagoro\": \"たまごろー\",\n        \"mizore\": \"みぞれ\",\n        \"akure ekuto\": \"吾暮えくと\",\n        \"chacharan\": \"茶々らん\",\n        \"isuwie\": \"イスィ\",\n        \"misaoka\": \"みさおか\",\n        \"ootori mahiro\": \"鳳まひろ\",\n        \"yaya hinata\": \"稍日向\",\n        \"koeda shiro\": \"こえだしろ\",\n        \"honjou hideaki\": \"本条秀明\",\n        \"notzackforwork\": \"NotZackForWork\",\n        \"hayashizaki fumihiro\": \"林崎文博\",\n        \"hatomizu\": \"ハト水\",\n        \"hiroya\": \"广弥\",\n        \"amamiya\": \"アマミヤ\",\n        \"nedia\": \"ねでぃあ\",\n        \"aiki\": \"Aiki\",\n        \"mumei\": \"Mumei\",\n        \"tefun\": \"てふん\",\n        \"shikoripa\": \"しこりぱ\",\n        \"tani takuya\": \"谷拓也\",\n        \"maron\": \"魔龙\",\n        \"yomoyama takashi\": \"四方山贵史\",\n        \"fuji tarawi\": \"藤たらゐ\",\n        \"mousou\": \"妄想\",\n        \"yokohama inka\": \"よこはまインカ\",\n        \"hoshi\": \"ほし\",\n        \"nanamatsu kenji\": \"七松建司\",\n        \"fuumi\": \"ふーみ\",\n        \"shacho\": \"社ちょ\",\n        \"toito\": \"トイト\",\n        \"toketou\": \"とけとう\",\n        \"shisyo\": \"ししょー\",\n        \"whistlerx\": \"WhistlerX\",\n        \"hagiwara asami\": \"萩原あさ美\",\n        \"itose ikuto\": \"爱濑郁人\",\n        \"osaru\": \"御猿\",\n        \"etori yuuya\": \"江鸟\",\n        \"ootsuka kotora\": \"大塚子虎\",\n        \"testa\": \"てすた\",\n        \"butachang\": \"ぶたちゃんぐ\",\n        \"sahara gensei\": \"佐原玄清\",\n        \"hino hino\": \"緋乃ひの\",\n        \"tsukuru\": \"作\",\n        \"habara meguru\": \"羽原メグル\",\n        \"hanabusa satoshi\": \"はなぶささとし\",\n        \"hado\": \"はあど\",\n        \"takemasa takeshi\": \"武将武\",\n        \"akabeko\": \"あかべこ\",\n        \"hisui\": \"翡翠石\",\n        \"sakura yuki\": \"咲良ゆき\",\n        \"suga hideo\": \"スガヒデオ\",\n        \"nadaka harutsugu\": \"南高春告（梅干）\",\n        \"hatori you\": \"葉鳥侑\",\n        \"byougaku\": \"猫額\",\n        \"yoshu ohepe\": \"養酒オヘペ\",\n        \"amanagi seiji\": \"天凪青磁\",\n        \"tsukako\": \"つかこ\",\n        \"mochi\": \"モチ\",\n        \"araiguma\": \"あらいぐま\",\n        \"2-g\": \"2-G\",\n        \"sukoyaka gyuunyuu\": \"健やか牛乳\",\n        \"saeki nao\": \"彩季なお\",\n        \"endori\": \"えんどり\",\n        \"fukuoka tarou\": \"福冈太朗\",\n        \"mafuyu hemp\": \"麻冬HEMP\",\n        \"kanno takanori\": \"南乃さざん\",\n        \"takehana note\": \"竹花ノート\",\n        \"sakuraba hikaru\": \"桜庭光\",\n        \"wolflong\": \"╰狼龍\",\n        \"toyosaki shu\": \"豊咲\",\n        \"mutou koucha\": \"无糖红茶\",\n        \"kurihara kenshirou\": \"栗原ケンシロウ\",\n        \"matsumotoke\": \"松本家御愛用\",\n        \"utamaro\": \"歌麿\",\n        \"tadima yoshikadu\": \"たぢまよしかづ\",\n        \"puuakachan\": \"プーアカちゃん\",\n        \"wataame\": \"わたあめ\",\n        \"aduki\": \"あづき\",\n        \"inui waon\": \"乾和音\",\n        \"majima shiroyuki\": \"间岛白幸\",\n        \"sougetsu nonono\": \"草月野々乃\",\n        \"wantan meo\": \"云吞めお\",\n        \"kemuri haku\": \"煙ハク\",\n        \"kani biimu\": \"かにビーム\",\n        \"watanohara\": \"わたのはら\",\n        \"kawasaki tadataka\": \"川崎直孝\",\n        \"shiraishi nagisa\": \"白石なぎさ\",\n        \"kurikimaru\": \"くりきまる\",\n        \"hinohara fuki\": \"檜原フキ\",\n        \"kobayashi kina\": \"小林キナ\",\n        \"takemitsu\": \"たけみつ\",\n        \"shiki\": \"四季\",\n        \"deyuyama\": \"でゆ山\",\n        \"namidame\": \"泪目\",\n        \"higata akatsuki\": \"阳方晶月\",\n        \"kayumidome\": \"かゆみ止め\",\n        \"naha 78\": \"ナハ78\",\n        \"getsuyou yasumi.\": \"月曜休み。\",\n        \"arumamai ayuka plus\": \"在誠舞あゆか+\",\n        \"take calcium\": \"竹刈シウム\",\n        \"aritsuno\": \"有角\",\n        \"shinova\": \"シノバ\",\n        \"mahito\": \"真人\",\n        \"anon 2-okunen\": \"あのん2億年\",\n        \"zikataro\": \"自家太郎\",\n        \"footaro\": \"辻風太郎\",\n        \"mokuzu\": \"もくず\",\n        \"mizuno kurage\": \"水乃くらげ\",\n        \"aoi\": \"あおい\",\n        \"uguisu mochi\": \"うぐいす餅\",\n        \"kirero\": \"kirero\",\n        \"hyura3\": \"ひゅらさん\",\n        \"fumituki\": \"ふみつき\",\n        \"mimi\": \"魅未\",\n        \"doru\": \"$\",\n        \"mikagami hiyori\": \"水鏡ひより\",\n        \"hisaka tooru\": \"氷坂透\",\n        \"eseneko\": \"えせねこ\",\n        \"oinari\": \"おいなり\",\n        \"kata k\": \"カタケイ\",\n        \"miisha\": \"みーしゃ\",\n        \"ichiba youichi\": \"市葉葉市\",\n        \"beni shake\": \"べにしゃけ\",\n        \"megumiya\": \"megumiya\",\n        \"aiu\": \"蓝兔\",\n        \"kobato neneko\": \"小鳩ねねこ\",\n        \"marota\": \"麻吕太\",\n        \"maineko ruru\": \"舞猫ルル\",\n        \"kanroame\": \"甘露アメ\",\n        \"shaa\": \"しゃあ\",\n        \"aka shio\": \"朱シオ\",\n        \"tomobe kinuko\": \"友部キヌコ\",\n        \"hirasaka makoto\": \"比良坂真琴\",\n        \"matsuriuta\": \"祭唄（松竜太）\",\n        \"momizi-kei\": \"紅葉-K\",\n        \"nagayori\": \"长赖\",\n        \"toosaka asagi\": \"遠坂あさぎ\",\n        \"momoco\": \"ももこ\",\n        \"ashima\": \"アシマ\",\n        \"suzumori\": \"铃森\",\n        \"kimishima ao\": \"君岛青\",\n        \"motiduki siina\": \"望月椎那\",\n        \"kino\": \"kino\",\n        \"mitha\": \"Mitha\",\n        \"tateha\": \"立羽\",\n        \"yano mitsuki\": \"夜ノみつき\",\n        \"fukahire\": \"フカヒレ\",\n        \"takano yuki\": \"鷹乃ゆき\",\n        \"suimya\": \"すいみゃ\",\n        \"shirokuma a\": \"シロクマA\",\n        \"karory\": \"karory\",\n        \"tomo\": \"ともー\",\n        \"kiba satoshi\": \"木場智士\",\n        \"ziko\": \"ziko\",\n        \"techi\": \"てち\",\n        \"koza\": \"コザ\",\n        \"mame denkyuu\": \"まめでんきゅう\",\n        \"mocha\": \"Mocha\",\n        \"teitetsu\": \"蹄铁\",\n        \"sugiura sen\": \"杉浦线\",\n        \"izumi nanase\": \"いずみななせ\",\n        \"moekibara fumitake\": \"萌木原文武\",\n        \"mizuki takehito\": \"みづきたけひと\",\n        \"takahashi tetsuya\": \"高桥哲哉\",\n        \"hiten\": \"Hiten\",\n        \"inugami kira\": \"狗神煌\",\n        \"korie riko\": \"梱枝莉子\",\n        \"hasune\": \"はすね\",\n        \"muku\": \"muku\",\n        \"kurou\": \"九郎\",\n        \"natsuki yuu\": \"なつきゆう\",\n        \"pan\": \"ぱん\",\n        \"yaman\": \"yaman**\",\n        \"anapon\": \"あなぽん\",\n        \"mashiro shirako\": \"真白しらこ\",\n        \"yagi the goat\": \"ヤギの人\",\n        \"morimiya masayuki\": \"森宫正幸\",\n        \"airandou\": \"あいらんどう\",\n        \"nishizawa 5mm\": \"西沢5ミリ\",\n        \"ninoko\": \"にの子\",\n        \"kibii mocha\": \"きびぃもか\",\n        \"ohnaka ito\": \"大仲いと\",\n        \"anzuame\": \"杏飴\",\n        \"takaharu\": \"タカハル\",\n        \"asanoha\": \"麻の葉\",\n        \"sasaki akira\": \"ささきあきら\",\n        \"asahina hikage\": \"アサヒナヒカゲ\",\n        \"piyodera mucha\": \"ぴよ寺むちゃ\",\n        \"daichi\": \"矢座だいち\",\n        \"ramchi\": \"らむち\",\n        \"mignon\": \"mignon\",\n        \"natsuki marina\": \"夏月まりな\",\n        \"watanon\": \"わたのん\",\n        \"amami mikihiro\": \"甘味みきひろ\",\n        \"mikage\": \"未影\",\n        \"mk\": \"MK\",\n        \"aria.\": \"ありあ。\",\n        \"kago\": \"加护\",\n        \"akashi rokuro\": \"明石六露\",\n        \"kuon\": \"久遠\",\n        \"miyasu risa\": \"ミヤスリサ\",\n        \"konomi\": \"konomi\",\n        \"bokkun\": \"ぼっくん\",\n        \"ikura nagisa\": \"伊倉ナギサ\",\n        \"furukawa odoro\": \"古河おどろ\",\n        \"nishiki chizu\": \"西木地図\",\n        \"konka\": \"绀菓\",\n        \"hakomaru\": \"箱。\",\n        \"makoto\": \"MAKOTO\",\n        \"iori\": \"ゐおり\",\n        \"chocoan\": \"ちょこ庵\",\n        \"hisagi\": \"ひさぎ\",\n        \"arato asato\": \"あらと安里\",\n        \"caigen\": \"菜★梗\",\n        \"maple\": \"まぷる\",\n        \"kon\": \"紺\",\n        \"shibi\": \"ShiBi\",\n        \"yamu\": \"やむっ\",\n        \"senyuu\": \"戦友\",\n        \"noukatu\": \"noukatu\",\n        \"yoyomura\": \"夜々村\",\n        \"yuhi\": \"ゆーひ\",\n        \"katase aoko\": \"片瀬蒼子\",\n        \"yuzuri ai\": \"ゆずりあい\",\n        \"tony taka\": \"Tony\",\n        \"fal maro\": \"ファルまろ\",\n        \"hiru okita\": \"昼沖太\",\n        \"marumie\": \"まるミエ\",\n        \"hiyashi mirano\": \"ひやしみらの\",\n        \"kageyama kuroto\": \"景山玄都\",\n        \"netarou\": \"ねたろう\",\n        \"itou eight\": \"伊藤エイト\",\n        \"sajipen\": \"さじペん\",\n        \"dam\": \"だむ\",\n        \"ko-yahu\": \"こーやふ\",\n        \"toufu\": \"とうふ\",\n        \"kuriyuzu kuryuu\": \"栗柚くりゅー\",\n        \"homu\": \"homu\",\n        \"kamelie\": \"Kamelie\",\n        \"nicoby\": \"にこびぃ\",\n        \"mitsuba choco\": \"三つ葉ちょこ\",\n        \"miyama\": \"箕山\",\n        \"ayagi daifuku\": \"綾城大福\",\n        \"taruhi\": \"たるひ\",\n        \"kikunosukemaru\": \"菊のすけまる\",\n        \"hamaken.\": \"はまけん。\",\n        \"konohana\": \"此花\",\n        \"hirotti\": \"ひろっち\",\n        \"rogobo\": \"ろごぼ\",\n        \"momoya show-neko\": \"桃屋しょう猫\",\n        \"mashiro yukiya\": \"真白雪夜\",\n        \"hikagi tatsuhiko\": \"绯键龙彦\",\n        \"tekehiro\": \"てけひろ\",\n        \"marumikan\": \"丸美甘\",\n        \"yamato bambies\": \"ヤマトバンビーズ\",\n        \"azuma sawayoshi\": \"アズマサワヨシ\",\n        \"oyabe ryo\": \"小矢部亮\",\n        \"naoharu\": \"直晴\",\n        \"tamashii carnival botamochi\": \"魂カーニバルぼたもち\",\n        \"arima kouichi\": \"有马纮一\",\n        \"kamochome\": \"かもちょめ\",\n        \"horny-oni\": \"Horny-Oni\",\n        \"sora ni tori ga\": \"空に鳥が\",\n        \"serebi ryousangata\": \"セレビィ量産型\",\n        \"abara heiki\": \"肋兵器\",\n        \"ukami\": \"うかみ\",\n        \"itou hachi\": \"伊藤ハチ\",\n        \"nishihata kei\": \"西畑けい\",\n        \"bon\": \"凡\",\n        \"john\": \"じょん\",\n        \"tamaki kurou\": \"鐶九朗\",\n        \"haiba\": \"灰叶\",\n        \"makita yoshiharu\": \"卷田佳春\",\n        \"asahiru yuu\": \"浅ひるゆう\",\n        \"rokumaru inami\": \"六丸いなみ\",\n        \"mogu\": \"モグ\",\n        \"cbgb\": \"CBGB\",\n        \"eretto\": \"えれっと\",\n        \"ken hultgren\": \"赓·赫尔脱格仑\",\n        \"senmu\": \"SeNMU\",\n        \"arito arayuru\": \"有都あらゆる\",\n        \"9so\": \"9SO\",\n        \"haruba negi\": \"春场葱\",\n        \"maki komura\": \"真木こむら\",\n        \"sakamata nerimono\": \"逆又练物\",\n        \"nagata maria\": \"永田まりあ\",\n        \"kinona\": \"紀奈\",\n        \"hano haruka\": \"葉乃はるか\",\n        \"shiden hiro\": \"四電ヒロ\",\n        \"kyabetsuka\": \"篝町狐懐\",\n        \"midoriha mint\": \"緑葉みんと | 洗面きぬ子\",\n        \"scott robertson\": \"斯科特·罗伯逊\",\n        \"andrew loomis\": \"安德鲁·路米斯\",\n        \"bert dodson\": \"伯特·多德森\",\n        \"kuzuya ramurin\": \"葛谷らむりん\",\n        \"taka\": \"タカ\",\n        \"sw\": \"Sw（すぅ）\",\n        \"piro\": \"Piro\",\n        \"itou noizi\": \"いとうのいぢ\",\n        \"hirose madoka\": \"広瀬まどか\",\n        \"nabe wataru\": \"名部渉\",\n        \"gaou\": \"がおう\",\n        \"umekiti\": \"うめきち\",\n        \"onaka emi\": \"小中えみ\",\n        \"bobobo\": \"ボボボ\",\n        \"okinaga umanosuke\": \"翁贺马乃助\",\n        \"yoikono tt\": \"ヨイコノtt\",\n        \"gosaiji\": \"ごさいじ\",\n        \"rokkotsu\": \"肋骨\",\n        \"akino komichi\": \"秋乃こみち\",\n        \"ido\": \"いど\",\n        \"asaki takayuki\": \"朝木贵行\",\n        \"koyanagi royal\": \"小柳ロイヤル\",\n        \"iketaki ganguten\": \"池泷玩具店\",\n        \"akagi kuro\": \"赤木クロ\",\n        \"ash yokoshima\": \"Ash横島\",\n        \"haitokukan\": \"背德汉\",\n        \"henkuma\": \"变熊\",\n        \"kawashima yoshio\": \"川島よしお\",\n        \"kanari tokusaku\": \"鹿成トクサク\",\n        \"onigiri unicorn\": \"鬼斬ゆにこーん\",\n        \"namae renraku\": \"なまえ れんらく\",\n        \"kouda tomohiro\": \"幸田朋弘\",\n        \"senbei\": \"煎饼\",\n        \"corundum\": \"こらんだむ\",\n        \"miyabe kiwi\": \"宮部キウイ\",\n        \"dendenbotch\": \"でんでんぼっち\",\n        \"redash\": \"RedAsh\",\n        \"kuroha reiji\": \"九郎\",\n        \"kirekawa\": \"きれかわ\",\n        \"taro oimo\": \"たろおいも\",\n        \"akimoto dai\": \"あきもと大\",\n        \"kumada\": \"くまのとおる（くまだ）\",\n        \"nipi\": \"nipi\",\n        \"misakana\": \"みさかな\",\n        \"cru\": \"Cru\",\n        \"garana\": \"ガラナ\",\n        \"muraimura\": \"村井村\",\n        \"murasakio\": \"紫御\",\n        \"itohana\": \"イトハナ\",\n        \"shirogane hina\": \"シロガネヒナ\",\n        \"chikuwa.\": \"ちくわ。\",\n        \"naka\": \"なか\",\n        \"midorino haru\": \"緑野はる\",\n        \"ma-sa\": \"MA-SA\",\n        \"ameno usari\": \"飴乃うさり\",\n        \"mizukaga syou\": \"水利硝\",\n        \"kudo\": \"９℃\",\n        \"sumii\": \"すみい\",\n        \"ai takurou\": \"安威拓郎\",\n        \"nagisora riku\": \"凪空りく\",\n        \"minase\": \"御奈瀬\",\n        \"niwacho\": \"niwacho\",\n        \"yasaka syu\": \"矢坂しゅう\",\n        \"nimuno\": \"にむの\",\n        \"watanore\": \"わたのれ\",\n        \"qblade\": \"blade\",\n        \"mugen no sudadokei\": \"無限の須田時計\",\n        \"omimo\": \"おみも\",\n        \"minami aomori\": \"南森\",\n        \"uo denim\": \"魚デニム\",\n        \"mitsuba minoru\": \"三叶稔\",\n        \"zeros\": \"是露巣\",\n        \"necomi\": \"necömi\",\n        \"cona kinaco\": \"小奈きなこ\",\n        \"kamioka chirol\": \"神岡ちろる\",\n        \"mikoma sanagi\": \"美驹沙名希\",\n        \"nanashiki fuka\": \"七色風香\",\n        \"ashita\": \"アシタ\",\n        \"midorinocha\": \"みどりのちゃ\",\n        \"tsurukawa yashiro\": \"鶴川社\",\n        \"samizu gumi\": \"さみずぐみ\",\n        \"seijin\": \"せーじん\",\n        \"yukisaki miale\": \"雪咲MIALE\",\n        \"shennai misha\": \"神奈弥莎\",\n        \"tsunano\": \"つなの\",\n        \"eizan\": \"影斩\",\n        \"akino kabocha\": \"秋野かぼちゃ\",\n        \"kiyu fuyuki\": \"季結ふゆき\",\n        \"ankoman\": \"あんこまん\",\n        \"highlow\": \"废狼\",\n        \"hanao.\": \"熊尾もふもふ\",\n        \"otokura ringo\": \"乙倉りんご\",\n        \"rougetu\": \"胧月\",\n        \"ryuga syo\": \"龍牙翔\",\n        \"kurage modoki\": \"くらげもどき\",\n        \"oozora wakaba\": \"大空若叶\",\n        \"nigirimeshi\": \"にぎりめし\",\n        \"minami chisato\": \"南ちさと（有澤司）\",\n        \"aotsuki shinobu\": \"蒼月しのぶ\",\n        \"oshima aki\": \"大岛あき\",\n        \"kimino tomonari\": \"君野朋成\",\n        \"sune\": \"sune\",\n        \"molgen\": \"モルゲン\",\n        \"skylader\": \"すかいれーだー\",\n        \"topia\": \"とぴあ\",\n        \"nakamura regura\": \"仲村レグラ\",\n        \"narumiya\": \"鳴海也\",\n        \"ekakibit\": \"えかきびと\",\n        \"yuki\": \"雪\",\n        \"tadano mezashi\": \"只野めざし\",\n        \"ojo\": \"おじょ\",\n        \"himino\": \"ひみの\",\n        \"6u\": \"6U☆\",\n        \"nagioka\": \"凪丘\",\n        \"yukiguni yuu\": \"雪国裕\",\n        \"jairou\": \"ジャイロウ\",\n        \"hirune\": \"昼寝\",\n        \"nanatsuda\": \"七ツ田\",\n        \"fun bo\": \"ふんぼ\",\n        \"siseki hirame\": \"芝石\",\n        \"nattou mazeo\": \"納豆まぜお\",\n        \"yamago\": \"山后\",\n        \"hamon ai\": \"波纹爱\",\n        \"misaka12003\": \"御坂12003\",\n        \"mayafufu -kakko- kashikoi\": \"まやふふ(賢)\",\n        \"yamanashi yuuya\": \"山梨ユウヤ\",\n        \"ashinoue futomomo\": \"苇上太桃\",\n        \"echigoya takeru\": \"越後屋タケル\",\n        \"kawauchi\": \"川内\",\n        \"aoi yun\": \"蒼井ゆん\",\n        \"nimoshi\": \"にもし\",\n        \"ennorei\": \"円之怜\",\n        \"yuuki sonisuke\": \"ゆうきそにすけ\",\n        \"kurororo rororo\": \"くろろろろろろ\",\n        \"junsui na fujunbutsu\": \"純粋な不純物\",\n        \"takano saku\": \"嵩乃朔\",\n        \"sikusiku\": \"シクシク\",\n        \"shiguma\": \"しぐま\",\n        \"hisona\": \"ひそな\",\n        \"nakatani nio\": \"仲谷鳰\",\n        \"crerp\": \"くれ～ぷ\",\n        \"indozou\": \"インド僧\",\n        \"itou yuuji\": \"イトウゆーじ\",\n        \"yu-ki\": \"ユーキ\",\n        \"gotoh juan\": \"后藤寿庵\",\n        \"binto\": \"瓶人\",\n        \"itaru\": \"至る\",\n        \"wasavi 8\": \"wasavi_8\",\n        \"kitahara aki\": \"北原亚希\",\n        \"satsuki itsuka\": \"五月五日\",\n        \"kawaraya\": \"瓦爺\",\n        \"kamizuki shiki\": \"守月史贵\",\n        \"ponekusan\": \"ポネクサン\",\n        \"akasa tanu\": \"赤佐たぬ\",\n        \"takeya\": \"竹や\",\n        \"makihitsuji\": \"巻羊\",\n        \"jimmy\": \"jimmy\",\n        \"healthyman\": \"ヘルシーマン\",\n        \"aokoji\": \"青こじ\",\n        \"miginohito mitsuru\": \"右の人みつる\",\n        \"hidari kagetora\": \"左カゲトラ\",\n        \"suruga kuroitsu\": \"駿河クロイツ\",\n        \"mauve\": \"Mauve\",\n        \"saeki sola\": \"佐伯ソラ\",\n        \"tange suzuki\": \"丹下スズキ\",\n        \"neji\": \"寝路\",\n        \"negom\": \"ネゴム\",\n        \"opanchu\": \"おぱんちゅ\",\n        \"xion\": \"Xion\",\n        \"tomoki tomonori\": \"ともきとものり\",\n        \"pistonring nishizawa\": \"西泽みずき\",\n        \"kokuryuugan\": \"黑龙眼\",\n        \"kazakami sudare\": \"かざかみすだれ\",\n        \"paryi\": \"帕里\",\n        \"satoh\": \"砂糖\",\n        \"amatake akewo\": \"甘竹朱郎\",\n        \"jikasei\": \"自家製\",\n        \"sakura hiyori\": \"桜ひより\",\n        \"mukyu\": \"無休\",\n        \"h2so4\": \"H2SO4\",\n        \"yamada konayuki\": \"山田コナユキ\",\n        \"mizushima sorahiko\": \"水岛空彦\",\n        \"taneno nakami\": \"種乃なかみ\",\n        \"mgmee\": \"MGMEE\",\n        \"nathaniel pennel\": \"Pennel\",\n        \"hadron9\": \"HADRON9\",\n        \"supu\": \"すぷ\",\n        \"kitaku\": \"きたく\",\n        \"shirota dai\": \"白田太\",\n        \"moyazou\": \"もや造\",\n        \"kuguri oimo\": \"九栗おいも\",\n        \"namio.h.ryuudou\": \"NAMIO.H.龍堂\",\n        \"kazawa\": \"かざわ\",\n        \"nukaji\": \"ぬかじ（wizakun）\",\n        \"negresco\": \"Negresco\",\n        \"navia\": \"なびあ\",\n        \"sagaraten\": \"纱柄天\",\n        \"naoto\": \"naoto\",\n        \"green\": \"GreeN\",\n        \"wakured\": \"和紅\",\n        \"mankai kaika\": \"满开开花\",\n        \"kumatora\": \"天空太一\",\n        \"teshima nari.\": \"手島nari\",\n        \"amashiro natsuki\": \"甘城なつき\",\n        \"tumiki akeno\": \"積木あけの\",\n        \"miwano rag\": \"美和野らぐ\",\n        \"shigure ui\": \"しぐれうい\",\n        \"nanahara fuyuki\": \"七原冬雪\",\n        \"fukuinu\": \"福犬\",\n        \"shotan\": \"しょたん\",\n        \"ezoshika\": \"エゾシカ\",\n        \"taketori zaiku\": \"竹取细工\",\n        \"harada shoutarou\": \"原田将太郎\",\n        \"kyougoku shin\": \"京極しん\",\n        \"yamamori\": \"山森\",\n        \"daki makura\": \"滝まくら\",\n        \"nagishiro mito\": \"凪白みと\",\n        \"minase nagi\": \"みなせなぎ\",\n        \"nii manabu\": \"仁井学\",\n        \"o-zicha\": \"おーじ茶\",\n        \"p19\": \"p19\",\n        \"sakuragi ren\": \"桜木蓮\",\n        \"poruno ibuki\": \"はるのいぶき\",\n        \"kenichi\": \"ケンイチ\",\n        \"mashu\": \"ましゅー\",\n        \"na-ga\": \"Na-Ga\",\n        \"sakurazawa izumi\": \"桜沢いづみ\",\n        \"hinayuki usa\": \"ヒナユキウサ\",\n        \"amamitu kousuke\": \"甘蜜こうすけ\",\n        \"atiki\": \"Aちき\",\n        \"masaru.jp\": \"まさる.jp\",\n        \"kizuki rei\": \"傷希レイ\",\n        \"arisu kazumi\": \"有栖かずみ\",\n        \"nanashiki\": \"七色\",\n        \"tokuno yuika\": \"徳之ゆいか\",\n        \"cut\": \"カット\",\n        \"taya\": \"TAYA\",\n        \"kamaboko\": \"釜ボコ\",\n        \"mountainhan\": \"山含\",\n        \"ahugan sugita\": \"アフガン杉田\",\n        \"kurebayashi asami\": \"暮林あさ美\",\n        \"oshiro\": \"阿白\",\n        \"hakaishin\": \"破坏神\",\n        \"muryotaro\": \"むりょたろ\",\n        \"stealyy\": \"すてりい\",\n        \"yamabukiiro\": \"山吹色\",\n        \"gotoh\": \"ごとー\",\n        \"casino\": \"カジノ\",\n        \"hanekoto\": \"はねこと\",\n        \"kanzaki hiro\": \"かんざきひろ\",\n        \"saki chisuzu\": \"さき千鈴\",\n        \"fujoujoshi\": \"不嬢女子\",\n        \"mikuni saho\": \"御国纱帆\",\n        \"tatsuse yumino\": \"龙濑弓乃\",\n        \"ma-kurou\": \"まー九郎\",\n        \"maitaimu\": \"舞大梦\",\n        \"kyozip\": \"狂zip\",\n        \"nishi yoshiyuki\": \"西义之\",\n        \"momonosukebe\": \"腿之助兵卫\",\n        \"torichamaru\": \"鸟茶丸\",\n        \"uonome beji\": \"魚目ベジ\",\n        \"j-kisarazu\": \"JK更津\",\n        \"greco roman\": \"暮古浪漫\",\n        \"shugao\": \"しゅがお\",\n        \"andoryu\": \"安堂流\",\n        \"commamion\": \"狐狸恩\",\n        \"numa\": \"numa | 沼\",\n        \"amagappa shoujogun\": \"雨がっぱ少女群\",\n        \"suzumi raika\": \"凉海来夏\",\n        \"aramaki echizen\": \"荒卷越前\",\n        \"nakada rumi\": \"中田瑠美\",\n        \"yuzuto sen\": \"柚十扇\",\n        \"hayashi kewi\": \"林けゐ\",\n        \"tadano saboten\": \"ただのサボテン\",\n        \"hara yui\": \"原悠衣\",\n        \"ibuki notsu\": \"伊吹のつ\",\n        \"kinako\": \"木なこ\",\n        \"shiino sera\": \"椎野せら\",\n        \"kusakabe\": \"草壁\",\n        \"kaiware\": \"かいわれ\",\n        \"nakyo\": \"なきょ\",\n        \"kutori panya\": \"九鳥ぱんや\",\n        \"chiica\": \"ちぃか\",\n        \"ushiro\": \"う白\",\n        \"yuyumatsu\": \"ゆゆまつ\",\n        \"sakura shiho\": \"紗倉シホ\",\n        \"gomzi\": \"gomzi\",\n        \"amamitsuki\": \"天三月\",\n        \"xenon\": \"世音\",\n        \"gyozanuko\": \"餃子ぬこ\",\n        \"raptor7\": \"ラプトル７\",\n        \"toshi\": \"toshi\",\n        \"taishinkokuoh anton\": \"大秦国王安敦\",\n        \"wanyanaguda\": \"完颜阿骨打\",\n        \"kaede\": \"ゆか\",\n        \"fummy\": \"ふみー\",\n        \"shobu\": \"菖蒲\",\n        \"sakayama shinta\": \"茶化山心太\",\n        \"takasaki keisuke\": \"高咲圭介\",\n        \"ushino naka\": \"うしの菜夏\",\n        \"doskoinpo\": \"doskoinpo\",\n        \"rin yuu\": \"リン☆ユウ\",\n        \"mushi\": \"小虫\",\n        \"trigger\": \"TRIGGER\",\n        \"miwabe sakura\": \"みわべさくら\",\n        \"shirisensha\": \"尻戦車\",\n        \"makabe gorou\": \"真壁吾郎\",\n        \"kakuninii\": \"角煮煮\",\n        \"tukimi daifuku\": \"月見大福\",\n        \"satou chagashi\": \"佐藤茶菓子\",\n        \"touno itsuki\": \"桐野いつき\",\n        \"gekka kaguya\": \"月下火愚夜\",\n        \"maguro shining\": \"まぐろシャイニング\",\n        \"santa\": \"santa\",\n        \"togi\": \"とぎ\",\n        \"akizuki mac\": \"秋月まく\",\n        \"fujii jun\": \"藤伊洵\",\n        \"morino bambi\": \"森乃ばんび\",\n        \"nekoi mie\": \"猫井ミィ\",\n        \"ikujinashi no fetishist\": \"いくじなしのフェティシスト\",\n        \"chomikuplus\": \"Chomikuplus\",\n        \"fuzui\": \"不随\",\n        \"tokomaya keita\": \"とこまやけいた\",\n        \"holiday yasumi\": \"堀出井靖水\",\n        \"ronrinri ronri\": \"論倫理ろんり\",\n        \"tsukueno elf\": \"机野エルフ\",\n        \"hiiragi popura\": \"柊ぽぷら\",\n        \"nogiwa kaede\": \"野際かえで\",\n        \"hitoi\": \"灯問\",\n        \"bouen\": \"ぼうえん\",\n        \"tsukudani\": \"佃煮\",\n        \"shigemiya kyouhei\": \"樹宮匡平\",\n        \"roshin\": \"炉心\",\n        \"mamemametama\": \"まめまめたま\",\n        \"nakagami takashi\": \"中上たかし\",\n        \"ukanmuri\": \"うかんむり\",\n        \"momotomato\": \"桃とまと\",\n        \"muchin\": \"むーちん\",\n        \"hou\": \"蜂様 (ほう)\",\n        \"nakamura b-ta\": \"中村べーた\",\n        \"lengsediaokafei\": \"冷色调咖啡\",\n        \"naruse hirofumi\": \"鸣濑ひろふみ\",\n        \"momose sumomo\": \"桃瀬すもも\",\n        \"nukuo\": \"ヌク男\",\n        \"sindoll\": \"シンドール\",\n        \"horikawa gorou\": \"堀川悟郎\",\n        \"kandenki\": \"感电器\",\n        \"tsukimi ruko\": \"月見ルコ\",\n        \"kameyama shiruko\": \"亀山しるこ\",\n        \"takimoto yukari\": \"瀧本ゆかり\",\n        \"sakamoto kafka\": \"阪本KAFKA\",\n        \"itsutsuse\": \"古川五势（いつつせ）\",\n        \"chiyingzai\": \"帜瑛\",\n        \"isako rokuroh\": \"井硲六郎\",\n        \"nigiri usagi\": \"にぎりうさぎ\",\n        \"mizumizuni\": \"見ず水煮\",\n        \"shinagawa mikuzu\": \"品川ミクズ\",\n        \"wakamatsu\": \"わかまつ\",\n        \"geko\": \"GEKO\",\n        \"yatosaki haru\": \"やとさきはる\",\n        \"ootsuka mahiro\": \"大塚まひろ\",\n        \"fuyuichi monme\": \"冬壱もんめ\",\n        \"momosawa\": \"ももさわ\",\n        \"sangatsu sanichi\": \"三月さんいち\",\n        \"konnyaku\": \"蒟蒻\",\n        \"yaminabe\": \"やみなべ\",\n        \"tenjo ryuka\": \"天壌りゅか\",\n        \"nekoya\": \"猫夜\",\n        \"muninshiki\": \"むにんしき\",\n        \"masayo\": \"まさよ\",\n        \"momozu komamochi\": \"桃豆こまもち\",\n        \"hoshii nasake\": \"星井情\",\n        \"amezawa koma\": \"飴沢狛\",\n        \"kanda dan\": \"館田ダン\",\n        \"mikuni mizuki\": \"みくに瑞貴\",\n        \"yamamoto naoki\": \"山本直树\",\n        \"neromashin\": \"ねろましん\",\n        \"yuugen\": \"ゆーげん\",\n        \"oshio\": \"おしお\",\n        \"torotarou\": \"トロ太郎\",\n        \"mishima kurone\": \"三岛黑音\",\n        \"himuro shunsuke\": \"氷室しゅんすけ\",\n        \"haikome\": \"灰米\",\n        \"bizen dorobune\": \"備前泥舟\",\n        \"kagura nanaki\": \"神楽七姫\",\n        \"nozomi tsubame\": \"希望つばめ\",\n        \"saba satoru\": \"佐波サトル\",\n        \"nagashiro rouge\": \"長代ルージュ\",\n        \"kuroiwa menou\": \"黑岩玛瑙\",\n        \"isorashi\": \"五十嵐唱乃\",\n        \"minato fumi\": \"三巷文\",\n        \"hashida mamoru\": \"桥田镇\",\n        \"hiryuu ran\": \"飞龙乱\",\n        \"nyoro nyorozou\": \"清炭ハリケーン\",\n        \"denkichi\": \"でん吉\",\n        \"qdou kei\": \"Q堂恵\",\n        \"hisen kaede\": \"緋仙カエデ\",\n        \"kazushiki midori\": \"一色緑\",\n        \"someoka yusura\": \"染岡ゆすら\",\n        \"haruse hiroki\": \"晴瀬ひろき\",\n        \"tenmu shinryuusai\": \"天夢森流彩\",\n        \"anza yuu\": \"あんざゆう\",\n        \"amane ruri\": \"天音るり\",\n        \"dytm\": \"DYTM\",\n        \"gentsuki\": \"ゲンツキ\",\n        \"iwasaki yuuki\": \"岩崎ユウキ\",\n        \"mashiraga aki\": \"猿駕アキ\",\n        \"midori aoi\": \"みどり葵\",\n        \"musha sabu\": \"武者サブ\",\n        \"sanjuurou\": \"三十郎\",\n        \"souji hougu\": \"扫除朋具\",\n        \"uousaoh\": \"鱼ウサ王\",\n        \"kuroharuto\": \"くろはると\",\n        \"oomori\": \"大盛り\",\n        \"yasson yoshiyuki\": \"やっそん義之\",\n        \"hiyori mizuki\": \"陽寄瑞貴\",\n        \"fushoku\": \"腐蝕\",\n        \"coupe\": \"こっぺ\",\n        \"panchira steak\": \"ぱんちらステーキ\",\n        \"saizu nitou gunsou\": \"才津二等軍曹\",\n        \"nakamura rohane\": \"中村六翅\",\n        \"nohito\": \"nohito\",\n        \"turiganesou\": \"釣鐘草\",\n        \"kyo1\": \"響樹はじめ\",\n        \"shimimaru\": \"纸鱼丸\",\n        \"arai kei\": \"荒井启\",\n        \"suzudama renri\": \"鈴玉レンリ\",\n        \"kurokoshi you\": \"黑越阳\",\n        \"inato serere\": \"稲戸せれれ\",\n        \"akitsuki itsuki\": \"秋月伊槻\",\n        \"yd\": \"yd\",\n        \"azuma yuki\": \"东由希\",\n        \"enokido\": \"エノキドォ\",\n        \"gokubuto mayuge\": \"极太眉毛\",\n        \"hakaba\": \"墓場\",\n        \"hitotsuba\": \"ひとつば\",\n        \"furyouhin\": \"不良品\",\n        \"gesundheit\": \"ゲズンタイト\",\n        \"takamichi\": \"たかみち\",\n        \"aki99\": \"aki99\",\n        \"rensyu\": \"Rensyu\",\n        \"himitsu\": \"蜜酱（ひみつ）\",\n        \"tooo\": \"tooo\",\n        \"abubu\": \"あぶぶ\",\n        \"red romanov\": \"はだぱるか\",\n        \"bubukka\": \"ぶぶっか\",\n        \"itosugi masahiro\": \"糸杉柾宏\",\n        \"a-801\": \"アニメ8OI\",\n        \"araki akira\": \"あらきあきら\",\n        \"haregama shiina\": \"晴釜椎名\",\n        \"misao.\": \"みさお。\",\n        \"yamazaki kana\": \"山崎かな\",\n        \"kanyapyi\": \"かにゃぴぃ\",\n        \"maruta\": \"MARUTA\",\n        \"ichiichi yuuna\": \"一市裕納\",\n        \"rinrin\": \"RINRIN\",\n        \"meramera jealousy\": \"メラメラジェラシー\",\n        \"miyazaki maya\": \"宫崎摩耶\",\n        \"sasakura ayato\": \"笹仓绫人\",\n        \"mori guruta\": \"森ぐる太\",\n        \"mayonnaise.\": \"まよねーず。\",\n        \"broiler\": \"broiler\",\n        \"zukiki\": \"ZUKI树\",\n        \"urute\": \"urute\",\n        \"anyanko\": \"あにゃんこ\",\n        \"inuarasi\": \"犬嵐\",\n        \"sasahara yuuki\": \"佐佐原忧树\",\n        \"wakaba kaoru\": \"わかばかおる\",\n        \"teruki kuma\": \"てるき熊\",\n        \"shitou\": \"四头\",\n        \"ryunnu\": \"りゅんぬ\",\n        \"sage\": \"Sage（りゅんぬ ）\",\n        \"hikami izuto\": \"ひかみいずと\",\n        \"e10\": \"e10\",\n        \"tawawaringo\": \"たわわりんご\",\n        \"ujiie moku\": \"氏家もく\",\n        \"urotan\": \"うろたん\",\n        \"kaishinshi\": \"怪绅士\",\n        \"kakkuu\": \"滑空\",\n        \"urajirou\": \"杉浦次郎\",\n        \"chuushin kuranosuke\": \"忠臣藏之介\",\n        \"tsukiyoshi hiroki\": \"月吉ヒロキ\",\n        \"tomozawa shou\": \"智泽渚优\",\n        \"nakamura mizumo\": \"中村みずも\",\n        \"nendo.\": \"ねんど。\",\n        \"hokama mitsuri\": \"ほかまみつり\",\n        \"horihone saizou\": \"掘骨碎三\",\n        \"toruneko\": \"获る猫\",\n        \"sirokuma shake\": \"白クマシェイク\",\n        \"mizui kaou\": \"瑞井鹿央\",\n        \"minasuki popuri\": \"みなすきぽぷり\",\n        \"hoshino shiho\": \"星野志保\",\n        \"miyashita miki\": \"宫下未纪\",\n        \"yamamoto kumoi\": \"山本云居\",\n        \"marcy dog\": \"MARCYどっぐ\",\n        \"asahina makoto\": \"朝比奈诚\",\n        \"majoccoid\": \"majoccoid\",\n        \"aogiri penta\": \"あおぎりぺんた\",\n        \"mitsuba\": \"三叶 | みつば\",\n        \"ppshex\": \"芝士糖\",\n        \"misakamitoko0903\": \"电磁炮二期\",\n        \"kimimaru\": \"きみまる（东毅）\",\n        \"softcharm\": \"SOFTCHARM\",\n        \"tsuruyama mito\": \"鶴山ミト\",\n        \"tanimachi maid\": \"谷町女仆\",\n        \"bookmoun10\": \"ぶっくまうんten\",\n        \"ogataaz\": \"OgataAz\",\n        \"ayato ayari\": \"あやとあやり\",\n        \"rangetsu\": \"岚月\",\n        \"misakura nankotsu\": \"御樱软骨\",\n        \"kio seiji\": \"きお誠児\",\n        \"riyo\": \"リヨ\",\n        \"hanamaki kaeru\": \"花巻かえる\",\n        \"bennys\": \"BENNY'S\",\n        \"inaba cozy\": \"稻叶COZY\",\n        \"oie kaeru\": \"御家かえる\",\n        \"chinzurena\": \"チンズリーナ\",\n        \"palco nagashima\": \"パルコ長嶋\",\n        \"ponpon itai\": \"ぽんぽんイタイ\",\n        \"takeuchi takashi\": \"武内崇\",\n        \"takahashi keitarou\": \"高桥庆太郎\",\n        \"shima drill\": \"しまどりる\",\n        \"bunbun\": \"BUNBUN\",\n        \"abec\": \"abec\",\n        \"a-10\": \"A-10（不破大辅）\",\n        \"atori k\": \"秋尚\",\n        \"umashika\": \"うましか\",\n        \"ebifly\": \"えびふらい\",\n        \"azumawari\": \"あずまわり\",\n        \"namori\": \"Namori\",\n        \"hata kenjirou\": \"畑健二郎\",\n        \"gelatin\": \"沟口明胶\",\n        \"utahane w\": \"うたはね\",\n        \"kusano kouichi\": \"草野红壹\",\n        \"konata hyuura\": \"虎向Hyuura\",\n        \"konno azure\": \"紺野あずれ\",\n        \"sawano akira\": \"泽野明\",\n        \"shiran takashi\": \"しらんたかし\",\n        \"matra milan\": \"的良米兰\",\n        \"morisaki kurumi\": \"森崎胡桃\",\n        \"todoroki shin\": \"轰真\",\n        \"hirotake awataka\": \"粟岳高弘\",\n        \"hayake\": \"はやけ\",\n        \"hasblow cream\": \"はすぶろくりーむ\",\n        \"kagami fumio\": \"加賀美ふみを\",\n        \"kamirenjaku sanpei\": \"上连雀三平\",\n        \"kyaradain\": \"きゃらだいん\",\n        \"minna daisuki\": \"みんなだいすき\",\n        \"cloba.u\": \"Cloba・U\",\n        \"binsen\": \"びんせん\",\n        \"koari\": \"小蚁\",\n        \"toriburi\": \"トリブリ\",\n        \"osanpo suisou\": \"おさんぽ水槽\",\n        \"ohaguro dobu\": \"御歯黒溝（桜シロウ）\",\n        \"makio\": \"マキオ\",\n        \"mikaduchi\": \"みかづち\",\n        \"ogu\": \"おぐ\",\n        \"aoki kanji\": \"青木干治\",\n        \"amagi kei\": \"亚麻木硅\",\n        \"ikumo taisuke\": \"井云泰助\",\n        \"mana\": \"MANA\",\n        \"hanpen\": \"はんぺん\",\n        \"zeroshiki kouichi\": \"ぷぅ崎ぷぅ奈\",\n        \"kagono tori\": \"かごのとり\",\n        \"haga yui\": \"叶贺唯\",\n        \"shinichirou otsuka\": \"大冢真一郎\",\n        \"haniwa hao\": \"はにわはお\",\n        \"akitaka mika\": \"明贵美加\",\n        \"kanabun\": \"kanabun\",\n        \"miyasaka takaji\": \"ミヤサカタカジ\",\n        \"crowe\": \"クロエ\",\n        \"ruhika\": \"ルヒカ\",\n        \"oobanburumai\": \"オオバンブルマイ\",\n        \"shin fuzen\": \"シン 普禅\",\n        \"magekichi\": \"まげきち\",\n        \"juna\": \"JUNA\",\n        \"kotokane hajime\": \"ことかねはじめ\",\n        \"yoshitani ganjitsu\": \"义谷元日\",\n        \"kawai masaki\": \"川合正起\",\n        \"wada wau\": \"和田羽烏\",\n        \"rondonko\": \"ろんどんこ\",\n        \"pirason\": \"ぴらそん\",\n        \"zettai yarumoni\": \"絶対やるもに\",\n        \"shishi senmaru\": \"狮子千丸\",\n        \"kameyoshi ichiko\": \"亀吉いちこ\",\n        \"leonardo 16sei\": \"れオナるド16世\",\n        \"funwari rice\": \"ふんわり☆らいす\",\n        \"akao\": \"朱尾\",\n        \"omecho\": \"おめちょ\",\n        \"chicken\": \"チキン\",\n        \"uba yoshiyuki\": \"宇场义行\",\n        \"syokuyou-mogura\": \"Syokuyou-Mogura\",\n        \"nanjou asuka\": \"南条飞鸟\",\n        \"kurenai yuuji\": \"紅ゆーじ\",\n        \"kohsaka novak\": \"高坂のばく\",\n        \"osisio\": \"osisio\",\n        \"kazune haka\": \"和音ハカ\",\n        \"yatomi\": \"やとみ\",\n        \"karaage3\": \"からあげ3\",\n        \"gibachan\": \"ぎばちゃん\",\n        \"takitarou\": \"滝太郎\",\n        \"yangcong chaodasuan\": \"洋葱炒大蒜\",\n        \"tokunou shoutarou\": \"得能正太郎\",\n        \"tsugumi suzuma\": \"亚美寿真\",\n        \"kakao\": \"kakao\",\n        \"akabane\": \"アカバネ\",\n        \"miyashiro ryuutarou\": \"三夜代龙太郎\",\n        \"meganei\": \"メガねぃ\",\n        \"tamatanuki\": \"たまたぬき\",\n        \"asabi miho\": \"山葵美保\",\n        \"matsumiya kiseri\": \"茉宮祈芹\",\n        \"hirokawa\": \"広川\",\n        \"kamiya yuu\": \"榎宮祐\",\n        \"imigimuru\": \"いみぎむる\",\n        \"kise itsuki\": \"木濑树\",\n        \"shono kotaro\": \"宵野小太郎\",\n        \"rurudo\": \"rurudo\",\n        \"ashima takumi\": \"芦間拓海\",\n        \"nishigori atsushi\": \"锦织敦史\",\n        \"nanashimushi\": \"ななし虫\",\n        \"ippo\": \"ippo\",\n        \"smomo\": \"smomo\",\n        \"madoromi\": \"まどろみ\",\n        \"nishiyama yuichi\": \"にしやまゆーいち\",\n        \"azumi akitake\": \"安曇アキタケ\",\n        \"dondakei\": \"どんだけい\",\n        \"imaishi hiroyuki\": \"今石洋之\",\n        \"gilse\": \"Gilse\",\n        \"junkie\": \"千要よゆち\",\n        \"nibiirokaden\": \"鈍色家電\",\n        \"migihaji\": \"右端\",\n        \"miyoshino\": \"みよしの\",\n        \"omochi monaka\": \"おもち もなか\",\n        \"ootsuka reika\": \"大塚麗夏\",\n        \"zanka\": \"ざんか\",\n        \"ashizuki\": \"アシズキ\",\n        \"abe nattou\": \"あべなっつ\",\n        \"yuushi tessen\": \"柚子铁线\",\n        \"hitsujino\": \"羊乃\",\n        \"ancotaku\": \"餡こたく\",\n        \"shirokimochi\": \"白生もち\",\n        \"nagatukiin\": \"长月院\",\n        \"tanuma\": \"たぬま\",\n        \"chihiro\": \"Chihiro\",\n        \"soba\": \"soba\",\n        \"kaneko\": \"華猫\",\n        \"sekai saisoku no panda\": \"世界最速のパンダ\",\n        \"ayame iro\": \"絢芽いろ\",\n        \"kaiduka akuta\": \"貝塚芥\",\n        \"katsuten\": \"かつてん\",\n        \"waterring\": \"WaterRing\",\n        \"gwegwe\": \"gweda\",\n        \"nehani\": \"ねはに\",\n        \"juukyuu\": \"じゅうきゅう\",\n        \"chobipero\": \"ちょびぺろ\",\n        \"takama\": \"高天\",\n        \"pesshin\": \"ペッシン\",\n        \"tomatojigoku\": \"とまとじごく\",\n        \"midori\": \"みどり\",\n        \"ponponmaru\": \"ぽんぽんまる\",\n        \"hame dragon\": \"ハメドラゴン\",\n        \"ziran\": \"ZIRAN\",\n        \"hinamo\": \"ひなも🍀\",\n        \"keso shirou\": \"けそシロウ\",\n        \"nishimura nike\": \"西村にけ\",\n        \"ererep\": \"エレレ🌸\",\n        \"mammoth\": \"ドロンタビ\",\n        \"yonemochi akihiko\": \"米餅昭彦\",\n        \"momikocu\": \"籾殻\",\n        \"danimaru\": \"だにまる\",\n        \"reba\": \"れば☆\",\n        \"chifuyu\": \"千冬\",\n        \"itsuki kuro\": \"伊月クロ\",\n        \"tonari\": \"隣\",\n        \"sawaragi\": \"沢良宜\",\n        \"sanrokumaru\": \"さんろく丸\",\n        \"kuga mayuri\": \"久我茧莉\",\n        \"jiyu2\": \"磁油2\",\n        \"yoshida\": \"吉田\",\n        \"dokukinokozin\": \"毒茸人\",\n        \"danrenji\": \"だんれんじ\",\n        \"kiri-kiri mai\": \"ギリギリ舞\",\n        \"oshino\": \"推乃\",\n        \"shiramizu mizuchi\": \"白瑞みずち\",\n        \"majima tetsurou\": \"真島てつろー\",\n        \"super zombie\": \"すーぱーぞんび\",\n        \"seuma\": \"せうま\",\n        \"ryoma\": \"きただりょうま\",\n        \"kannko\": \"缶子\",\n        \"sencha\": \"せんちゃ\",\n        \"miyazaki hayao\": \"宫崎骏\",\n        \"amatou\": \"甘党\",\n        \"aki akane\": \"秋赤音\",\n        \"lack\": \"lack\",\n        \"morikoke\": \"もり苔\",\n        \"tansuiken\": \"淡水犬\",\n        \"yamakonbu\": \"やまこんぶ\",\n        \"crew\": \"クルー\",\n        \"toujou tsukushi\": \"東條土筆\",\n        \"yamada gogogo\": \"山田ゴゴゴ\",\n        \"g-wara\": \"爺わら\",\n        \"ibarame hisa\": \"茨芽ヒサ\",\n        \"aoyama kiiro.\": \"あおやまきいろ。\",\n        \"ushiro muki\": \"丑露ムキ\",\n        \"uono shinome\": \"魚野シノメ\",\n        \"igedoaha\": \"イゲドアハ\",\n        \"tachibana nagon\": \"立花なごん\",\n        \"takoyaki rock\": \"タコヤキロック\",\n        \"yuruchin kyouso\": \"ゆるちん教祖\",\n        \"mitsuki\": \"ミツ季\",\n        \"momono yuuca\": \"もものユーカ\",\n        \"oyama kina\": \"大山树奈\",\n        \"ronna\": \"ろんな\",\n        \"uranokyuu\": \"ウラノキュウ\",\n        \"7x2\": \"7×2\",\n        \"kurowa\": \"黒輪\",\n        \"pei\": \"ぺい\",\n        \"shimazu tekko\": \"島津鉄甲（raikoh）\",\n        \"enoki\": \"えのき\",\n        \"mizuno cho\": \"みずのちょう\",\n        \"rca\": \"rca\",\n        \"satotuki tiyo\": \"里月ちよ\",\n        \"gar\": \"ガー\",\n        \"shibaken goro\": \"柴犬五郎\",\n        \"tachibana roku\": \"タチロク（MegaPantS）\",\n        \"tang-pong\": \"Tang-Pong★\",\n        \"yamaimo tororo\": \"山芋とろろ\",\n        \"furumoto takeru\": \"降本孟\",\n        \"kayama kifumi\": \"加山きふみ（樹八ウロ）\",\n        \"tobari saru\": \"トバリ猿\",\n        \"utsusumi kio\": \"空住キオ\",\n        \"eshimoto\": \"Eシモト\",\n        \"shingo.\": \"Shingo.\",\n        \"nedokoro mitsuki\": \"ねどころみつき\",\n        \"hoshi to lucky\": \"ほしとラッキー\",\n        \"fuzichoco\": \"藤原\",\n        \"yuiga naoha\": \"由雅なおは\",\n        \"tousen\": \"冬扇\",\n        \"edogawa roman\": \"江戸川浪漫\",\n        \"kurimoti tiduru\": \"栗餅ちづる\",\n        \"the-sinner\": \"The-Sinner\",\n        \"nochanzero\": \"Nochanzero\",\n        \"10eki\": \"10駅\",\n        \"voidmaki\": \"Voidmaki\",\n        \"star chaser\": \"STAR☆CHASER\",\n        \"greko\": \"Greko🔞\",\n        \"onikun\": \"おにくん\",\n        \"c ice\": \"C_ICE\",\n        \"saitom\": \"斋藤将嗣\",\n        \"komi zumiko\": \"コミズミコ\",\n        \"kawakami masaki\": \"川上真树\",\n        \"hizuki akira\": \"绯月Akira\",\n        \"cream cod\": \"奶油鳕鱼\",\n        \"yasuyuki\": \"やすゆき\",\n        \"hisama kumako\": \"ひさまくまこ\",\n        \"mikisai\": \"みきさい\",\n        \"kisaragi yuri\": \"きさらぎゆり\",\n        \"ichikawa halu\": \"いちかわはる\",\n        \"betm\": \"杯面\",\n        \"bttn\": \"bttn\",\n        \"hao\": \"はお\",\n        \"wool\": \"うーる\",\n        \"dainyu\": \"代入\",\n        \"koshino\": \"こしの\",\n        \"haiki\": \"はいき\",\n        \"50 percent off\": \"50%OFF\",\n        \"shiba kumiko\": \"柴くみこ\",\n        \"tousaki shiina\": \"凍咲しいな\",\n        \"shiba yuuji\": \"司馬ゆうじ\",\n        \"ruki\": \"琉希\",\n        \"longbow flintlock\": \"长弓燧龙\",\n        \"milkybot\": \"Milkybot\",\n        \"kyougoku touya\": \"京极灯弥\",\n        \"ikutsuki\": \"イクツキ\",\n        \"mitarou\": \"ミタロウ\",\n        \"higuchi isami\": \"ひぐちいさみ\",\n        \"yuuki rika\": \"結城リカ\",\n        \"meicha\": \"冥茶\",\n        \"shinoda kazuhiro\": \"篠田一宏\",\n        \"cure slum\": \"キュアスラム\",\n        \"nanakichi\": \"七吉\",\n        \"yoshitama ichirou\": \"吉玉一楼\",\n        \"rifuru\": \"りふる\",\n        \"oniharigusa\": \"鬼针草\",\n        \"komota\": \"こもた\",\n        \"akamoku\": \"あかもく\",\n        \"hiyama yuki\": \"檜山ユキ\",\n        \"izumi kirifu\": \"和泉キリフ\",\n        \"suzuki nago\": \"铃木和\",\n        \"ito fleda\": \"伊藤達哉Tatsuya Ito\",\n        \"namatsui\": \"なまつい\",\n        \"mimamoriencyo\": \"みまもり園長\",\n        \"yukiyoshi mamizu\": \"ゆきよし真水\",\n        \"miyashiro sousuke\": \"宮社惣恭\",\n        \"sasaki bullet\": \"佐々木バレット\",\n        \"kuroki hidehiko\": \"黑木秀彦\",\n        \"agemo agm\": \"阿戈魔AGM\",\n        \"jackasss\": \"空蜂ミドロ（テラダ・ジャッカス）\",\n        \"izayoi seishin\": \"十六夜清心\",\n        \"dancyo\": \"だんちょ\",\n        \"ame\": \"雨\",\n        \"jp06\": \"JP06\",\n        \"kazepana\": \"かぜぱな\",\n        \"gyouza teishoku\": \"ギョウザテイショク\",\n        \"kyouichirou\": \"狂一郎\",\n        \"kuon michiyoshi\": \"久远道义\",\n        \"gorgeous mushroom\": \"绚烂的蘑菇\",\n        \"samneco\": \"寒猫\",\n        \"yakuhina\": \"yakuhina\",\n        \"kawayoi\": \"かわよい\",\n        \"nishida megane\": \"仁志田メガネ\",\n        \"furuya nagisa\": \"古矢渚\",\n        \"chouchin ankou\": \"提灯暗光\",\n        \"kantamaki yui\": \"環々唯\",\n        \"emu emuo\": \"えむえむお\",\n        \"yanagi hareta\": \"晴太\",\n        \"houkisei\": \"ほうき星\",\n        \"takahama tarou\": \"高浜太郎\",\n        \"ikezaki misa\": \"池咲弥撒\",\n        \"ikameshi\": \"乌贼饭\",\n        \"sakura romako\": \"桜ロマ子\",\n        \"moejin\": \"萌尽\",\n        \"shinjitsu\": \"真实\",\n        \"yoshiie\": \"由家\",\n        \"nikubou maranoshin\": \"肉棒魔罗之进\",\n        \"goya\": \"蜜姫モカ\",\n        \"doji ro\": \"どじろー\",\n        \"hiro\": \"博\",\n        \"inokuma shinobu\": \"猪熊忍\",\n        \"kusayarou\": \"草野郎\",\n        \"eufoniuz\": \"Eufoniuz\",\n        \"chaoroushi\": \"炒肉师\",\n        \"nikujiruc\": \"肉汁uc\",\n        \"nakadera akira\": \"中寺明良\",\n        \"kushida\": \"くしだ\",\n        \"ono kenuji\": \"尾野けぬじ\",\n        \"gotoh akira\": \"後藤晶\",\n        \"niko\": \"ニコ\",\n        \"hcwj\": \"心味觉\",\n        \"kunimoto takashi\": \"国本隆史\",\n        \"okyou\": \"おきょう\",\n        \"testame\": \"ツリサス\",\n        \"jj\": \"jj\",\n        \"sesena yau\": \"せせなやう\",\n        \"cai pi jun\": \"菜さん\",\n        \"hara\": \"へら\",\n        \"nenobi\": \"子野日\",\n        \"maki hideto\": \"牧秀人\",\n        \"sahara ikkou\": \"佐原一光\",\n        \"izumi mahiru\": \"泉まひる\",\n        \"ranou\": \"卵の黄身\",\n        \"abso lu\": \"あぶそる\",\n        \"kyuusuikei\": \"給水係\",\n        \"sr\": \"SR\",\n        \"azure\": \"あずーる\",\n        \"ishimura\": \"石村\",\n        \"random\": \"兰田梦\",\n        \"hamadamiku\": \"浜田みく\",\n        \"nanasaki\": \"七崎\",\n        \"satsuki misuzu\": \"皐月深鈴\",\n        \"haneru\": \"HaneRu\",\n        \"manbou\": \"マンボー\",\n        \"mokuseirokku\": \"木星ろっく\",\n        \"ment\": \"ment\",\n        \"nardack\": \"Nardack\",\n        \"borisu\": \"ボリス\",\n        \"kunisaki kei\": \"国崎蛍\",\n        \"torimogura\": \"とりもぐら\",\n        \"ihara asta\": \"伊原あす太\",\n        \"yasu\": \"yasu\",\n        \"akadama\": \"红玉\",\n        \"shiranami kouki\": \"白波航希\",\n        \"asaga aoi\": \"浅賀葵\",\n        \"camonome\": \"かものめ\",\n        \"shikigami kuroko\": \"式神くろ子\",\n        \"coburaco\": \"コブラノヲヤツ\",\n        \"nemu\": \"ネム\",\n        \"yoshika\": \"ヨシカ\",\n        \"uduki takeru\": \"卯月たける\",\n        \"yunagi amane\": \"憂凪あまね\",\n        \"nusmusbim\": \"ナスムスビム\",\n        \"tatsu tairagi\": \"燵成\",\n        \"doemutan\": \"どえむたん\",\n        \"ooshima towa\": \"大島永遠\",\n        \"posuimianju\": \"破碎面具\",\n        \"suzuki hinomi\": \"鈴木ひのみ\",\n        \"minamo\": \"みなも\",\n        \"ka-9\": \"ないん\",\n        \"shinjima saki\": \"心岛咲\",\n        \"riko\": \"利行\",\n        \"shinozaki rei\": \"しのざき嶺\",\n        \"mei ichi\": \"名一\",\n        \"sadakage\": \"貞影\",\n        \"akako\": \"AKAKO\",\n        \"momokumo\": \"桃云\",\n        \"umiyamasoze\": \"海山そぜ\",\n        \"cailin020\": \"Cailin020\",\n        \"yuzhou\": \"宇宙\",\n        \"tantan\": \"たん旦\",\n        \"rana yume\": \"らな夢\",\n        \"sen\": \"Sen\",\n        \"oumikun\": \"近江训\",\n        \"fukai ryousuke\": \"深井涼介\",\n        \"hmongt\": \"hmongt\",\n        \"saber01\": \"saber_01\",\n        \"tripleq\": \"TripleQ\",\n        \"kashieda subaru\": \"貸江田昴\",\n        \"uranoa\": \"うらのあ\",\n        \"tisen\": \"撥撥 (Tisen)\",\n        \"chamu\": \"雅茶木HZ\",\n        \"owari\": \"おわり\",\n        \"zoharwolf\": \"Zoharwolf\",\n        \"ushi no shita\": \"牛の舌\",\n        \"dikk0\": \"ディッコ\",\n        \"nanamoto\": \"ななもと\",\n        \"naidong\": \"奶凍\",\n        \"karan\": \"からん\",\n        \"hetaren\": \"へたれん\",\n        \"ginger shuka\": \"姜糖\",\n        \"sazaemu\": \"さざえむ\",\n        \"gunjou\": \"群青\",\n        \"takaman\": \"高馒\",\n        \"xiaoxi\": \"小西0619\",\n        \"arimura daikon\": \"有村大根\",\n        \"toyama burin\": \"遠山ブリン\",\n        \"tsukai you\": \"塚井ヨウ\",\n        \"botan m\": \"牡丹M\",\n        \"syouwaru\": \"性悪\",\n        \"indo curry\": \"印度咖喱\",\n        \"hirasawa zen\": \"平沢Zen\",\n        \"shimuro itaru\": \"至室\",\n        \"mishiro shizuku\": \"水白しずく\",\n        \"gedou danshaku\": \"外道男爵\",\n        \"nero augustus\": \"尼禄奥古斯都\",\n        \"sarena\": \"百花星彩メメちゃん\",\n        \"makari tohru\": \"魔狩十织\",\n        \"mizoguchi keiji\": \"沟口凯吉\",\n        \"bing gong asylum\": \"冰宫Asylum\",\n        \"mikimoto haruhiko\": \"美树本晴彦\",\n        \"asakura ryosuke\": \"朝仓亮介\",\n        \"b-river\": \"B-RIVER\",\n        \"katakura mikki\": \"片倉みっき\",\n        \"chichan54\": \"ちーちゃん54\",\n        \"midori niku\": \"绿肉\",\n        \"oko yomiko\": \"小神よみ子\",\n        \"umemotsuzou\": \"梅モツ蔵\",\n        \"nori gorou\": \"のり伍郎\",\n        \"0-g\": \"0-G\",\n        \"0bake\": \"0BAKE\",\n        \"0k0j0\": \"0k0j0\",\n        \"10-shion\": \"10-Shion\",\n        \"10mo\": \"10mo\",\n        \"10nin\": \"10nin\",\n        \"13.\": \"13.\",\n        \"2 equals 8\": \"2=8\",\n        \"286c\": \"286c\",\n        \"2gou\": \"2号\",\n        \"2t\": \"2T\",\n        \"322g\": \"322g\",\n        \"360mb yano\": \"360MB矢野\",\n        \"38kb\": \"38kb\",\n        \"3e\": \"さんい\",\n        \"3u\": \"3u\",\n        \"4 coulomb\": \"よんくーろん\",\n        \"45acp\": \"45ACP\",\n        \"4shi\": \"4氏\",\n        \"4why\": \"4why\",\n        \"5jack\": \"5jack\",\n        \"666zarike\": \"Contact\",\n        \"77gl\": \"77gl\",\n        \"78rr\": \"だぶるあーる\",\n        \"7c\": \"7c\",\n        \"7ten paoki\": \"7点ぱおき\",\n        \"846gou\": \"846号\",\n        \"94plum\": \"94Plum\",\n        \"9chibiru\": \"九千ビノレ\",\n        \"9law\": \"9LAW\",\n        \"a toshi\": \"Aとし\",\n        \"a-loveru\": \"A・Loveる\",\n        \"a-lucky murashige\": \"アラーキー村重\",\n        \"a-s\": \"A-S\",\n        \"a-tak\": \"A-tak\",\n        \"a.k.a.nyarot\": \"a.k.a.にゃろっと\",\n        \"a.s. hermes\": \"A.S.ヘルメス\",\n        \"a1\": \"A1\",\n        \"ababari\": \"ababari\",\n        \"abara\": \"アバラ\",\n        \"abazu red\": \"あばずRed\",\n        \"abc-pauler\": \"abc-pauler\",\n        \"abe\": \"ABE\",\n        \"abe aiko\": \"安部愛コ\",\n        \"abe ryu\": \"悪部瑠\",\n        \"abe tsukumo\": \"あべつくも\",\n        \"abeno chaco\": \"阿倍野ちゃこ\",\n        \"abi\": \"あび\",\n        \"abio\": \"あびお\",\n        \"abmayo\": \"abmayo\",\n        \"abo\": \"ABO\",\n        \"abo manten\": \"阿保満天\",\n        \"abu4\": \"あぶ4\",\n        \"aburaage\": \"柳瀬敬之\",\n        \"aburi\": \"あぶり\",\n        \"aburidashi zakuro\": \"あぶりだしざくろ\",\n        \"abutomato\": \"アブトマト\",\n        \"abzome\": \"エビゾメ\",\n        \"acbins\": \"あくびんす\",\n        \"accio\": \"あっちょ\",\n        \"ace\": \"エース\",\n        \"acht\": \"アハト\",\n        \"achumuchi\": \"あちゅむち\",\n        \"aco\": \"Aco\",\n        \"adon no aniki\": \"アドンの兄貴\",\n        \"aduma kei\": \"あづま京\",\n        \"afuro\": \"あふろ\",\n        \"agata\": \"アガタ\",\n        \"agata akira\": \"県晶\",\n        \"agemon\": \"アゲモン\",\n        \"agetama\": \"あげたま\",\n        \"ago\": \"顎\",\n        \"agro bio\": \"阿黒バイオ\",\n        \"agu\": \"あぐ\",\n        \"agumen\": \"アグ麺\",\n        \"agurecchi\": \"アグれっち\",\n        \"aguri\": \"あぐり\",\n        \"ahaha\": \"あはは\",\n        \"ahchi\": \"あぁち\",\n        \"ahe\": \"あへ\",\n        \"aheen\": \"あへーん\",\n        \"ahiru\": \"あひる\",\n        \"ahobaka\": \"AHOBAKA\",\n        \"ahorobo\": \"ahorobo\",\n        \"ahou miya\": \"阿呆宮\",\n        \"ahru.\": \"あーる。\",\n        \"ai\": \"あぃ\",\n        \"ai ni shisu\": \"愛に死す\",\n        \"aiu kaho\": \"相羽翔穂\",\n        \"aibu yue\": \"相武ゆえ\",\n        \"aichi shiho\": \"あいち志保\",\n        \"aida mai\": \"英田舞\",\n        \"aida maki\": \"あいだまき\",\n        \"aida takanobu\": \"会田孝信\",\n        \"aiiro danchi\": \"藍色団地\",\n        \"aika\": \"Aika\",\n        \"aikawa\": \"愛川\",\n        \"aikawa ruru\": \"藍川琉々\",\n        \"aikawa ryou\": \"相川りょう\",\n        \"aikawa tatsuki\": \"相川たつき\",\n        \"aikura mahiru\": \"藍倉真昼\",\n        \"aikura shuuya\": \"藍倉秋夜\",\n        \"aikuri\": \"あいくり\",\n        \"aimirucha\": \"藍海松茶\",\n        \"aimitsu\": \"あいみつ\",\n        \"aimo\": \"アイモ\",\n        \"aimy\": \"あいみ*\",\n        \"ainaryumu\": \"藍那りゅむ\",\n        \"aino\": \"あいの\",\n        \"ainu mania\": \"アイヌマニア\",\n        \"aioi aoi\": \"相生青唯\",\n        \"air\": \"air\",\n        \"aira\": \"姶良\",\n        \"aitanikov\": \"あいたにこふ\",\n        \"aito matoko\": \"あいとまとこ\",\n        \"aiuchi yoshiki\": \"あいうちよしき\",\n        \"aiueou\": \"愛飢王\",\n        \"aiyama toshikazu\": \"愛山寿一\",\n        \"aiyoshi hazuki\": \"藍吉はづき\",\n        \"aizawa\": \"相沢\",\n        \"aizawa chihiro\": \"藍沢ちひろ\",\n        \"aizawa moe\": \"相澤萌\",\n        \"aizawa sanae\": \"相沢早苗\",\n        \"aizawa shin\": \"あいざわしん\",\n        \"aizawa tetora\": \"アイザワテトラ\",\n        \"aizima atsushi\": \"相嶋敦\",\n        \"aizome gorou\": \"愛染五郎\",\n        \"aji\": \"鯵\",\n        \"aji pontarou\": \"安治ぽん太郎\",\n        \"ajino\": \"あじの\",\n        \"ajoea\": \"あじょぁ\",\n        \"aju\": \"アジュ\",\n        \"aka\": \"亚果\",\n        \"aka marl\": \"赤Marl\",\n        \"aka p\": \"赤P\",\n        \"aka satanan\": \"赤さたなん\",\n        \"aka seiryuu\": \"赤セイリュウ\",\n        \"akaboshi rika\": \"赤星りか\",\n        \"akabur\": \"Akabur\",\n        \"akadume\": \"朱爪\",\n        \"akae neo\": \"赤絵ねお\",\n        \"akae shirou\": \"朱江士朗\",\n        \"akaga hirotaka\": \"赤賀博隆\",\n        \"akage no un\": \"赤毛のUN\",\n        \"akagi gisho\": \"アカギギショウ\",\n        \"akagi rio\": \"赤木リオ\",\n        \"akaguchi yuuda\": \"赤口ユウダ\",\n        \"akahira kirin\": \"あかひらきりん\",\n        \"akai hoya\": \"赤井ほや\",\n        \"akai kagerou\": \"あかいかげろう\",\n        \"akai mato\": \"紅唯まと\",\n        \"akaiken\": \"あかいけん\",\n        \"akainu pochi\": \"赤犬ポチ\",\n        \"akairo\": \"あかゐろ\",\n        \"akaishi shiroishi\": \"あかいししろいし\",\n        \"akame\": \"あかめ\",\n        \"akamichi\": \"朱道\",\n        \"akan tare\": \"阿寒たれ\",\n        \"akanagi\": \"AKANAGI\",\n        \"akanagi youto\": \"紅薙遥兎\",\n        \"akane\": \"あかね\",\n        \"akane shuuhei\": \"茜しゅうへい\",\n        \"akane souichi\": \"明音そーいち\",\n        \"akaneman\": \"明寝マン\",\n        \"akaou\": \"赤王\",\n        \"akari\": \"アカリ\",\n        \"akari seisuke\": \"明誠助\",\n        \"akarin\": \"あかりん\",\n        \"akasaka kazuhiro\": \"赤坂かずひろ\",\n        \"akasode\": \"赤袖\",\n        \"akasya botan\": \"朱赦ぼたん\",\n        \"akatsuki\": \"あかつき\",\n        \"akatsuki akane\": \"あかつき茜\",\n        \"akatsuki johnny reitou\": \"紅月ジョニー冷凍\",\n        \"akatsuki katsuie\": \"暁勝家\",\n        \"akatsuki kochi\": \"暁月こち\",\n        \"akatsuki yakyou\": \"暁夜響\",\n        \"akatu bon\": \"赤津梵\",\n        \"akatuki\": \"アカツキ\",\n        \"akatuki tetora\": \"暁てとら\",\n        \"akaume\": \"あかうめ\",\n        \"akayoshi hajime\": \"赤善元\",\n        \"akazaki yasuma\": \"赤崎やすま\",\n        \"akazawa fuyuki\": \"赤沢冬希\",\n        \"akazukin\": \"赤ZUKIN\",\n        \"akchu\": \"akchu\",\n        \"akechi shizuku\": \"明地雫\",\n        \"akemi\": \"明美\",\n        \"aken\": \"あけん\",\n        \"akenami yasutaka\": \"明波康孝\",\n        \"akenotsuki renya\": \"朱乃月蓮夜\",\n        \"aki\": \"あき\",\n        \"aki eda\": \"秋★枝\",\n        \"aki kyouma\": \"秋恭摩\",\n        \"aki matsuri\": \"亜木・祭\",\n        \"aki suzuki\": \"秋鈴木\",\n        \"aki yuuto\": \"秋遊兎\",\n        \"akiba monaka\": \"秋葉もなか\",\n        \"akiba nagi\": \"秋葉凪樹\",\n        \"akiba ryu\": \"暁葉龍\",\n        \"akiba wataru\": \"秋葉わたる\",\n        \"akichin\": \"あきちん\",\n        \"akiduki akina\": \"秋月秋名\",\n        \"akiduki touya\": \"秋月十夜\",\n        \"akiha chiaki\": \"秋葉千秋\",\n        \"akihazama\": \"akihazama\",\n        \"akihiro\": \"旭洋\",\n        \"akishiro kiko\": \"秋城鬼子\",\n        \"akikan\": \"あきかん\",\n        \"akikaze shirakumo\": \"秋風白雲\",\n        \"akimbo\": \"Akimbo\",\n        \"akimoto akio\": \"あきもとあきお\",\n        \"akimoto kei\": \"秋元けい\",\n        \"akimoto youichi\": \"あきもとよういち\",\n        \"akimura yafumi\": \"秋村八二三\",\n        \"akina\": \"秋凪\",\n        \"akina rei\": \"秋奈伶\",\n        \"akinaie\": \"アキナイエ\",\n        \"akino hidefumi\": \"秋乃秀文\",\n        \"akino konomi\": \"秋乃このみ\",\n        \"akino melpa\": \"秋乃めるぱ\",\n        \"akino nagaame\": \"秋乃長雨\",\n        \"akino nonomi\": \"秋乃ののみ\",\n        \"akino shin\": \"あきのしん\",\n        \"akino takehiko\": \"秋乃武彦\",\n        \"akira\": \"アキラ\",\n        \"akira hajime\": \"あきら肇\",\n        \"akiru\": \"秋留\",\n        \"akisa\": \"アキサ\",\n        \"akisame ruu\": \"秋雨ルウ\",\n        \"akisamo\": \"アキサモ\",\n        \"akisawa yusi\": \"秋沢由史\",\n        \"akishima\": \"秋島\",\n        \"akisoba\": \"秋蕎麦\",\n        \"akita hika\": \"晃田ヒカ\",\n        \"akita seito\": \"秋田成都\",\n        \"akitaka\": \"あきたか\",\n        \"akitani\": \"明谷\",\n        \"akito\": \"あきと\",\n        \"akitsuki hirozumi\": \"秋月ひろずみ\",\n        \"akitsuki karasu\": \"榎本ひでひら\",\n        \"akiyama\": \"あきやま\",\n        \"akiyama kenta\": \"あきやまけんた\",\n        \"akiyama yuuzi\": \"秋山裕治\",\n        \"akiyoshi yoshiaki\": \"あきよしよしあき\",\n        \"akizuki takahiro\": \"秋月たかひろ\",\n        \"akki\": \"あっきー\",\n        \"akki gedoumaru\": \"惡鬼外導丸\",\n        \"akkii\": \"あっきー\",\n        \"ako\": \"A子\",\n        \"akoko.\": \"あここ。\",\n        \"akow kazumi\": \"亜神和美\",\n        \"aku\": \"あく\",\n        \"akuma\": \"あくま\",\n        \"akuno toujou\": \"悪の東丈\",\n        \"akushizu\": \"あくしず\",\n        \"akuta\": \"アクタ\",\n        \"akuta noe\": \"阿久多のえ\",\n        \"akutabin\": \"アクタビン\",\n        \"akutabone\": \"芥骨\",\n        \"akutagawa manbou\": \"芥川まんぼう\",\n        \"akutenkou\": \"悪天候\",\n        \"akuto\": \"あくと\",\n        \"al eas\": \"アル・イース\",\n        \"alapi\": \"あらぴ\",\n        \"alber\": \"Alber\",\n        \"albert-aet\": \"Contact\",\n        \"ganassa\": \"Ganassa\",\n        \"alex\": \"あれっくす\",\n        \"alfabravo\": \"アルファブラボー\",\n        \"ali\": \"ALI\",\n        \"alimika satomi\": \"ありみかさとみ\",\n        \"allegro\": \"アレグロ\",\n        \"alpacaeater\": \"アルパカイーター\",\n        \"alpha\": \"有葉\",\n        \"alphe\": \"あるふぇ\",\n        \"alpini\": \"あるぴに\",\n        \"alroune\": \"アルラウネ\",\n        \"alt bayern\": \"あるとばいえるん\",\n        \"alto\": \"あると\",\n        \"amaama\": \"いちこ\",\n        \"amadeusky\": \"アマデウスキー\",\n        \"amado nageru\": \"雨戸ナゲル\",\n        \"amagasa higasa\": \"雨傘日傘\",\n        \"amagi michihito\": \"あまぎみちひと\",\n        \"amagi yuuru\": \"あまぎゆうる\",\n        \"amaguri aniko\": \"甘栗あに子\",\n        \"amahara mizuho\": \"あまはらみずほ\",\n        \"amai choco\": \"甘伊ちょこ\",\n        \"amakara surume\": \"あまからするめ\",\n        \"amakase masaki\": \"天枷雅樹\",\n        \"amakawa ginga\": \"天川銀河\",\n        \"amagi kazuko\": \"天城一子\",\n        \"amakuchi\": \"甘口\",\n        \"amama\": \"あまま\",\n        \"amami fuu\": \"天海ふう\",\n        \"amami ryouko\": \"あまみりょうこ\",\n        \"amamiya iria\": \"雨宮杁亜\",\n        \"amamiya tsumugi\": \"雨宮ツムギ\",\n        \"amamiya yuki\": \"雨宮結鬼\",\n        \"amamizu\": \"amamizu\",\n        \"amamori tsuruha\": \"天森つるは\",\n        \"amanai uni\": \"天内うに\",\n        \"amanatsu\": \"あまなつ\",\n        \"amane\": \"Amane\",\n        \"amane hasuhito\": \"天音蓮人\",\n        \"amane mari\": \"天音真理\",\n        \"amane shirou\": \"あまね紫狼\",\n        \"amaniji\": \"天虹\",\n        \"amano ameno\": \"天野雨乃\",\n        \"amano chiharu\": \"天乃ちはる\",\n        \"amano hidemi\": \"天野英美\",\n        \"amano jack\": \"尼野じゃっく\",\n        \"amano kanehisa\": \"アマノカネヒサ\",\n        \"amano koori\": \"桑折二号\",\n        \"amano mitsurugi\": \"天乃御剣\",\n        \"amano ribbon\": \"天野りぼん\",\n        \"amano taiki\": \"天野大気\",\n        \"amano yosora\": \"天野よそら\",\n        \"amano youki\": \"あまの・よ～き\",\n        \"amano yuu\": \"天之有\",\n        \"amanogami dai\": \"あまのがみだい\",\n        \"amanomiya haruka\": \"天宮遥\",\n        \"amaro tamaro\": \"あまろたまろ\",\n        \"amasawa natsuhisa\": \"天沢夏久\",\n        \"amashoku\": \"あましょく\",\n        \"amassa hikae\": \"あまさひかえ\",\n        \"amasyoku jiro\": \"甘食次郎\",\n        \"amato yuuki\": \"天戸祐輝\",\n        \"amaya kan\": \"あまやかん\",\n        \"amaya kyo\": \"雨耶恭\",\n        \"amayu\": \"あまゆ\",\n        \"amazing\": \"飴井神具\",\n        \"amedama akihito\": \"雨珠秋比人\",\n        \"amedori\": \"飴鳥\",\n        \"amei sumeru\": \"あめいすめる\",\n        \"amelie\": \"amelie\",\n        \"amemiya luky\": \"雨宮ルキ\",\n        \"amemiya nyanko\": \"飴宮にゃんこ\",\n        \"ameno ringo\": \"飴乃苹果\",\n        \"ameotoko\": \"雨男\",\n        \"amesawa yagi\": \"飴沢やぎ\",\n        \"ameya kyo\": \"雨矢恭\",\n        \"amhoo\": \"amhoo!!\",\n        \"ami\": \"阿見\",\n        \"ami hideto\": \"弥舞秀人\",\n        \"ami2\": \"ami2\",\n        \"amida murasaki\": \"あみだむらさき\",\n        \"amin\": \"あみん\",\n        \"amino\": \"あみ野\",\n        \"amu\": \"あむ\",\n        \"amum\": \"amum\",\n        \"amury\": \"あむりー\",\n        \"amyuchan\": \"アミュちゃん\",\n        \"an2a\": \"An2A\",\n        \"ana\": \"穴\",\n        \"ana-chan s\": \"穴ちゃんS\",\n        \"anachans\": \"穴ちゃんS\",\n        \"anago\": \"Anago\",\n        \"anakuro\": \"あなくろ\",\n        \"anan yutaka\": \"阿南ゆたか\",\n        \"anapom\": \"あなぽん\",\n        \"anchors\": \"Anchors\",\n        \"hamaburicchi\": \"ハマブリッチ\",\n        \"andoriyu\": \"あんどりゅ～\",\n        \"andou hiroyuki\": \"安藤裕行\",\n        \"andou tomoya\": \"安藤智也\",\n        \"andouyou\": \"アンドウユウ\",\n        \"andrew\": \"Andrew\",\n        \"andy\": \"ANDY\",\n        \"ane\": \"姉\",\n        \"angel dust\": \"エンジェルダスト\",\n        \"angelica\": \"アンジェリカ\",\n        \"angie nishikawa\": \"アンジー西川\",\n        \"aniki\": \"アニキ\",\n        \"anji\": \"杏二\",\n        \"ankoromochi\": \"あんころもち\",\n        \"anma\": \"安間\",\n        \"anmitsu sou\": \"あんみつ草\",\n        \"ann\": \"Ann\",\n        \"annie\": \"あにぃ\",\n        \"annin\": \"杏仁\",\n        \"annjeria\": \"あんじぇりあ\",\n        \"annkoku daimaou\": \"暗黒大魔王\",\n        \"anohito\": \"あのひと\",\n        \"anoshabu\": \"アノシャブ\",\n        \"anparu98\": \"anparu98\",\n        \"anshin mama\": \"あんしんママ\",\n        \"anyakunin\": \"暗躍人\",\n        \"anyama takemi\": \"案山たけみ\",\n        \"anzu hime\": \"あんず姫\",\n        \"ao\": \"蒼\",\n        \"ao banana\": \"青ばなな\",\n        \"ao madousi\": \"蒼惑う子\",\n        \"aogen genda\": \"青木ゲンダ\",\n        \"aohashi ame\": \"青橋雨\",\n        \"aohashi yutaka\": \"青橋由高\",\n        \"aoi chiro\": \"碧井チロ\",\n        \"aoi hiro\": \"葵比呂\",\n        \"aoi itigo\": \"葵イチゴ\",\n        \"aoi levin\": \"あおいれびん\",\n        \"aoi mikan\": \"葵蜜柑\",\n        \"aoi mikku\": \"アオイみっく\",\n        \"aoi mizuki\": \"蒼居観月\",\n        \"aoi muramasa\": \"蒼井村正\",\n        \"aoi remi\": \"青井レミ\",\n        \"aoi runa\": \"蒼井るな\",\n        \"aoi shinji\": \"葵信次\",\n        \"aoi taishi\": \"蒼井タイシ\",\n        \"aoi takayuki\": \"蒼隆行\",\n        \"aoi tsuyukusa\": \"蒼井露草\",\n        \"aoi yumi\": \"蒼井遊美\",\n        \"aojiru\": \"あおじる\",\n        \"aoki eichi\": \"蒼木えいち\",\n        \"aoki reimu\": \"青樹零夢\",\n        \"aoko\": \"Aoko\",\n        \"aokura shou\": \"青倉ショウ\",\n        \"aomeyuu\": \"アオメユウ\",\n        \"aonaga heri\": \"青永HERI\",\n        \"aonatsusu\": \"蒼夏酢\",\n        \"aono\": \"あおの\",\n        \"aono akira\": \"蒼野アキラ\",\n        \"aono keita\": \"青野圭太\",\n        \"aono yami\": \"蒼野矢美\",\n        \"aonuma shizuma\": \"蒼沼シズマ\",\n        \"aoreyo\": \"あおれよ\",\n        \"aosusuki dakuna\": \"青薄 だくな\",\n        \"aotsuki hirotada\": \"蒼月裕忠\",\n        \"aotsuki kakka\": \"蒼月かっか\",\n        \"aotsuki ren\": \"蒼月蓮\",\n        \"aoume kaito\": \"青梅街人\",\n        \"aox\": \"あおっくす\",\n        \"aoyama reo\": \"青山怜央\",\n        \"aozame takao\": \"青雨高夫\",\n        \"aozuki ran\": \"蒼月蘭\",\n        \"apacchi\": \"アパッチ\",\n        \"apart\": \"おだねるapart\",\n        \"apita\": \"あぴ太\",\n        \"apophis str\": \"アポフィス★STR\",\n        \"aporon\": \"Aporon\",\n        \"apostle\": \"apostle\",\n        \"apple13\": \"apple13\",\n        \"apploute\": \"あっぷるーと\",\n        \"appuri ko\": \"あっぷり子\",\n        \"appyalpie\": \"あぴゃるぴえ\",\n        \"aqu\": \"亜空\",\n        \"aqua vit\": \"アクアビット\",\n        \"kosuke poke\": \"こーすけぽけ\",\n        \"aqui\": \"AQUI\",\n        \"ar-mai\": \"ar-mai\",\n        \"arabiki koshou\": \"あらびき故障\",\n        \"araco\": \"あらこー\",\n        \"aragishi\": \"あらぎし\",\n        \"arai kazuki\": \"新井和崎\",\n        \"arai nobu\": \"アライノブ\",\n        \"arai yuu\": \"新居佑\",\n        \"araki akihito\": \"荒木アキヒト\",\n        \"araki hiroaki\": \"あらきひろあき\",\n        \"araki jeccy\": \"Araki Jeccy\",\n        \"araki mitsuru\": \"荒木みつる\",\n        \"aramaki shake\": \"荒巻しゃけ\",\n        \"arami taito\": \"荒海泰人\",\n        \"arao masaki\": \"荒尾マサキ\",\n        \"araragi ayune\": \"あららぎあゆね\",\n        \"araruck\": \"あららっく\",\n        \"arashi-d-akira\": \"嵐-D-悪鬼羅\",\n        \"arashiyama tsugumoto\": \"嵐山次元\",\n        \"arata mai\": \"新米\",\n        \"aratagawa nikei\": \"荒田川にけい\",\n        \"arbuzbudesh\": \"Contact\",\n        \"arcana rude\": \"あるかな(るど)\",\n        \"arch enemy\": \"あーちえねみー\",\n        \"arciealbano\": \"arciealbano\",\n        \"arctic char\": \"Arctic char\",\n        \"are\": \"ARE\",\n        \"ari\": \"蟻\",\n        \"aria\": \"Aria\",\n        \"ariesu watanabe\": \"ありえす渡辺\",\n        \"ariga tou\": \"有賀冬\",\n        \"ariichi kyuu\": \"有一九\",\n        \"ariike tomosane\": \"有池智実\",\n        \"arikawa koba\": \"有川古葉\",\n        \"ariko\": \"亜璃子\",\n        \"arima\": \"ありま\",\n        \"arima jun\": \"有马纯\",\n        \"arima keitarou\": \"有马启太郎\",\n        \"arima you\": \"有马有\",\n        \"arima yutaka\": \"有马ゆたか\",\n        \"arimori haru\": \"在森 晴\",\n        \"arimura ario\": \"有村ありお\",\n        \"arimura shinobu\": \"有村しのぶ\",\n        \"arimura yuu\": \"有村悠\",\n        \"arinko\": \"蟻ん子\",\n        \"arisaka ako\": \"有坂あこ\",\n        \"arisato natsuki\": \"ありさと奈月\",\n        \"arisawa masaharu\": \"有沢柾春\",\n        \"arisue tsukasa\": \"有末つかさ\",\n        \"ariyas honda\": \"本田有保\",\n        \"ariyoshi gen\": \"蟻吉げん\",\n        \"ark waver\": \"あるくでんぱ\",\n        \"arkas\": \"Arkas\",\n        \"aro\": \"あろ\",\n        \"art jam\": \"Art Jam\",\n        \"afro\": \"あふろ\",\n        \"akagi\": \"赤木\",\n        \"pastel\": \"ぱすてる\",\n        \"aru\": \"ある\",\n        \"aruma\": \"あるま\",\n        \"andou jirou\": \"安藤慈朗\",\n        \"arumi\": \"あるみ\",\n        \"aruse yuuji\": \"有瀬祐志\",\n        \"aruta\": \"あるた\",\n        \"arutan\": \"あるたん\",\n        \"aruva\": \"aruva\",\n        \"as-special\": \"As-Special\",\n        \"asa\": \"あさ\",\n        \"asaba hideaki\": \"あさばひであき\",\n        \"asagi\": \"浅戯\",\n        \"asagi aya\": \"あさぎあや\",\n        \"asagi hiroshi\": \"浅葱洋\",\n        \"asagi shion\": \"浅葱しおん\",\n        \"asagi yoshimitsu\": \"あさぎよしみつ\",\n        \"asagi yukia\": \"浅樹ゆきあ\",\n        \"asagiri\": \"あさぎり\",\n        \"asagiri miyabi\": \"朝霧雅\",\n        \"asagiri rira\": \"あさぎりりら\",\n        \"asagiri tendou\": \"朝霧天道\",\n        \"asagiri.\": \"ASAGIRI.\",\n        \"asahi\": \"アサヒ\",\n        \"asahi uta\": \"あさひウタ\",\n        \"asahikawa\": \"旭川\",\n        \"asahimaru\": \"旭丸\",\n        \"asai yuuri\": \"浅井ユウリ\",\n        \"asakai mocchinu\": \"浅貝もっちぬ\",\n        \"asakawa yuki\": \"麻川由貴\",\n        \"asako\": \"あさこ\",\n        \"asakura\": \"麻倉\",\n        \"asakura blue\": \"朝倉ブルー\",\n        \"asakura gin\": \"浅倉ギン\",\n        \"asakura hina\": \"朝倉妃那\",\n        \"asakura kazuki\": \"あさくらかずき\",\n        \"asakura nao\": \"明桜なお\",\n        \"asakura ryou\": \"朝倉亮\",\n        \"asakura sakura\": \"麻倉桜\",\n        \"asama\": \"あさま\",\n        \"asamaki\": \"あさマキ\",\n        \"asamashi masashi\": \"浅増マサシ\",\n        \"asami asami\": \"浅海朝美\",\n        \"asami waka\": \"浅見わか\",\n        \"asami yumesuke\": \"朝見ユメスケ\",\n        \"asami yurumu\": \"浅湖葵天\",\n        \"asano\": \"朝野\",\n        \"asano akira\": \"浅野晃\",\n        \"asano keigo\": \"浅野けいご\",\n        \"asano maya\": \"麻野まや\",\n        \"asano shimon\": \"麻乃史門\",\n        \"asano yukino\": \"あさのゆきの\",\n        \"asanuma katsuaki\": \"浅沼克明\",\n        \"asari yoshitoo\": \"あさりよしとお\",\n        \"asaroku\": \"あさろく\",\n        \"asatsuki madoka\": \"朝月円\",\n        \"asazaki\": \"アサザキ\",\n        \"asazuki\": \"アサヅキ\",\n        \"ase\": \"汗\",\n        \"ashi o\": \"Ashi_O\",\n        \"ashiashi\": \"あしあし\",\n        \"ashisyun\": \"芦俊\",\n        \"ashita cha\": \"明日茶\",\n        \"ashling\": \"あしゅりんぐ\",\n        \"ashura kumo\": \"阿修羅クモ\",\n        \"asio\": \"アシオ\",\n        \"asitaba tomorou\": \"明日葉友婁\",\n        \"aska takuya\": \"飛鳥拓哉\",\n        \"asou\": \"阿宗\",\n        \"asou shin\": \"麻生シン\",\n        \"aspara daisuke\": \"アスパラダイスケ\",\n        \"assteka\": \"あずてか\",\n        \"asterisk\": \"＊\",\n        \"astre\": \"ASTRE\",\n        \"astroguy2\": \"ASTROGUY2\",\n        \"asu\": \"asu\",\n        \"asu oikiru\": \"明日追斬\",\n        \"asuka\": \"アスカ\",\n        \"asuka nashina\": \"飛鳥梨菜\",\n        \"asuma omi\": \"遊馬臣\",\n        \"asumi jinta\": \"明澄迅汰\",\n        \"asuoi kiru\": \"明日追斬\",\n        \"asupaka\": \"あすぱか\",\n        \"asurai masaki\": \"明日頼真咲\",\n        \"asya\": \"亞沙\",\n        \"at\": \"AT\",\n        \"atagawa\": \"あたがわ\",\n        \"atahuta\": \"atahuta\",\n        \"atai\": \"A太\",\n        \"atarime\": \"当たり目\",\n        \"ataru\": \"あたる\",\n        \"atera\": \"アテラ\",\n        \"ather birochi\": \"アザービロチ\",\n        \"atoki\": \"あとき\",\n        \"atono matsuri\": \"後野祭\",\n        \"atono maturi\": \"亜斗乃茉利\",\n        \"atori rei\": \"あとり玲\",\n        \"atp\": \"ATP\",\n        \"atsyu\": \"亞つゅ\",\n        \"atte nanakusa\": \"あって七草\",\n        \"atunabe\": \"圧鍋\",\n        \"aturn\": \"ATURN\",\n        \"atutoku\": \"あつとく\",\n        \"atyuto\": \"あちゅと\",\n        \"auauun\": \"あうあうーん\",\n        \"aula\": \"あうら\",\n        \"autumm\": \"秋\",\n        \"awa\": \"AwA\",\n        \"awamori ichitarou\": \"泡盛一太郎\",\n        \"awata mokane\": \"粟田もかね\",\n        \"aweida\": \"アウェイ田\",\n        \"aya shiina\": \"彩しーな\",\n        \"aya-cis\": \"AYA-cis\",\n        \"ayakashi\": \"アヤカシ\",\n        \"hatakeyama tohya\": \"畠山桃哉\",\n        \"ayakaze ryuushou\": \"綾風柳晶\",\n        \"ayakumo\": \"ayakumo\",\n        \"ayame\": \"アヤメ\",\n        \"ayame riyo\": \"あやめりよ\",\n        \"ayame sino\": \"彩恵紫乃\",\n        \"ayana mizuki\": \"綾那瑞奇\",\n        \"ayana rio\": \"彩奈りお\",\n        \"ayanagi gumimi\": \"彩柳グミミ\",\n        \"ayane\": \"あやね\",\n        \"ayano naoto\": \"綾野なおと\",\n        \"ayano rumi\": \"綾乃るみ\",\n        \"ayanokouji haruka\": \"綾小路はるか\",\n        \"ayasaka mitsune\": \"綾阪みつね\",\n        \"ayase\": \"綾瀬\",\n        \"ayase hazuki\": \"綾瀬はづき\",\n        \"ayase jun\": \"綾瀬純\",\n        \"ayase mako\": \"綾瀬真子\",\n        \"ayase shinomu\": \"綾瀬しのむ\",\n        \"ayase suitento\": \"綾瀬水天戸\",\n        \"ayase totsuki\": \"彩瀬とつき\",\n        \"ayase yura\": \"綾瀬ゆら\",\n        \"ayashi ayashibe\": \"妖部あやし\",\n        \"ayasugi tsubaki\": \"綾杉つばき\",\n        \"ayato\": \"綺人\",\n        \"ayatsuri-doll\": \"文釣遠瑠\",\n        \"ayu\": \"あゆ\",\n        \"ayuka\": \"あゆか\",\n        \"ayukisa\": \"アユキサ\",\n        \"azasuke\": \"AZASUKE\",\n        \"azmodan\": \"Azmodan\",\n        \"azu\": \"Azu\",\n        \"azuki\": \"アズキ\",\n        \"azuki kurenai\": \"あずき紅\",\n        \"azukiko\": \"あずきこ\",\n        \"azuma\": \"あずま\",\n        \"azuma aya\": \"あずまあや\",\n        \"azuma hirota\": \"東ひろた\",\n        \"azuma kyouto\": \"東京都\",\n        \"azuma minatu\": \"東みなつ\",\n        \"azuma seiya\": \"東聖夜\",\n        \"azumi kyohei\": \"あずみ京平\",\n        \"azusa norihee\": \"あずさのりへー\",\n        \"azuteru.\": \"あずてる。\",\n        \"b.tarou\": \"B.たろう\",\n        \"b1h\": \"B1H\",\n        \"bach\": \"Bach\",\n        \"backfischalter\": \"伸長に関する考察\",\n        \"bacon\": \"ベーコン\",\n        \"badbamboo\": \"badbamboo\",\n        \"badhand\": \"BadHanD\",\n        \"badman bastich\": \"Deceased.\",\n        \"baerun\": \"ばえるん\",\n        \"bajou takurou\": \"馬乗拓郎\",\n        \"bakedanuki\": \"バケダヌキ\",\n        \"bakko\": \"跋扈\",\n        \"bakkon tamago\": \"バッコンたまご\",\n        \"bakuchin\": \"ばくちん\",\n        \"bakudanbonbon\": \"ばくだんぼんぼん\",\n        \"bakuretsu chichihirosu\": \"爆裂チチヒロス.\",\n        \"bakusai\": \"爆砕\",\n        \"baldie\": \"BALDIE\",\n        \"balpanther\": \"ばるぱんさー\",\n        \"baltan\": \"Baltan\",\n        \"baltika\": \"ばるてぃか\",\n        \"ban\": \"ばん!\",\n        \"bancha\": \"番茶\",\n        \"bangetsu setsuka\": \"晩月雪加\",\n        \"banjaku\": \"ばんじゃく\",\n        \"bankokudou\": \"ばんこく堂\",\n        \"barbachos\": \"ばるばちょす\",\n        \"baron mori\": \"バロン森\",\n        \"baron.m\": \"BARON.M\",\n        \"bash\": \"BASH\",\n        \"bazaar\": \"ばざーる\",\n        \"bb\": \"BB\",\n        \"bbsacon\": \"bbsacon\",\n        \"bbwh\": \"bbwH\",\n        \"bea\": \"bea\",\n        \"beat-kun\": \"びーとくん\",\n        \"beater\": \"Beater\",\n        \"bebebe\": \"べべべ\",\n        \"beco\": \"Beco\",\n        \"bee\": \"bee\",\n        \"beijuu\": \"米獸\",\n        \"bekko.\": \"べっ子。\",\n        \"bekkou megane buchiko\": \"べっこうめがねぶち子\",\n        \"bell\": \"ベル\",\n        \"bells\": \"Bell’s\",\n        \"bellsuke\": \"ベル助\",\n        \"belmond uozumi\": \"ベルモンド魚住\",\n        \"ben\": \"BEN\",\n        \"ben237\": \"BEN237\",\n        \"beni bana\": \"紅花\",\n        \"benikawa akito\": \"紅川アキト\",\n        \"benimashiko\": \"べにましこ\",\n        \"benzou\": \"ベンゾウ\",\n        \"berggold\": \"バーゴ\",\n        \"berose\": \"べろせ\",\n        \"berukko\": \"べるっこ\",\n        \"beti\": \"べてぃ\",\n        \"betty\": \"べってぃ\",\n        \"bibandamu\": \"びばんだむ\",\n        \"bibi\": \"ビビ\",\n        \"big.g\": \"big.g\",\n        \"bikkle\": \"ビックル\",\n        \"binbi\": \"びん美\",\n        \"binf\": \"ななし\",\n        \"biozs\": \"バイオ前線\",\n        \"birobon\": \"ビロボン\",\n        \"bisco\": \"ビスコ\",\n        \"bismarcho\": \"ビスマルチョ\",\n        \"bitaro\": \"ビ太郎\",\n        \"bitibiti\": \"bitibiti\",\n        \"bitou\": \"微糖\",\n        \"bittsu\": \"びっつ\",\n        \"biwa\": \"枇杷\",\n        \"bizen\": \"備前\",\n        \"bkyu\": \"bkyu\",\n        \"black\": \"ぶらっく\",\n        \"blackbaka\": \"ブラック馬鹿\",\n        \"blackheart\": \"BLACKHEART\",\n        \"blacksaw\": \"BLACKSAW\",\n        \"blast\": \"Blast\",\n        \"blind\": \"ブラインド\",\n        \"blmanian\": \"ぶるまにあん\",\n        \"bloomer hogero\": \"ぶるマほげろー\",\n        \"blue blood\": \"BLUE BLOOD\",\n        \"blue gk\": \"Blue_Gk\",\n        \"blue impulse\": \"ブルーインパルス\",\n        \"blz\": \"BLZ\",\n        \"bmg\": \"bmg\",\n        \"bnr\": \"BNR\",\n        \"bob jr\": \"ボブJr\",\n        \"bob kosugi\": \"ボブ小杉\",\n        \"bob r\": \"暴武R\",\n        \"bobca\": \"ボブキャ\",\n        \"bocha\": \"ぼちゃ\",\n        \"bojore\": \"ボジョレ\",\n        \"bol\": \"bol\",\n        \"boljoy-kun\": \"ぼりじょいくん\",\n        \"boltack\": \"ぼるたっく\",\n        \"bom\": \"BOM\",\n        \"bomber grape\": \"ボンバーグレープ\",\n        \"bon-3000\": \"BON_3000\",\n        \"bond\": \"ボンド\",\n        \"bondo\": \"ぼんど\",\n        \"bonehead\": \"Bonehead\",\n        \"bonnie\": \"ぼに～\",\n        \"bono\": \"ぼの\",\n        \"bonske\": \"ぼんすけ\",\n        \"bonten\": \"梵典\",\n        \"bontenkarasu\": \"梵天鴉\",\n        \"bonyuu cheese no natsu\": \"母乳ち～ずの夏\",\n        \"bonzakashi\": \"盆座\",\n        \"booch\": \"Booch\",\n        \"boots\": \"物\",\n        \"borurun\": \"ぼるるん\",\n        \"bose\": \"bose\",\n        \"boss chin\": \"BOSS珍\",\n        \"botan\": \"牡丹\",\n        \"bottomline\": \"Bottomline\",\n        \"boudan nyuugyuu\": \"防弾乳牛\",\n        \"bouko\": \"bouko\",\n        \"bourne\": \"ボーン\",\n        \"bouto\": \"帽都\",\n        \"bov\": \"bov\",\n        \"bowalia\": \"タケユウ\",\n        \"bowcan\": \"ぼーかん\",\n        \"bowieknife\": \"ボウイナイフ\",\n        \"brave\": \"brave\",\n        \"brewstar\": \"ぶりすた\",\n        \"brilliant jijii\": \"ブリリアントじじい\",\n        \"brll\": \"BRLL\",\n        \"brokao\": \"BroKao\",\n        \"brother bob\": \"ブラザーボブ\",\n        \"bt\": \"BT\",\n        \"btk\": \"BTK\",\n        \"buaisou\": \"無愛想\",\n        \"bubonic\": \"ぶぼにっく\",\n        \"buccho\": \"ぶっちょ\",\n        \"buchimaru\": \"ぶちマル\",\n        \"buhi\": \"ぶひ\",\n        \"bukatsu\": \"ぶかつ\",\n        \"bullion\": \"ばるらいおん\",\n        \"bun\": \"ぶん\",\n        \"bun150\": \"Bun150\",\n        \"bunapi 397 yen\": \"ぶなぴー397円\",\n        \"bunbon\": \"ぶんぼん\",\n        \"bunny\": \"バニー\",\n        \"buri\": \"ブリ\",\n        \"buriki\": \"ブリキ\",\n        \"bushi\": \"BUSHI\",\n        \"butajiman\": \"豚じまん\",\n        \"butao\": \"ブタ男\",\n        \"buthikireta\": \"ぶっちぃ\",\n        \"butsuri neko\": \"物理猫\",\n        \"butter\": \"butter\",\n        \"bwell\": \"bwell\",\n        \"byoin\": \"びょーいん\",\n        \"byte\": \"Byte\",\n        \"bzsk.\": \"Bzsk.\",\n        \"c\": \"C\",\n        \"c-cake\": \"C-Cake\",\n        \"c-low\": \"C-Low\",\n        \"c-taro\": \"C-taro\",\n        \"cabayaki\": \"Cabayaki\",\n        \"caburi\": \"caburi\",\n        \"cacao\": \"cacao\",\n        \"cai\": \"cai\",\n        \"cait\": \"Cait\",\n        \"calpara\": \"calpara\",\n        \"calpish\": \"かるぴ\",\n        \"can\": \"CAN\",\n        \"canadazin\": \"カナダ人\",\n        \"canvas solaris\": \"カンバスそらりす\",\n        \"capriccio\": \"かぷりっちょ\",\n        \"capriccyo\": \"カプリッチョ\",\n        \"cara subato\": \"空すばと\",\n        \"caramel dow\": \"きゃらめる堂\",\n        \"carbon rice\": \"カーボン飯\",\n        \"carlos toshiki\": \"カルロスとしき\",\n        \"carnelian\": \"CARNELIAN\",\n        \"carrot\": \"きゃろっと\",\n        \"caruta\": \"caruta\",\n        \"cashew\": \"かしゅう\",\n        \"cashue\": \"香愁\",\n        \"cassandra\": \"かっさんどら\",\n        \"castella\": \"カステラ\",\n        \"caterpillar\": \"キャタピラ\",\n        \"cccpo\": \"cccpo\",\n        \"cel\": \"Cel\",\n        \"cesar\": \"しーざー\",\n        \"cevoy\": \"せぼい\",\n        \"chaa\": \"ちゃあ\",\n        \"chabashira tatsukichi\": \"茶柱立吉\",\n        \"chabin\": \"茶瓶\",\n        \"chabo\": \"茶鳥\",\n        \"chaccu\": \"chaccu\",\n        \"chado\": \"茶戸\",\n        \"chagata\": \"ちゃがた\",\n        \"chagu\": \"ちゃぐ\",\n        \"chaigidhiell\": \"カイギディエル\",\n        \"chakkaman\": \"チャッカマン\",\n        \"chamame\": \"茶豆\",\n        \"chameleon\": \"かめれおん\",\n        \"chan shin han\": \"chan shin han\",\n        \"chanary\": \"Chanary\",\n        \"chane\": \"ちゃね\",\n        \"chano mina\": \"茶野みな\",\n        \"chanta\": \"チャン太\",\n        \"chaos 2nd\": \"かおす二号\",\n        \"charlie nishinaka\": \"チャーリーにしなか\",\n        \"chasaracha\": \"茶皿茶\",\n        \"chataro\": \"ちゃたろー\",\n        \"chatsune\": \"ちゃつね\",\n        \"chawa\": \"ちゃわ\",\n        \"chazutsu sayu\": \"茶筒さゆ\",\n        \"cheko\": \"ちぇこ\",\n        \"chemical flow\": \"けみかるふろう\",\n        \"cherry\": \"CHERRY\",\n        \"cheruno\": \"ちぇるの\",\n        \"chesuka\": \"チェスカ\",\n        \"chiba chibasa\": \"千葉ちばさ\",\n        \"chiba dirou\": \"ちば・ぢろう\",\n        \"chiba shinji\": \"千葉進司\",\n        \"chiba shuusaku\": \"千葉秀作\",\n        \"chiba tetsutarou\": \"千葉哲太郎\",\n        \"chibibibi\": \"ちびびび\",\n        \"chibineco master\": \"ちびねこマスター\",\n        \"chibinon\": \"チビのん☆\",\n        \"chibou\": \"ちーぼう\",\n        \"chicago\": \"シカゴ\",\n        \"chicke iii\": \"Chicke III\",\n        \"chidori\": \"ちどり\",\n        \"chidori nekoro\": \"千鳥ねころ\",\n        \"chidorinu\": \"チドリヌ\",\n        \"chiebukuro ichiban\": \"知恵袋一番\",\n        \"chief\": \"ちーふ\",\n        \"chiei\": \"智英\",\n        \"chieko\": \"ちえこ\",\n        \"chigiri maru\": \"ちぎりまる\",\n        \"chihi\": \"ちひ\",\n        \"chihiro aoi\": \"葵千尋\",\n        \"chihuri\": \"ちふり\",\n        \"chii\": \"地井\",\n        \"chijiwa sawa\": \"千々石さわ\",\n        \"chika\": \"千翔\",\n        \"chikado\": \"ちかど\",\n        \"chikahii\": \"ちかひー\",\n        \"chikake\": \"ちかけー\",\n        \"chikane\": \"千鐘\",\n        \"chikasato michiru\": \"近里みちる\",\n        \"chikaya\": \"ちかや\",\n        \"chikijima\": \"ちきじま\",\n        \"chikiko\": \"チキコ\",\n        \"chikomayo\": \"ちこマヨ\",\n        \"chikotam\": \"ちこたむ\",\n        \"chiku\": \"築\",\n        \"chikubai\": \"竹梅\",\n        \"chikugen\": \"竹玄\",\n        \"chilt\": \"ちると\",\n        \"chimaro\": \"ちまろ\",\n        \"chimo\": \"チモ\",\n        \"chimple hotter\": \"チンプル堀田\",\n        \"chin\": \"chin\",\n        \"chin tokusyu\": \"珍・特集\",\n        \"china\": \"茶否\",\n        \"chinhou\": \"珍步\",\n        \"chinjao roosu\": \"ちんじゃおろおす\",\n        \"chino fumiyu\": \"稚乃ふみゆ\",\n        \"chinyoko\": \"ちんよこ\",\n        \"chipa\": \"薙派\",\n        \"chirorian\": \"ちろり庵\",\n        \"chiroru\": \"ちろる\",\n        \"chisato\": \"チサト\",\n        \"chisato kirin\": \"千里きりん\",\n        \"chisato reiri\": \"チサトレイリ\",\n        \"chita arihiro\": \"知多有洋\",\n        \"chitose\": \"ちとせ\",\n        \"chitosezaka suzu\": \"千歳坂すず\",\n        \"chiune\": \"ちうね\",\n        \"chiyo\": \"千代\",\n        \"chiyoda mikurou\": \"千代多みく郎\",\n        \"chiyomi\": \"chiYOMI\",\n        \"chizakya\": \"ちざきゃ\",\n        \"chizu\": \"ちず\",\n        \"chizuru\": \"ちづる\",\n        \"chocco coronetto\": \"チョココロネット\",\n        \"chocho\": \"チョチョ\",\n        \"choco\": \"CHOCO\",\n        \"choco coronet\": \"チョココロネット\",\n        \"chocomint\": \"ちょこみんと\",\n        \"chocore\": \"ちょこれ\",\n        \"choko yarou\": \"ちょこ野郎\",\n        \"chomes\": \"Chomes\",\n        \"chomo\": \"ちょも\",\n        \"chonko\": \"ちよんこ\",\n        \"chou creme\": \"シュークリーム\",\n        \"chou shippaisaku\": \"超失敗作\",\n        \"chouniku\": \"超肉\",\n        \"chourui\": \"鳥類\",\n        \"chouzetsu yarou\": \"超絶野朗\",\n        \"chro\": \"chro\",\n        \"chun\": \"CHuN\",\n        \"chunko\": \"ちゅんこ\",\n        \"chunrouzan\": \"春籠漸\",\n        \"chupimaro\": \"ちゅぴまろ\",\n        \"chuusuu kairo\": \"中枢回路\",\n        \"chuuta\": \"ちゅー太\",\n        \"ci\": \"Ci\",\n        \"cian yo\": \"Cian yo\",\n        \"cilica\": \"CILICA\",\n        \"cindy\": \"cindy\",\n        \"circussion\": \"circussion\",\n        \"ck j\": \"Ckj\",\n        \"ckj\": \"ckj\",\n        \"cl\": \"シーエル\",\n        \"cla\": \"Cla\",\n        \"clappy\": \"くらっぴ\",\n        \"clarin\": \"くらりん\",\n        \"clip\": \"くりっぷ\",\n        \"cloire clover\": \"Cloire Clover\",\n        \"cloth tsugutoshi\": \"黒須嗣載\",\n        \"clover\": \"clover\",\n        \"co ma\": \"Co_Ma\",\n        \"coara\": \"coara\",\n        \"coaster\": \"コースター\",\n        \"cobo\": \"こぼ\",\n        \"cock robin\": \"クックロビン\",\n        \"cocoa\": \"ここあ\",\n        \"cocolog\": \"ココローグ\",\n        \"coconoe ricoco\": \"九重リココ\",\n        \"coconoha mikage\": \"心葉御影\",\n        \"cocorono arika\": \"心野ありか\",\n        \"cocounco\": \"cocounco\",\n        \"cocoyama\": \"ココ山\",\n        \"coelacanth\": \"しーらかんす\",\n        \"cohen\": \"cohen\",\n        \"coin rand\": \"コインRAND\",\n        \"colin\": \"COLIN\",\n        \"collagen\": \"コラーゲン\",\n        \"colonel aki\": \"Colonel AKI\",\n        \"color\": \"COLOR\",\n        \"colulun\": \"こるるん\",\n        \"combat ecchu\": \"戦闘的越中\",\n        \"comeon showme\": \"花門初海\",\n        \"comizuk\": \"こみずく\",\n        \"comord\": \"コモード\",\n        \"comugico\": \"comugico\",\n        \"condessa\": \"Condessa\",\n        \"coo\": \"くー\",\n        \"copo copo\": \"こぽこぽ\",\n        \"core-suke\": \"コア助\",\n        \"cosine\": \"COSiNE\",\n        \"cosmashiva\": \"COSMASHIVA\",\n        \"cotoba\": \"COTOBA\",\n        \"cotoji\": \"琴慈\",\n        \"couch potato\": \"かうちぽてと\",\n        \"cozy\": \"コージー\",\n        \"cpk418\": \"CPK418\",\n        \"cpu\": \"CPU\",\n        \"cr-r\": \"Cr-R\",\n        \"craft\": \"くらふと\",\n        \"crataegus\": \"Crataegus\",\n        \"crazy nirin\": \"クレイジー二厘\",\n        \"crazy white\": \"クレイジーホワイト\",\n        \"cream\": \"Cream\",\n        \"creek\": \"CREEK\",\n        \"crepix\": \"シーレ\",\n        \"cross\": \"クロス\",\n        \"crossco\": \"くろすこ\",\n        \"crow\": \"CROW\",\n        \"crozu\": \"黒酢\",\n        \"crystal shoujo\": \"クリスタル少女\",\n        \"ctk\": \"CTK\",\n        \"cube\": \"キューブ\",\n        \"cube85\": \"Cube85\",\n        \"cumasyo\": \"くましょう\",\n        \"cup-chan\": \"カップちゃん\",\n        \"cura\": \"cura\",\n        \"cureryuta\": \"キュアリュータ\",\n        \"custom\": \"カスタム\",\n        \"cuteg\": \"CUTEG\",\n        \"cv1115\": \"cv1115\",\n        \"cylia-the-antelope\": \"Cylia-The-Antelope\",\n        \"cyorisuke\": \"ちょりすけ\",\n        \"cyoro suke\": \"チョロ助\",\n        \"d-2\": \"D-2\",\n        \"d-suke\": \"D-Suke\",\n        \"d.hiranuma\": \"D.HIRANUMA\",\n        \"da\": \"だ\",\n        \"daga shikashi\": \"だがしかし\",\n        \"dagasi\": \"DAGASI\",\n        \"dai\": \"Dai\",\n        \"dai pippy\": \"大ピッピ\",\n        \"daidai\": \"大々\",\n        \"daidokoro\": \"台所\",\n        \"daifuku keiji\": \"大福けーじ\",\n        \"daigo\": \"DAIGO\",\n        \"daihuku\": \"大福\",\n        \"daiji\": \"だいじ\",\n        \"daiki\": \"だいき\",\n        \"daikyojin\": \"大巨神\",\n        \"daimon\": \"大門\",\n        \"dainakishin\": \"ダイナキシン\",\n        \"dairoku tenmaou great\": \"第六天魔王グレート\",\n        \"daisaku\": \"大作\",\n        \"daitou\": \"だい唐\",\n        \"daitouchi runoru\": \"大灯地ルノル\",\n        \"dakara\": \"だかラ\",\n        \"dame neko\": \"ダメ猫\",\n        \"nakao hamu\": \"仲尾ハム\",\n        \"damii\": \"駄みぃ\",\n        \"dan\": \"ダン\",\n        \"danchino\": \"団地の\",\n        \"dandy\": \"だんでぃ\",\n        \"dangan\": \"DANGAN\",\n        \"dango\": \"団子\",\n        \"dango.\": \"だんご。\",\n        \"danna\": \"ダンナ\",\n        \"danshaku\": \"男爵\",\n        \"dantou\": \"暖冬\",\n        \"dantyo neko\": \"だんちょねこ\",\n        \"dara\": \"だら\",\n        \"darabuchi\": \"だらぶち\",\n        \"darius-kun\": \"ダライアスくん\",\n        \"darkilow\": \"DarkⅠlow\",\n        \"darkside-g\": \"DARKSIDE-G\",\n        \"darren\": \"だれん\",\n        \"daru.\": \"だる。\",\n        \"daruton\": \"怠豚\",\n        \"dash\": \"DASH\",\n        \"dashio\": \"だしお\",\n        \"dastar\": \"ダスター\",\n        \"date kazuki\": \"伊達和騎\",\n        \"date naoto\": \"ダテナオト\",\n        \"date natsuku\": \"伊達なつく\",\n        \"dawy\": \"DAWY\",\n        \"dd\": \"DD\",\n        \"ddal\": \"ddal\",\n        \"ddg160\": \"DDG160\",\n        \"de\": \"De\",\n        \"deadnoodles\": \"ゴミョン\",\n        \"dear\": \"dear\",\n        \"dearonnus\": \"Dearonnus\",\n        \"deburasu\": \"でぶらす\",\n        \"decko\": \"でっこ\",\n        \"decosuke\": \"デコスケ\",\n        \"deego\": \"ディーゴ\",\n        \"deep purple 72\": \"深紫'72\",\n        \"deep valley\": \"ディープバレー\",\n        \"dei\": \"dei\",\n        \"deibara\": \"泥原\",\n        \"dekochin hammer\": \"でこちんハンマー\",\n        \"dekoisu\": \"デコいす\",\n        \"dekosen takuji\": \"デコセンタクジ\",\n        \"delf\": \"DELF\",\n        \"delta-tsf\": \"delta-TSF\",\n        \"deme\": \"DEME\",\n        \"demio\": \"デミオ\",\n        \"den\": \"デン\",\n        \"den meka\": \"電メカ\",\n        \"denden\": \"でんでん\",\n        \"denki\": \"電鬼\",\n        \"denki biribiri\": \"電気びりびり\",\n        \"denkousekka gou\": \"電光石火轟\",\n        \"denpanic\": \"デンぱにっく\",\n        \"densetsu no shimi\": \"伝説のシミ\",\n        \"densuke\": \"電SUKE\",\n        \"deo\": \"deo\",\n        \"deshima shin\": \"出縞臣\",\n        \"detritus\": \"デトリタス掘込\",\n        \"deusa\": \"でうさ\",\n        \"devilob\": \"デビロブ\",\n        \"dha\": \"DHA\",\n        \"digdug\": \"DigDug\",\n        \"diisuke\": \"ヂイスケ\",\n        \"din\": \"DIN\",\n        \"dining\": \"ダイニング\",\n        \"diru\": \"ぢる\",\n        \"dit\": \"DIT\",\n        \"jnnkleche\": \"じんにくれーちぇ\",\n        \"dmpn\": \"dmpn\",\n        \"doburocky\": \"ドブロッキィ\",\n        \"doctor rei\": \"ドクトル零\",\n        \"dodai shouji\": \"土代昭治\",\n        \"dodomeiro mayonnaise\": \"どどめ色マヨネーズ\",\n        \"dodomori\": \"ドドもり\",\n        \"dodorian suzuki\": \"ドドリアン鈴木\",\n        \"dofib\": \"dofib\",\n        \"doga\": \"DOGA\",\n        \"doguu\": \"どぐう\",\n        \"dohi kensuke\": \"土肥けんすけ\",\n        \"doki\": \"フリピク\",\n        \"doko tetora\": \"何処テトラ\",\n        \"doku corne\": \"毒コロネ\",\n        \"doll\": \"DOLL\",\n        \"doluta\": \"ドルタ\",\n        \"dom danshaku\": \"ドM男爵\",\n        \"domoshipette\": \"どもしペッテ\",\n        \"don\": \"Don\",\n        \"jt dong-agyoku\": \"ドン・アギョク\",\n        \"donan\": \"どなん\",\n        \"donburako\": \"丼ﾌﾞﾗｺ\",\n        \"donburi\": \"丼\",\n        \"done\": \"どね\",\n        \"donguri\": \"団栗\",\n        \"donkey\": \"DONKEY\",\n        \"donki\": \"どんき\",\n        \"donson\": \"鈍村\",\n        \"dora\": \"どら\",\n        \"dorabmon\": \"DoraBmon\",\n        \"dori rumoi\": \"どり留萌\",\n        \"doro doneru\": \"泥どねる\",\n        \"doromiez\": \"泥水\",\n        \"doru riheko\": \"ドルリヘコ\",\n        \"dos\": \"どす\",\n        \"dosu\": \"どす\",\n        \"dot-r\": \"どっとあーる\",\n        \"dote kabocha\": \"どてかぼちゃ\",\n        \"dotsuco\": \"dotsuco\",\n        \"dou yutaka\": \"堂豊\",\n        \"double deck\": \"だぶるでっく\",\n        \"doudantsutsuji\": \"満天星\",\n        \"doug winger\": \"Deceased.\",\n        \"douman ao\": \"道満青\",\n        \"doumou\": \"ドウモウ\",\n        \"dousai\": \"百斎\",\n        \"dova\": \"DOVA\",\n        \"dowabako\": \"童話箱\",\n        \"dpg\": \"DPg\",\n        \"dr-man\": \"Dr-Man\",\n        \"dr. ten\": \"Dr.天\",\n        \"dr. vu\": \"ヴー博士\",\n        \"dr.momo\": \"毒桃\",\n        \"dr.p\": \"Dr.P\",\n        \"dr.q\": \"Dr.Q\",\n        \"dra\": \"Dra\",\n        \"drain\": \"drain\",\n        \"dre\": \"DRE\",\n        \"drill jill\": \"ドリル汁\",\n        \"drossel\": \"泥っせる\",\n        \"dry\": \"DRY\",\n        \"dt hone\": \"DT骨\",\n        \"dulce-q\": \"ダルシー研Q所\",\n        \"dune\": \"でゅーん\",\n        \"dura\": \"でゅら\",\n        \"dy\": \"Dy\",\n        \"dynamite kantou\": \"ダイナマイト関東\",\n        \"dyne equals gallon\": \"ダイン=ガロン\",\n        \"dyon\": \"ぢょん\",\n        \"e\": \"E\",\n        \"e-noy\": \"E-noy\",\n        \"e.snow\": \"E.Snow\",\n        \"ebgr\": \"エビグラ\",\n        \"ebi blue\": \"海老ブルー\",\n        \"ebidou\": \"えびどー\",\n        \"ebifry akita\": \"えびふらい秋田\",\n        \"ebifurya\": \"えびふりゃ\",\n        \"ebikichi\": \"えび吉\",\n        \"ebiko\": \"えびこ\",\n        \"ebimayo\": \"えびまよ\",\n        \"ebisu\": \"えびす\",\n        \"ebisubashi seizou\": \"戎橋政造\",\n        \"ebisuyu nogi\": \"戎湯のぎ\",\n        \"ebiwantan\": \"えびわんたん\",\n        \"eboshi\": \"え★\",\n        \"ech\": \"エイチ\",\n        \"echigawa ryuuka\": \"越川リューカ\",\n        \"echo jiro\": \"江高次郎\",\n        \"ed\": \"ED\",\n        \"edih\": \"Edih\",\n        \"edo\": \"い～どぅ～\",\n        \"edo shigezu\": \"江戸しげズ\",\n        \"edoya pochi\": \"江戸屋ぽち\",\n        \"efink\": \"EFINK\",\n        \"egami\": \"エガミ\",\n        \"eguchi\": \"江口\",\n        \"eguchi chibi\": \"江口ちび\",\n        \"ehime mikan\": \"江姫蜜柑\",\n        \"eho\": \"会帆\",\n        \"eigetu\": \"eigetu\",\n        \"eight\": \"エイト\",\n        \"eikichi\": \"エーキチ\",\n        \"eiko\": \"エイコ\",\n        \"eikokukan momoha\": \"英国館桃葉\",\n        \"eimu yuu\": \"影夢優\",\n        \"eiri\": \"嬰里\",\n        \"eitaisa\": \"ぇぃたいさ\",\n        \"eitarou\": \"えーたろー\",\n        \"eixen\": \"EIXIN\",\n        \"eixin\": \"Eixen\",\n        \"ekimae\": \"駅前\",\n        \"eko\": \"絵虎\",\n        \"ekz\": \"EKZ\",\n        \"electric sheep\": \"Electric Sheep\",\n        \"elf\": \"ELF\",\n        \"elf.k\": \"elf.k\",\n        \"elia\": \"Elia\",\n        \"elijah\": \"エリヤ\",\n        \"elimiko\": \"えりみこ\",\n        \"elis 120 percent\": \"エリス120%\",\n        \"eltole\": \"eltole\",\n        \"em\": \"em\",\n        \"ema20\": \"ema20\",\n        \"eman\": \"eman\",\n        \"emanon123\": \"emanon123\",\n        \"emi\": \"えみ\",\n        \"emilio\": \"えみりお\",\n        \"emina\": \"emina\",\n        \"emino\": \"えみの\",\n        \"emit\": \"えみっと\",\n        \"emori misaki\": \"江森美沙樹\",\n        \"emote\": \"えもて\",\n        \"emu\": \"ゑむ\",\n        \"emua\": \"えむあ\",\n        \"emya\": \"emya\",\n        \"en\": \"袁\",\n        \"enamizawa\": \"江波沢\",\n        \"end\": \"えんど\",\n        \"endles\": \"炎℃れす\",\n        \"endou\": \"えんどう\",\n        \"endou marin\": \"遠藤真理ん\",\n        \"endou tatsumi\": \"遠藤辰己\",\n        \"engo\": \"えんご\",\n        \"enigma\": \"えにぐま\",\n        \"enikuma\": \"えにくま\",\n        \"enishi nasa\": \"縁なさ\",\n        \"enji\": \"エンジ\",\n        \"enma koorogi\": \"エンマコオロギ\",\n        \"enno syouta\": \"縁乃生多\",\n        \"eno\": \"eno\",\n        \"enokifu\": \"えのきふ\",\n        \"enokitake yuniku\": \"榎茸ゆにく\",\n        \"enoma shinji\": \"江之間真次\",\n        \"enomoto heights\": \"榎本ハイツ\",\n        \"enomoto hidehira\": \"榎本ひでひら\",\n        \"enomoto hina\": \"榎本ひな\",\n        \"enoshima iki\": \"江ノ島行き\",\n        \"enotou\": \"えのとう\",\n        \"enoughmin\": \"イナフミン\",\n        \"enu\": \"エヌ\",\n        \"enu-yamayama\": \"えぬーやまやま\",\n        \"epuko\": \"えぷ子\",\n        \"era\": \"Era\",\n        \"ere 2 earo\": \"えれ2エアロ\",\n        \"erika\": \"えりか\",\n        \"ero kojiki\": \"エロ乞食\",\n        \"ero koutei\": \"エロ皇帝\",\n        \"ero murasaki\": \"エロムラサキ\",\n        \"erobaldo\": \"エロバルド\",\n        \"erutasuku\": \"えるたすく\",\n        \"escape\": \"えすけーぷ!\",\n        \"esora koto\": \"絵空コト\",\n        \"esukichizuru\": \"S木チズリ\",\n        \"esuo\": \"えすお\",\n        \"esupu\": \"えすぷ\",\n        \"esureki\": \"えすれき\",\n        \"et alors\": \"Et alors\",\n        \"ether\": \"ether\",\n        \"eto\": \"えと\",\n        \"etosei\": \"干支政\",\n        \"eud\": \"euD\",\n        \"eugene batten\": \"ユージン・バートン\",\n        \"eunos\": \"ゆ～のす\",\n        \"euphonia\": \"Euphonia\",\n        \"eve\": \"eve\",\n        \"exabyte\": \"Exabyte\",\n        \"excel\": \"EXCEL\",\n        \"exeter\": \"エクゼター\",\n        \"exp\": \"EXP\",\n        \"ezo renge\": \"えぞれんげ\",\n        \"f\": \"f\",\n        \"faith\": \"faith\",\n        \"fan\": \"FAN\",\n        \"fana\": \"ふぁな\",\n        \"faust\": \"FAUST\",\n        \"fct\": \"FCT\",\n        \"fe\": \"Fe\",\n        \"feccso\": \"ふぇっくそ\",\n        \"fechi\": \"ふぇっちー\",\n        \"feiren\": \"feiren\",\n        \"femto\": \"ふぇむと\",\n        \"fence 14\": \"フェンス14\",\n        \"ferdinand\": \"フェルディナン\",\n        \"feriko\": \"フェリコ\",\n        \"fes\": \"ふぇす\",\n        \"fey tas\": \"Fey Tas\",\n        \"fi-san\": \"Fi-san\",\n        \"figaro\": \"ふぃがろ\",\n        \"fight fight chiharu\": \"ファイトファイトチハル\",\n        \"fin no uta\": \"フィンの詩\",\n        \"final\": \"Final\",\n        \"fireyuki\": \"フィレユキ\",\n        \"fk696\": \"fk696\",\n        \"flanvia\": \"Flanvia\",\n        \"flat\": \"FLAT\",\n        \"flipper\": \"FLIPPER\",\n        \"flowerchild\": \"FLOWERCHILD\",\n        \"flugel\": \"Flugel\",\n        \"flyking\": \"Flyking\",\n        \"follet\": \"Follet\",\n        \"fondue\": \"フォンデュ\",\n        \"fontin\": \"ふぉんてぃん\",\n        \"foolest\": \"ふぅすりと\",\n        \"foosnow\": \"ふーすのー\",\n        \"fortythree\": \"fortythree\",\n        \"loic foster\": \"Loic Foster\",\n        \"franken n\": \"Franken N\",\n        \"frapowa\": \"ふらぽわ\",\n        \"fred kelly\": \"フレッドケリー\",\n        \"free style\": \"Free style\",\n        \"friday\": \"フライデイ\",\n        \"fried.\": \"ふらいど。\",\n        \"frunbell\": \"ふらんべる\",\n        \"fu\": \"ふぅ\",\n        \"fu-ta\": \"Fu-ta\",\n        \"fuchi\": \"fuchi\",\n        \"fudematsuri kyousuke\": \"筆祭競介\",\n        \"fudou shin\": \"不動心\",\n        \"fue\": \"Fue\",\n        \"fugetsu taku\": \"浮月たく\",\n        \"fugo\": \"FUGO\",\n        \"fuhatsu\": \"ふはつ\",\n        \"fuji fujino\": \"富士フジノ\",\n        \"fuji sangou\": \"富士参號\",\n        \"fuji yoshida\": \"藤吉田\",\n        \"fujibayashi haru\": \"フジバヤシ春\",\n        \"fujihara gacho\": \"藤原がちょ\",\n        \"fujii aya\": \"藤井あや\",\n        \"fujii chifumi\": \"藤井ちふみ\",\n        \"fujii mochi\": \"藤井もち\",\n        \"fujii rino\": \"藤井理乃\",\n        \"fujikawa daichi\": \"藤川大智\",\n        \"fujikawa riko\": \"藤川梨子\",\n        \"fujikawa satoshi\": \"不二河聡\",\n        \"fujiko\": \"ふじこ\",\n        \"fujiku yuima\": \"藤久ゆいま\",\n        \"fujikura ryune\": \"藤倉琉音\",\n        \"fujimaru arikui\": \"ふぢまるありくい\",\n        \"fujimi\": \"藤味\",\n        \"fujimi gaku\": \"富士見ガク\",\n        \"fujimiya akane\": \"藤宮茜\",\n        \"fujimiya midori\": \"藤宮緑\",\n        \"fujimiya siryu\": \"フジミヤ子龍\",\n        \"fujimiya yahiro\": \"藤宮やひろ\",\n        \"fujimon\": \"ふじもん\",\n        \"fujimori saya\": \"ふじもり沙耶\",\n        \"fujimoto gou\": \"藤本郷\",\n        \"fujimoto hideaki\": \"藤本秀明\",\n        \"fujimoto sei\": \"ふじもとせい\",\n        \"fujimura erika\": \"藤村えりか\",\n        \"fujinami arisa\": \"藤浪有沙\",\n        \"fujinari ayako\": \"藤成アヤコ\",\n        \"fujinari takumi\": \"藤也卓巳\",\n        \"fujino yoshika\": \"ふじの芳夏\",\n        \"fujinomiya yuu\": \"藤ノ宮悠\",\n        \"fujioka toki\": \"藤岡とき\",\n        \"fujirin\": \"ふじりん\",\n        \"fujisaki kou\": \"藤崎こう\",\n        \"fujisaki makoto\": \"藤咲真\",\n        \"fujisaki rei\": \"ふじさき怜\",\n        \"fujisawa tatsurou\": \"ふじさわたつろー\",\n        \"fujishima\": \"フジシマ\",\n        \"fujishiro seiki\": \"藤城成騎\",\n        \"fujita hidetoshi\": \"藤田秀俊\",\n        \"fujiwara\": \"藤原\",\n        \"fujiwara hisashi\": \"藤原ひさし\",\n        \"fujiwara warawara\": \"藤原々々\",\n        \"fujiwara yumi\": \"藤原結実\",\n        \"fujiya\": \"ふじや\",\n        \"fujiya apota\": \"不二家あぽ太\",\n        \"fujiyama\": \"富士やま\",\n        \"fujiyama takashi\": \"フジヤマタカシ\",\n        \"fuka\": \"FUKA\",\n        \"fukada takushi\": \"深田拓士\",\n        \"fukai maro\": \"ふかぃまろ\",\n        \"fukai miyabi\": \"深井雅\",\n        \"fukami naoyuki\": \"深水直行\",\n        \"fukami otoha\": \"フカミオトハ\",\n        \"fukami ryou\": \"深海リョウ\",\n        \"fukao toriko\": \"深生とり子\",\n        \"fukase ayaka\": \"深瀬アヤカ\",\n        \"fukashiba\": \"深シバ\",\n        \"fukazume\": \"ふかづめ\",\n        \"fukiko\": \"フキコ\",\n        \"fukin\": \"布巾\",\n        \"fukudahda\": \"フクダーダ\",\n        \"fukui sora\": \"福井空\",\n        \"fukumimi\": \"ふくみみ\",\n        \"fukunaga yukito\": \"福永ゆきと\",\n        \"fukunotsukuribe\": \"ふくのつくりべ\",\n        \"fukuoka kisara\": \"福岡きさら\",\n        \"fukurokouji\": \"袋小路\",\n        \"fukurou\": \"フクロウ\",\n        \"fukutarou\": \"ふくたろう\",\n        \"fukutoku saori\": \"福徳紗織\",\n        \"fukuzawa yukine\": \"福沢ゆきね\",\n        \"fume\": \"fume\",\n        \"fumi\": \"ふみ\",\n        \"fumi haru\": \"ふみはる\",\n        \"fumicha\": \"史茶\",\n        \"fumihiro\": \"ふみひろ\",\n        \"fumikage\": \"文影\",\n        \"fumikiri\": \"ふみきり\",\n        \"fumio\": \"ふみお\",\n        \"fumitani yasunori\": \"フミタニヤスノリ\",\n        \"fumiya\": \"文哉\",\n        \"fumizuki misoka\": \"文月みそか\",\n        \"fumotono mikoto\": \"梺乃みこと\",\n        \"funabori nariaki\": \"船堀斉晃\",\n        \"funakura\": \"ふなくら\",\n        \"funamushi\": \"船虫\",\n        \"funan\": \"ふなん\",\n        \"funato hitoshi\": \"船戸ひとし\",\n        \"funatsu kazuki\": \"ふなつかずき\",\n        \"funaya sakichi\": \"船弥さ吉\",\n        \"fundoshi\": \"褌\",\n        \"funeral\": \"Funeral\",\n        \"funiai riko\": \"不似合りこ\",\n        \"funky function\": \"ファンキーファンクション\",\n        \"fupe\": \"ふぺ\",\n        \"furafura\": \"ふらふら\",\n        \"furanshisu\": \"フランシス\",\n        \"furari\": \"フラリ\",\n        \"furiri\": \"ふりり\",\n        \"furo\": \"ふろ\",\n        \"furuta a.\": \"ふる太・A\",\n        \"fusa\": \"房\",\n        \"fushimori tonkatsu\": \"不死森トンカツ\",\n        \"fusisya o\": \"不死者O\",\n        \"futaba\": \"ふたば\",\n        \"futaba miwa\": \"ふたば実和\",\n        \"futaba841\": \"双葉841\",\n        \"futago\": \"双子\",\n        \"futamaro\": \"ふうたまろ\",\n        \"futami kazuha\": \"ふたみかずは\",\n        \"futami shihen\": \"双視使翩\",\n        \"futamura futon\": \"ふたむらふとん\",\n        \"futase hijiri\": \"双瀬聖\",\n        \"futase hikaru\": \"二瀬ひかる\",\n        \"futatsuki hisame\": \"双月氷雨\",\n        \"futatsuki kazuo\": \"2月かずお\",\n        \"futee\": \"ふてー\",\n        \"futomaki tamamo.\": \"太巻多摩も。\",\n        \"futoo\": \"フトー\",\n        \"futou ryouko\": \"不透りょうこ\",\n        \"fuuga utsura\": \"風雅うつら\",\n        \"fuurai\": \"風籟\",\n        \"fuurin\": \"ふぅりん\",\n        \"fuyo\": \"ふよ\",\n        \"fuyube rion\": \"冬部李穏\",\n        \"fuyukaze tsubasa\": \"冬風つばさ\",\n        \"fuyuki masato\": \"冬木真人\",\n        \"fuyunagi reku\": \"冬凪れく\",\n        \"fuyuno hitsuji\": \"冬野ひつじ\",\n        \"fuyuno yuno\": \"冬野由乃\",\n        \"fuyutarou\": \"ふゆたろう\",\n        \"fuyuwa kotatsu\": \"冬和こたつ\",\n        \"fuzai yumoto\": \"不在ゆもと\",\n        \"g zero\": \"Gゼロ\",\n        \"g-co\": \"G-co\",\n        \"g.g. kakeru\": \"G.G.翔\",\n        \"ga015\": \"ga015\",\n        \"gabagobogebe\": \"ガバゴボゲベ\",\n        \"gaburi\": \"ガブリ\",\n        \"gachonjirou\": \"がちょん次郎\",\n        \"gaden\": \"GADEN\",\n        \"gagarin kichi\": \"ガガーリン吉\",\n        \"gaiseisya\": \"凱聖者\",\n        \"gajirabute\": \"ガジラビュート\",\n        \"gakimagari\": \"ガキマガリ\",\n        \"gakugaku\": \"楽々\",\n        \"gamako\": \"ガマ子\",\n        \"gamma\": \"gamma\",\n        \"gamma chaos\": \"ガンマカオス\",\n        \"gamu\": \"がむ\",\n        \"gangi mari\": \"雁木麻理\",\n        \"ganmarei\": \"眼魔礼\",\n        \"gao\": \"gao\",\n        \"gara ayuri\": \"柄あゆり\",\n        \"garakuta sochi\": \"瓦落多装置\",\n        \"garou damenade\": \"画廊ダメナデ\",\n        \"garyou\": \"臥龍\",\n        \"gatari\": \"Gatari\",\n        \"gatling a\": \"ガトリングA\",\n        \"gattai soutou\": \"合体総統\",\n        \"gazeru\": \"GAZERU\",\n        \"gazetta masuda\": \"ガゼッタ増田\",\n        \"gb\": \"GB\",\n        \"ge-b\": \"ゲB\",\n        \"geboku\": \"下僕\",\n        \"gedo\": \"外道\",\n        \"gekato\": \"ゲカト\",\n        \"gekoge satoru\": \"ゲコゲさとる\",\n        \"gemuo\": \"げむお\",\n        \"gemurax\": \"じぇーむら\",\n        \"gemuta\": \"げむた\",\n        \"gen\": \"GEN | 源 | 舷\",\n        \"gengetsu\": \"玄月\",\n        \"genjirou\": \"言示弄\",\n        \"genjuroh\": \"元十郎\",\n        \"genka ichien\": \"原価壱円\",\n        \"genki tarou\": \"元気太郎\",\n        \"genkung\": \"Genkung\",\n        \"gennosuke\": \"源之助\",\n        \"genshi\": \"GENSHI\",\n        \"george\": \"ジョージ\",\n        \"geppei\": \"月餅\",\n        \"gero\": \"げろ\",\n        \"shimaki ika\": \"風巻いか\",\n        \"gesho ichirou\": \"げしょ一郎\",\n        \"geshop\": \"げしょぷ\",\n        \"gggg\": \"GGGG\",\n        \"ggrn\": \"GGRN\",\n        \"gia\": \"ギア\",\n        \"gida\": \"ぎだ\",\n        \"gigokku\": \"疑獄\",\n        \"gimako\": \"ぎまこ\",\n        \"gin\": \"ぎん\",\n        \"gin jyuji\": \"銀十字\",\n        \"gincha\": \"銀茶\",\n        \"ginga azuma\": \"銀河アズマ\",\n        \"gingitsune\": \"宇宙戦艦ヤマト\",\n        \"ginichi\": \"銀一\",\n        \"ginkamen\": \"銀仮面\",\n        \"ginko\": \"ginko\",\n        \"ginmugi\": \"銀麦\",\n        \"ginnosuke\": \"銀ノ助\",\n        \"gino\": \"Gino\",\n        \"ginseiou\": \"銀星王\",\n        \"ginta\": \"ぎん太\",\n        \"ginto\": \"吟人\",\n        \"ginzake\": \"ギンザケ\",\n        \"giro chinko-chan\": \"ギロ・チン子ちゃん\",\n        \"gisyo\": \"gisyo\",\n        \"giu\": \"ぎう\",\n        \"glastonbury1966\": \"グラストンベリー1966\",\n        \"glycerol takeru\": \"グリセリンたける\",\n        \"glyserin\": \"グリセ麟\",\n        \"gmkj\": \"GMKJ\",\n        \"go-1\": \"Go-1\",\n        \"goban\": \"ごばん\",\n        \"goblin\": \"ゴブリン\",\n        \"goblinboy\": \"kronn\",\n        \"gochou\": \"伍长\",\n        \"gody\": \"Gody\",\n        \"goggles\": \"goggles\",\n        \"gohan no otomo\": \"ごはんのおとも\",\n        \"goji\": \"ゴジ\",\n        \"gojou kurota\": \"五條くろた\",\n        \"gojou shino\": \"ごじょう忍\",\n        \"gokuraku jouko\": \"極楽浄子\",\n        \"gokurou\": \"ごくろう\",\n        \"golden\": \"ゴールデン\",\n        \"golgi bon\": \"ゴルジイ本\",\n        \"goma\": \"ごま\",\n        \"goma satoshi\": \"ごまさとし\",\n        \"gomabura\": \"ごまぶら\",\n        \"gomashi\": \"ごまし\",\n        \"gomatamago\": \"ゴマタマゴ\",\n        \"gomoku tsukune\": \"ごもくつくね\",\n        \"gomtang\": \"GomTang\",\n        \"gomu\": \"ゴム\",\n        \"gon\": \"ごん\",\n        \"gon heihachi\": \"ゴン平八\",\n        \"gonbuto\": \"ごんぶと\",\n        \"gonta\": \"ゴンタ\",\n        \"gonza\": \"gonza\",\n        \"gonzaburo-\": \"ゴンざぶろー\",\n        \"gorgon\": \"ゴルゴン\",\n        \"golgonzola\": \"ごるごんぞーら\",\n        \"goriyaku\": \"ごりやく\",\n        \"goro\": \"ごろ\",\n        \"gorogoro\": \"ゴロごろ\",\n        \"gorohati\": \"ごろはち\",\n        \"goro ichi\": \"五六壱\",\n        \"goroumaru\": \"五郎丸\",\n        \"gotakichi\": \"誤汰吉\",\n        \"goto-p\": \"ごとP\",\n        \"gotou\": \"ゴトウ\",\n        \"gotou sakaaki\": \"ごとうさかあき\",\n        \"gouda hakase\": \"ｺﾞｳﾀﾞﾊｶｾ\",\n        \"gouda nagi\": \"剛田ナギ\",\n        \"gouguru\": \"ゴーグル\",\n        \"goyac\": \"ごやっち\",\n        \"gozaemon\": \"御座衛門\",\n        \"gozaru\": \"ござる\",\n        \"gozen\": \"午前\",\n        \"gozen reiji\": \"御前零士\",\n        \"gozz\": \"gozz\",\n        \"gram\": \"グラム\",\n        \"great daikon\": \"グレイト大根\",\n        \"great magami\": \"グレート魔神\",\n        \"grey fisher\": \"グレイ・フィッシャー\",\n        \"grifon\": \"GRIFON\",\n        \"grimmelkin\": \"グリムメルキン\",\n        \"ground\": \"GROUND\",\n        \"grune\": \"Grune\",\n        \"gt\": \"GT\",\n        \"guchi wota\": \"愚痴ヲタ\",\n        \"gum\": \"ガム\",\n        \"gumbat\": \"Gumbat\",\n        \"gumi\": \"ぐみ\",\n        \"gun ryuusei\": \"群りゅうせい\",\n        \"gunnousa\": \"ぐんのうさ\",\n        \"gura\": \"ぐら\",\n        \"gure\": \"ぐれ\",\n        \"gurekan\": \"ぐれ缶\",\n        \"guri\": \"ぐり\",\n        \"guriko\": \"Guriko\",\n        \"guriko-san\": \"ぐりこ・さん\",\n        \"gushigushi maru\": \"ぐしぐし丸\",\n        \"gussan\": \"ぐっさん\",\n        \"gust-san\": \"ガストさん\",\n        \"guy\": \"GUY\",\n        \"gyakushuu takeshi\": \"逆襲武士\",\n        \"gyarin\": \"ぎゃりん\",\n        \"gyoko\": \"漁港\",\n        \"gyokro\": \"ぎょくろ\",\n        \"gyonikun\": \"魚肉ん\",\n        \"gyony\": \"Gyony\",\n        \"akatsuki kanten\": \"暁寒天\",\n        \"gyro amarume\": \"ジャイロ余目\",\n        \"gyunyu\": \"牛乳\",\n        \"gyuunyuuzaemon\": \"牛乳左卫门\",\n        \"gyuutei\": \"牛帝\",\n        \"h-h\": \"H・H\",\n        \"h9\": \"H9\",\n        \"ha-ru\": \"ha-ru\",\n        \"haba hirokazu\": \"幅ヒロカズ\",\n        \"habatakuhituji\": \"羽ばたく羊\",\n        \"habezamurai\": \"侍侍\",\n        \"habutae kyusetsu\": \"羽双重 毬雪\",\n        \"hacchake tarou\": \"はっちゃけ太郎\",\n        \"hachi\": \"はち\",\n        \"hachi duchi\": \"hachi_duchi\",\n        \"hachiko\": \"ハチコ\",\n        \"hachimitsu\": \"はちみつ\",\n        \"hachimitsu cute\": \"ハチミツキュート\",\n        \"hachiro\": \"ハチロ\",\n        \"hachiya mitsu\": \"蜂屋みつ\",\n        \"hacho\": \"はちょ\",\n        \"had\": \"ハディ\",\n        \"hadacra\": \"羽田暮\",\n        \"hafu\": \"HaFu\",\n        \"hagane soushi\": \"羽鐘そうし\",\n        \"hagane tetsu\": \"鋼鉄\",\n        \"haganemaru kennosuke\": \"鋼丸剣ノ介\",\n        \"hage\": \"はげ\",\n        \"hagetaka\": \"ハゲたか\",\n        \"hagure kedama\": \"はぐれけだま\",\n        \"hagure metal\": \"はぐれメタル\",\n        \"haiboku\": \"敗北\",\n        \"haida nanako\": \"灰田 ナナコ\",\n        \"haiiroguma\": \"はいいろぐま\",\n        \"haineken\": \"はいねけん\",\n        \"hairaito\": \"灰雷兎\",\n        \"haison\": \"haison\",\n        \"haito mitori\": \"灰都みとり\",\n        \"haitukun\": \"Haitukun\",\n        \"haizaki mejiro\": \"灰崎めじろ\",\n        \"haji\": \"ﾊｼﾞ\",\n        \"hajime\": \"創\",\n        \"hajime-san.\": \"はじめさん。\",\n        \"hajin\": \"Hajin\",\n        \"hakaba yodomu\": \"墓場淀夢\",\n        \"hakai taitei\": \"破坏大帝\",\n        \"hakano shinshi\": \"ハカノシンシ\",\n        \"hakiata\": \"はきあた\",\n        \"hakika\": \"はきか\",\n        \"hakkaku shikimi\": \"八角シキミ\",\n        \"hakoiri nekohime\": \"箱入猫姫\",\n        \"hakojima akane\": \"ハコジマアカネ\",\n        \"haku\": \"白\",\n        \"hakua ugetsu\": \"白亜右月\",\n        \"hakubun.\": \"はくぶん.\",\n        \"hakugi\": \"白義\",\n        \"hakui ami\": \"羽咋あみ\",\n        \"hakuma\": \"HAKUMA\",\n        \"hakumai gen\": \"白米玄\",\n        \"hakusui riko\": \"白水リコ\",\n        \"hakuto\": \"ハクト\",\n        \"hakutou\": \"白桃\",\n        \"hakuun\": \"はく雲\",\n        \"hakuzen\": \"白髯\",\n        \"halcachanel\": \"ハルカチャンネル\",\n        \"halco\": \"ハルコ\",\n        \"halcon\": \"はるこん\",\n        \"halfpricecelebr\": \"半額セレブ\",\n        \"hallelujah\": \"晴屋\",\n        \"halo\": \"HALO\",\n        \"halogen\": \"halogen\",\n        \"ham\": \"HAM\",\n        \"ham sausage\": \"公双誠二\",\n        \"hama\": \"はま\",\n        \"hama machisu\": \"濱まちす\",\n        \"hamada mari\": \"濱田麻里\",\n        \"hamahara yoshio\": \"浜原義雄\",\n        \"hamalu\": \"hamalu\",\n        \"hamanasu\": \"はまなす\",\n        \"hamano makoto\": \"ハマノマコト\",\n        \"hamaoka ponta\": \"浜岡ポン太\",\n        \"hamashima shigeo\": \"はましま薫夫\",\n        \"hamigaki shinji\": \"はみがきしんぢ\",\n        \"hamihe\": \"はみへ\",\n        \"hamiltan\": \"ハミルタン\",\n        \"hamuhamu\": \"ハムハム\",\n        \"hamunohito\": \"ハムの人\",\n        \"hamuta\": \"公タ\",\n        \"han\": \"HAN\",\n        \"hana\": \"花\",\n        \"hanabi21\": \"花火21\",\n        \"hanada hyou\": \"はなだひょう\",\n        \"hanada ranmaru\": \"花田蘭丸\",\n        \"hanamizawa q-tarou\": \"花見沢Q太郎\",\n        \"hanamoto ari\": \"花本アリ\",\n        \"hanamura shikika\": \"華村色花\",\n        \"hanamura shuuzou\": \"花村しゅーぞー\",\n        \"hanao\": \"はなぉ。\",\n        \"hanapin\": \"はなぴん\",\n        \"hanasaki\": \"華咲\",\n        \"hanasaku mahiru\": \"花咲まひる\",\n        \"hanataka retomo\": \"はなたかれとも\",\n        \"hanauna\": \"はなうな\",\n        \"hanazawa suou\": \"花澤すおう\",\n        \"hanchou\": \"班長\",\n        \"handa\": \"handa\",\n        \"handsofmidaz\": \"handsofmidaz\",\n        \"hane\": \"HANE\",\n        \"haneda ikao\": \"羽田いかお\",\n        \"hanee\": \"HANEE\",\n        \"hanekumo\": \"羽雲\",\n        \"hanemikakko\": \"ハネミカッコ\",\n        \"hanetsuki tokei\": \"羽月とけい\",\n        \"hanibi\": \"hanibi\",\n        \"hanikura un\": \"羽仁倉雲\",\n        \"hanini\": \"はにーに\",\n        \"haniwa pao\": \"埴輪ぱお\",\n        \"hankkwo\": \"H@nk²wo\",\n        \"hankotsu max\": \"反骨MAX\",\n        \"hanma akira\": \"範馬アキラ\",\n        \"hans\": \"hans\",\n        \"hansharu\": \"半しゃる\",\n        \"hanya\": \"Hanya\",\n        \"hanyw\": \"ハニュー\",\n        \"hanzaki jirou\": \"はんざきじろう\",\n        \"hanzawa 821\": \"半澤821\",\n        \"happamushi\": \"はっぱむし\",\n        \"hara sakeru\": \"はらさける\",\n        \"hara shigeyuki\": \"原茂之\",\n        \"hara-peco\": \"腹ペ娘\",\n        \"harada\": \"はらだ\",\n        \"haraita\": \"はらいた\",\n        \"harano\": \"原野\",\n        \"harasaki\": \"原崎\",\n        \"hardcrom\": \"hardcrom\",\n        \"harenochiame\": \"ハレノチアメ\",\n        \"hareya umako\": \"晴屋うまこ\",\n        \"hari\": \"hari\",\n        \"hariken hanna\": \"はりけんはんな\",\n        \"harimoji\": \"はりもじ\",\n        \"harino646\": \"harino646\",\n        \"haritama hiroki\": \"針玉ヒロキ\",\n        \"hariyu\": \"はりゆ\",\n        \"harry\": \"ハリー\",\n        \"haru\": \"春\",\n        \"haru z\": \"はるZ\",\n        \"haru.\": \"はる。\",\n        \"haruchika\": \"ハルチカ\",\n        \"haruemon\": \"ハルゑもん\",\n        \"harufumi\": \"ハルフミ\",\n        \"haruharu haruto\": \"春々春兎\",\n        \"haruhina murasaki\": \"春雛紫\",\n        \"haruichigo\": \"はるいちご\",\n        \"haruka\": \"はるか\",\n        \"harukami rio\": \"春上里央\",\n        \"harukaze do-jin\": \"春風道人\",\n        \"harukaze koucha\": \"春風紅茶\",\n        \"harukaze unipo\": \"春風うにぽ\",\n        \"haruken\": \"ハル犬\",\n        \"haruki\": \"春辉\",\n        \"haruma tokihiko\": \"ハルマ刻彦\",\n        \"harumari\": \"はるまり\",\n        \"kasane haruo\": \"かさね春緒\",\n        \"harumi jun\": \"春海潤\",\n        \"harumi zyun\": \"春海淳\",\n        \"haruna mao\": \"榛名まお\",\n        \"harunaga makito\": \"晴永牧兎\",\n        \"haruno yomogi\": \"春野蓬\",\n        \"harunori\": \"はるのり\",\n        \"harura\": \"はるら\",\n        \"harurun\": \"はるるん\",\n        \"haruruyuco\": \"はるるゆこ\",\n        \"harusame\": \"春雨\",\n        \"harusame kiruke\": \"榛雨きるけ\",\n        \"harusawa\": \"ハルサワ\",\n        \"harusuke\": \"春助\",\n        \"haruyoshi\": \"はるよし\",\n        \"haruyuki\": \"はるゆき\",\n        \"haryu\": \"ハリュー\",\n        \"hase yuu\": \"はせ☆裕\",\n        \"hasebe kazunari\": \"长谷部一成\",\n        \"hasebe mitsuhiro\": \"长谷部臣丈\",\n        \"hasebe souutsu\": \"はせべso鬱\",\n        \"hasegawa daisuke\": \"ハセガワダイスケ\",\n        \"hasegawa keita\": \"はせがわけいた\",\n        \"hasegawa yukino\": \"長谷川ユキノ\",\n        \"hasei agana\": \"ハセイアガナ\",\n        \"hasekura\": \"支倉\",\n        \"hasekura chiaki\": \"支倉ちあき\",\n        \"hasekura noise\": \"支倉ノイズ\",\n        \"hash\": \"hash\",\n        \"hashi cube\": \"土師キューブ\",\n        \"hashiba yachi\": \"端葉やち\",\n        \"hashikure\": \"はしくれ\",\n        \"hashimo yuki\": \"羽霜ゆき\",\n        \"hashimoto\": \"橋本\",\n        \"hashinoha\": \"はしのは\",\n        \"hasuke\": \"葉助\",\n        \"hasumi elan\": \"蓮見江蘭\",\n        \"hasumi hana\": \"羽純ハナ\",\n        \"hasumi hiro\": \"ハスミヒロ\",\n        \"hasumi tsuina\": \"蓮見ついな\",\n        \"hasuno\": \"ハスノ\",\n        \"hasunoue baitsu\": \"はすの上梅津\",\n        \"hata\": \"ハタ\",\n        \"hata jinshichi\": \"湊甚七\",\n        \"hatachi\": \"はたち\",\n        \"ekataraf\": \"エカタラフ\",\n        \"hatara\": \"HATARA\",\n        \"hatimoto\": \"鉢本\",\n        \"hato\": \"hato\",\n        \"hato no suisou\": \"ハトの水槽\",\n        \"hatoba\": \"はとば\",\n        \"hatoko\": \"ハトこ\",\n        \"hatomugi\": \"鳩むぎ\",\n        \"hatoya kobayashi\": \"ハトヤ小林\",\n        \"hatoya mameshichi\": \"鳩矢豆七\",\n        \"hatsuki kyou\": \"葉月京\",\n        \"hatsushio\": \"ハツ塩\",\n        \"kuzunoha hiroshi\": \"葛葉洋志\",\n        \"hattori\": \"ハットリ\",\n        \"hattori gorou\": \"はっとりゴロー\",\n        \"hattori masaki\": \"はっとりまさき\",\n        \"hattori mitsuka\": \"服部ミツカ\",\n        \"hatty\": \"はてぃ\",\n        \"haura shouhei\": \"葉浦昌平\",\n        \"hawkear\": \"ハウケア\",\n        \"hayabusa shingo\": \"はやぶさ真吾\",\n        \"hayahide\": \"ハヤヒデ\",\n        \"hayakawa halui\": \"早川ハルイ\",\n        \"hayakawa torinone\": \"はやかわトリノネ\",\n        \"hayama yuu\": \"羽山悠\",\n        \"hayami aya\": \"はやみあや\",\n        \"hayami kuro\": \"速水くろ\",\n        \"hayami osamu\": \"速水オサム\",\n        \"hayami rokusichi\": \"速水ろくしち\",\n        \"hayami sakura\": \"速水桜\",\n        \"hayasaka mebawe\": \"はやさかめばゑ\",\n        \"hayashi\": \"はやし\",\n        \"hayashi custom\": \"はやしけ\",\n        \"hayashi mario\": \"林マリオ\",\n        \"hayashi tsukasa\": \"はやしつかさ\",\n        \"hayuta\": \"はゆた\",\n        \"hazaka mau\": \"羽坂まう\",\n        \"hazaki\": \"ハザキ\",\n        \"hazio\": \"ハジオ\",\n        \"hazuki\": \"はづき\",\n        \"hazuki kyou\": \"葉月梗\",\n        \"hazuki shishimaru\": \"葉月獅子丸\",\n        \"hazuki yuu\": \"葉月祐\",\n        \"hazumi yae\": \"羽純やえ\",\n        \"hcwr\": \"HCWR\",\n        \"heat one\": \"ヒートワン\",\n        \"hebereke black\": \"へべれけBLACK\",\n        \"hechi\": \"へち\",\n        \"hechimabushi\": \"ヘチマ節\",\n        \"hechiumu\": \"ヘチウム\",\n        \"heguri\": \"へぐり\",\n        \"heibon kaeru\": \"平凡蛙\",\n        \"heigani\": \"兵蟹\",\n        \"heika\": \"HEIKA\",\n        \"heiya\": \"へぃや\",\n        \"heizo\": \"HEIZO\",\n        \"hekyu\": \"碧宇\",\n        \"hemachi\": \"hemachi\",\n        \"hemoglobina1c\": \"へもぐろびんA1C\",\n        \"henichi\": \"ヘンイチ\",\n        \"henshako\": \"ヘンシャコ\",\n        \"heppoko taro\": \"へっぽこ太郎\",\n        \"herahera\": \"へらへら\",\n        \"hermmy\": \"Hermmy\",\n        \"hertro\": \"Hertro\",\n        \"herunia ninja\": \"ヘルニア忍者\",\n        \"heshi\": \"HESHI\",\n        \"hews\": \"Hews\",\n        \"hhh\": \"HHH\",\n        \"hi-mosu\": \"ひ～もす\",\n        \"hiatari shin\": \"日辺しん\",\n        \"hibakichi\": \"ひばきち\",\n        \"hibiiro\": \"日々色\",\n        \"hibiki jun\": \"ひびき純\",\n        \"hibiki seiya\": \"響星哉\",\n        \"hibiki wataru\": \"響ワタル\",\n        \"hibino tomoki\": \"日比野友輝\",\n        \"hida\": \"火田\",\n        \"hida mari\": \"妃田マリ\",\n        \"hida tatsuo\": \"飛田竜夫\",\n        \"hidaka ryou\": \"ヒダカリョウ\",\n        \"hidari pory5n\": \"左ポリ5ン\",\n        \"hidarikiki\": \"左利き\",\n        \"hide\": \"___hide___\",\n        \"hidori\": \"日鳥\",\n        \"higashiyama sion\": \"東山しをん\",\n        \"higashizukihi sei\": \"東月陽西\",\n        \"hige\": \"ひげ\",\n        \"hige ojisan\": \"ヒゲおじさん\",\n        \"higemorigen\": \"ヒゲモリゲン\",\n        \"higetora\": \"髭寅\",\n        \"higuchi tsuyuhito\": \"樋口露仁\",\n        \"higure samon\": \"日暮さもん\",\n        \"hihiyama yokikana\": \"比比山よきかな\",\n        \"hiiaru\": \"ひいある\",\n        \"hiichan\": \"ひぃちゃん\",\n        \"hiiragi azato\": \"柊アザト\",\n        \"hiiragi hajime\": \"柊はじめ\",\n        \"hiiragi yuki\": \"柊ゆき\",\n        \"hiiro yuki\": \"緋色雪\",\n        \"hijikawa\": \"Hijikawa\",\n        \"hijiki\": \"ひじき\",\n        \"hijiri\": \"聖\",\n        \"hijiribashi chaki\": \"聖橋茶紀\",\n        \"hikabe sakuho\": \"ひかべさくほ\",\n        \"hikanyan\": \"ひかにゃん\",\n        \"hikari\": \"ひかり\",\n        \"hikawa hekiru\": \"氷川へきる\",\n        \"hikawa yuuki\": \"斐川悠希\",\n        \"hikeshi no kaze zimbabwe\": \"火消しの風ジンバブエ\",\n        \"hikitogu\": \"ひきとぐ\",\n        \"hiko\": \"ヒコ\",\n        \"hikou nabe\": \"飛行鍋\",\n        \"hima\": \"HIMA\",\n        \"himadara\": \"ひまだら\",\n        \"hime hajime\": \"ひめ はじめ\",\n        \"himei yoru\": \"ひめいよる\",\n        \"himekawa akira\": \"姫川明月\",\n        \"himekuri\": \"ヒめくり\",\n        \"himemiya aoi\": \"姫宮葵\",\n        \"himemiya aya\": \"姫宮あや\",\n        \"himemiya nina\": \"ひめみやにいな\",\n        \"himeno\": \"ひめの\",\n        \"himeoka yuki\": \"姫岡幸忌\",\n        \"himori tsukineko\": \"妃杜つきねこ\",\n        \"himukai yuji\": \"日向悠二\",\n        \"himura eiji\": \"緋村えいじ\",\n        \"himuro kouichi\": \"氷室光一\",\n        \"hina miruku\": \"未来みるく\",\n        \"hinadori\": \"雛鳥\",\n        \"hinagi rion\": \"緋凪りおん\",\n        \"hinaki\": \"ヒナキ\",\n        \"hinako yui\": \"比奈子惟\",\n        \"hinakuma\": \"ひなくま\",\n        \"hinamatsuri touko\": \"雛祭桃子\",\n        \"hinami\": \"ひなみ\",\n        \"hinamori yui\": \"ひなもりゆい\",\n        \"hinapo\": \"ヒナポ\",\n        \"hinase aya\": \"雛瀬あや\",\n        \"hinase kazusa\": \"ヒナセカズサ\",\n        \"hinata aimi\": \"日向アイミ\",\n        \"hinata aoi\": \"日向あおい\",\n        \"hinata karin\": \"ひなた夏鈴\",\n        \"hinata momo\": \"ひなたもも\",\n        \"hinata mutsuki\": \"ひなた睦月\",\n        \"hinata neru\": \"ひなたねる\",\n        \"hinata yagaki\": \"日向野牙樹\",\n        \"hinayori\": \"ヒナヨリ\",\n        \"hino\": \"ひの\",\n        \"hinoakimitu\": \"ヒノアキミツ\",\n        \"hinoe nami\": \"ヒノエナミ\",\n        \"hinoki\": \"ひのき\",\n        \"hinooka shuuji\": \"緋ノ丘シュウジ\",\n        \"hinori\": \"ひのり\",\n        \"hinoshima sora\": \"緋乃島空\",\n        \"hinoue itaru\": \"樋上いたる\",\n        \"hir\": \"Hir\",\n        \"hira\": \"平\",\n        \"hira taira\": \"ひらたいら\",\n        \"hiraizumi\": \"比良泉\",\n        \"hiraizumi kou\": \"ひらいずみこう\",\n        \"hiraki naori\": \"平木直利\",\n        \"hirame guard\": \"ひらめがーど\",\n        \"hirano kana\": \"平野かな\",\n        \"hirano kawajuu\": \"平野河重\",\n        \"hirano kouta\": \"平野耕太\",\n        \"hirano tsukiko\": \"平野月子\",\n        \"hiraru\": \"ヒラル\",\n        \"hirasato\": \"ヒラサト\",\n        \"hirase yuu\": \"平瀬ゆう\",\n        \"hiratsura masaru\": \"ひらつらまさる\",\n        \"hirayan\": \"ひらやん\",\n        \"hirno\": \"Hirno\",\n        \"hiro kari\": \"ひろ(仮)\",\n        \"hiro kazuki\": \"比呂カズキ\",\n        \"hirob816\": \"HiRoB816\",\n        \"hiroe rei\": \"広江礼威\",\n        \"hirogoori akio\": \"広郡明生\",\n        \"hiroichi\": \"ヒロイチ\",\n        \"hirokawa kouichirou\": \"広川浩一郎\",\n        \"hirokawa tomo\": \"緋呂河とも\",\n        \"hirokazukine\": \"HirokazuKine\",\n        \"hiroko\": \"ヒロ子\",\n        \"hiromaji\": \"ひろまじ\",\n        \"hirome\": \"ひろめ\",\n        \"hironii\": \"ひろにい\",\n        \"hirono\": \"Hirono\",\n        \"hirooki\": \"博海城\",\n        \"hiroshi\": \"ヒロシ\",\n        \"hirosue maron\": \"広末まろん\",\n        \"hirota masatane\": \"廣田眞胤\",\n        \"hiroto\": \"启人\",\n        \"hiroyama hiroshi\": \"广山弘\",\n        \"hiroyoshi\": \"ヒロヨシ\",\n        \"hiroyuki\": \"ヒロユキ\",\n        \"hiroyuki koto\": \"比呂之\",\n        \"hiryuu takahiro\": \"緋龍高弘\",\n        \"hisa\": \"ひさ\",\n        \"hisahiko\": \"久彦\",\n        \"hisakabe oto\": \"久壁おと\",\n        \"hisame\": \"氷雨\",\n        \"hisame genta\": \"氷雨げんた\",\n        \"hisano\": \"ひさの\",\n        \"hisaya\": \"久夜\",\n        \"hisayakiq\": \"ひさやききゅう\",\n        \"hishimori\": \"菱守\",\n        \"histamine c\": \"ヒスタミンC\",\n        \"hiten onee-ryuu\": \"飛天御姉流\",\n        \"hitohako\": \"人箱\",\n        \"hitokko\": \"ひとっこ\",\n        \"hitomasu modoru\": \"ヒトマスモドル\",\n        \"hitomi\": \"人見\",\n        \"hitomi aki\": \"人見あき\",\n        \"hitori jozu\": \"日盗りジョーズ\",\n        \"hitotose rin\": \"春夏秋冬鈴\",\n        \"hits\": \"ひっつ\",\n        \"hitsuji\": \"HITSUJI\",\n        \"hitsuji hako\": \"日辻ハコ\",\n        \"hitsujibane shinobu\": \"羊羽 忍\",\n        \"hitsujiko\": \"羊子\",\n        \"hitsujin\": \"ひつじん\",\n        \"hitsujinx\": \"ヒツジンクス\",\n        \"hitsuki\": \"ひつき\",\n        \"hiviki.n\": \"Hiviki.N\",\n        \"hiwatari rin\": \"樋渡りん\",\n        \"hiya\": \"Hiya\",\n        \"hiyama chiaki\": \"桧山千秋\",\n        \"hiyo hiyo\": \"ひよひよ\",\n        \"hiyocco\": \"hiyocco\",\n        \"hiyoko daiou\": \"ひよこ大王\",\n        \"hiyoko.\": \"ひよこ。\",\n        \"hiyokomame\": \"ひよこまめ\",\n        \"hiyou\": \"飛熊\",\n        \"hiyozakura\": \"ひよざくら\",\n        \"hizaka\": \"ひざか\",\n        \"hizaki ryuuta\": \"ひざきりゅうた\",\n        \"hjb\": \"HJB\",\n        \"hobilo\": \"Hobilo\",\n        \"hobo3\": \"ほぼ3\",\n        \"hohehohe\": \"ほへほへ\",\n        \"hoihoi\": \"hoihoi\",\n        \"hoimin\": \"ホイミン\",\n        \"hojo\": \"hojo\",\n        \"hokage\": \"ほかげ\",\n        \"hokagemio\": \"ホカゲミオ\",\n        \"hokku\": \"ホック\",\n        \"hokuna rin\": \"北那リン\",\n        \"hokuro ryuseigun\": \"ホクロ流星群\",\n        \"hokuto\": \"北斗\",\n        \"homaderi\": \"ほまでり\",\n        \"homra\": \"homra\",\n        \"honda formalin\": \"本田ホルマリン\",\n        \"honda hajime\": \"本田基\",\n        \"honda mitsuru\": \"本多みつる\",\n        \"honda naoki\": \"本田直樹\",\n        \"honda negi\": \"本田ねぎ\",\n        \"honda opon\": \"本田おぽん\",\n        \"hone\": \"ホネ\",\n        \"honebuto danshaku\": \"骨太男爵\",\n        \"honewo arukemita\": \"ホネヲ・アルケミタ\",\n        \"honey-usako\": \"はにいうさこ\",\n        \"honjou masato\": \"本庄マサト\",\n        \"honmachi keisuke\": \"本町圭祐\",\n        \"honnori\": \"ほんのり\",\n        \"honnouchi honoji\": \"本能血ホノジ\",\n        \"honoka\": \"萌香\",\n        \"honokun\": \"ほのくん\",\n        \"honoutsukai\": \"炎使\",\n        \"hontai bai\": \"本体売\",\n        \"hontoku\": \"ホン・トク\",\n        \"honya\": \"ほにゃー\",\n        \"hoono yurumu\": \"頬乃ゆるむ\",\n        \"hoosaku\": \"ほ～さく\",\n        \"hoppege\": \"ほっぺげ\",\n        \"hora\": \"法螺\",\n        \"hori hiraki\": \"堀ヒラキ\",\n        \"horie\": \"ホリエ\",\n        \"horie tankei\": \"堀江耽閨\",\n        \"horiguchi\": \"ホリグチ\",\n        \"horikawa kyo\": \"堀川◆キョウ\",\n        \"horikiri haruto\": \"堀切ハルト\",\n        \"horimoto akira\": \"ほりもとあきら\",\n        \"hormone\": \"ホルモン\",\n        \"horo makoto\": \"幌真人\",\n        \"horosuke\": \"ホロすけ\",\n        \"hosaka takemaru\": \"保坂たけまる\",\n        \"hosaka yuuichi\": \"ほさかゆーいち\",\n        \"hoshi nohara\": \"ほしのはら\",\n        \"hoshiduki akira\": \"星月晃\",\n        \"hoshiduki melon\": \"星月めろん\",\n        \"hoshieda\": \"ほしえだ\",\n        \"hoshifuri\": \"ホシフリ\",\n        \"hoshikawa atsuki\": \"星河あつき\",\n        \"hoshikawa kirara\": \"ほしかわきらら\",\n        \"hoshimoto piero\": \"星本ピエロ\",\n        \"hoshina\": \"ほしな\",\n        \"hoshino cobato\": \"星野小鳩\",\n        \"hoshino kabi\": \"ホシノカビ\",\n        \"hoshino lala\": \"星野ララ\",\n        \"hoshino nia\": \"星野ニア\",\n        \"hoshioki\": \"ホシオキ\",\n        \"hoshizaki ryuu\": \"星崎龍\",\n        \"hoshizora\": \"星空\",\n        \"hosikawa tukimi\": \"星川月海\",\n        \"hosizora mikoto\": \"星空ミコト\",\n        \"hosoi kouzou\": \"細井コウゾウ\",\n        \"hosokawa fuziemon\": \"細川ふじえもん\",\n        \"hot\": \"HOT\",\n        \"hot melon\": \"Hot Melon\",\n        \"hota.\": \"ほた。\",\n        \"hotaru\": \"蛍\",\n        \"hotarugusa\": \"ほたる草\",\n        \"hotei kazuha\": \"保汀一葉\",\n        \"hotori\": \"歩鳥\",\n        \"houga\": \"芳芽\",\n        \"houhokekiyo\": \"ホウホケキヨ\",\n        \"houmitsu\": \"方密\",\n        \"houou-tan\": \"鳳凰たん\",\n        \"houruri\": \"蓬瑠璃\",\n        \"housubaru\": \"鳳スバル\",\n        \"houtei kara\": \"法廷から\",\n        \"hozumi takashi\": \"Hozumi Takashi\",\n        \"hozumi touzi\": \"八月一日冬至\",\n        \"hplay\": \"Hplay\",\n        \"hroz\": \"ふろず\",\n        \"htg\": \"htg\",\n        \"huet\": \"Huet\",\n        \"hujinon\": \"ふじのん\",\n        \"hukidamari\": \"吹溜\",\n        \"hukokukyohei\": \"腐国狂兵\",\n        \"hukuhukuan\": \"福々餡\",\n        \"humei\": \"フメイ\",\n        \"humi\": \"ふみ\",\n        \"humiu\": \"ふみぅ\",\n        \"humizuki\": \"Humizuki\",\n        \"huracan\": \"うらかん\",\n        \"hutoshi\": \"ふとし\",\n        \"huupo\": \"フーポ\",\n        \"huyukiti\": \"冬吉\",\n        \"huzinami kaoru\": \"藤波薫\",\n        \"hyaku\": \"ヒャク\",\n        \"hyakuen\": \"hyakuen\",\n        \"hyakuhachi\": \"ひゃくはち\",\n        \"hyakushiki cheerio\": \"百式テリヲ\",\n        \"hydrant\": \"HYDRANT\",\n        \"hyouga.\": \"ひょうが。\",\n        \"hyouju issei\": \"氷樹一世\",\n        \"hyoukai\": \"氷海\",\n        \"hypar\": \"Hypar\",\n        \"hyper unko cannon\": \"ハイパーウンコキャノン\",\n        \"hypno sushi\": \"ひぷの寿司\",\n        \"hyudora\": \"ヒュドラ\",\n        \"hyung tae kim\": \"김형태\",\n        \"hyuuga azuri\": \"日向あずり\",\n        \"iapoc\": \"IAPOC\",\n        \"ibn\": \"Ibn\",\n        \"ibonnu\": \"イボンヌ\",\n        \"ibu hidekichi\": \"伊武秀吉\",\n        \"ibuki pon\": \"息吹ポン\",\n        \"ibukichi\": \"いぶきち\",\n        \"iburo.\": \"いぶろー。\",\n        \"ica\": \"ica\",\n        \"icelee\": \"IceLee\",\n        \"ichi\": \"ichi\",\n        \"ichi ume\": \"いちうめ\",\n        \"ichi-san\": \"いち\",\n        \"ichiboshi\": \"イチボシ\",\n        \"ichie ryouko\": \"一恵りょうこ\",\n        \"ichiei\": \"一栄\",\n        \"ichifuji nitaka\": \"壱藤弐鷹\",\n        \"ichigo\": \"いちご\",\n        \"ichigo mark\": \"いちごまぁく\",\n        \"ichigo.\": \"いちご。\",\n        \"ichiha\": \"いちは\",\n        \"ichihara kazuma\": \"市原和真\",\n        \"ichii akira\": \"いちい瑛\",\n        \"ichika\": \"いちか\",\n        \"ichikawa\": \"市川\",\n        \"ichikawa ichiko\": \"市川いちこ\",\n        \"ichikawa kazuhide\": \"市川和秀\",\n        \"ichikawa ryuunosuke\": \"壱河柳乃助\",\n        \"ichikawa yayoi\": \"イチカワヤヨイ\",\n        \"ichiki tomoe\": \"壱樹ともえ\",\n        \"ichimai ugou\": \"一枚烏合\",\n        \"ichimedou\": \"いちめどー\",\n        \"ichimi\": \"いちみ\",\n        \"ichimi tougarashi\": \"いちみとうがらし\",\n        \"ichimonji mutsuki\": \"一文字睦月\",\n        \"ichinashi kimi\": \"市梨きみ\",\n        \"ichino\": \"いちの\",\n        \"ichinomiya kazusa\": \"一ノ宮かずさ\",\n        \"ichinose\": \"イチノセ\",\n        \"ichiokunen wakusei\": \"1億年惑星\",\n        \"ichiro\": \"一滝\",\n        \"ichitaka\": \"いちたか\",\n        \"ichiya\": \"一夜\",\n        \"ichiya koutei\": \"いちや皇帝\",\n        \"icica\": \"いちか\",\n        \"id-ed\": \"ID-ED\",\n        \"idogawa\": \"井戸川\",\n        \"iduki\": \"いづき\",\n        \"idumi minami\": \"いづみみなみ\",\n        \"ie gami\": \"いえがみ\",\n        \"ieda kirizen\": \"家田キリゼン\",\n        \"ifnil\": \"IFNIL\",\n        \"ifpark\": \"ifpark\",\n        \"ifuji shinsen\": \"いふじシンセン\",\n        \"igakino agenasu\": \"井垣野あげなす\",\n        \"igan seijin\": \"胃がん星人\",\n        \"iganseijin\": \"胃がん星人\",\n        \"ignica\": \"ignica\",\n        \"iguchi takajin\": \"井口たかじん\",\n        \"igusa shunrou\": \"井草春朗\",\n        \"ihara tatsuya\": \"伊原達矢\",\n        \"iida toyoyuki\": \"いいだ豊雪\",\n        \"iihama daka\": \"飯浜ダカ\",\n        \"iinano\": \"いいなの\",\n        \"iino haseru\": \"イイノ　ハセル\",\n        \"iio tetsuaki\": \"飯尾鉄明\",\n        \"iio tetsuomi\": \"飯尾哲臣\",\n        \"mesiyama\": \"飯山\",\n        \"iiyo koiyo\": \"伊々代恋夜\",\n        \"iiyon\": \"いいよん\",\n        \"iizuki tasuku\": \"唯々月たすく\",\n        \"ijiro suika\": \"居城スイカ\",\n        \"ika\": \"いか\",\n        \"ikagawa shirou\": \"いかがわ四郎\",\n        \"ikanomaru\": \"イカノマル\",\n        \"ikasumi bokuju\": \"イカスミぼくじゅー\",\n        \"ikeda jun\": \"池田淳\",\n        \"ikeda shuuko\": \"池田秀子\",\n        \"ikeda usao\": \"イケダウサオ\",\n        \"ikeda yasuhiro\": \"池田靖宏\",\n        \"ikeden\": \"いけでん\",\n        \"ikelag\": \"ikelag\",\n        \"iken\": \"イケン\",\n        \"ikoma ippei\": \"伊駒一平\",\n        \"iktk\": \"イキテク\",\n        \"iku\": \"郁\",\n        \"ikue fuji\": \"幾枝風児\",\n        \"ikuhashi muiko\": \"郁橋むいこ\",\n        \"ikuma satsuki\": \"伊久間さつき\",\n        \"ikuno harusame\": \"生野ハルサメ\",\n        \"ikura gunkan\": \"いくら軍艦\",\n        \"ikurumi bill\": \"生王ビル\",\n        \"ikuta takanon\": \"いくたたかのん\",\n        \"ikuwiron\": \"イクヰロン\",\n        \"ikuyoan\": \"ikuyoan\",\n        \"illi\": \"ILLI\",\n        \"imacchi\": \"いまっち\",\n        \"imachi reki\": \"居待暦\",\n        \"imaden\": \"いまでん\",\n        \"imagawa akira\": \"今川あきら\",\n        \"imai hanako\": \"イマイ\",\n        \"imai riho\": \"今井里穂\",\n        \"imaichi\": \"居妹治\",\n        \"imaima sayuki\": \"今々沙雪\",\n        \"imaizumi atsushi\": \"いまいずみあつし\",\n        \"imaka hideki\": \"いまかひでき\",\n        \"imaki hitotose\": \"春夏秋冬\",\n        \"imari\": \"伊万里\",\n        \"imawano lem\": \"忌野Lem\",\n        \"imazon\": \"今ゾン\",\n        \"imiju\": \"寒天\",\n        \"imotarei\": \"イモタレ\",\n        \"imozuka panikuru\": \"芋塚ぱにくる\",\n        \"imperial boy\": \"帝国少年\",\n        \"inaba fuyuki\": \"稲場冬樹\",\n        \"inaba sunimi\": \"いなばすにみ\",\n        \"inaho\": \"稲穂\",\n        \"inai\": \"居内\",\n        \"iname\": \"稲芽\",\n        \"inami heil\": \"伊波ハイル\",\n        \"inari kinzou\": \"稲荷金蔵\",\n        \"inari.\": \"ゐなり。\",\n        \"inasaki shirau\": \"稲咲しらう\",\n        \"inase shinya\": \"稲瀬信也\",\n        \"inax\": \"INAX\",\n        \"inayama\": \"稲山\",\n        \"infraton\": \"インフラトン\",\n        \"ingamorugu\": \"いんがもるぐ\",\n        \"ingram 97\": \"いんぐらむ'97\",\n        \"ini\": \"イニ\",\n        \"initsukkii\": \"いにつっきー\",\n        \"inkey\": \"inkey\",\n        \"ino-ki\": \"ino-ki\",\n        \"ino.\": \"ino.\",\n        \"inode\": \"いので\",\n        \"inoino\": \"inoino\",\n        \"inono\": \"inono\",\n        \"inori\": \"いのり\",\n        \"inoshita\": \"いのした\",\n        \"inoue junichi\": \"井上純一\",\n        \"inoue kiyoshi\": \"井上清\",\n        \"inoue mitan\": \"いのうえみたん\",\n        \"inoue takuya\": \"いのうえたくや\",\n        \"inoue tommy\": \"いのうえとみい\",\n        \"inoue yuki\": \"イノウエユキ\",\n        \"inseki 3gou\": \"隕石3号\",\n        \"inu g\": \"犬G\",\n        \"inu-blade\": \"犬ブレード\",\n        \"inuboe\": \"狗吠\",\n        \"yoshino hodaka\": \"吉野ホダカ\",\n        \"inuburo\": \"いぬぶろ\",\n        \"inucreamice\": \"いぬくりぃむあいす\",\n        \"inuduka takeru\": \"犬塚毅\",\n        \"inufuro\": \"いぬふろ\",\n        \"inugahora an\": \"犬洞あん\",\n        \"inugai shin\": \"犬凱新\",\n        \"inugami johnny\": \"犬神じょにー\",\n        \"inugami naoyuki\": \"犬神尚雪\",\n        \"inugami nepia\": \"犬上ねぴあ\",\n        \"inui haruka\": \"乾はるか\",\n        \"inui nui\": \"乾ぬい\",\n        \"inui sekihiko\": \"犬威赤彦\",\n        \"inukai\": \"犬飼\",\n        \"inukkoro\": \"いぬっころ\",\n        \"inukon geek.\": \"いぬこんぎーく。\",\n        \"inumaru\": \"犬丸\",\n        \"inumimi moeta\": \"犬耳もえ太\",\n        \"inumori sayaka\": \"犬森サヤカ\",\n        \"inunare\": \"inunare\",\n        \"inuyashiki\": \"犬屋敷\",\n        \"inuzuka bouru\": \"犬塚ボウル\",\n        \"inyucchi\": \"いにゅっち\",\n        \"io takuya\": \"射尾卓弥\",\n        \"iogi juichi\": \"井荻寿一\",\n        \"ippachi\": \"いっぱち\",\n        \"ippon\": \"一本\",\n        \"iri\": \"イリ\",\n        \"irie\": \"IRIE\",\n        \"irie yamazaki\": \"IRIE YAMAZAKI\",\n        \"iripyon\": \"いりぴょん\",\n        \"iroen\": \"いろえん\",\n        \"iroha\": \"いろは\",\n        \"irohane sui\": \"彩羽スイ\",\n        \"iroito\": \"色糸\",\n        \"irotsuya\": \"いろつや\",\n        \"irua\": \"irua\",\n        \"iruka\": \"Iruka\",\n        \"isada\": \"伊佐田\",\n        \"isaki\": \"伊佐木\",\n        \"isaki uta\": \"伊咲ウタ\",\n        \"isao\": \"isao\",\n        \"isato\": \"イサト\",\n        \"ise.\": \"いせ。\",\n        \"iseki\": \"いせき\",\n        \"isemagu\": \"いせマグ\",\n        \"iseno yajin\": \"いせのやじん\",\n        \"ishibashi shingo\": \"石橋シンゴ\",\n        \"ishida masayuki\": \"石田麻茶行\",\n        \"ishigaki takashi\": \"イシガキタカシ\",\n        \"ishigana\": \"いしがな\",\n        \"ishihara kouhei\": \"石原浩平\",\n        \"ishihara souka\": \"石原そうか\",\n        \"ishikawa kingyo\": \"石川きんぎょ\",\n        \"ishikkoro\": \"石っころ\",\n        \"ishimu\": \"イシム\",\n        \"ishino kanon\": \"石野鐘音\",\n        \"ishioto\": \"Ishioto\",\n        \"ishitoku\": \"イシトク\",\n        \"ishitomo ren\": \"いしとも蓮\",\n        \"ishizuchi ginko\": \"石鎚ぎんこ\",\n        \"isiyama kosuke\": \"石山コースケ\",\n        \"island\": \"あいらんど\",\n        \"isna\": \"イスナ\",\n        \"iso nogi\": \"磯乃木\",\n        \"isogani\": \"イソガニ\",\n        \"isoroku\": \"いそろく\",\n        \"isoya kashi\": \"磯谷かし\",\n        \"isshi taira\": \"いっしたいら\",\n        \"isshiki nishiki\": \"一敷錦\",\n        \"issi-13\": \"イッシー13\",\n        \"isuke gratanity\": \"イスケ・グラタニティー\",\n        \"isutasshu\": \"イスタッシュ\",\n        \"isutoshi\": \"ISUTOSHI\",\n        \"isya\": \"isya\",\n        \"it\": \"イット\",\n        \"itachou\": \"いたちょう\",\n        \"itaku\": \"イタク\",\n        \"itami\": \"伊丹\",\n        \"itamochi\": \"板餅\",\n        \"itaya satoruno\": \"板谷さとるの\",\n        \"ithino li\": \"一ノらい\",\n        \"ito\": \"いとう\",\n        \"ito ichizo\": \"伊藤一蔵\",\n        \"ito katsumi\": \"いとう克巳\",\n        \"ito ryusei\": \"伊藤隆生\",\n        \"itoh kani\": \"伊藤蟹\",\n        \"itome\": \"糸目\",\n        \"itotin\": \"itotin\",\n        \"itou ben\": \"伊藤ベン\",\n        \"itou hiromine\": \"伊東聖峰\",\n        \"itou jin\": \"イトウヂン\",\n        \"itou makoto\": \"伊藤誠\",\n        \"itou puriso\": \"伊藤プリソ\",\n        \"itou satera\": \"伊藤サテラ\",\n        \"itou souichi\": \"伊藤宗一\",\n        \"itoyoko\": \"ITOYOKO\",\n        \"itsuki\": \"いつき\",\n        \"itsuki kousuke\": \"いつきこうすけ\",\n        \"itsuki mai\": \"イツキ舞\",\n        \"itsuki makoto\": \"いつきまこと\",\n        \"itsuki tsukune\": \"樹つくね\",\n        \"itto\": \"一十\",\n        \"iuro\": \"ゆうろ\",\n        \"iwai takeshi\": \"祝たけし\",\n        \"iwaki amami\": \"磐城あまみ\",\n        \"iwama yoshiki\": \"いわまよしき\",\n        \"iwami shouko\": \"石見翔子\",\n        \"iwano\": \"いわの\",\n        \"iwanori\": \"いわのり\",\n        \"iwao naoto\": \"岩尾尚人\",\n        \"iwasaki hiromasa\": \"岩崎啓眞\",\n        \"iwasaki takashi\": \"いわさきたかし\",\n        \"iwashita\": \"いわした\",\n        \"iwatsuki aware\": \"岩月あわれ\",\n        \"iyoda mato\": \"伊与田まと\",\n        \"iyohara kansuke\": \"伊予原勘助\",\n        \"iyutani\": \"iyutani\",\n        \"izuki jirou\": \"戌月ジロウ\",\n        \"izumi aki\": \"和泉あき\",\n        \"izumi kyouta\": \"いずみきょうた\",\n        \"izumi masashi\": \"和泉まさし\",\n        \"izumi rion\": \"和泉リオン\",\n        \"izumi tomoki\": \"泉ともき\",\n        \"izumi yakumo\": \"和泉八雲\",\n        \"izumi yayoi\": \"和泉弥生\",\n        \"izumi yoshikazu\": \"和泉美和\",\n        \"izumi yukiru\": \"和泉ゆきる\",\n        \"izumikado kou\": \"泉門コウ\",\n        \"izumimipu\": \"いずみみぷ\",\n        \"izumo kuutarou\": \"出雲空太郎\",\n        \"izumo ryo\": \"出雲りょう\",\n        \"izuna kazuki\": \"Izuna Kazuki\",\n        \"izuna masaru\": \"飯綱まさる\",\n        \"izure\": \"いづれ\",\n        \"izurumi\": \"いづるみ\",\n        \"izushi juunin\": \"出石十人\",\n        \"j\": \"ジェイ\",\n        \"j kakeru\": \"ジョウ・カケル\",\n        \"j-max japan\": \"J-MAX JAPAN\",\n        \"j.c.pandam\": \"J・C・パンダム\",\n        \"j.sairo\": \"J・さいろー\",\n        \"jack\": \"ジャック\",\n        \"jack auber\": \"ジャック・アウバー\",\n        \"rapscallion\": \"Rapscallion\",\n        \"jack hamster\": \"ジャック・ハムスター\",\n        \"jacky\": \"Jacky\",\n        \"jacky knee-san\": \"ジャッキーニーさん\",\n        \"jaguar imoko\": \"ジャガー芋子\",\n        \"jajala\": \"ジャジャラ\",\n        \"jakko\": \"じゃっこ\",\n        \"jakomaru\": \"じゃこまる\",\n        \"jakoten\": \"じゃこてん\",\n        \"jakuwa\": \"邪鍬\",\n        \"jam ouji\": \"ジャム王子\",\n        \"jambread\": \"Jambread\",\n        \"james\": \"ジェームス\",\n        \"james hardiman\": \"skunkworks\",\n        \"jas\": \"JAS\",\n        \"jason\": \"J村\",\n        \"jax2o\": \"じゃじゃお\",\n        \"jd\": \"jd\",\n        \"jean louis\": \"ジャン・ルイ\",\n        \"jellytits7\": \"JellyTits7\",\n        \"jema\": \"jema\",\n        \"jet\": \"JET\",\n        \"jeter\": \"ジーター\",\n        \"ji yuuyuu\": \"じゆうゆう\",\n        \"jiba tenko\": \"じばてんこ\",\n        \"jigoku\": \"jigoku\",\n        \"jigoku sensei hirobe\": \"地獄先生ひろべ～\",\n        \"jii\": \"ぢぃ\",\n        \"jii jii sachira\": \"じーじー☆さちら\",\n        \"jiji\": \"じじ\",\n        \"jils\": \"JILS\",\n        \"jimi sakita\": \"ジミサキタ\",\n        \"jimo\": \"じも\",\n        \"jinbaku-ryuoh\": \"神爆龍王\",\n        \"jingai modoki\": \"人外モドキ\",\n        \"jingo kajiki\": \"神護カジキ\",\n        \"jingrock\": \"甚六\",\n        \"jinkennashi tarou\": \"人権なし太郎\",\n        \"jinmu hirohito\": \"神武裕仁\",\n        \"jinnai jun\": \"陣内潤\",\n        \"jino\": \"じーの\",\n        \"jiro\": \"JIRO\",\n        \"jirou\": \"ジロウ\",\n        \"jiseki\": \"ジセキ\",\n        \"jita\": \"爺太\",\n        \"jitsuyou shinshiki\": \"実用新式\",\n        \"jjj\": \"JJJ\",\n        \"jjune\": \"JJune\",\n        \"joey hentai\": \"Contact\",\n        \"john k. pe-ta\": \"ジョン・K・ペー太\",\n        \"johnnie\": \"じょにぃ\",\n        \"johnny\": \"じょにー\",\n        \"johnson\": \"ジョンソン\",\n        \"jomae\": \"錠間江\",\n        \"jomo\": \"じょも\",\n        \"jon\": \"じょん\",\n        \"jon ozaki\": \"ジョン尾崎\",\n        \"jordi\": \"じょるでぃ\",\n        \"joumu\": \"条夢\",\n        \"jovejun.\": \"じょぶじゅん。\",\n        \"jude\": \"jude\",\n        \"jumping dogeza\": \"ジャンピング土下座\",\n        \"jungfrau\": \"Jungfrau\",\n        \"junji\": \"じゅんじぃ\",\n        \"junko\": \"淳子\",\n        \"jura\": \"樹羅\",\n        \"juri reiqa\": \"樹莉麗華\",\n        \"jusc0\": \"jusc0\",\n        \"justy\": \"Justy\",\n        \"juubaori mashumaro\": \"十羽織ましゅまろ\",\n        \"juugatsu\": \"十月\",\n        \"juuji\": \"拾次\",\n        \"juunigatsu shoujo\": \"十二月少女\",\n        \"juurouta\": \"十郎太\",\n        \"juusangatsu\": \"拾参月\",\n        \"jyom\": \"jyom\",\n        \"jyouden\": \"ジョウデン\",\n        \"jyujyo\": \"銃丈\",\n        \"jyunintoiro\": \"獣人といろ\",\n        \"jyura\": \"じゅら\",\n        \"jyuuji\": \"拾次\",\n        \"k no ji\": \"Kの字\",\n        \"k-nattou\": \"K‐なっとう\",\n        \"k-you\": \"K-you\",\n        \"k-zima\": \"圭島瞬里\",\n        \"k. k usako\": \"k.kうさこ\",\n        \"k2 dorachan\": \"K2ドラちゃん\",\n        \"k2isu\": \"ケィス\",\n        \"k3\": \"K3\",\n        \"kabaki\": \"kabaki\",\n        \"kabane\": \"カバネ\",\n        \"kabaya kosuke\": \"樺矢耕助\",\n        \"kabayaki unagi\": \"蒲焼鰻\",\n        \"kabocha head\": \"かぼちゃヘッド\",\n        \"kabocya torute\": \"南瓜とるて\",\n        \"kabotyausagi\": \"かぼちゃ兎\",\n        \"kabuki shigeyuki\": \"香吹茂之\",\n        \"kaburaya seiden\": \"鏑矢正伝\",\n        \"kachoufuugetsu\": \"花鳥風月\",\n        \"kadita\": \"かぢ太\",\n        \"kadokura tomomi\": \"門倉ともみ\",\n        \"kadomaki shinnosuke\": \"門巻森乃介\",\n        \"kadomaru tsubura\": \"角丸つぶら\",\n        \"kadota hisashi\": \"角田ひさし\",\n        \"kadou\": \"カドウ\",\n        \"kaduki\": \"かづき\",\n        \"kaduki ryo\": \"香月稜\",\n        \"kaede kaeru\": \"楓蛙\",\n        \"kaede minoru\": \"カエデミノル\",\n        \"kaen miso\": \"火炎味噌\",\n        \"kaeru\": \"小松菜屋\",\n        \"kaeru neko\": \"かえるねこ\",\n        \"kaerudon\": \"カエル丼\",\n        \"kaeruyama yoshitaka\": \"蛙山芳隆\",\n        \"kagajou hiroki\": \"加賀城ヒロキ\",\n        \"kagami\": \"嘉臥深\",\n        \"kagami mochi\": \"かがみもち\",\n        \"kagami uekusa\": \"鏡植草\",\n        \"kagari\": \"kagari\",\n        \"kagari touya\": \"篝とうや\",\n        \"kagawa tomonobu\": \"矢野たくみ\",\n        \"kage oi\": \"影追い\",\n        \"kagehara hanzou\": \"影原半蔵\",\n        \"kageira\": \"カゲイラ\",\n        \"daigaijin\": \"Daigaijin\",\n        \"kagemusya\": \"KAGEMUSYA\",\n        \"kagerou1991\": \"陽炎1991\",\n        \"kagesaki yuna\": \"影崎由那\",\n        \"kageshio\": \"カゲシオ\",\n        \"kageusu gokuto\": \"影薄獄人\",\n        \"kagiana\": \"鍵穴\",\n        \"kagimushi\": \"かぎむし\",\n        \"kagiyama ryuta\": \"鍵山りゅうた\",\n        \"kagome\": \"籠目\",\n        \"kagura\": \"神楽\",\n        \"kagura kazuto\": \"神楽一刀\",\n        \"kagura momiji\": \"神楽紅葉\",\n        \"kagura nisiki\": \"神楽弐式\",\n        \"kagura takeshi\": \"神楽武志\",\n        \"kagura tsukune\": \"神楽つくね\",\n        \"kagura yutakamaru\": \"神楽雄隆丸\",\n        \"kagura yuuki\": \"かぐらゆうき\",\n        \"kagura yuuto\": \"神楽優人\",\n        \"kagurazaka nagu\": \"神楽坂なぐ\",\n        \"kagurazaka saki\": \"神楽坂沙希\",\n        \"kahasina\": \"川科\",\n        \"kahlua suzuki\": \"カルーア鈴木\",\n        \"kai\": \"改\",\n        \"kai makoto\": \"櫂まこと\",\n        \"kaibara keiya\": \"海原圭哉\",\n        \"kaibara you\": \"海原由布\",\n        \"kaibutsu o koeta kaibutsu\": \"怪物を超えた怪物\",\n        \"kaida michi\": \"海田路\",\n        \"kaidiu\": \"かいぢう\",\n        \"kaidou\": \"海道\",\n        \"kaidou j1\": \"蚕堂j1\",\n        \"kaidou mizuki\": \"海棠深月\",\n        \"kaiga\": \"kaiga\",\n        \"kaigun santouhei\": \"怪軍三等兵\",\n        \"kaika\": \"Kaika\",\n        \"kaiko\": \"初音\",\n        \"kaim\": \"kaim\",\n        \"kaiou\": \"悔王\",\n        \"kairakuen umeka\": \"快楽園梅香\",\n        \"kairi\": \"魁李\",\n        \"kaishaku\": \"介錯\",\n        \"kaishundou\": \"回春堂\",\n        \"kaisoku babangita\": \"快足ババンギタ\",\n        \"kaito shirou\": \"海都しろー\",\n        \"kaitou pink\": \"かいとうぴんく\",\n        \"kaizu\": \"かいず\",\n        \"kaji naoki\": \"梶なおき\",\n        \"kajimura kajima\": \"かじむらカジマ\",\n        \"kajitsu\": \"果実\",\n        \"kajiura\": \"かじうら\",\n        \"kajiwara chihaya\": \"梶原千早\",\n        \"kajiyama hiroshi\": \"梶山浩\",\n        \"kaka otoko\": \"カカ男\",\n        \"kakashi asahiro\": \"かかし朝浩\",\n        \"kakei asato\": \"筧あさと\",\n        \"kakenari\": \"kakenari\",\n        \"kakenashi\": \"かけなし\",\n        \"kakeru\": \"KAKERU\",\n        \"kakiemon\": \"カキえもん\",\n        \"kakino nashiko\": \"柿野なしこ\",\n        \"kakinomoto utamaro\": \"柿ノ本歌麿\",\n        \"kakitamajiru\": \"かきたま汁\",\n        \"kakitsubata kanae\": \"杜若かなえ\",\n        \"kakitsubata tsukune\": \"杜若つくね\",\n        \"kakizaki\": \"柿崎\",\n        \"kakka hideto\": \"活火秀人\",\n        \"kakudai\": \"カクダイ\",\n        \"kakugari ani\": \"カクガリ兄\",\n        \"kakuka\": \"かくか\",\n        \"kakutou oukoku\": \"格闘王国\",\n        \"kakuzato yun\": \"角砂糖ゆん\",\n        \"kakyouin chiroru\": \"華京院ちろる\",\n        \"kamado\": \"かまど\",\n        \"kamata\": \"かまた\",\n        \"kamatori pokari\": \"かまとりぽかり\",\n        \"kame\": \"かめ\",\n        \"kamehama takeshi\": \"亀浜たけし\",\n        \"kamei\": \"仮名\",\n        \"kamei kaori\": \"亀井香里\",\n        \"kamekichi\": \"かめ吉\",\n        \"kameponde\": \"カメポンデ\",\n        \"kami\": \"kami\",\n        \"kamimiya\": \"神宮\",\n        \"kamidou haruki\": \"神堂ハルキ\",\n        \"kamiishi nyny\": \"上石ニーニー\",\n        \"kamiishi sono\": \"神石その\",\n        \"kamikaze\": \"Kamikaze\",\n        \"kamikaze miyabi\": \"神風雅\",\n        \"kamimaki enpitsu\": \"紙巻エンピツ\",\n        \"kaminaru fuyu\": \"神鳴る冬\",\n        \"kamino ryu-ya\": \"上乃龙也\",\n        \"kamio 96\": \"神尾96\",\n        \"kamiryou kaduki\": \"上嶺榎月\",\n        \"kamisae ryouya\": \"上冴良夜\",\n        \"kamisato takeharu\": \"上里竹春\",\n        \"kamishima akira\": \"剃嶋章\",\n        \"kamishima tatsuya\": \"神嶋龍矢\",\n        \"kamishima yu\": \"神島悠\",\n        \"kamishiro midorimaru\": \"カミシロ緑マル\",\n        \"kamisori\": \"かみそり\",\n        \"kamita\": \"かみ田\",\n        \"kamitou masaki\": \"上藤政樹\",\n        \"kamitsuki shion\": \"神月紫苑\",\n        \"kamiya karin sakurako\": \"神谷迦麟桜子\",\n        \"kamiya naoya\": \"神谷尚哉\",\n        \"kamiya ogawa\": \"神宮小川\",\n        \"kamiya tomoe\": \"神谷ともえ\",\n        \"kamiyama aya\": \"神山彩\",\n        \"kamiyoshi\": \"神吉\",\n        \"kamizaki yotsuba\": \"上崎よつば\",\n        \"kamizawa reiji\": \"神沢零司\",\n        \"kamizono\": \"かみぞの\",\n        \"kamotama\": \"かもたま\",\n        \"kamui aya\": \"神居あや\",\n        \"kan\": \"環\",\n        \"kan da chi\": \"かん(だ)ち\",\n        \"kan koromoya\": \"寒衣屋\",\n        \"kana\": \"カナ\",\n        \"kanade sou\": \"奏奏\",\n        \"kanae\": \"かなえ\",\n        \"kanahito\": \"かなひと\",\n        \"kanaisei jitenshasougyou\": \"家内制自転車操業\",\n        \"kaname\": \"kaname\",\n        \"kaname nagi\": \"かなめ\",\n        \"kaname.\": \"かなめ。\",\n        \"kanan asuka\": \"河南あすか\",\n        \"kanano ayu\": \"奏乃あゆ\",\n        \"kanaru\": \"かなる\",\n        \"kanbayashi chico\": \"神林ちこ\",\n        \"kanbayashi makoto\": \"上林眞\",\n        \"kanbe\": \"kanbe\",\n        \"kanchela\": \"Kanchela\",\n        \"kanda\": \"神田\",\n        \"kandagawa\": \"神田川\",\n        \"kanduki kamibukuro\": \"環月紙袋\",\n        \"kandume\": \"かんづめ\",\n        \"kaneda asao\": \"金田麻生\",\n        \"kaneda shotaro\": \"金田正太郎\",\n        \"kanei yoh\": \"鐘井楊\",\n        \"kaneko ako\": \"金子アコ\",\n        \"kaneko rin\": \"金子鈴\",\n        \"kaneneko\": \"カネ-ネコ\",\n        \"kanesada keishi\": \"兼処敬士\",\n        \"kaneta\": \"かねた\",\n        \"kanetsuki masayoshi\": \"カネツキマサヨシ\",\n        \"kangaechuu\": \"考え中\",\n        \"kani\": \"かに\",\n        \"kanibasami\": \"かにばさみ\",\n        \"kanichiri\": \"かにちり\",\n        \"kanie\": \"鹿贄\",\n        \"kanif\": \"Kanif\",\n        \"kanikama\": \"カニカマ\",\n        \"kanikoro\": \"KANIKORO\",\n        \"kanimaru\": \"かにまる\",\n        \"kanimura ebio\": \"かに村えびお\",\n        \"kanitaro\": \"かに太郎\",\n        \"kanitoon\": \"蟹丹\",\n        \"kanju\": \"kanju\",\n        \"kanka\": \"カンカ\",\n        \"kanko\": \"かんこ\",\n        \"kanmimitsu\": \"甘味みつ\",\n        \"kanmuri\": \"かんむり\",\n        \"kanna asuke\": \"神無あすけ\",\n        \"kanna satsuki\": \"神無さつき\",\n        \"kanna tetsuboku\": \"かんな鉄木\",\n        \"kannagi kyouichi\": \"巫杏壱\",\n        \"kannatsuki noboru\": \"神奈月昇\",\n        \"kannazuki akira\": \"神無月アキラ\",\n        \"kannazuki motofumi\": \"神無月元史\",\n        \"kannazuki sakyou\": \"神名月紗香\",\n        \"kanno izuka\": \"かんのいずか\",\n        \"kanno kei\": \"神乃啓\",\n        \"kannon ouji\": \"観音王子\",\n        \"kano\": \"カノ\",\n        \"kanon\": \"花音\",\n        \"kanosamu\": \"KANOSAMU\",\n        \"kanri kokka semashi\": \"管理国家せまし\",\n        \"kansuke\": \"カンスケ\",\n        \"kantarou\": \"燗汰朗\",\n        \"kantori\": \"かんとり\",\n        \"kanu\": \"カヌ\",\n        \"kanzaki gorou\": \"かんざき五郎\",\n        \"kanzaki katsumi\": \"神崎かつみ\",\n        \"kanzaki misora\": \"神崎美宙\",\n        \"kanzaki shirou\": \"神崎四郎\",\n        \"kao\": \"Kao\",\n        \"kaori\": \"かおり\",\n        \"kapa\": \"かぱ\",\n        \"kapo\": \"カポ\",\n        \"kappa\": \"かっぱ\",\n        \"kappipe\": \"かっぴぺ\",\n        \"kara\": \"から\",\n        \"karaage muchio\": \"からあげむちお\",\n        \"karaage-chan\": \"からあげチャン\",\n        \"karakuri\": \"からくり\",\n        \"karakuribee\": \"カラくりべえ\",\n        \"karakuriusagi\": \"からくりうさぎ\",\n        \"karamai\": \"空舞\",\n        \"karasawa yonjuu\": \"唐沢四十\",\n        \"karasu chan\": \"カラスちゃん\",\n        \"karasuke d\": \"カラスケD\",\n        \"karasuma amiru\": \"烏丸あみる\",\n        \"karasuma nishiki\": \"からすま弐式\",\n        \"karasuma pink\": \"烏丸ぴんく\",\n        \"karasuma renya\": \"烏丸蓮耶\",\n        \"karasumaru\": \"烏間ル\",\n        \"karateka value\": \"カラテカ・バリュー\",\n        \"karatekikku\": \"karatekikku\",\n        \"karen kyuu\": \"華蓮きゅう\",\n        \"kari\": \"かり\",\n        \"kari paku\": \"かりぱく\",\n        \"karin\": \"かりん\",\n        \"karin akira\": \"花琳晶\",\n        \"karitaka akira\": \"狩鷹明\",\n        \"karo\": \"カロ\",\n        \"karoti\": \"かろちー\",\n        \"karucho\": \"カルチョ\",\n        \"karukanko\": \"カルカン子\",\n        \"karura jun\": \"迦楼羅淳\",\n        \"karura syou\": \"華瑠羅翔\",\n        \"karutamo\": \"かるたも\",\n        \"kasai ema\": \"葛西えま\",\n        \"kasaiya\": \"カサイ屋\",\n        \"kasaran\": \"kasaran\",\n        \"kashi\": \"華師\",\n        \"kashiba toshizou\": \"樫葉歳三\",\n        \"kashimi masao\": \"樫見正央\",\n        \"kashipam\": \"仮死パン\",\n        \"kashiwamochi june\": \"柏餅ジュン\",\n        \"kashou uta\": \"嘉咲ウタ\",\n        \"kasose\": \"風合瀬\",\n        \"kasuga\": \"春日\",\n        \"kasuga naoka\": \"春日直加\",\n        \"kasuga sunao\": \"春日沙生\",\n        \"kasuga tousen\": \"春日冬扇\",\n        \"kasugai\": \"春日井\",\n        \"kasukabe akira\": \"カスカベアキラ\",\n        \"kasuki masato\": \"春日木雅人\",\n        \"kasumi ryo\": \"かすみりょう\",\n        \"kasumi\": \"カスミ\",\n        \"kat\": \"KAT\",\n        \"katagiri\": \"カタギリ\",\n        \"katagiri atsuko\": \"かたぎりあつこ、牛乳リンダ\",\n        \"katagiri chisato\": \"片桐ちさと\",\n        \"katagiri hinoka\": \"片桐火華\",\n        \"katakana\": \"カタカナ\",\n        \"katakuri komeko\": \"片栗こめこ\",\n        \"katakuri-ko\": \"片栗子\",\n        \"katanbina\": \"かたんびな\",\n        \"katari\": \"かたり\",\n        \"katase yuu\": \"片瀬ゆう\",\n        \"katatuka kouji\": \"片塚工司\",\n        \"katazaki miki\": \"かたざきみき\",\n        \"katita\": \"Katita\",\n        \"kato cobayashi\": \"カトーコバヤシ\",\n        \"kato sig\": \"加藤シグ\",\n        \"katori youichi\": \"鹿取葉一\",\n        \"katou\": \"加藤\",\n        \"katou fuguo\": \"加藤フグオ\",\n        \"katou kakashi\": \"かとうかかし\",\n        \"katou koban\": \"加藤小判\",\n        \"katou takaaki\": \"加藤天秋\",\n        \"katou teppei\": \"加藤徹平\",\n        \"katou tetsuya\": \"加糖哲哉\",\n        \"katsudansou\": \"活断層\",\n        \"katsuma rei\": \"かつまれい\",\n        \"katsuo\": \"かつお\",\n        \"katsura 24 gou\": \"桂24號\",\n        \"katsuragi maya\": \"桂騎魔夜\",\n        \"katsuragi you\": \"葛城ゆう\",\n        \"katsuto\": \"かつと\",\n        \"katte ni kappa\": \"勝手に河童\",\n        \"katutoshi\": \"かつとし\",\n        \"katuu\": \"KATUU\",\n        \"katydid keeeta\": \"KATYDID KEEETA\",\n        \"kauti\": \"かーうち\",\n        \"kawa\": \"Kawa\",\n        \"kawacchi hirohiro\": \"かわっちひろひろ\",\n        \"kawachi izumi\": \"河内和泉\",\n        \"kawachi yuki\": \"かわち雪\",\n        \"kawada shougo\": \"かわだ章吾\",\n        \"kawadu\": \"カワヅ\",\n        \"kawagishi keitarou\": \"カワギシケイタロウ\",\n        \"kawahara\": \"カワハラ\",\n        \"kawahara shin\": \"かわはらしん\",\n        \"kawai\": \"カワイ\",\n        \"kawai kenji\": \"河合健司\",\n        \"kawakami ioru\": \"川上イオル\",\n        \"kawakami kou\": \"河上康\",\n        \"kawakami takashi\": \"川上聖\",\n        \"kawamoto hiroshi\": \"河本ひろし\",\n        \"kawamoto yutsuki\": \"河本ゆつき\",\n        \"kawamura tsukasa\": \"川邑司\",\n        \"kawana\": \"かわな\",\n        \"kawanakajima\": \"川中島\",\n        \"kawanishi yuuji\": \"かわにしゆうじ\",\n        \"kawano masatoshi\": \"川乃雅慧\",\n        \"kawanuma uotsuri\": \"川沼魚釣\",\n        \"kawase marimo\": \"川瀬まりも\",\n        \"kawase seiki\": \"カワセセイキ\",\n        \"kawasemi makiko\": \"かわせみまきこ\",\n        \"kawatare\": \"かわたれ\",\n        \"kawatsu kenjiro\": \"川津健二郎\",\n        \"kawazu kento\": \"河津ケント\",\n        \"kawazuko chouji\": \"蛙子丁字\",\n        \"kaya\": \"加耶\",\n        \"kaya rio\": \"夏谷リオ\",\n        \"kayabanashi\": \"かやばなし\",\n        \"kayako\": \"かやこ\",\n        \"kayama harumizu\": \"加山春水\",\n        \"kayama ikkaku\": \"加山一角\",\n        \"kayanagi takahiro\": \"芽薙隆裕\",\n        \"kayano\": \"茅乃\",\n        \"kayanoyuki\": \"kayanoyuki\",\n        \"kayura yuka\": \"かゆらゆか\",\n        \"kaz\": \"kaz\",\n        \"kazami aki\": \"風海聡\",\n        \"kazami rei\": \"KAZAMI澪\",\n        \"kazami ruk\": \"風見るく\",\n        \"kazamik\": \"風見圭\",\n        \"kazamitiu\": \"かざみちう\",\n        \"kazasuzu\": \"風鈴\",\n        \"kaze\": \"カゼ\",\n        \"kazekawa nagi\": \"風川なぎ\",\n        \"kazet\": \"かぜっと\",\n        \"kazeya\": \"風夜\",\n        \"kazu\": \"和\",\n        \"kazuboh\": \"KAZUBOH\",\n        \"kazuha\": \"kazuha\",\n        \"kazuhito\": \"かづひと\",\n        \"kazuki hiyori\": \"かずきひより\",\n        \"kazuki kaho\": \"香月かほ\",\n        \"kazuki yuu\": \"霞月由羽\",\n        \"kazum\": \"kazum\",\n        \"kazurasui\": \"かずらすい\",\n        \"kazushi\": \"一志\",\n        \"kazushirononko\": \"カズシロノンコ\",\n        \"kazutaro\": \"かずたろ\",\n        \"kazuto\": \"和斗\",\n        \"kazuwo daisuke\": \"カズヲダイスケ\",\n        \"kazuya\": \"カズヤ\",\n        \"kcccc\": \"kcccc\",\n        \"kebabuta\": \"けばブタ\",\n        \"kedai no kokoro\": \"懈怠の心\",\n        \"kedama\": \"けだま\",\n        \"kei\": \"慧\",\n        \"kei jiei\": \"けいじえい\",\n        \"kei kei\": \"啓々\",\n        \"kei natsu\": \"景夏\",\n        \"matumoto kei\": \"松本痙\",\n        \"keigen asuka\": \"蛍幻飛鳥\",\n        \"keiji\": \"けいじ\",\n        \"keijoh ayano\": \"圭条あやの\",\n        \"keiki\": \"けーき\",\n        \"keiko\": \"K子\",\n        \"keimi\": \"けいみ\",\n        \"keiryu\": \"keiryu\",\n        \"keishiki\": \"系式\",\n        \"keisuke\": \"Keisuke\",\n        \"keita\": \"蛍汰\",\n        \"keito\": \"圭斗\",\n        \"keke\": \"ケケ\",\n        \"kemoribbon\": \"けもりぼん\",\n        \"kemukemuke\": \"けむけむけ\",\n        \"kemushi\": \"けむし\",\n        \"ken tatuki\": \"剣辰輝\",\n        \"ken tsukikage\": \"ケン月影\",\n        \"ken-sya\": \"ken-sya\",\n        \"kenbouka\": \"KENBOUKA\",\n        \"kenmochi ena\": \"剣持えな\",\n        \"kenmomen\": \"けんもめん\",\n        \"kenpi\": \"けんぴ\",\n        \"kensuke\": \"拳介\",\n        \"kent\": \"KENT\",\n        \"kenta\": \"犬太\",\n        \"kentarou\": \"けんたろう\",\n        \"keny\": \"keny\",\n        \"kenzi\": \"kenzi\",\n        \"keoko\": \"けおこ\",\n        \"keraton\": \"ケラトン\",\n        \"kereno\": \"けれの\",\n        \"keroko\": \"けろこ\",\n        \"keso\": \"keso\",\n        \"kesupu\": \"ケスープ\",\n        \"ket\": \"KET\",\n        \"keta\": \"ケタ\",\n        \"ketama\": \"けたま\",\n        \"ketarou\": \"毛太郎\",\n        \"ketsudrum\": \"ケツドラム\",\n        \"keuma\": \"希有马\",\n        \"key\": \"きい\",\n        \"keyneq\": \"きーねく\",\n        \"kh\": \"KH\",\n        \"ki equals yuu\": \"キ=ユウ\",\n        \"ki-51\": \"ki-51\",\n        \"kiasa\": \"kiasa\",\n        \"kibimoca\": \"きびもか\",\n        \"kicchan\": \"きっちゃん\",\n        \"kichihachi\": \"きちはち\",\n        \"kichijouji kitashirou\": \"吉祥寺北四郎\",\n        \"kichiku hiroshi\": \"鬼畜広子\",\n        \"kidmo\": \"Kidmo\",\n        \"kidou muichi\": \"綺堂無一\",\n        \"kidouchi kon\": \"Kidouchi_Kon\",\n        \"kiduki erika\": \"季月えりか\",\n        \"kieyza\": \"喜栄座\",\n        \"kigetu miya\": \"キゲツミヤ\",\n        \"kigisuke\": \"木々助\",\n        \"kiguchi\": \"木口\",\n        \"kihinata hiroki\": \"希日向ひろき\",\n        \"kiiro\": \"きいろ\",\n        \"kiiro kurumi\": \"きいろくるみ\",\n        \"kijima hyougo\": \"鬼嶋兵伍\",\n        \"kijinaka mahiro\": \"雉中真裕\",\n        \"kijirushi\": \"キジルシ\",\n        \"kika\": \"きか\",\n        \"kiki\": \"kiki\",\n        \"kiki ryu\": \"貴騎琉\",\n        \"kikira\": \"ききら\",\n        \"kikkawa kabao\": \"吉川かば夫\",\n        \"kikkawa ryounei\": \"季川良寧\",\n        \"kikuchi tsutomu\": \"キクチツトム\",\n        \"kikuduki taro\": \"菊月太朗\",\n        \"kikuichi monji\": \"菊一もんじ\",\n        \"kikuno\": \"きくの\",\n        \"kikusui\": \"菊水\",\n        \"kikuta kouji\": \"菊田高次\",\n        \"kilie\": \"切絵\",\n        \"kiliu\": \"きぃう\",\n        \"killcy\": \"きるし\",\n        \"kim chii\": \"KIMちー\",\n        \"kima azusa\": \"鬼魔あづさ\",\n        \"kima-gray\": \"Kima-gray\",\n        \"kimagu\": \"きまぐ\",\n        \"kimakura\": \"きまくら\",\n        \"kimarin\": \"きまりん\",\n        \"kimi\": \"黄身\",\n        \"kimidori\": \"きみどり\",\n        \"kimidori iro\": \"樹碧唯旅\",\n        \"kimino yume\": \"君乃遊女\",\n        \"kimizuka aoi\": \"きみづか葵\",\n        \"kimobusa-j\": \"KIMOBUSA-J\",\n        \"kimotani\": \"胆谷\",\n        \"kimoto kanata\": \"きもとかなた\",\n        \"kimoto rai\": \"木本らい\",\n        \"kimrin\": \"機夢倫\",\n        \"kimura naoki\": \"樹村ナオキ\",\n        \"kimuraya izumi\": \"木村屋いづみi\",\n        \"kimuti\": \"きむち\",\n        \"kimuti-g\": \"KIMUTI-G\",\n        \"kinari\": \"きなり\",\n        \"kinata\": \"葵奈太\",\n        \"kinbakuman\": \"緊縛魔\",\n        \"kindatsu\": \"きんだつ\",\n        \"kine\": \"杵\",\n        \"kingindou yumeji\": \"琴吟どう夢路\",\n        \"kinka\": \"金夏\",\n        \"kinkoumori\": \"きんこうもり\",\n        \"kinniku shinkou\": \"筋肉信仰\",\n        \"kinntarou\": \"kinntarou\",\n        \"kino ayuri\": \"きのアユリ\",\n        \"kinohara hikaru\": \"きのはらひかる\",\n        \"kinoko\": \"Kinoko\",\n        \"kinoko dake\": \"きのこダケ\",\n        \"kinokuniya kanoko\": \"キノクニヤカノコ\",\n        \"kinosaki yuki\": \"木ノ崎由貴\",\n        \"kinoshita junichi\": \"きのした順市\",\n        \"kinoshita shashinkan\": \"木下写真館\",\n        \"kinouchi ai\": \"生之内あい\",\n        \"kinryuu\": \"禽竜\",\n        \"kinta\": \"金太\",\n        \"kinta mawaru\": \"きんたまわる\",\n        \"kintarou\": \"金たロウ\",\n        \"kintoki\": \"公時\",\n        \"kinuta kouji\": \"絹田コウジ\",\n        \"kippow\": \"キッポウ\",\n        \"kira boshi\": \"綺羅星\",\n        \"kira maru\": \"綺羅丸\",\n        \"kirara\": \"きらら\",\n        \"kirara moe\": \"きらら萌\",\n        \"kiri\": \"桐\",\n        \"kirigakure takaya\": \"きりがくれたかや\",\n        \"kirigirisu\": \"きりぎりす\",\n        \"kirihara futaha\": \"桐原ふたは\",\n        \"kirihara subako\": \"霧原すばこ\",\n        \"kirii nao\": \"桐井ナオ\",\n        \"kirikaze\": \"霧風\",\n        \"kirikiriya\": \"きりきりや\",\n        \"kirimia\": \"きりみあ\",\n        \"kirimoro\": \"きりもろ\",\n        \"kirin\": \"きりん\",\n        \"kirin kakeru\": \"木铃カケル\",\n        \"kirino kyousuke\": \"桐野キョウスケ\",\n        \"kiriri takanori\": \"霧李孝徳\",\n        \"kirisaki akihito\": \"霧咲空人\",\n        \"kirisaki mocori\": \"切裂モコリ\",\n        \"kirisawa shinji\": \"桐沢しんじ\",\n        \"kirisawa tokito\": \"きりさわときと\",\n        \"kirise\": \"キリセ\",\n        \"kirise mitsuru\": \"霧瀬ミツル\",\n        \"kirishima fuuki\": \"霧島ふうき\",\n        \"kirishima riona\": \"桐島りおな\",\n        \"kirishima shiroo\": \"霧島シロー\",\n        \"kiritachi\": \"キリタチ\",\n        \"kiritomo koroha\": \"霧巴ころは\",\n        \"kiriya\": \"霧也\",\n        \"kiriyama machi\": \"桐山マチ\",\n        \"kiriyama taichi\": \"キリヤマ太一\",\n        \"kirome\": \"きろめ\",\n        \"kirsi\": \"キルシー\",\n        \"kiryuu makoto\": \"騎竜まこと\",\n        \"kiryu masumi\": \"桐生真澄\",\n        \"kiryuu mina\": \"霧生実奈\",\n        \"kisa\": \"キサ\",\n        \"kisaki\": \"后\",\n        \"kisaki nana\": \"木崎七\",\n        \"kisaki noah\": \"希咲のあ\",\n        \"kisaki saki\": \"きさきさき\",\n        \"kisamu\": \"キサム\",\n        \"kisara ai\": \"きさら藍\",\n        \"kisara shi-\": \"キサラしぃ\",\n        \"kisaradu\": \"木更津\",\n        \"kisaragi\": \"如月\",\n        \"kisaragi kanata\": \"如月かなた\",\n        \"kisaragi mizu\": \"如月水\",\n        \"kisaragi mizuka\": \"如月瑞香\",\n        \"kisaragi moyu\": \"如月モユ\",\n        \"kisaragi neon\": \"如月ねおん\",\n        \"kisaragi sara\": \"如月沙良\",\n        \"kisaragi zwei\": \"如月ツヴァヰ\",\n        \"kishi kaisei\": \"旗幟灰星\",\n        \"kishi nisen\": \"騎士二千\",\n        \"kishida mel\": \"岸田メル\",\n        \"kishiguma toragorou\": \"岸熊虎五郎\",\n        \"kishikino\": \"きしきの\",\n        \"kishimasa\": \"きしまさ\",\n        \"kishimoto daisuke\": \"岸本大介\",\n        \"kishinosato satoshi\": \"岸里さとし\",\n        \"kisia\": \"きしあ\",\n        \"kisin juki\": \"姫心重機\",\n        \"kisirian\": \"kisirian\",\n        \"kisu yoshimitsu\": \"貴須ヨシミツ\",\n        \"kisugi\": \"きすぎ\",\n        \"kisunka\": \"kisunka\",\n        \"kisyuu naoyuki\": \"紀州直行\",\n        \"kitagawa kei\": \"きたがわけい\",\n        \"kitagawa ryuu\": \"きたがわ竜\",\n        \"kitakaze tsukasa\": \"北風つかさ\",\n        \"kitamiya genbu\": \"北宮弦武\",\n        \"kitamura hato\": \"北村鳩\",\n        \"kitamura tooru\": \"きたむらとおる\",\n        \"kitani ikari\": \"希谷一光\",\n        \"kitani sai\": \"木谷さい\",\n        \"kitao taki\": \"北尾タキ\",\n        \"kitaohji guranosuke\": \"北大路倉之介\",\n        \"kitatani uni\": \"北谷うに\",\n        \"kitayori minami\": \"きたよりみなみ\",\n        \"kitazato nawoki\": \"北里ナヲキ\",\n        \"kitoen\": \"鬼頭えん\",\n        \"kitoha\": \"きとは\",\n        \"kitsune\": \"きつね\",\n        \"kitsune tsuki\": \"狐憑き\",\n        \"kitsuneko anko\": \"狐古あんこ\",\n        \"kitto shibaru\": \"吉都しばる\",\n        \"kitty\": \"キ帝ィ\",\n        \"kiu\": \"希憂\",\n        \"kiwa\": \"きわ\",\n        \"kiwata\": \"木綿\",\n        \"kiyama shiro\": \"キヤマシロ\",\n        \"kiyan\": \"喜屋武\",\n        \"kiyo mori\": \"紀世盛\",\n        \"kiyokiba miyo\": \"清木場みよ\",\n        \"kizaki\": \"キザキ\",\n        \"kizaru\": \"黄猿\",\n        \"kizoku\": \"貴族\",\n        \"kkyz13\": \"Kkyz13\",\n        \"km\": \"KM\",\n        \"kni-droid\": \"Kにぃー\",\n        \"knight\": \"ナイト\",\n        \"knsk\": \"knsk\",\n        \"ko\": \"ko\",\n        \"ko tora\": \"小虎\",\n        \"ko-ri azuki\": \"氷あずき\",\n        \"ko.darts\": \"ko.darts\",\n        \"koala\": \"こあら\",\n        \"kobaji\": \"こばじ\",\n        \"kobako\": \"KOBAKO\",\n        \"kobanya koban\": \"孤蛮屋こばん\",\n        \"kobayashi hiyoko\": \"こばやしひよこ\",\n        \"kobayashi masakazu\": \"小林正和\",\n        \"kobayashi tetsuya\": \"コバヤシテツヤ\",\n        \"kobenza\": \"コベンザ\",\n        \"kobiyuun\": \"こびゆうん\",\n        \"kobucha\": \"昆布茶\",\n        \"kobuta no shinai\": \"こぶたのしない\",\n        \"koda masanov\": \"コダマサノブ\",\n        \"kodai heiki\": \"古代兵器\",\n        \"kodamashi\": \"kodamashi\",\n        \"kodeida\": \"こでぃだ\",\n        \"kodou\": \"コドウ\",\n        \"kodou kuji\": \"巨道空二\",\n        \"kodukue\": \"こづくえ\",\n        \"koe\": \"声\",\n        \"koga chiharu\": \"古蛾千春\",\n        \"koga rejini\": \"古賀れじに\",\n        \"koga yoshihisa\": \"胡河義久\",\n        \"kogakunama itohiro\": \"こがくなまイトヒロ\",\n        \"koganemushi\": \"こがねむし\",\n        \"kogawa masayoshi\": \"こがわまさよし\",\n        \"niiyama takashi\": \"古川やすし\",\n        \"koge neko\": \"こげねこ\",\n        \"kogma pierre\": \"こぐまピエール\",\n        \"koguma no joey\": \"こぐまのジョーイ\",\n        \"koguro masami\": \"小黒正巳\",\n        \"kohachi\": \"こはち\",\n        \"kohaku q\": \"こはくQ\",\n        \"koharu\": \"小春\",\n        \"koharuko\": \"こはるこ\",\n        \"kohinata ryou\": \"小日向 諒\",\n        \"kohitsuji\": \"こひつじ\",\n        \"kohri ms\": \"こおりみず\",\n        \"koike sadaji\": \"小池定路\",\n        \"koishikawa\": \"小石川\",\n        \"koishikawa hibiki\": \"小石川響\",\n        \"kojika\": \"こじか\",\n        \"kojima\": \"kojima\",\n        \"kojima aya\": \"こじまあや\",\n        \"kojima shoutarou\": \"小島祥太朗\",\n        \"kojiro izuta\": \"神代イヅタ\",\n        \"kojou\": \"kojou\",\n        \"koke\": \"こけ\",\n        \"koken\": \"こけん\",\n        \"kokeshi men\": \"こけし☆メン\",\n        \"kokiri\": \"コキリ\",\n        \"kokka\": \"こっか\",\n        \"koko\": \"呱呱\",\n        \"kokonoe yomogi\": \"ここのえ蓬\",\n        \"kokonoka\": \"ここのか\",\n        \"kokori\": \"ここり\",\n        \"kokujin\": \"黒人\",\n        \"kokumaro\": \"こくまろ\",\n        \"kokuu rikishi\": \"虚空力士\",\n        \"kolgha\": \"コルガー\",\n        \"kom\": \"Kom\",\n        \"koma\": \"KOMA\",\n        \"komac\": \"鼓膜\",\n        \"komagata\": \"狛形\",\n        \"komaki ren\": \"小巻恋\",\n        \"komaki tamotsu\": \"小牧保\",\n        \"komakichi\": \"こまきち\",\n        \"komame\": \"こまめ\",\n        \"komamemaru\": \"こまめ丸\",\n        \"komano mako\": \"狛野まこ\",\n        \"komaru\": \"こまる\",\n        \"kome\": \"こめ\",\n        \"kome dorobou\": \"米泥棒\",\n        \"kome tsubu\": \"こめつぶ\",\n        \"komechu\": \"こめちゅー\",\n        \"komeko\": \"komeko\",\n        \"kometanuki\": \"米たぬき\",\n        \"komichi\": \"こみち\",\n        \"komihisa\": \"こみひさ\",\n        \"kominato takuya\": \"小湊拓也\",\n        \"komon\": \"コモン\",\n        \"komori kaeru\": \"小森かえる\",\n        \"komori kiyoka\": \"小森キヨカ\",\n        \"komotoda emai\": \"小本田絵舞\",\n        \"komugi\": \"こむぎ\",\n        \"komura keita\": \"こむらけいた\",\n        \"komura saki\": \"小邑紗希\",\n        \"komuro\": \"コムロ\",\n        \"komusou\": \"こむそう\",\n        \"kona\": \"KONA\",\n        \"kona matsu\": \"粉末\",\n        \"konako\": \"こなこ\",\n        \"konata gazel\": \"此方がぜる\",\n        \"konayama kata\": \"粉山カタ\",\n        \"konboi\": \"KONBOI\",\n        \"kondom\": \"昆童虫\",\n        \"konecha\": \"こね茶\",\n        \"konkon\": \"KON-KON\",\n        \"konmori\": \"こんもり\",\n        \"konno chikata\": \"紺野チカ太\",\n        \"konnyaku yukko\": \"蒟蒻ゆっこ\",\n        \"kono\": \"河野\",\n        \"konode minoru\": \"このでみのる\",\n        \"konoi iko\": \"木井いこ\",\n        \"konoma waho\": \"このま和歩\",\n        \"konshin\": \"魂神\",\n        \"konsome\": \"コンソメ\",\n        \"koohii inu\": \"珈琲犬\",\n        \"koorogi\": \"コオロギ\",\n        \"koppamu\": \"こっぱむ\",\n        \"korikku\": \"コリック\",\n        \"korikori takeya\": \"こりこりタケヤ\",\n        \"korisei\": \"孤裡精\",\n        \"korisu\": \"こりす\",\n        \"koro\": \"ころ\",\n        \"koromia\": \"ころみあ\",\n        \"koromo\": \"衣\",\n        \"korone shousa\": \"コロね少佐\",\n        \"korotasuke\": \"コロ太助\",\n        \"korotsuke\": \"コロツケ\",\n        \"koruri\": \"こるり\",\n        \"koryu misato\": \"湖竜美里\",\n        \"kosa\": \"こさ\",\n        \"kosakai\": \"kosakai\",\n        \"koshika rina\": \"小鹿りな\",\n        \"koshimura\": \"越村\",\n        \"kosuge yuutarou\": \"小菅勇太郎\",\n        \"kosugi koutarou\": \"小杉光太郎\",\n        \"kosuke\": \"小助\",\n        \"kosuzu\": \"小鈴\",\n        \"kota\": \"耕太 | コタ | こた(炬太郎) | kota´\",\n        \"kotaru\": \"瑚樽\",\n        \"kotatsu\": \"虎龍\",\n        \"kotatsu tomodachi\": \"コタツトモダチ\",\n        \"koto\": \"koto\",\n        \"kotobuki\": \"kotobuki\",\n        \"kotobuki hajime\": \"ことぶきはじめ\",\n        \"kotobuki maimu\": \"ことぶきまいむ\",\n        \"kotobuki ringo\": \"寿りんご\",\n        \"kotobuki utage\": \"寿宴\",\n        \"kotoduki z\": \"琴月絶人\",\n        \"kotoeri iroha\": \"ことえりいろは\",\n        \"kotogi raura\": \"虎兎木蘭浦\",\n        \"kotojima motoki\": \"琴島もとき\",\n        \"kotomuke fuurin\": \"平国風鈴\",\n        \"kotono wakako\": \"琴の若子\",\n        \"kotori aiko\": \"コトリアイコ\",\n        \"kotou ichigou\": \"小嶌一豪\",\n        \"kotowari\": \"理\",\n        \"kotsumudi\": \"こつむぢ\",\n        \"kou\": \"孝\",\n        \"kou1\": \"こう1\",\n        \"kouba\": \"こうば\",\n        \"kouduki miyabi\": \"神月みやび\",\n        \"koudzuki shinobu\": \"たまご\",\n        \"kouenji marimo\": \"高円寺まりも\",\n        \"kouenji rei\": \"紅園寺麗\",\n        \"kougami\": \"鴻上\",\n        \"kougi\": \"KOUGI\",\n        \"kouguchi moto\": \"工口本\",\n        \"kouhaku\": \"紅白\",\n        \"kouma hidehito\": \"慌麻秀仁\",\n        \"koume satsuki\": \"小梅さつき\",\n        \"koumorikaizin\": \"こうもり貝人\",\n        \"koumoto nami\": \"河本那美\",\n        \"kouno kei\": \"光野けい\",\n        \"kouno mai\": \"香野舞\",\n        \"kouno mizuho\": \"紅野瑞穂\",\n        \"kouno you\": \"河野曜\",\n        \"kounose akara\": \"神瀬あから\",\n        \"kounosu\": \"こうのす\",\n        \"kouri\": \"木鈴カケル\",\n        \"kousaka donten\": \"高坂曇天\",\n        \"kousaki\": \"光崎\",\n        \"kou siryou\": \"黄支亮\",\n        \"kousoku\": \"光燭\",\n        \"koutarosu\": \"コウタロス\",\n        \"koutei\": \"皇帝\",\n        \"koutei penko\": \"校庭ぺん子\",\n        \"kouyou sakaki\": \"后謡榊\",\n        \"kouzaka kouhei\": \"神坂公平\",\n        \"koyama ichi\": \"こやまいち\",\n        \"koyama tomosato\": \"こやまともさと\",\n        \"koyama unkaku\": \"小山雲鶴\",\n        \"koyasu kazu\": \"子安和\",\n        \"koyomisa\": \"こよみさ\",\n        \"kozakura botan\": \"小桜ぼたん\",\n        \"kozakura ryou\": \"小桜りょう\",\n        \"kozara\": \"小皿\",\n        \"kozi\": \"kozi\",\n        \"kozirow\": \"Kozirow\",\n        \"kozou\": \"小僧\",\n        \"kozue akari\": \"こずえあかり\",\n        \"kozy\": \"kozy\",\n        \"krohudeanna\": \"黒筆ANnA\",\n        \"ksg\": \"ksg\",\n        \"ksheera\": \"ksheera\",\n        \"kso\": \"けそ\",\n        \"kswazza\": \"くすわZZA\",\n        \"kty\": \"KTY\",\n        \"ktzw\": \"ktzw\",\n        \"ku-ba\": \"ku-ba\",\n        \"kubota chihiro\": \"久保田チヒロ\",\n        \"kubyou azami\": \"九猫あざみ\",\n        \"kudou\": \"クドウ\",\n        \"kudou shino\": \"工藤詩乃\",\n        \"kudou taizou\": \"工藤大蔵\",\n        \"kuga mingo\": \"久我みんご\",\n        \"kugayama hodai\": \"久我山砲台\",\n        \"kugelschreiber\": \"くーげるしゅれいばー\",\n        \"kujira sanbiki\": \"くじら三匹\",\n        \"kujiran\": \"くぢらん\",\n        \"kujou shirei\": \"九条志玲\",\n        \"kuju shikuro\": \"苦渋しくろ\",\n        \"kukuru\": \"KKR\",\n        \"kuloamaki\": \"黒天姫\",\n        \"kuma\": \"くま\",\n        \"kumacchi\": \"くまっち\",\n        \"kumada kazushi\": \"熊田一司\",\n        \"kumagai hachi\": \"くまがいはち\",\n        \"kumagaya nerico\": \"熊谷ネリコ\",\n        \"kumagaya shin\": \"熊谷しん\",\n        \"kumaki toshikazu\": \"熊木十志和\",\n        \"kumakichi\": \"熊吉\",\n        \"kumano kotaro\": \"くまのこたろ\",\n        \"kumao\": \"く魔王\",\n        \"kumasaku tamizou\": \"クマ作民三\",\n        \"kumashiro\": \"くましろ\",\n        \"kumatora tatsumi\": \"熊虎たつみ\",\n        \"kumatyu\": \"クマチュウ\",\n        \"kumicho\": \"くみちょー\",\n        \"kumimon\": \"kumimon\",\n        \"kumisan\": \"くみさん\",\n        \"kumoi takashi\": \"菅野タカシ\",\n        \"kunaboto\": \"クナボト\",\n        \"kuni\": \"クニ\",\n        \"kunifuto\": \"くにふと\",\n        \"kunoichi\": \"くノ壱\",\n        \"kawahara reki\": \"川原砾\",\n        \"kuonji hodaka\": \"久遠路火鷹\",\n        \"kupala\": \"Kupala\",\n        \"kura oh\": \"蔵王\",\n        \"kurabayashi\": \"倉林\",\n        \"kurada\": \"蔵田\",\n        \"kuragari\": \"くらがり\",\n        \"kuragi\": \"蔵儀\",\n        \"kuraki hiro\": \"椋木尋\",\n        \"kurakino issiki\": \"椋木野一式\",\n        \"kurakumo nue\": \"黒雲鵺\",\n        \"kuramachi bun\": \"蔵街ぶん\",\n        \"kurami\": \"蔵見\",\n        \"kuramoto keizou\": \"蔵本鶏蔵\",\n        \"kurano yuuichi\": \"倉野ユウイチ\",\n        \"kuraoka aki\": \"倉岡亜妃\",\n        \"kurasaki aya\": \"倉崎あや\",\n        \"kurasawa kyosyo\": \"倉澤京章\",\n        \"kurata ichiro\": \"倉田いち朗\",\n        \"kurata muto\": \"倉田むと\",\n        \"kurata shinji\": \"倉田シンジ\",\n        \"kuratsuka riko\": \"倉塚りこ\",\n        \"kuraya\": \"蔵屋\",\n        \"kure\": \"くれ\",\n        \"kure ichirou\": \"くれいちろう\",\n        \"kure shikure\": \"久澪しくれ\",\n        \"kureha mitsushige\": \"自遊本舗「宇」\",\n        \"kureha yosho\": \"くれは洋書\",\n        \"kurei daisuke\": \"暮井大助\",\n        \"kurenami yuuji\": \"暮浪夕時\",\n        \"kuresato yoshiaki\": \"暮里良昭\",\n        \"kureta fumiaki\": \"呉田文明\",\n        \"kureura keita\": \"暮浦鶏太\",\n        \"kuri\": \"栗\",\n        \"kurikama\": \"くりかま\",\n        \"kuriki\": \"kuriki\",\n        \"kurisu\": \"くりす\",\n        \"chris tina\": \"栗栖ティナ\",\n        \"kuro\": \"KURO\",\n        \"kuro hiyoko\": \"黒ひよこ\",\n        \"kuro itachi\": \"黒イタチ\",\n        \"kuro koshou\": \"黒胡椒\",\n        \"kuro oolong\": \"黒烏龍\",\n        \"kuro tengu\": \"黒てんぐ\",\n        \"kuro yorozu\": \"くろよろず\",\n        \"kuroama\": \"黒甘\",\n        \"kuroarama soukai\": \"黒荒馬双海\",\n        \"kurocastle\": \"黒城\",\n        \"kurocazenosora\": \"黒風ノ空\",\n        \"kuroda\": \"黒田\",\n        \"kuroda akimi\": \"黒田晶見\",\n        \"kurodou katana\": \"黒堂カタナ\",\n        \"kurogane\": \"くろがね\",\n        \"kurogane riku\": \"鐵陸\",\n        \"kurogane satsuki\": \"黒金さつき\",\n        \"kuroha nue\": \"クロハぬえ\",\n        \"kuroha rapid\": \"黒羽ラピッド\",\n        \"kurohagane\": \"クロハガネ\",\n        \"kurohekiten\": \"黒碧天\",\n        \"kuroi inu\": \"黒い犬\",\n        \"kuroi kingyo\": \"黒井きんぎょ\",\n        \"kuroi moyamoya\": \"黒井もやもや\",\n        \"kuroichiba\": \"くろいちば\",\n        \"kuroie\": \"黒家\",\n        \"kuroihi\": \"くろいひ\",\n        \"kuroinu\": \"くろ犬\",\n        \"kurokari nigou\": \"黒狩弐号\",\n        \"kurokawa girito\": \"黒川ギリト\",\n        \"kurokawa izumi\": \"黒川 IZUMI\",\n        \"kurokawa juso\": \"黒川呪詛\",\n        \"kurokawa rikuu\": \"黒川律空\",\n        \"kurokawa ryu\": \"黒川竜\",\n        \"kurokawa tasuku\": \"黒川たすく\",\n        \"kurokaze hanare\": \"黒風離零\",\n        \"kuroki bicoco\": \"黒木ビココ\",\n        \"kuroki masahiro\": \"黒木雅弘\",\n        \"kurokishi\": \"黒騎士\",\n        \"kuroko\": \"クロ子\",\n        \"kurokura eri\": \"黒倉エリ\",\n        \"kurokuro\": \"くろくろ\",\n        \"kurokuroku\": \"黒九六\",\n        \"kuromame\": \"クロマメ\",\n        \"kuromame mugicha\": \"黑豆麦茶\",\n        \"kuromi\": \"kuromi\",\n        \"kuromitu\": \"kuromitu\",\n        \"kuromiya sakana\": \"黒宮魚\",\n        \"kuromogu\": \"黒モグ\",\n        \"kuromoinu no kemono\": \"黒藻犬の獣\",\n        \"kurona\": \"くろな\",\n        \"kuroneko nigou\": \"黒猫弐号\",\n        \"kuroneko reigou\": \"黒猫零号\",\n        \"kuronezumi\": \"くろねズみ\",\n        \"kurono masakado\": \"黒乃マサカド\",\n        \"kurono rokurou\": \"黒野六郎\",\n        \"kuroore\": \"黒俺\",\n        \"kurosai\": \"黒齋\",\n        \"kurosaki bunta\": \"黒崎文太\",\n        \"kurosaki kotora\": \"黒崎仔虎\",\n        \"kurosaki mairi\": \"黒崎まいり\",\n        \"kurosaki yuuri\": \"黒崎 百利\",\n        \"kurosawa\": \"クロサワ\",\n        \"kurosawa shouhei\": \"黒沢庄平\",\n        \"kuroshiki\": \"玄式\",\n        \"kurosirogurei\": \"黒白ぐれい\",\n        \"kurosu\": \"黒須\",\n        \"kurosuke\": \"黒すけ\",\n        \"kurota\": \"くろた\",\n        \"kurota nichiru\": \"黒田にちる\",\n        \"kurotama\": \"くろたま\",\n        \"kuroto\": \"黑斗\",\n        \"kurotsuki\": \"黑月\",\n        \"kurotsuki kyouto\": \"黒月京都\",\n        \"kurouku\": \"くろーく\",\n        \"kuroya kenji\": \"黒谷賢志\",\n        \"kuroyume naoto\": \"黒夢奈音\",\n        \"kurozako\": \"くろざこ\",\n        \"kurukuru\": \"クルクル\",\n        \"kuruma\": \"くるま\",\n        \"kurumai\": \"くるまい\",\n        \"kurumi moka\": \"胡桃もか\",\n        \"kurumi riko\": \"胡桃りこ\",\n        \"kurushima\": \"くるしま\",\n        \"kurusu kanon\": \"来栖かのん\",\n        \"kurutsuki\": \"KURUTSUKI\",\n        \"kuruwa aki\": \"くるわ亜希\",\n        \"kusabi keri\": \"楔ケリ\",\n        \"kusahara kuuki\": \"草原空貴\",\n        \"kusairo kaede\": \"草色楓\",\n        \"kusaka maichi\": \"駆坂真一\",\n        \"kusakabe tsukasa\": \"日下部つかさ\",\n        \"kusakami akira\": \"草上明\",\n        \"kusanagi ryuuiti\": \"草薙龍一\",\n        \"kusanagi tonbo\": \"草凪蜻蛉\",\n        \"kusano houki\": \"草野ほうき\",\n        \"kusano tsuyuri\": \"草野つゆり\",\n        \"kushida ashura\": \"くしだあしゅら\",\n        \"kushikatsu koumei\": \"串カツ孔明\",\n        \"kushinada iruwe\": \"櫛灘ゐるゑ\",\n        \"kusnoha kaede\": \"くすのは楓\",\n        \"kusugano\": \"我野\",\n        \"kusunoki hina\": \"楠木ひな\",\n        \"kusunoki rin\": \"楠木りん\",\n        \"kusurin\": \"くすりん\",\n        \"kutsugen kanna\": \"屈原神無\",\n        \"kuurin\": \"空輪\",\n        \"kuusou\": \"空想\",\n        \"kuuya\": \"空也\",\n        \"kuwabara\": \"くわばら\",\n        \"kuwabatake kajuen\": \"桑畑果樹園\",\n        \"kuzirazio\": \"くじらジオ\",\n        \"kuzu\": \"屑\",\n        \"kuzukow\": \"屑コウ\",\n        \"kuzuya\": \"くずや\",\n        \"kuzuyama mememe\": \"屑山めめめ\",\n        \"kuzuyu\": \"葛湯\",\n        \"kuzzy\": \"くっじー\",\n        \"ky.\": \"ky.\",\n        \"kyanite\": \"Kyanite\",\n        \"kyantama\": \"きゃんたま\",\n        \"kyantaman\": \"きゃんたマン\",\n        \"kyarine\": \"きゃりね\",\n        \"kyawashuku\": \"きゃわしゅく\",\n        \"kyohei\": \"KYOHEI\",\n        \"kyokkai\": \"曲解\",\n        \"kyoko\": \"響胡\",\n        \"kyokugeiteki jiisha\": \"曲芸的自慰者\",\n        \"kyokutyo\": \"kyokutyo\",\n        \"kyolnov\": \"キョルノフ\",\n        \"kyoro\": \"きょろ\",\n        \"kyosu\": \"キョス\",\n        \"kyou\": \"kyou\",\n        \"kyou konogoro\": \"kyouこの頃\",\n        \"kyouan\": \"狭暗\",\n        \"kyouka\": \"狂華\",\n        \"kyouno aki\": \"京野秋\",\n        \"kyouta\": \"きょう太\",\n        \"kyouyuu kei\": \"叫遊佳\",\n        \"kyuri\": \"kyuri\",\n        \"kyusui\": \"吸水\",\n        \"kyuun\": \"きゅうん\",\n        \"kyuunosuke\": \"きゅうのすけ\",\n        \"kyuuri\": \"kyuuri\",\n        \"kyuuryuujousai\": \"九龍城砦\",\n        \"kyuusho tarou\": \"急所太郎\",\n        \"kyuushoku\": \"給食\",\n        \"l apple\": \"Lアップル\",\n        \"l-road\": \"エルロード\",\n        \"l-s\": \"L-S\",\n        \"la-men\": \"LA-MEN\",\n        \"lact mangan\": \"楽人満願\",\n        \"lakuhito\": \"lakuhito\",\n        \"lamb\": \"Lamb\",\n        \"lamcha\": \"ラム茶\",\n        \"langerhans\": \"ランゲルハンス\",\n        \"lantana\": \"ランタナ\",\n        \"laomeng\": \"LaoMeng\",\n        \"lapiness\": \"lapiness\",\n        \"larua\": \"ラルア\",\n        \"laserflip\": \"Laserflip\",\n        \"lassie\": \"らっしー\",\n        \"laut 2-sei\": \"ラウト2世\",\n        \"lay dragon\": \"零龍\",\n        \"lazu\": \"Lazu\",\n        \"lazuli\": \"らずり\",\n        \"lbl\": \"LBL\",\n        \"leaf\": \"Leaf\",\n        \"leafy\": \"リーフィ\",\n        \"lee\": \"LEE\",\n        \"lefleau\": \"ルフレ王\",\n        \"lefthand\": \"レフトハンド\",\n        \"leli\": \"レリ\",\n        \"lem\": \"LEM\",\n        \"lemon jiru\": \"レモン汁\",\n        \"lena a-7\": \"LENA[A-7]\",\n        \"lento\": \"蓮斗\",\n        \"leonardo\": \"れオナるド\",\n        \"leonat\": \"レオナト\",\n        \"leopard\": \"レオパルド\",\n        \"leopon\": \"れおぽん\",\n        \"level.21\": \"Level.21\",\n        \"lew\": \"レゥ\",\n        \"lewis\": \"ルイス\",\n        \"lewis mclaren\": \"るいす・まくられん\",\n        \"leymei\": \"LEYMEI\",\n        \"liang xing\": \"狼星\",\n        \"libonzu\": \"吉啓\",\n        \"lielos\": \"ゆいれそ\",\n        \"lien\": \"Lien\",\n        \"like\": \"Like\",\n        \"lilish\": \"lilish\",\n        \"lime\": \"Lime\",\n        \"lina\": \"Lina\",\n        \"lionel\": \"ライオネル\",\n        \"littlemare\": \"リトルメア\",\n        \"liveis watanabe\": \"リーバイス渡辺\",\n        \"llm\": \"LLM\",\n        \"locon\": \"locon\",\n        \"locos\": \"ろこす\",\n        \"lod\": \"Lod\",\n        \"logie\": \"路地\",\n        \"lolee\": \"炉LEE\",\n        \"loliconder\": \"ロリコンダー\",\n        \"lolie\": \"ろりえ\",\n        \"lolimoyashi\": \"ろりもやし\",\n        \"lond\": \"ろんど\",\n        \"lopez hakkinen\": \"ロペス・ハッキネン\",\n        \"loriko\": \"Loriko\",\n        \"lowhide\": \"ろーはいど\",\n        \"luchi\": \"ルーチ\",\n        \"lucie\": \"ルーシー\",\n        \"luck\": \"らっく\",\n        \"lucknight\": \"Lucknight\",\n        \"luka\": \"ルカ\",\n        \"luku\": \"る～く\",\n        \"lummy\": \"Lummy\",\n        \"lumper sheider\": \"LumperSheider\",\n        \"luphis\": \"luphis\",\n        \"lurkergg\": \"Contact\",\n        \"lutein\": \"Lutein\",\n        \"luu\": \"Luu\",\n        \"lux\": \"Lux\",\n        \"luxianne\": \"Contact\",\n        \"lvi\": \"LVI\",\n        \"m\": \"M\",\n        \"m-max\": \"M-MAX\",\n        \"m2go\": \"M2号\",\n        \"m9kndi\": \"m9kndi\",\n        \"ma-yu\": \"ma-yu\",\n        \"mabo\": \"マボ\",\n        \"maboku\": \"魔ボク\",\n        \"mabuchoko m\": \"マブチョコ M\",\n        \"mac-v\": \"MAC-V\",\n        \"macanoka\": \"マカノカ\",\n        \"macaroni\": \"まかろに\",\n        \"maccha\": \"抹茶\",\n        \"maccha chamomo\": \"抹茶ちゃもも\",\n        \"maccha neji\": \"抹茶ねじ\",\n        \"maccha vanilla\": \"抹茶バニラ\",\n        \"macchaume\": \"抹茶梅\",\n        \"macchi\": \"まっち\",\n        \"macchuu\": \"まっちゅう\",\n        \"machi\": \"マチ\",\n        \"machi gaita\": \"街凱太\",\n        \"machi machiko\": \"町マチコ\",\n        \"machigi ruru\": \"街樹るる\",\n        \"machimura komori\": \"町村こもり\",\n        \"machine head\": \"Machine Head\",\n        \"machino henmaru\": \"町野変丸\",\n        \"macho.\": \"マッチョ。\",\n        \"maclo\": \"まっ黒\",\n        \"macop\": \"Macop\",\n        \"madae thor\": \"未江達\",\n        \"madara\": \"まだら\",\n        \"madara sai\": \"まだらさい\",\n        \"mado\": \"まど\",\n        \"madohan\": \"まどはん\",\n        \"madoka hifumi\": \"まどかひふみ\",\n        \"mae\": \"前\",\n        \"maeda\": \"まえだ\",\n        \"maeda momo\": \"まえだもも\",\n        \"maeguchi syunzou\": \"前口俊三\",\n        \"maekawa hayato\": \"前川ハヤト\",\n        \"mag\": \"MAG\",\n        \"mage\": \"mage\",\n        \"magic xiang\": \"Magic_Xiang\",\n        \"magiko\": \"マギコ\",\n        \"magokoro kurage\": \"まごころくらげ\",\n        \"magorona\": \"まごろな\",\n        \"magpoppo\": \"まぐぽっぽ\",\n        \"magtan\": \"まぐたん\",\n        \"magu\": \"マグ\",\n        \"maguro ouji\": \"真黒皇子\",\n        \"maguro taishi\": \"マグロ大使\",\n        \"mahan.\": \"まはん。\",\n        \"mahimaru\": \"まひまる\",\n        \"mahiruno kagerou\": \"まひるの影郎\",\n        \"maho\": \"真秀\",\n        \"mahouya\": \"魔法屋\",\n        \"mai\": \"MAI\",\n        \"myrage\": \"舞麗辞\",\n        \"mai renjie\": \"麥人杰\",\n        \"maihara\": \"まいはら\",\n        \"maihime\": \"舞姫\",\n        \"maino\": \"マイノ\",\n        \"maino umi\": \"まいのうみ\",\n        \"maitake\": \"まいたけ\",\n        \"maji\": \"マジ\",\n        \"majiyoko\": \"まじよこ\",\n        \"maka kiseki\": \"マカキセキ\",\n        \"makano mucchi\": \"摩訶乃ムッチ\",\n        \"makarou\": \"まかろー\",\n        \"suta furachina\": \"スター不埒な＠まかそに\",\n        \"make\": \"make\",\n        \"makedon\": \"まけどん\",\n        \"maki\": \"まき\",\n        \"maki katsuya\": \"勝生真菜美\",\n        \"maki miyuki\": \"牧美雪\",\n        \"maki morun\": \"槙モルン\",\n        \"makiavery\": \"牧亜べりぃ\",\n        \"makigai ikko\": \"巻貝一ヶ\",\n        \"makimaru\": \"巻丸\",\n        \"makinaru\": \"まきなる\",\n        \"makinon tm\": \"まきのんTM\",\n        \"makinosaka shinichi\": \"牧野坂シンイチ\",\n        \"makirin\": \"まきリン\",\n        \"makishi miya\": \"槇志未夜\",\n        \"makita aoi\": \"魔北葵\",\n        \"makita miki\": \"蒔田ミキ\",\n        \"makka\": \"makka\",\n        \"makka na kedamono\": \"真っ赤なケダモノ\",\n        \"makko reader\": \"maッコ・リーダー\",\n        \"makkuro\": \"まっ黒\",\n        \"makomo ashino\": \"まこも葦乃\",\n        \"makoni\": \"makoni\",\n        \"makoto daikichi\": \"まこと大吉\",\n        \"makoushi\": \"魔公子\",\n        \"makpower\": \"Makpower\",\n        \"makui\": \"幕井\",\n        \"makuma ikeru\": \"マ熊イケル\",\n        \"makunouchi\": \"幕野内\",\n        \"makunouchi isami\": \"幕の内勇\",\n        \"makura cover\": \"枕河馬亜\",\n        \"makura no doushi\": \"まくらの同士\",\n        \"makuwa\": \"ま・くわ\",\n        \"malaia\": \"マライぁ\",\n        \"malino\": \"MALINO\",\n        \"maluball\": \"毛玉丸\",\n        \"mam melon\": \"まむめろん\",\n        \"mamaka\": \"麻々花\",\n        \"mame\": \"豆\",\n        \"mame-p\": \"まめP\",\n        \"mamedanuki\": \"まめだぬき\",\n        \"mami\": \"まみ\",\n        \"mamiya\": \"マミヤ\",\n        \"mamiya noriko\": \"間宮法子\",\n        \"mamiya poko\": \"まみやぽこ\",\n        \"mamiya shouko\": \"間宮庄子\",\n        \"mamo\": \"MAMO\",\n        \"mamoi\": \"まもぃ\",\n        \"mamono karin\": \"まものかりん\",\n        \"mamoribito\": \"守り人\",\n        \"mamuru\": \"mamuru\",\n        \"man\": \"mAn\",\n        \"manabe jouji\": \"真鍋譲治\",\n        \"manaka mizuki\": \"マナカミズキ\",\n        \"manao\": \"まなお\",\n        \"manarou\": \"まなろう\",\n        \"manatsu roco\": \"真夏ろこ\",\n        \"manboren\": \"まんぼん練\",\n        \"mance\": \"まんす\",\n        \"manekineko\": \"マネキ猫\",\n        \"mangetsu pon\": \"満月ポン\",\n        \"mangosteen\": \"マンゴスチン\",\n        \"manjiro\": \"まんじろー\",\n        \"manjuurou\": \"まんじゅうろう\",\n        \"manle\": \"マンル\",\n        \"manmosu marimo\": \"マンモスまりも\",\n        \"mao\": \"真尾\",\n        \"mao fabao\": \"猫法宝\",\n        \"mao no\": \"MAOの\",\n        \"maomi leon\": \"真臣レオン\",\n        \"map\": \"まっぷ\",\n        \"maple-go\": \"maple号\",\n        \"mappa\": \"まっぱ\",\n        \"mapputatsu\": \"マップタツ\",\n        \"marble\": \"マーブル\",\n        \"mare halberd eye\": \"メアー・ハルベルト・アイ\",\n        \"mareo\": \"まれお\",\n        \"margamoid\": \"まーがもいど\",\n        \"maria\": \"まりあ\",\n        \"marianne hanako\": \"マリアンヌ花子\",\n        \"marika\": \"まりか\",\n        \"marimo\": \"マリモ\",\n        \"marin\": \"まりる\",\n        \"marinade vinegar\": \"マリネ・ビネガー\",\n        \"mario kaneda\": \"まりお金田\",\n        \"maripyon\": \"まりぴょん\",\n        \"maririn\": \"まりりん\",\n        \"maririn anaka\": \"マリリンあなか\",\n        \"marlin\": \"まーりん\",\n        \"marron\": \"魔龍\",\n        \"martan\": \"まあたん\",\n        \"maru\": \"マル\",\n        \"maru dasshu\": \"まるだっしゅ\",\n        \"maru mary\": \"墨丸まり\",\n        \"maru mikan\": \"○蜜柑\",\n        \"maru sun\": \"まるサン\",\n        \"maru.\": \"まる。\",\n        \"marubayashi shumaru\": \"○林修○\",\n        \"marugoto ringo\": \"まるごと林檎\",\n        \"maruhage p\": \"丸禿P\",\n        \"marui\": \"まるい\",\n        \"marui ryuu\": \"まるいりゅう\",\n        \"marukidou\": \"まるキ堂\",\n        \"marukome\": \"まるこめ\",\n        \"maruma\": \"まるま\",\n        \"marumarusuke\": \"まる丸介\",\n        \"marumi\": \"丸美\",\n        \"marumu\": \"まるむ\",\n        \"maruna\": \"まるな\",\n        \"marunosuke\": \"まるのすけ\",\n        \"marupuni\": \"まるぷに\",\n        \"marurou\": \"まるろう\",\n        \"marurumi\": \"まるるみ\",\n        \"maruto\": \"Maruto!\",\n        \"maruyama kaori\": \"まるやま香里\",\n        \"maruyama kei\": \"丸山圭\",\n        \"masa\": \"将\",\n        \"masa-nii\": \"マサ兄\",\n        \"masaki\": \"MASAKI\",\n        \"masaki shisari\": \"真咲シサリ\",\n        \"masakichi\": \"まさきち\",\n        \"masama\": \"まさma\",\n        \"masamu\": \"マサムー\",\n        \"masanaga\": \"政长\",\n        \"masara\": \"まさら\",\n        \"masaya ichika\": \"磨鞘一佳\",\n        \"masayoshi tomoko\": \"まさよしともこ\",\n        \"masbe akyto\": \"まそべ晶磨\",\n        \"masha\": \"masha\",\n        \"mashikodori\": \"ましこどり\",\n        \"mashiro\": \"ましろ\",\n        \"mashitaka\": \"ましたか\",\n        \"mashu maro\": \"真朱麻呂\",\n        \"mashune\": \"MASHUNE\",\n        \"mask the j\": \"マスクザJ\",\n        \"massan\": \"まっさん\",\n        \"masuda tsuyoshi\": \"増田剛\",\n        \"masuishi kinoto\": \"桝石きのと\",\n        \"masujima kensue\": \"ますじまけんすー\",\n        \"masumasu\": \"ますます\",\n        \"masurao\": \"ますらお\",\n        \"matashita kintama\": \"股下金珠\",\n        \"matatabi\": \"またたび\",\n        \"match\": \"マッチ\",\n        \"matetsu\": \"まてつ\",\n        \"mato\": \"まと\",\n        \"matoba\": \"的場\",\n        \"maton\": \"マトン\",\n        \"matou\": \"まとう\",\n        \"matra-mica\": \"MATRA-MICA\",\n        \"matrix one\": \"ロジャー・マンゴー\",\n        \"matsubara kanabun\": \"松原かなぶん\",\n        \"matsubayashi nagana\": \"松林ながな\",\n        \"matsubayashi satoru\": \"松林悟\",\n        \"matsuda eine\": \"松田えいね\",\n        \"matsue\": \"まつえー\",\n        \"matsuka\": \"松果\",\n        \"matsukura nemu\": \"松倉ねむ\",\n        \"matsumoto akira\": \"松本英\",\n        \"matsumoto himiko\": \"松本姫美子\",\n        \"matsumoto inaki\": \"松本いなき\",\n        \"matsumoto katsuya\": \"まつもとかつや\",\n        \"matsumoto mimiko\": \"松本耳子\",\n        \"matsumoto mitohi.\": \"松本ミトヒ。\",\n        \"matsunaga garana\": \"松永がらな\",\n        \"matsunaga hijiri\": \"松永ヒジリ\",\n        \"matsunoan\": \"松之庵\",\n        \"matsuo\": \"松雄\",\n        \"matsuri\": \"まつり\",\n        \"matsuri miko\": \"まつりみこ\",\n        \"matsurino naginata\": \"祭野薙刀\",\n        \"matsurioka hideyuki\": \"祭丘ヒデユキ\",\n        \"matsushima namio\": \"松島ナオミ\",\n        \"matsuyama hayate\": \"松山はやて\",\n        \"matsuyama seiji\": \"松山せいじ\",\n        \"matsuyoshi ako\": \"松吉アコ\",\n        \"matsuyuki kabun\": \"松足嘉分\",\n        \"matsuzaka reia\": \"まつざかれいあ\",\n        \"matsuzono\": \"松園\",\n        \"matui you\": \"末井夕\",\n        \"maverick\": \"まーべりっく\",\n        \"mawaru\": \"きんたまわる\",\n        \"may\": \"MAY\",\n        \"maya gorou\": \"まゃ～吾郎\",\n        \"maya temple\": \"真夜テンプル\",\n        \"mayag\": \"MayaG\",\n        \"mayama haruji\": \"真山春二\",\n        \"mayamura aki\": \"真矢村明\",\n        \"mayao\": \"まやお\",\n        \"mayashinya\": \"真夜真夜\",\n        \"maybe\": \"めいびい\",\n        \"mayofun\": \"まよふん\",\n        \"mayohara-san\": \"マヨハラさん\",\n        \"mayu\": \"まゆ\",\n        \"mayugeyama\": \"眉毛山\",\n        \"mayuki\": \"マユキ\",\n        \"mazaki katsumi\": \"まざきかつみ\",\n        \"maze\": \"maze*\",\n        \"mcqueen\": \"mcqueen\",\n        \"mebachi maguro\": \"目鉢鮪\",\n        \"mebae\": \"mebae\",\n        \"mebura\": \"めぶら\",\n        \"mee\": \"めー\",\n        \"meem\": \"MEEM!\",\n        \"megi\": \"めぎ\",\n        \"mego\": \"めご\",\n        \"meguo\": \"メグオ\",\n        \"meguro\": \"目黒\",\n        \"meguro linu\": \"目黒霖雨\",\n        \"meguro sankichi\": \"目黒三吉\",\n        \"mei\": \"芽唯\",\n        \"meido sushi\": \"冥土すし\",\n        \"meido yomi\": \"冥土黄泉\",\n        \"meiji\": \"めいじ\",\n        \"meiji michiru\": \"明治ミチル\",\n        \"meika\": \"めいか\",\n        \"meiko\": \"めい子\",\n        \"meito\": \"星名めいと | めいと\",\n        \"meiya\": \"メイヤ\",\n        \"mekabu aji max\": \"めかぶ味MAX\",\n        \"mekuri\": \"めくり\",\n        \"romulo mancin\": \"Romulo Mancin\",\n        \"melodic core.\": \"石月めろこあ\",\n        \"melon22\": \"めろん22\",\n        \"melonleaf\": \"メロソリーフ\",\n        \"melu\": \"Melu\",\n        \"meme\": \"めめ\",\n        \"memeo\": \"女々男\",\n        \"menbo\": \"めんぼ\",\n        \"menimo\": \"めにも\",\n        \"meno\": \"meno\",\n        \"menosuke\": \"メノスケ\",\n        \"mens\": \"Men's\",\n        \"mennsuke\": \"めんスケ\",\n        \"menteiyakuna\": \"めんていやくな\",\n        \"menu.\": \"めぬ。\",\n        \"mepikari\": \"メピカリ\",\n        \"mercy rabbit\": \"マーシーラビット\",\n        \"meri\": \"めり\",\n        \"meria\": \"メリア\",\n        \"meridier\": \"Meridier\",\n        \"meriko\": \"めりこ\",\n        \"merkonig\": \"Merkonig\",\n        \"merry luna\": \"めりぃるな\",\n        \"meshi\": \"めし\",\n        \"mesousan\": \"めそうさん\",\n        \"metabond\": \"めたぼんど\",\n        \"metal gummo\": \"めたるがんも\",\n        \"meten\": \"めてん\",\n        \"meto\": \"Meto\",\n        \"mevius9\": \"mevius9\",\n        \"mezashi gohan\": \"めざしごはん\",\n        \"mhs\": \"MHS\",\n        \"mia\": \"みあ\",\n        \"mibry\": \"MIBRY\",\n        \"micchan\": \"みっちゃん\",\n        \"michael f91\": \"マイコーF91\",\n        \"michairu\": \"ミ茶いる\",\n        \"michikusa akimichi\": \"道草閑道\",\n        \"michinoku atami\": \"みちのくアタミ\",\n        \"michiyoshi\": \"ミチヨシ\",\n        \"mico\": \"蜜co\",\n        \"micopp\": \"micopp\",\n        \"midarin\": \"midarin\",\n        \"midoh torako\": \"水堂とらこ\",\n        \"midorigi mura\": \"緑木邑\",\n        \"midoriko\": \"ミドリコ\",\n        \"midou midori\": \"御堂みどり\",\n        \"midou ren\": \"御堂廉\",\n        \"midou shin\": \"魅堂真\",\n        \"miduki aki\": \"観月あき\",\n        \"miduki sho\": \"みづき翔\",\n        \"miduno kenshi\": \"みづの剣士\",\n        \"miel\": \"Miel\",\n        \"mifune yatsune\": \"三船八音\",\n        \"miga\": \"美雅\",\n        \"migchip\": \"MIGCHIP\",\n        \"migi tonari\": \"みぎ隣\",\n        \"migio moto\": \"右雄基留\",\n        \"migiwa\": \"みぎわ\",\n        \"migiyori\": \"右頼\",\n        \"migu\": \"みぐ\",\n        \"migumigu\": \"みぐみぐ\",\n        \"mihara\": \"みはら\",\n        \"mihara nori\": \"三原のり\",\n        \"miho rei\": \"御歩れい\",\n        \"mii akira\": \"美衣暁\",\n        \"miicho\": \"みーちょ\",\n        \"miiru\": \"みいる\",\n        \"miitoban\": \"みぃとばん\",\n        \"mika pikazo\": \"Mika Pikazo\",\n        \"mika sayaki\": \"みかさやき\",\n        \"mikagami mamizu\": \"水鏡まみず\",\n        \"mikagami sou\": \"水鏡想\",\n        \"mikage kirino\": \"神影霧乃\",\n        \"mikage nao\": \"みかげ尚\",\n        \"mikage sekizai\": \"御影石材\",\n        \"mikagura\": \"みかぐら\",\n        \"mikami cannon\": \"三上キャノン\",\n        \"mikami hokuto\": \"箕神北都\",\n        \"mikami sasara\": \"みかみ沙更\",\n        \"mikamikan\": \"みかみかん\",\n        \"mikan gyuunyuu\": \"みかん牛乳\",\n        \"mikan no kawa houchikai no shinsei\": \"みかんの皮放置界の新星\",\n        \"mikan.\": \"みかん。\",\n        \"mikawa\": \"み皮\",\n        \"mikawa no yummy\": \"三河のヤミー\",\n        \"mikawaya\": \"みかわや\",\n        \"mikaze\": \"みかぜ\",\n        \"mike\": \"ミケ\",\n        \"mikeko\": \"みけこ\",\n        \"mikepon\": \"みけぽん\",\n        \"miketa miekichi\": \"みけ田みい吉\",\n        \"mikihime\": \"みき姫\",\n        \"mikkoukun\": \"ミッコウクン\",\n        \"miko\": \"みこ\",\n        \"mikoita\": \"みこいた\",\n        \"mikokuno homare\": \"みこくのほまれ\",\n        \"mikorin\": \"みこりん\",\n        \"mikoto kei\": \"未琴圭\",\n        \"miku\": \"みく\",\n        \"mikuni hadzime\": \"三国ハヂメ\",\n        \"mil\": \"mil\",\n        \"milcara\": \"ミルキャラ\",\n        \"milda7\": \"Milda7\",\n        \"milele\": \"Milele\",\n        \"militia\": \"みりしゃ\",\n        \"milk panda\": \"みるくぱんだ\",\n        \"milkcow\": \"MILKCOW\",\n        \"milkexplorer\": \"MilkExplorer\",\n        \"milkshake\": \"奶昔\",\n        \"millefeuille\": \"ミル・フィーユ\",\n        \"milli\": \"ミリ\",\n        \"milts\": \"みるつ\",\n        \"mima\": \"みま\",\n        \"mimamui\": \"みまむぃ\",\n        \"mimasaka hideaki\": \"美作英明\",\n        \"mimasaka yorozu\": \"みまさかよろず\",\n        \"mimikaki\": \"みみかき\",\n        \"mimimaru\": \"耳丸\",\n        \"mimishiki\": \"耳式\",\n        \"mimisuke\": \"みみすけ\",\n        \"mimizu\": \"蚯蚓\",\n        \"mimori nahda\": \"水護難陀\",\n        \"mimoton\": \"みもとん\",\n        \"mimoza\": \"みもざ\",\n        \"mimuda ryouzou\": \"みむだ良雑\",\n        \"min\": \"ミン\",\n        \"min-naraken\": \"MIN-NARAKEN\",\n        \"minaduki haruka\": \"水月悠\",\n        \"minaduki nanana\": \"皆月ななな\",\n        \"minagata\": \"ミナガタ\",\n        \"minagi ruiji\": \"ミナギルイジ\",\n        \"minai\": \"ミナイ\",\n        \"minakami hiroki\": \"水上広樹\",\n        \"minakami kurena\": \"水上暮菜\",\n        \"minakami riku\": \"ミナカミ理久\",\n        \"minakawa haruhisa\": \"皆川晴久\",\n        \"minako nami\": \"みなこなみ\",\n        \"minakuchi takashi\": \"水口鷹志\",\n        \"minami funi.\": \"南ふに。\",\n        \"minami kohto\": \"南狡兎\",\n        \"minami kunimusu\": \"南邦結\",\n        \"minami sei\": \"みなみせい\",\n        \"minami star\": \"南☆\",\n        \"minamichou naname\": \"南町ななめ\",\n        \"minamino hazuki\": \"南乃映月\",\n        \"minamishi\": \"南嗣\",\n        \"minamoto\": \"みな本\",\n        \"minamoto jin\": \"皆素人\",\n        \"minamura haruki\": \"皆村春樹\",\n        \"minarai\": \"美奈來\",\n        \"minari\": \"minari\",\n        \"minase kaya\": \"水瀬佳也\",\n        \"minase norihiko\": \"みなせのりひこ\",\n        \"minase ruruu\": \"水瀬るるう\",\n        \"minase sizuku\": \"水瀬雫\",\n        \"minase tamaki\": \"皆瀬たまき\",\n        \"minase taruhi\": \"水無瀬たるひ\",\n        \"minase yowkow\": \"水瀬揺光\",\n        \"minase yuu\": \"水瀬結宇\",\n        \"minato akira\": \"湊晶\",\n        \"minato yoshihiro\": \"湊良弘\",\n        \"minatoya shunsaku\": \"湊谷俊作\",\n        \"minatsuki alumi\": \"水月あるみ\",\n        \"minatsuki hina\": \"みなつきひな\",\n        \"minazoi kuina\": \"水添水鶏\",\n        \"minazuki akira\": \"水無月あきら\",\n        \"minazuki ayu\": \"水無月愛勇\",\n        \"mineyuki\": \"峰之\",\n        \"mingaru\": \"ミンガル\",\n        \"miniru\": \"miniru\",\n        \"minna no haipe\": \"みんなのハイペ\",\n        \"mino kureha\": \"美濃紅葉\",\n        \"minobu gentle\": \"身延ジェントル\",\n        \"minoda kenichi\": \"みのだけんいち\",\n        \"minoh rom\": \"水尾ろむ\",\n        \"ojigi\": \"箕吉\",\n        \"minomushi\": \"みのむし\",\n        \"minor boy\": \"まいなぁぼぉい\",\n        \"minori\": \"みのり\",\n        \"minority\": \"マイノリティ\",\n        \"minpei ichigo\": \"民兵一号\",\n        \"mintice\": \"みんとあいす\",\n        \"minto\": \"みんと\",\n        \"minus a\": \"-A\",\n        \"minutati\": \"みぬたち\",\n        \"mio\": \"MIO\",\n        \"mioki koeru\": \"みおき超\",\n        \"mirai denki\": \"未来電機\",\n        \"miri\": \"ミリ\",\n        \"mirino\": \"みりの\",\n        \"miromiro mumu\": \"みろみろ☆むむ\",\n        \"miru\": \"MIRU\",\n        \"mirun\": \"ミルン\",\n        \"misa\": \"美沙\",\n        \"misagi nagomu\": \"みさぎ和\",\n        \"misaka\": \"御坂\",\n        \"misaka niumu\": \"三坂ニウム\",\n        \"misaka nyuumen\": \"みさかにゅうめん\",\n        \"misaka shou\": \"三坂晶\",\n        \"misaki\": \"御崎\",\n        \"misaki ren\": \"美咲恋\",\n        \"misaki ryo\": \"御前伶\",\n        \"misaki tou\": \"ミサキ闘 | ミサキ糖\",\n        \"misana\": \"みさな\",\n        \"misao\": \"小野ミサオ\",\n        \"misaragi\": \"みさらぎ\",\n        \"misasagi yuuya\": \"ミササギユウヤ\",\n        \"misato nana\": \"三郷なな\",\n        \"miseo\": \"みせお\",\n        \"mishibe hamata\": \"みしべハマタ\",\n        \"mishima hiroji\": \"みしまひろじ\",\n        \"misnon the great\": \"ミスノン・ザ・グレート\",\n        \"miso oden\": \"みそおでん\",\n        \"miso panda\": \"みそパンダ\",\n        \"miso poteto\": \"みそぽてと\",\n        \"misoiri\": \"味噌入り\",\n        \"misono denpachi\": \"みそのデンパ\",\n        \"misonou\": \"みそのう\",\n        \"misooden\": \"みそおでん\",\n        \"misril\": \"Misril\",\n        \"miss black\": \"MISS BLACK\",\n        \"missile228\": \"MISSILE228\",\n        \"mister\": \"ミスター\",\n        \"mister ochitsu\": \"ミスターおちつ\",\n        \"misumi natsuki\": \"水澄夏希\",\n        \"mita kazuo\": \"三田和夫\",\n        \"mita satomi\": \"みたさとみ\",\n        \"mitaka\": \"美岳\",\n        \"mitamori tatsuya\": \"みた森たつや\",\n        \"mitarai\": \"御手洗\",\n        \"mitarai yuuki\": \"御手洗佑樹\",\n        \"mitarashi kousei\": \"みたらし侯成\",\n        \"mitei\": \"未定\",\n        \"mito\": \"ミト\",\n        \"miton\": \"みとん\",\n        \"mitsu king\": \"蜜キング\",\n        \"mitsufuji kouichi\": \"みつふじこういち\",\n        \"mitsui mana\": \"みついまな\",\n        \"mitsuie\": \"みついえ\",\n        \"mitsukazu\": \"みつかず\",\n        \"mitsuki kisara\": \"観月きさら\",\n        \"mitsuki mantarou\": \"光姫満太郎\",\n        \"mitsuki ponz\": \"蜜葵ぽんず\",\n        \"mitsuki yuuya\": \"御月ユウヤ\",\n        \"mitsumaro\": \"みつまろ\",\n        \"mitsurugi tsurugi\": \"御剱剣\",\n        \"mitsuya\": \"みつや\",\n        \"mitsuyama hajime\": \"みつやまはじめ\",\n        \"mitty\": \"Mitty\",\n        \"miu\": \"みU\",\n        \"miumi\": \"みうみ\",\n        \"miura\": \"miura\",\n        \"miura jota\": \"三浦いお太\",\n        \"miya\": \"みや\",\n        \"miya9\": \"miya9\",\n        \"miyabe makoto\": \"みやべまこと\",\n        \"miyabi tsuzuru\": \"みやびつづる\",\n        \"miyabi yutaka\": \"ミヤビユタカ\",\n        \"miyabikawa sakura\": \"雅川佐倉\",\n        \"esaki tamotsu\": \"江崎惟\",\n        \"miyagi yasutomo\": \"宮城靖朋\",\n        \"miyagoe yoshitsuki\": \"宮越良月\",\n        \"miyahara mimikaki\": \"みやはらみみかき\",\n        \"miyakawa hajime\": \"美夜川はじめ\",\n        \"kyou no gohan\": \"京のごはん\",\n        \"miyama rima\": \"宮馬りま\",\n        \"miyama zero\": \"美山零\",\n        \"miyamoto ikusa\": \"みやもといくさ\",\n        \"miyamoto yuu\": \"みやもとゆう\",\n        \"miyamu\": \"みやむ\",\n        \"miyamura\": \"みやむら\",\n        \"miyane aki\": \"みやねあき\",\n        \"miyanogi jiji\": \"宮野木ジジ\",\n        \"miyanoyuki\": \"みやのゆき\",\n        \"miyashita kitsune\": \"宮下キツネ\",\n        \"miyatsuki itsuka\": \"美弥月いつか\",\n        \"miyauchi yuka\": \"宮内由香\",\n        \"miyazaki yuki\": \"宮崎ユウキ\",\n        \"miyazawa riewo\": \"宮沢りえを\",\n        \"miyoichi\": \"みよいち\",\n        \"miyu\": \"MIYU\",\n        \"miyuki\": \"深雪\",\n        \"miyuki yaya\": \"御幸やや\",\n        \"miyuma subaru\": \"未由間すばる\",\n        \"miyuu\": \"未柚\",\n        \"mizinnkosutinn\": \"みじんこすちん\",\n        \"mizo\": \"原人\",\n        \"mizoguchi kou\": \"ミゾグチコウ\",\n        \"mizu\": \"mizu\",\n        \"mizu asato\": \"水あさと\",\n        \"mizuha\": \"みずは\",\n        \"mizuhara mei\": \"水原明\",\n        \"mizuhati saru\": \"水八申\",\n        \"mizui\": \"みずい\",\n        \"mizuiro megane\": \"みずいろ めがね\",\n        \"mizujouyu\": \"水醤油\",\n        \"mizuki\": \"みずき\",\n        \"mizuki gai\": \"水樹凱\",\n        \"mizuki haruto\": \"みづき春人\",\n        \"mizuki hitoshi\": \"みずきひとし\",\n        \"miduki honey\": \"水月ハニー\",\n        \"mizuki loose\": \"みづきるうず\",\n        \"mizuki makoto\": \"観月真\",\n        \"mizuki yuu\": \"瑞紀悠\",\n        \"mizuki yuuma\": \"みずき佑真\",\n        \"mizukimaru\": \"満月◯\",\n        \"mizumidori\": \"水緑\",\n        \"mizumori omizu\": \"水森おみず\",\n        \"mizumura kaoru\": \"水村かおる\",\n        \"mizuna\": \"みづな\",\n        \"mizunashi\": \"みずなし\",\n        \"mizunezumi\": \"水鼠\",\n        \"mizuno\": \"みずの\",\n        \"mizuno haruyoshi\": \"水野珍\",\n        \"mizuno kei\": \"水野慧\",\n        \"mizuno makoto\": \"みずのまこと\",\n        \"mizuno mumomo\": \"水野むもも\",\n        \"mizuno poppo\": \"水翠野ポッポ\",\n        \"mizuno sao\": \"水野早桜\",\n        \"mizunoe nemone\": \"壬星ねもね\",\n        \"mizusaka saki\": \"水坂早希\",\n        \"mizusawa\": \"水澤\",\n        \"mizusawa mimori\": \"水沢深森\",\n        \"mizusawa nagi\": \"水沢凪\",\n        \"mizushima aru\": \"みづしま亜留\",\n        \"mizushima kero\": \"水島ケロ\",\n        \"mizushima sei\": \"みずしま聖\",\n        \"mizushina minato\": \"水科湊\",\n        \"mizushiro takuya\": \"水城たくや\",\n        \"mizutama\": \"みずたま\",\n        \"mizutani tooru\": \"水谷とおる\",\n        \"mizuto\": \"水兎\",\n        \"mizuya tiharu\": \"水夜ちはる\",\n        \"mizuyoukan\": \"水ようかん\",\n        \"mko\": \"マキオ\",\n        \"ml\": \"ML\",\n        \"mm\": \"えむえむ\",\n        \"mmmnomu\": \"むむむのム\",\n        \"mnk\": \"MNK\",\n        \"mo\": \"もっさん\",\n        \"moai tentyou\": \"モアイ店長\",\n        \"moccyi\": \"モッチィー\",\n        \"mochi ice\": \"もちアイス\",\n        \"mochi sensee\": \"もちせんせぇ\",\n        \"mochiduki nano\": \"モチヅキナノ\",\n        \"mochiji tada\": \"餅持唯\",\n        \"mochikuu usagi\": \"もちくううさぎ\",\n        \"mochimako\": \"モチマコ\",\n        \"mochinosora\": \"もちのそら\",\n        \"mochizuki nao\": \"望月なお\",\n        \"mochizuki tooya\": \"望月とーや\",\n        \"mockmock\": \"MockMock\",\n        \"moech\": \"moech\",\n        \"moeda kazukichi\": \"萌田かずきち\",\n        \"moeki yuta\": \"萌木雄太\",\n        \"moekichi.\": \"もえきち。\",\n        \"mofuriru\": \"もふりる\",\n        \"mogg\": \"mogg\",\n        \"mogi\": \"モギ\",\n        \"mogi yasunobu\": \"茂木康信\",\n        \"mogiri\": \"もぎり\",\n        \"mogo-721\": \"mogO-721\",\n        \"mogunosukes\": \"モグ乃助\",\n        \"mogupuchi.\": \"もぐぷち。\",\n        \"moiky\": \"Moiky\",\n        \"moizumi shipon\": \"茂泉しぽん\",\n        \"moja\": \"MOJA\",\n        \"mokamoka\": \"モカモカ\",\n        \"moke\": \"もけ\",\n        \"mokei\": \"百景\",\n        \"mokeke\": \"mokeke\",\n        \"mokichi\": \"茂吉\",\n        \"mokke\": \"もっけ\",\n        \"mokki\": \"もっき\",\n        \"moko\": \"もこ\",\n        \"mokokee\": \"もこけ\",\n        \"mokomoko yanakku\": \"モコモコヤナック\",\n        \"mokumokuren\": \"目目蓮\",\n        \"mokushi\": \"もくし\",\n        \"mokyu\": \"もきゅ\",\n        \"momi\": \"もみ\",\n        \"momiji\": \"もみじ\",\n        \"momiji mao\": \"もみじ真魚\",\n        \"momijizuki luna\": \"紅葉月るな\",\n        \"momizi inori\": \"紅葉いのり\",\n        \"momo\": \"もも\",\n        \"momo inu\": \"ももいぬ\",\n        \"momo iwao\": \"百々巌\",\n        \"momo no kanzume\": \"桃の缶詰\",\n        \"momoda yasuhito\": \"百田やすひと\",\n        \"momoe\": \"ももえ\",\n        \"momofuki rio\": \"桃吹リオ\",\n        \"momohime shibuki\": \"桃姫しぶき\",\n        \"momoiro retas\": \"桃色レタス\",\n        \"momokan85\": \"momokan85\",\n        \"momomitsu kinako\": \"桃蜜きなこ\",\n        \"momomo\": \"ももも\",\n        \"momonashi potato\": \"桃梨ぽてと\",\n        \"momonga\": \"桃ん画\",\n        \"momosaki\": \"桃咲\",\n        \"momose\": \"ももせ\",\n        \"momose sei\": \"百瀬せー\",\n        \"momoshiro\": \"モモシロ\",\n        \"momota momo\": \"モモタ モモ\",\n        \"mon-petit\": \"もんぷち\",\n        \"monaka\": \"最中\",\n        \"monatsu\": \"もなつ\",\n        \"monchan rev3\": \"もんちゃんrev3\",\n        \"monchy\": \"もんちぃ\",\n        \"monimitto\": \"もにみっと\",\n        \"monin\": \"もにん\",\n        \"moninna\": \"もにんな\",\n        \"monio\": \"もにお\",\n        \"monkey ni-gou\": \"悶鬼威弐号\",\n        \"monkeycandy\": \"MonkeyCandy\",\n        \"monme\": \"monme\",\n        \"monodevil\": \"ものっち\",\n        \"monou natsuki\": \"桃生夏綺\",\n        \"monsuke\": \"MONSUKE\",\n        \"monvasa\": \"モンヴァサ\",\n        \"moonlight\": \"むーんらいと\",\n        \"mor.\": \"モル\",\n        \"more\": \"モレ\",\n        \"mori\": \"森\",\n        \"mori takuya\": \"杜拓哉\",\n        \"moribell\": \"モリーベル\",\n        \"moricocco\": \"もりこっこ\",\n        \"morii\": \"MORII\",\n        \"morii fuzuki\": \"森井文月\",\n        \"morii shizuki\": \"森井しづき\",\n        \"morikawa\": \"もりかわ\",\n        \"morikawa narumi\": \"森川鳴海\",\n        \"morikurousagi\": \"森黑兎\",\n        \"warabi mochi\": \"わらびモチ\",\n        \"morina masayuki\": \"森菜雅雪\",\n        \"morinaga milk\": \"森永みるく\",\n        \"morinaga ramune\": \"森永らむね\",\n        \"morino hon\": \"もりのほん\",\n        \"morino kinoco\": \"森乃きの子\",\n        \"morino kinoko\": \"森乃きのこ\",\n        \"morino muck\": \"森野ムック\",\n        \"morinomiya maachi\": \"森ノ宮まあち\",\n        \"morisaki tirol\": \"森崎ちろる\",\n        \"morisaki yoshino\": \"杜崎淑乃\",\n        \"morishige\": \"もりしげ\",\n        \"morishima petit\": \"森嶋プチ\",\n        \"morishita kaoru\": \"モリシタカオル\",\n        \"morisoba\": \"もりそば\",\n        \"morisova\": \"morisova\",\n        \"morisugi\": \"morisugi\",\n        \"moritaka takashi\": \"もりたかたかし\",\n        \"moritake\": \"モリタケ\",\n        \"moritan\": \"もりたん\",\n        \"moriyama rikka\": \"森山六花\",\n        \"moriyama shijimi\": \"森山しじみ\",\n        \"morochin-san\": \"もろちんさん\",\n        \"morokoshitaroh\": \"morokoshitaroh\",\n        \"morota\": \"もろた\",\n        \"morozumi junka\": \"両角潤香\",\n        \"morpheus\": \"モルペウス\",\n        \"morris\": \"モリス\",\n        \"moruda\": \"もる田\",\n        \"moruga\": \"MORUGA\",\n        \"mos\": \"Mos\",\n        \"mosa\": \"モサ\",\n        \"moscow\": \"モスクワ\",\n        \"mosha\": \"もしゃ\",\n        \"mosuke\": \"mosuke\",\n        \"motchie\": \"もっちー\",\n        \"moti moti omoti\": \"餅もちお餅\",\n        \"mothica\": \"モティカ\",\n        \"moto\": \"MoTo\",\n        \"motobi\": \"もとび\",\n        \"motoe hiroya\": \"元永尋也\",\n        \"motoichi\": \"素壱\",\n        \"motomushi\": \"元虫\",\n        \"motoyon\": \"基4\",\n        \"motsu\": \"もつ\",\n        \"motsuaki\": \"もつあき\",\n        \"motti\": \"モッチー\",\n        \"mou\": \"もう\",\n        \"moukin punch\": \"猛禽パンチ\",\n        \"mountain pukuichi\": \"マウンテンプクイチ\",\n        \"moup\": \"もうぴい\",\n        \"moya\": \"moya\",\n        \"moyashi\": \"もやし\",\n        \"moyasibasto\": \"もやしばーすと\",\n        \"moyomoto lv48\": \"もょもとLV48\",\n        \"moyori\": \"moyori\",\n        \"moyuru-n\": \"MOYURU/n\",\n        \"moza\": \"もざ\",\n        \"mozuku\": \"もずく\",\n        \"mozuya murasaki\": \"もずや紫\",\n        \"mr.lostman\": \"Mr.Lostman\",\n        \"mr.sugar\": \"MR.sugar\",\n        \"mr.way\": \"Mr.way\",\n        \"mt\": \"mt\",\n        \"mt.somo\": \"Mt.somo\",\n        \"mtd\": \"mtd\",\n        \"mu mu munou\": \"66-夢王\",\n        \"mu-min\": \"夢～眠\",\n        \"mucc\": \"ムック\",\n        \"muchabou\": \"無茶坊\",\n        \"mufuru\": \"ムフル\",\n        \"mugen no ossan\": \"無限のおっさん\",\n        \"mugendai\": \"無限大\",\n        \"mugenkidou\": \"無限軌道\",\n        \"mugi\": \"MUGI\",\n        \"mugicha\": \"麦茶\",\n        \"mugichoko\": \"むぎちょこ\",\n        \"mugimaru\": \"麦丸\",\n        \"mugino hotaru\": \"麦野ほたる\",\n        \"muichimon\": \"無一文\",\n        \"mujiko\": \"むじこ\",\n        \"mujin\": \"霧迅\",\n        \"mujina\": \"むじな\",\n        \"mukai kiyoharu\": \"むかいきよはる\",\n        \"mukai masayoshi\": \"向正義\",\n        \"mukasa kouki\": \"六笠洸季\",\n        \"mukaunosato isuke\": \"イスケ・グラタニティー\",\n        \"mukeikaku\": \"夢計画\",\n        \"mukku\": \"MUKKU\",\n        \"mukouhara shiryu\": \"むこうはらしりゅう\",\n        \"mukuge\": \"毳\",\n        \"mukyuu\": \"むきゅう☆\",\n        \"mumin\": \"むみん\",\n        \"mumu\": \"MUMU\",\n        \"mumumu\": \"むむむ\",\n        \"munashimujou\": \"むなしむじょう\",\n        \"munitin\": \"むにちん\",\n        \"munomerikun\": \"ミネむら\",\n        \"munoshishi\": \"むのしし\",\n        \"munyuu\": \"むにゅう\",\n        \"murai g\": \"村井Ｇ\",\n        \"murai kei\": \"ムライケイ\",\n        \"murakami\": \"村上\",\n        \"murakami masaki\": \"村上雅貴\",\n        \"murakumo\": \"村雲\",\n        \"muramurabito\": \"村々村\",\n        \"muranako\": \"ムラナコ\",\n        \"murasaki\": \"むらさき\",\n        \"murasaki akari\": \"むらさきあかり\",\n        \"murasaki orange\": \"紫オレンジ\",\n        \"murasaki tohka\": \"村崎とーか\",\n        \"murasakiiro orange\": \"むらさきいろオレンジ\",\n        \"murasame chiaki\": \"村雨知秋\",\n        \"murasame ha\": \"村雨刃\",\n        \"murasame maru\": \"村雨丸\",\n        \"murata denji\": \"村田電磁\",\n        \"murata.\": \"ムラタ。\",\n        \"muren\": \"ムウレン\",\n        \"muro\": \"むろ\",\n        \"muryou myakudou\": \"無料脈動\",\n        \"musashino sekai\": \"ムサシノセカイ\",\n        \"musasiya chogenbo\": \"武蔵屋長元坊\",\n        \"muscleman\": \"マッスルマン\",\n        \"mushanokouji atsune\": \"武者小路あつね\",\n        \"mushiboy\": \"MUSHIBOY\",\n        \"musouduki\": \"梦双月\",\n        \"muteki soda\": \"无敌苏打\",\n        \"muten\": \"武天\",\n        \"mutou\": \"無糖\",\n        \"mutou hiroki\": \"武藤裕樹\",\n        \"mutou keiji\": \"むとうけいじ\",\n        \"mutou kurihito\": \"武藤此史\",\n        \"mutou rei\": \"武藤礼恵\",\n        \"mutsu\": \"ムツ\",\n        \"mutsu nagare\": \"陸奥流\",\n        \"mutsuki aya\": \"睦月綾\",\n        \"mutsuki ginji\": \"睦月ぎんじ\",\n        \"mutsuki haru\": \"睦月はる\",\n        \"mutsuki hiiro\": \"睦月緋色\",\n        \"mutsuki kei\": \"睦月圭\",\n        \"mutsuki lime\": \"むつき来夢\",\n        \"mutsumi\": \"むつみ\",\n        \"mutuki shin\": \"六樹しん\",\n        \"mutumi\": \"MuTuMi\",\n        \"mutunari\": \"むつなり\",\n        \"muumuu\": \"ムームー\",\n        \"muuna\": \"むーな\",\n        \"muunyan\": \"むーにゃん\",\n        \"muya\": \"むや\",\n        \"myaa\": \"みゃー\",\n        \"myake\": \"みゃけ\",\n        \"myanie\": \"宮兄\",\n        \"myouga\": \"茗荷\",\n        \"myouji namae\": \"苗字なまゑ\",\n        \"mytyl\": \"Mytyl\",\n        \"myuratch\": \"Myuratch\",\n        \"myv\": \"myv\",\n        \"mzk\": \"MZK\",\n        \"mzne\": \"mzne\",\n        \"n\": \"ん\",\n        \"n-p-katou\": \"N・P・KATOU\",\n        \"n820\": \"n820\",\n        \"na\": \"な\",\n        \"naba\": \"菜葉\",\n        \"nabe\": \"Nabe\",\n        \"nabenco\": \"なべんこ\",\n        \"nabeshiki\": \"ナベシキ\",\n        \"nabeshima mike\": \"鍋島ミケ\",\n        \"nabeya sakihana\": \"鍋谷咲花\",\n        \"nabeyu\": \"なべゆ\",\n        \"nabuu\": \"なぶぅ\",\n        \"nac\": \"Nac\",\n        \"nacha\": \"NACHA\",\n        \"nachiku\": \"なちく\",\n        \"naco\": \"なこ\",\n        \"nada haruka\": \"灘遥歌\",\n        \"nadzuka\": \"ナヅカ\",\n        \"nae\": \"なえ\",\n        \"nagai kao\": \"永井佳緒\",\n        \"nagai momiage\": \"长井もみあげ\",\n        \"nagaikusa\": \"長い草\",\n        \"nagamatsu heizo\": \"永松平蔵\",\n        \"nagami mairu\": \"長海まいる\",\n        \"nagana sayui\": \"ながな坂結\",\n        \"naganeko\": \"ながねこ\",\n        \"naganohara nis\": \"長野原にす\",\n        \"naganoon\": \"ながの～ん\",\n        \"naganoro\": \"ながのろ\",\n        \"nagare\": \"nagare\",\n        \"nagareboshi\": \"流れ星\",\n        \"nagareboshi purin\": \"流れ星☆プリン\",\n        \"nagaro\": \"ながろ\",\n        \"nagase yuuki\": \"长濑佑希\",\n        \"nagasode\": \"长そで\",\n        \"nagata tsubasa\": \"永田翼\",\n        \"nagatsuki rio\": \"长月莉绪\",\n        \"nagi mayuko\": \"凪まゆこ\",\n        \"nagi wataru\": \"那木渡\",\n        \"nagisa manoa\": \"渚まのあ\",\n        \"nagisano usagi\": \"渚乃兎\",\n        \"nagisawa you\": \"なぎさわゆう\",\n        \"naglfar\": \"なぐるふぁる\",\n        \"nago.k\": \"NAGO.K\",\n        \"nagoshi\": \"夏越\",\n        \"nagoya shachihachi\": \"名古屋鯱八\",\n        \"naguu\": \"なぐう\",\n        \"nagy\": \"ナギー\",\n        \"nagyo\": \"なぎょ\",\n        \"naha ryou\": \"那覇了\",\n        \"naik\": \"NAiK\",\n        \"naipeta\": \"ないぺた\",\n        \"naisho\": \"内緒\",\n        \"naito loveca\": \"内藤らぶか\",\n        \"naitou gura\": \"内東ぐら\",\n        \"naitou haruto\": \"内藤春人\",\n        \"naitou ryuu\": \"内藤隆\",\n        \"naizou chimuko\": \"内蔵チムコ\",\n        \"nakabe e\": \"なかべ江\",\n        \"nakafusa momo\": \"中総もも\",\n        \"nakagawa\": \"中川\",\n        \"nakagawa kei\": \"中川けい\",\n        \"nakagawa ryna\": \"中川リィナ\",\n        \"nakahata izuru\": \"仲畑いづる\",\n        \"nakai\": \"ナカイ\",\n        \"nakai kana\": \"なかいかな\",\n        \"nakajima akihiko\": \"中島秋彦\",\n        \"nakajima kotoko\": \"中島ことこ\",\n        \"nakajima rei\": \"中島零\",\n        \"nakajima tomoki\": \"なかじまともき\",\n        \"nakajou\": \"ナカジョー\",\n        \"nakami yoshikage\": \"中海美影\",\n        \"nakamura hirofumi\": \"中村博文\",\n        \"nakamura kanko\": \"中村カンコ\",\n        \"nakamura koutarou\": \"中村紅太郎\",\n        \"nakamura morris\": \"中村モリス\",\n        \"nakamura osawari kun\": \"中村おさわり君\",\n        \"nakamura rumi\": \"仲村留海\",\n        \"nakamura subaru\": \"なかむらすばる\",\n        \"nakamura syumitto\": \"中村趣味人\",\n        \"nakamura uzuki\": \"中村卯月\",\n        \"nakamura zeus\": \"中村天神\",\n        \"nakano\": \"中野\",\n        \"nakano yuu\": \"中野ゆう\",\n        \"nakanoku kurochan\": \"中野区くろちゃん\",\n        \"nakaore porkbits\": \"中折れポークビッツ\",\n        \"nakasone haiji\": \"中曽根ハイジ\",\n        \"nakasumi\": \"なかすみ\",\n        \"nakata hana\": \"なかた華\",\n        \"nakatsugawa minoru\": \"中津川みのる\",\n        \"nakaya\": \"なかや\",\n        \"nakayama miyuki\": \"中山みゆき\",\n        \"nakayuki\": \"仲雪\",\n        \"nakazawa hinoto\": \"なかざわひのと\",\n        \"nakika\": \"鳴華\",\n        \"nako\": \"なこ\",\n        \"nako mameta\": \"なこ豆太\",\n        \"nakuma meika\": \"なくま冥架\",\n        \"nakura\": \"なくら\",\n        \"nakura yumari\": \"奈倉ゆまり\",\n        \"nalvas\": \"nalvas\",\n        \"nalzo\": \"nalzo\",\n        \"namaki\": \"奈慎\",\n        \"namakura\": \"なまくら\",\n        \"namakura makibishi\": \"鈍撒菱\",\n        \"namanie\": \"生煮え\",\n        \"namao\": \"なまお\",\n        \"namazu\": \"なまず\",\n        \"name\": \"なめ\",\n        \"name john\": \"なめジョン\",\n        \"namekata fumiaki\": \"行方ふみあき\",\n        \"nametake\": \"なめ茸\",\n        \"namiri\": \"なみり\",\n        \"namita\": \"浪田\",\n        \"namusan\": \"南無三\",\n        \"nana\": \"奈々\",\n        \"nana shinshi\": \"七紳士\",\n        \"nanaca mai\": \"ななかまい\",\n        \"nanae\": \"Nanae\",\n        \"nanae juu\": \"七影愁\",\n        \"nanagami you\": \"七神優\",\n        \"nanahachi\": \"ななはち\",\n        \"nanahi tosi\": \"七比とし\",\n        \"nanahime\": \"ななひめ\",\n        \"nanahoshi nas\": \"七星なす\",\n        \"nanahoshi tento\": \"七星てんと\",\n        \"nanakawa roduka\": \"七川楼塚\",\n        \"nanaki nana\": \"ナナキナナ\",\n        \"nanaki seijyu\": \"七輝静樹\",\n        \"nanako\": \"ナナコ\",\n        \"nanakoro\": \"七転\",\n        \"nanakura nanane\": \"七座菜々音\",\n        \"nanakusa amane\": \"七草天音\",\n        \"nanakusa mutsuki\": \"七草むつき\",\n        \"nanamaru\": \"菜々丸\",\n        \"nanami ayane\": \"七海綾音\",\n        \"nanami natuki\": \"七海夏樹\",\n        \"nanami shizuka\": \"ななみ静\",\n        \"nanami yasuna\": \"ナナミヤスナ\",\n        \"nanamiya rin\": \"ななみやりん\",\n        \"nanamiya tsugumi\": \"七宫つぐ实\",\n        \"nanamo\": \"ななも\",\n        \"nanamomo rio\": \"七桃りお\",\n        \"nanana nana\": \"七名菜奈\",\n        \"nananana nanana\": \"七々ななな\",\n        \"nanao mizuho\": \"七尾瑞穂\",\n        \"nanao-kun\": \"ななおくん\",\n        \"nanase aoi\": \"七瀬葵\",\n        \"nanase masato\": \"七瀬雅人\",\n        \"nanase michiru\": \"七瀬みちる\",\n        \"nanasiro\": \"ななしろ\",\n        \"nanasumi\": \"奈々澄\",\n        \"nanatsu nemu\": \"七夏ねむ\",\n        \"nanbu arata\": \"南部新\",\n        \"nandaba\": \"ナンダバ\",\n        \"naniwadou matatabi\": \"浪花道またたび\",\n        \"nankai no sizimi\": \"南海のしぢみ\",\n        \"nankakureman\": \"なんかくれまん\",\n        \"nankin maachan\": \"南京まーちゃん\",\n        \"nannal\": \"なんなる\",\n        \"nano\": \"nano\",\n        \"nanotaro\": \"なのたろ\",\n        \"nantetsu\": \"軟鉄\",\n        \"nantomo anison\": \"なんともアニソン\",\n        \"nanzaki iku\": \"南崎いく\",\n        \"nao\": \"なお\",\n        \"nao hiren\": \"緋蓮尚\",\n        \"nao michi\": \"直通\",\n        \"naochi\": \"naochi\",\n        \"naohiro\": \"NAOHIRO\",\n        \"naokame\": \"直かめ\",\n        \"naoki\": \"なおき\",\n        \"naokichi.\": \"なおきち。\",\n        \"naoko\": \"なお子\",\n        \"naonao\": \"尚尚\",\n        \"naop\": \"naop\",\n        \"narashino zoe\": \"習志野ゾーイ\",\n        \"narcisse noir\": \"なるしすのあ～る\",\n        \"narinatsu machi\": \"成夏万智\",\n        \"nario\": \"ナリヲ\",\n        \"narita riuku\": \"成田りうく\",\n        \"narita rumi\": \"成田るみ\",\n        \"narita suguru\": \"成田すぐる\",\n        \"narukami\": \"なるかみ\",\n        \"narukami ginryu\": \"鳴神銀龍\",\n        \"narukami x\": \"鳴神X\",\n        \"narumi\": \"ナルみ\",\n        \"narumi meiko\": \"鳴海鳴子\",\n        \"narumi yuu\": \"鳴海ゆう\",\n        \"narusawa aya\": \"鳴沢綾\",\n        \"narusawa sora\": \"成沢 空\",\n        \"naruse\": \"なるせ\",\n        \"naruse makoto\": \"成瀬真琴\",\n        \"naruse mamoru\": \"成瀬守\",\n        \"naruse michi\": \"成瀬みち\",\n        \"narushima godou\": \"成岛ゴドー\",\n        \"nas\": \"NAS\",\n        \"nas-o\": \"NAS-O\",\n        \"nasake muyou\": \"なさけむよう\",\n        \"nash\": \"nash\",\n        \"nashie\": \"なしえ\",\n        \"nashinori tunnel\": \"梨憲タヌル\",\n        \"nashiru\": \"なしる\",\n        \"nassukun\": \"ナッス君\",\n        \"nasu\": \"茄子\",\n        \"nasu hanahana\": \"那須花花\",\n        \"nasukichi\": \"茄子吉\",\n        \"nasuo\": \"なすお\",\n        \"natin\": \"なてぃん\",\n        \"nato\": \"NATO\",\n        \"natsu\": \"捺\",\n        \"natsu kirin\": \"ナツキリン\",\n        \"natsufuyu denki\": \"夏冬伝季\",\n        \"natsuhara saike\": \"夏原サイケ\",\n        \"natsuhime yuran\": \"夏媛柚蘭\",\n        \"natsukawa sarasa\": \"なつかわさらさ\",\n        \"natsuki\": \"奈月\",\n        \"natsuki coco\": \"奈月ここ\",\n        \"natsuki hajime\": \"夏生一\",\n        \"natsuki shuri\": \"なつきしゅり\",\n        \"natsuki takatora\": \"なつきたかとら\",\n        \"natsume\": \"夏目\",\n        \"natsume kei\": \"夏目系\",\n        \"natsumezaka sorekara\": \"夏目坂それから\",\n        \"natsumi\": \"Natsumi\",\n        \"natsumi akira\": \"夏海あきら\",\n        \"natsumi chiharu\": \"ナツミチハル\",\n        \"natsumi kansai\": \"なつみかんさい\",\n        \"natsumikan\": \"なつみかん\",\n        \"natsumin\": \"なつみん\",\n        \"natsunagi\": \"なつなぎ\",\n        \"natsuno hareruya\": \"ナツノハレルヤ\",\n        \"natsuno maki\": \"夏野槙\",\n        \"natsuno suika\": \"なつのすいか\",\n        \"natsuo\": \"夏尾\",\n        \"natsuta kousuke\": \"夏田コウスケ\",\n        \"natsuyo\": \"ナツヨ\",\n        \"natsuzora haduki\": \"夏空葉月\",\n        \"nattaka\": \"なったか\",\n        \"nattsu\": \"なっつ\",\n        \"natumyun\": \"なつみゅん♪\",\n        \"nayoshi\": \"なよし\",\n        \"nayuta daichi\": \"那由他大地\",\n        \"nayuzaki natsumi\": \"ナユザキナツミ\",\n        \"nazca\": \"ナスカ\",\n        \"nazumi kei\": \"菜澄桂\",\n        \"neco\": \"neco\",\n        \"nectar\": \"ねくたー\",\n        \"nedoko\": \"ネドコ\",\n        \"neet\": \"にぃと\",\n        \"negitama\": \"ねぎたま\",\n        \"negitoroko\": \"ネギトロ子\",\n        \"negoya\": \"ねご屋\",\n        \"negura nao\": \"ねぐら☆なお\",\n        \"negurie\": \"ねぐりえ\",\n        \"nei chi\": \"ねいちー\",\n        \"neji-pan\": \"ネジ\",\n        \"nejiro\": \"ねじろ\",\n        \"neko bus\": \"ねこばす\",\n        \"neko denryoku\": \"ねこ電力\",\n        \"neko gohan\": \"猫御飯\",\n        \"neko manma\": \"猫御飯\",\n        \"neko maru rentarou\": \"猫丸恋太郎\",\n        \"neko na yasai\": \"猫な野菜\",\n        \"neko samurai\": \"猫サム雷\",\n        \"neko sensei\": \"猫センセイ\",\n        \"nekobuton\": \"猫布団\",\n        \"nekodel\": \"ねこでる\",\n        \"nekoga yoshiki\": \"猫賀好樹\",\n        \"nekohige\": \"ねこひげ\",\n        \"nekojima lei\": \"猫島礼\",\n        \"nekojima myu\": \"猫島みゅう\",\n        \"nekokan\": \"ねこかん\",\n        \"nekokokazuma\": \"ねここかずま\",\n        \"nekokyuu\": \"ねこきゅう\",\n        \"nekomajin\": \"ねこまじん\",\n        \"nekomanma\": \"ねこまんま\",\n        \"nekomata\": \"ねこまた\",\n        \"nekomatsuri\": \"猫祭\",\n        \"nekomi haruto\": \"猫見春人\",\n        \"nekomimi kanon\": \"猫耳花音\",\n        \"nekomura\": \"猫村\",\n        \"nekomushi\": \"ねこむし\",\n        \"nekoneko\": \"ねこねこ\",\n        \"nekoneko panchu\": \"ねこねこぱんちゅっ\",\n        \"nekonin\": \"猫忍\",\n        \"nekono lonmiy\": \"猫乃ろんみい\",\n        \"nekono matatabi\": \"猫乃またたび\",\n        \"nekono shiro\": \"ねこのしろ\",\n        \"nekono tamami\": \"猫野たまみ\",\n        \"nekonomori maririn\": \"猫守麻里鈴\",\n        \"nekonose hajime\": \"猫ノ瀬はじめ\",\n        \"nekonso\": \"ねこんそ\",\n        \"nekonta\": \"ねこんた\",\n        \"nekonyan\": \"猫にゃん\",\n        \"nekookaji tayo\": \"猫岡寺多代\",\n        \"nekoro tanuki\": \"ねころたぬき\",\n        \"nekota chihiro\": \"猫田ちひろ\",\n        \"nekota kojirow\": \"猫田小次郎\",\n        \"nekota nanami\": \"ねこたななみ\",\n        \"nekota nigra\": \"猫多にぐら\",\n        \"nekotasou\": \"ねこたそう\",\n        \"nekotsuki naoya\": \"猫月なおや\",\n        \"nekou izuru\": \"猫生いづる\",\n        \"nekoume\": \"ねこうめ\",\n        \"nekoya marble\": \"猫屋まぁぶる\",\n        \"nekoyashiki nekomaru\": \"猫屋敷ねこ丸\",\n        \"nekozawa yukari\": \"猫沢ゆかり\",\n        \"nekubila\": \"ねくびぁ\",\n        \"nelo angelo\": \"Nelo安十朗\",\n        \"nemachizuki inesu\": \"寝待月いねすー\",\n        \"nemigi tsukasa\": \"ねみぎつかさ\",\n        \"nemo\": \"ネモ\",\n        \"nemokuge\": \"ねもくげ\",\n        \"nemoto\": \"ネモト\",\n        \"nemui\": \"tintin\",\n        \"nenchi\": \"ねんち\",\n        \"nene\": \"nene\",\n        \"nenemaru\": \"音音丸\",\n        \"neno\": \"ねの\",\n        \"neo black\": \"Neo Black\",\n        \"neo kusano\": \"NEO草野\",\n        \"neon ui\": \"音遠うい\",\n        \"neoneet\": \"寝起新人\",\n        \"nepuka\": \"根深\",\n        \"nerima marine\": \"ねりままりね\",\n        \"nerio\": \"ねりお\",\n        \"nero\": \"nero\",\n        \"neropaso\": \"neropaso\",\n        \"nerotarou\": \"ねろたろう\",\n        \"nerune\": \"ねるね\",\n        \"nesuo\": \"ねすお\",\n        \"net\": \"NET\",\n        \"new\": \"新\",\n        \"new ab\": \"にゅーAB\",\n        \"neyonsan\": \"ねよんさん\",\n        \"neyuki rei\": \"根雪れい\",\n        \"nezumeta\": \"ねずメーター\",\n        \"nezumidosi\": \"ねづみどし\",\n        \"nezumin\": \"ネズミン\",\n        \"nf4\": \"nf4\",\n        \"ngng\": \"ngng\",\n        \"nibi\": \"nibi\",\n        \"nicchi sangyou\": \"ニッチサンギョウ\",\n        \"nice tack\": \"ナイスタック\",\n        \"niche\": \"ニッチ\",\n        \"nichii\": \"ニチヰ\",\n        \"nick\": \"NICK\",\n        \"nico\": \"にこ\",\n        \"nico-momo\": \"にこもも\",\n        \"nicoco\": \"nicoco\",\n        \"nicutoka\": \"nicutoka\",\n        \"nidoro\": \"nidoro\",\n        \"niea\": \"にえあ\",\n        \"nietagiru\": \"にえたぎる\",\n        \"nigakuri takeshi\": \"ニガクリタケシ\",\n        \"nigane\": \"煮鐘\",\n        \"nigesapo\": \"にげサポ\",\n        \"nightjoy\": \"Nightjoy\",\n        \"nigo\": \"にご\",\n        \"niiruma kenji\": \"にいるまけんじ\",\n        \"niisan\": \"にーさん\",\n        \"nijiden\": \"ニジデン\",\n        \"nijihashi sola\": \"にじはしそら\",\n        \"nijiru\": \"煮汁\",\n        \"nijou tayun\": \"二条たゆん\",\n        \"nijyou makoto\": \"二条マコト\",\n        \"nikaido kai\": \"二階堂改\",\n        \"nikami\": \"にかみ\",\n        \"niku\": \"にく\",\n        \"niku jill\": \"肉Jill\",\n        \"nikudanmaru\": \"肉弾丸\",\n        \"nikuname\": \"肉ネーム\",\n        \"nikuyaki\": \"ニクヤキ\",\n        \"nikyu\": \"にきゅ\",\n        \"nilitsu\": \"ニリツ\",\n        \"nilo\": \"にろ\",\n        \"nina\": \"丹娜\",\n        \"nina ryo\": \"新和涼\",\n        \"ningen\": \"にんげん\",\n        \"ninniku\": \"にんにく\",\n        \"ninnin\": \"にんにん\",\n        \"nino paru\": \"にのパル\",\n        \"ninomae kazuichi\": \"二ノ前和市\",\n        \"ninomiya hitomi\": \"二宮仁巳\",\n        \"ninomotoko\": \"ニノモトコ\",\n        \"ninroku\": \"認六\",\n        \"nio\": \"nio\",\n        \"nioti\": \"におち\",\n        \"nippa takahide\": \"新羽隆秀\",\n        \"nippori\": \"にっぽり\",\n        \"nirapii\": \"にらぴー\",\n        \"niryuu tkys\": \"にりゅうtkys\",\n        \"nishi tagame\": \"西タガメ\",\n        \"nishida\": \"西田\",\n        \"nishifuji\": \"西藤\",\n        \"nishihara atsuko\": \"弐士原あつこ\",\n        \"nishikawa coto\": \"ニシカワコト\",\n        \"nishiki meyu\": \"西樹めゆ\",\n        \"nishiki yoshimune\": \"にしき義統\",\n        \"nishimaki tohru\": \"にしまきとおる\",\n        \"nishimo\": \"にしも\",\n        \"nishimura arimi\": \"西村有未\",\n        \"nishimura takashi\": \"にしむらたかし\",\n        \"nishin\": \"ニシン\",\n        \"nishino\": \"西野\",\n        \"nishino hikodge\": \"西野彦二\",\n        \"nishinozawa kaorisuke\": \"西野沢かおり介\",\n        \"nishitsuki tsutomu\": \"西月力\",\n        \"nisin\": \"ニシン\",\n        \"nisson\": \"nisson\",\n        \"nitiba rokusaburou\": \"にちばろくさぶろう\",\n        \"nitta jun\": \"にったじゅん\",\n        \"nittakumi\": \"新匠\",\n        \"niu\": \"丹雨\",\n        \"niwa\": \"にわ\",\n        \"niwa yukari\": \"丹羽ユカリ\",\n        \"niwaka yuan\": \"丹羽香ゆあん\",\n        \"niwakaame\": \"俄雨\",\n        \"niwasane\": \"にわさね\",\n        \"niwatori gunsou\": \"にわとり軍曹\",\n        \"niyama\": \"にやま\",\n        \"nkedoshita\": \"んけどした\",\n        \"nken\": \"NKEN\",\n        \"nmasse\": \"ンマッセ\",\n        \"nme\": \"んめ\",\n        \"nmi\": \"Nみ\",\n        \"nno\": \"nno\",\n        \"no.gomes\": \"NO.ゴメス\",\n        \"noa\": \"noa\",\n        \"noah\": \"のあ\",\n        \"nobi nobita\": \"野火ノビタ\",\n        \"nobita\": \"ノビタ\",\n        \"nobu\": \"NOBU\",\n        \"nobuki chihiro\": \"のぶきちひろ\",\n        \"nobuyuki\": \"信行\",\n        \"nochita sin\": \"のちた紳\",\n        \"nogami takeshi\": \"野上武志\",\n        \"nogod\": \"NOGOD\",\n        \"noguchi masatsu\": \"野口摩擦\",\n        \"nohara monyoral\": \"野原もにょらる\",\n        \"noi\": \"のい\",\n        \"noibara kou\": \"野茨杏\",\n        \"noji\": \"ノジ\",\n        \"nokishita negio\": \"軒下ネギヲ\",\n        \"noko\": \"乃子\",\n        \"nolia\": \"NOLIA\",\n        \"nomady mao\": \"のまでぃMAO\",\n        \"nomayo\": \"野マヨ\",\n        \"nomu\": \"NOMU\",\n        \"nomura teruya\": \"野村輝弥\",\n        \"non\": \"のん\",\n        \"nonaff\": \"のんアフ\",\n        \"noname\": \"NONAME\",\n        \"noneto\": \"ノネト\",\n        \"nonnon\": \"のんのん\",\n        \"nonohachi\": \"ノノはち\",\n        \"nonoki\": \"乃軒\",\n        \"nonoko\": \"ののこ\",\n        \"nonomura hideki\": \"野々村秀樹\",\n        \"nononono\": \"のののの\",\n        \"nonta\": \"のんた\",\n        \"nooca\": \"nooca\",\n        \"noran\": \"noran\",\n        \"norasuko\": \"ノラスコ\",\n        \"nori heita\": \"海苔餅太\",\n        \"nori senbei\": \"海苔せんべい\",\n        \"norikara\": \"のりから\",\n        \"norikin\": \"海苔規\",\n        \"noriko\": \"NORIKO\",\n        \"norimatsu nanami\": \"のりまつななみ\",\n        \"norinko\": \"のりんこ\",\n        \"norio\": \"のりお\",\n        \"norita\": \"のり太\",\n        \"noritama\": \"のりたま\",\n        \"norizi\": \"のりじ\",\n        \"norte\": \"Norte\",\n        \"noruriri\": \"ノルリリ\",\n        \"nosa\": \"NOSA\",\n        \"nosekichiku\": \"野石竹\",\n        \"noshi\": \"ノシ\",\n        \"noshigami\": \"のしがみ\",\n        \"nosuke\": \"のすけ\",\n        \"noto\": \"能戸\",\n        \"noumen\": \"ノウメン\",\n        \"noumiso\": \"脳みそ\",\n        \"noumitsu\": \"のうみつ\",\n        \"nov\": \"nov\",\n        \"noyomi dx\": \"ノヨミDX\",\n        \"nozarashi satoru\": \"秋神サトル\",\n        \"nozawa yukiko\": \"野澤ゆき子\",\n        \"nozomi ayaka\": \"希望あやか\",\n        \"nozomu\": \"のぞむ\",\n        \"np\": \"NP\",\n        \"npo\": \"んぽ\",\n        \"ns\": \"NS\",\n        \"nt robo\": \"NTロボ\",\n        \"nt00\": \"NT00\",\n        \"nu-\": \"ぬー\",\n        \"nucomas\": \"ぬこマス\",\n        \"nue\": \"鵺\",\n        \"nui\": \"ぬい\",\n        \"nukiyama gaisei\": \"拔山蓋世\",\n        \"nukobao\": \"ぬこばお\",\n        \"nukoko\": \"ぬここ\",\n        \"nukui lususu\": \"ぬくい味汐\",\n        \"numada\": \"沼田\",\n        \"numata chihiro\": \"ぬまたちひろ\",\n        \"number 55\": \"number_55\",\n        \"numeko\": \"Numeko\",\n        \"numeri\": \"ぬめり\",\n        \"nun\": \"ぬん\",\n        \"nunohechima\": \"ヌノヘチマ\",\n        \"nupuryu\": \"ぬぷ竜\",\n        \"nurikabe\": \"ぬり壁\",\n        \"nuruken\": \"ぬるけん\",\n        \"nurumu\": \"ぬるむ\",\n        \"nutro\": \"nutro\",\n        \"nuu\": \"ヌゥ\",\n        \"nuyakana\": \"ぬャカな\",\n        \"nwonyo\": \"んをんよ\",\n        \"ny-o-ph\": \"NY-O-PH\",\n        \"nyagomaru\": \"にゃご丸\",\n        \"nyahu\": \"にゃふ\",\n        \"nyakaaki\": \"にゃかあき\",\n        \"nyake\": \"にゃけ\",\n        \"nyakki\": \"にゃっき\",\n        \"nyakkuru\": \"ニャックル\",\n        \"nyamal\": \"にゃまる\",\n        \"nyamota\": \"にゃもた\",\n        \"nyamu\": \"にゃむ\",\n        \"nyanbii\": \"にゃんびぃ\",\n        \"nyangorou\": \"にゃんごろー\",\n        \"nyanko\": \"猫狐\",\n        \"nyanko mic\": \"にゃんこMIC\",\n        \"nyantarou\": \"にゃん太郎\",\n        \"nyanya\": \"nyanya\",\n        \"nyanzo\": \"にゃんぞー\",\n        \"nyara\": \"nyara\",\n        \"nyarosu\": \"にゃろす\",\n        \"nylon\": \"ナイロン\",\n        \"nyoichi\": \"にょいち\",\n        \"nyonyonba tarou\": \"にょにょんば太郎\",\n        \"nyoriko\": \"にょりこ\",\n        \"nyorori\": \"にょろり\",\n        \"nyorutarou\": \"にょる太郎\",\n        \"nyu\": \"nyu\",\n        \"nyuuhin\": \"にゅーひん\",\n        \"o-bow\": \"O-bow\",\n        \"o-ji\": \"おーじ\",\n        \"o.p com\": \"おぽこむ\",\n        \"o.ri\": \"O.RI\",\n        \"oasis\": \"オアシス\",\n        \"oba yoshifumi\": \"大庭佳文\",\n        \"obakyu-taro\": \"089タロー\",\n        \"obata hiroyuki\": \"小幡寛之\",\n        \"obata yayoi\": \"おばたやよい\",\n        \"obmas\": \"obmas\",\n        \"oboroduki yamiya\": \"朧月闇夜\",\n        \"oborotsuki kakeru\": \"朧月カケル\",\n        \"obyaa\": \"おびゃー\",\n        \"ocha\": \"おちゃ\",\n        \"ochatan\": \"おちゃたん\",\n        \"ochatsumi\": \"オチャツミ\",\n        \"ochi ai\": \"越智愛\",\n        \"ochi gento\": \"越智源斗\",\n        \"ochita taiji\": \"越智多たいじ\",\n        \"ocodo\": \"おこど\",\n        \"octotaco\": \"奥藤た子\",\n        \"oda\": \"oda\",\n        \"oda akira\": \"おだ あきら\",\n        \"oda haiji\": \"織田灰至\",\n        \"oda natsuki\": \"織田夏樹\",\n        \"odabutsu\": \"おだぶつ\",\n        \"oden\": \"おデン\",\n        \"oden no shima\": \"おでんno島\",\n        \"oden70\": \"おでん70\",\n        \"oekakizuki\": \"oekakizuki\",\n        \"og\": \"Og\",\n        \"ogami kazuki\": \"拝一樹\",\n        \"ogami wolf\": \"拝狼\",\n        \"ogata\": \"Ogata\",\n        \"ogata gatarou\": \"オガタガタロー\",\n        \"ogata hiro\": \"御形紘\",\n        \"ogata mamimi\": \"緒方マミ美\",\n        \"ogata satomi\": \"緒方賢美\",\n        \"ogawa hidari\": \"小川ひだり\",\n        \"ogawa mashiro\": \"オガワマシロ\",\n        \"ogawa renji\": \"小河レンジ\",\n        \"ogiara\": \"オギアラ\",\n        \"ogino\": \"オギノ\",\n        \"oguma\": \"oguma\",\n        \"ogura anko\": \"おぐらあん子\",\n        \"oguramansai\": \"小倉萬采\",\n        \"ohakotome\": \"おはことめ\",\n        \"ohanabatake run\": \"御花畑るん\",\n        \"ohara makoto\": \"おはら誠\",\n        \"ohiensis\": \"オヒエンシス\",\n        \"ohio-shuu riki\": \"オハイオ州力\",\n        \"ohiru\": \"電SUKE\",\n        \"ohiya\": \"お冷\",\n        \"ohka\": \"おーか\",\n        \"ohma\": \"謳馬\",\n        \"ohmi\": \"近江\",\n        \"ohmi takeshi\": \"大見武士\",\n        \"ohno kanae\": \"大野かなえ\",\n        \"ohrin\": \"王林\",\n        \"ohsima kouichi\": \"大島洸一\",\n        \"ohsugi yukihiro\": \"大杉 ゆきひろ\",\n        \"ohtsuki suzuki\": \"大槻涼樹\",\n        \"oimo\": \"おいも\",\n        \"oimori yura\": \"及森ゆうら\",\n        \"oimoto jirou\": \"おいもとじろう\",\n        \"ojii\": \"おじい\",\n        \"ojii-chan\": \"おじいちゃん\",\n        \"okabayashi beru\": \"岡林べる\",\n        \"okada kojiko\": \"冈田こじ子\",\n        \"okada reimi\": \"冈田れいみ\",\n        \"okagiri shou\": \"岡霧硝\",\n        \"okama\": \"OKAMA\",\n        \"okamoto\": \"オカモト\",\n        \"okamoto fujio\": \"おかもとふじお\",\n        \"okamura hijiki\": \"岡村ひじき\",\n        \"okamura takahiro\": \"岡村孝公\",\n        \"okashira\": \"おかしら\",\n        \"okashita makoto\": \"岡下誠\",\n        \"okatora\": \"岡虎\",\n        \"okawa wataru\": \"大河渡\",\n        \"okawari\": \"OKAWARI\",\n        \"okawari jiyuu\": \"おかわり児遊\",\n        \"okaya hitsuji\": \"ヲカヤヒツジ\",\n        \"okayado\": \"オカヤド\",\n        \"okayu\": \"Okayu\",\n        \"okazaki mituki\": \"おかざきみつき\",\n        \"okazaki nao\": \"岡崎那緒\",\n        \"okazu yuuichi\": \"オカズゆういち\",\n        \"oke\": \"桶\",\n        \"okeashi chiyoko\": \"桶葭千夜子\",\n        \"oki yukao\": \"沖由佳雄\",\n        \"okidaka yuu\": \"沖高有\",\n        \"okina\": \"OKINA\",\n        \"okina naoki\": \"沖名なおき\",\n        \"okino matsushiro\": \"沖の松城\",\n        \"okino ryuuto\": \"沖野琉人\",\n        \"okita ababa\": \"沖田あばば\",\n        \"okiura\": \"okiura\",\n        \"okiyo\": \"おきよ\",\n        \"okki\": \"okki\",\n        \"okoge senbei\": \"おこげ煎餅\",\n        \"okome\": \"お米\",\n        \"okowa\": \"おこわ\",\n        \"okumura\": \"おくむら\",\n        \"okuva\": \"奥ヴぁ\",\n        \"okusan\": \"奥さん\",\n        \"okuse saki\": \"奥瀬サキ\",\n        \"om\": \"om\",\n        \"omangarl\": \"オマンガール\",\n        \"omega destroyer\": \"オメ～ガ・デストロイヤー\",\n        \"omegane\": \"御眼鏡\",\n        \"omi\": \"おみ\",\n        \"omizu\": \"おみず\",\n        \"omizu chihiro\": \"お水ちひろ\",\n        \"omochi\": \"おもち\",\n        \"omoutubo\": \"思うつぼ\",\n        \"onamaru\": \"おな丸\",\n        \"onapan\": \"おなぱん\",\n        \"onetouch\": \"わんたっち\",\n        \"onguuchi\": \"御宮内\",\n        \"oni japu\": \"鬼 ジャプ\",\n        \"oniben katze\": \"鬼遍かっつぇ\",\n        \"oniku\": \"お肉\",\n        \"oniku.\": \"お肉。\",\n        \"onineko\": \"おにねこ\",\n        \"onita\": \"歐尼鬼\",\n        \"oniyama\": \"鬼山\",\n        \"oniyuri\": \"オニユリ\",\n        \"onizuka takuto\": \"鬼塚たくと\",\n        \"onna\": \"onna\",\n        \"onnami chiyu\": \"御並千侑\",\n        \"ono misao\": \"小野ミサオ\",\n        \"ono nui\": \"小野ぬい\",\n        \"onoda sachi\": \"おのださち\",\n        \"onodera\": \"おのでら\",\n        \"onodera kazumi\": \"小野寺和海\",\n        \"onoderasan\": \"おのでらさん\",\n        \"onogawa kiwi\": \"小野川キウイ\",\n        \"onomesin\": \"オノメシン\",\n        \"onomichi\": \"Onomichi\",\n        \"onsen nakaya\": \"おんせんなかや\",\n        \"onsen no tubuyaki\": \"おんせんなかや\",\n        \"onsoku zekuu\": \"己即是空\",\n        \"onyo\": \"Onyo\",\n        \"ooba jun\": \"大刃じゅん\",\n        \"oofuji reiichirou\": \"大藤玲一郎\",\n        \"oogane\": \"大金\",\n        \"oohashi kaoru\": \"大橋薫\",\n        \"ooi hanimaru\": \"大井はに丸\",\n        \"ooi masakazu\": \"大井昌和\",\n        \"ooi sakae\": \"大井栄\",\n        \"ooiwa kenzi\": \"大岩ケンヂ\",\n        \"ooizumi daisaku\": \"大泉だいさく\",\n        \"ookami\": \"狼\",\n        \"ookami yuuki\": \"大神ゆうき\",\n        \"ooki bonta\": \"おおきぼん太\",\n        \"ookido karo\": \"大城戸カロ\",\n        \"ookubo matagi\": \"おおくぼマタギ\",\n        \"ookuma tanuki\": \"大熊狸喜\",\n        \"oomori harusame\": \"大守春雨\",\n        \"oomori makoto\": \"大森誠\",\n        \"oona mitsutoshi\": \"おおなみつとし\",\n        \"oonami youko\": \"大波耀子\",\n        \"oonita hiroyuki\": \"大仁田ヒロユキ\",\n        \"oono\": \"オオノ\",\n        \"oono tetsuya\": \"大野哲也\",\n        \"oonuma shinichi\": \"大沼信一\",\n        \"oosaka hananoko\": \"大阪花之呼\",\n        \"oosawa\": \"大沢\",\n        \"oose tsunami\": \"大瀬津波\",\n        \"oosugi kazuma\": \"大杉和馬\",\n        \"oota yuuichi\": \"大田優一\",\n        \"ootake pashio\": \"大竹パシ夫\",\n        \"ootani mikoto\": \"大谷みこと\",\n        \"ootsuka potato\": \"大塚ぽてと\",\n        \"ootsuka shirou\": \"大塚志郎\",\n        \"ootsuki wataru\": \"大月渉\",\n        \"oowada tomari\": \"大輪田泊\",\n        \"ooyake\": \"公\",\n        \"ooyama chiroru\": \"おおやまちろる\",\n        \"opaisukii\": \"オパイスキー\",\n        \"orange manbou\": \"おれんじまんぼう\",\n        \"ore\": \"ore\",\n        \"ore ebis\": \"俺エビス\",\n        \"orenchin\": \"おれんちん\",\n        \"orenuma tooko\": \"オレヌマトオコ\",\n        \"oretto\": \"おれっと\",\n        \"organico\": \"おるがにこ\",\n        \"orico\": \"オリコ\",\n        \"orihara kotone\": \"折原琴音\",\n        \"orihi chihiro\": \"織日ちひろ\",\n        \"orikawa\": \"折川\",\n        \"orikuchi hirata\": \"折口ヒラタ\",\n        \"orima inaka\": \"織間いなか\",\n        \"orimiya mai\": \"おりみや舞\",\n        \"orimoto mimana\": \"おりもとみなま\",\n        \"oris\": \"織栖\",\n        \"orishima yupopo\": \"織島ユポポ\",\n        \"orita\": \"オリタ\",\n        \"oriue wato\": \"織上ワト\",\n        \"orizen\": \"おりぜん\",\n        \"orizuru bros\": \"折鶴兄弟\",\n        \"oroneko\": \"おろねこ\",\n        \"oruna\": \"オルナ\",\n        \"oryoku\": \"おーりょく\",\n        \"os\": \"OS\",\n        \"osafune\": \"オサフネ\",\n        \"osagashi\": \"オサガシ\",\n        \"osakana\": \"ヲさかな\",\n        \"osana sumika\": \"幼菜すみか\",\n        \"osanai mujica\": \"小山内ムジカ\",\n        \"osato\": \"おさとう\",\n        \"oseron\": \"オセロン\",\n        \"oshimugi\": \"押麦\",\n        \"oshousui\": \"和尚吹\",\n        \"osora\": \"緒空\",\n        \"osterei\": \"OSTEREi\",\n        \"osuzu akiomi\": \"尾铃明臣\",\n        \"osyakana\": \"おしゃかな\",\n        \"otakehiko\": \"雄竹彦\",\n        \"othello\": \"オセロ\",\n        \"otochichi\": \"音乳\",\n        \"otogi\": \"おとぎ\",\n        \"otogi tetsurou\": \"おとぎてつろう\",\n        \"otohiko\": \"音彦\",\n        \"otohuke bonne\": \"音更ボンヌ\",\n        \"otokam\": \"オトカム\",\n        \"otokawa kazuki\": \"乙川カヅキ\",\n        \"otori\": \"おとり\",\n        \"ototo\": \"おとと\",\n        \"otou\": \"尾刀\",\n        \"otsuki miharu\": \"鳴月みはる\",\n        \"ottoman turks\": \"オスマントル子\",\n        \"otumaru\": \"乙丸\",\n        \"otyawan\": \"オチャワン\",\n        \"ou\": \"おぅ\",\n        \"oudon\": \"おうどん\",\n        \"ougi hina\": \"扇城ひな\",\n        \"ougi nozomi\": \"扇希実\",\n        \"ougon dokuro\": \"黄金髑髏\",\n        \"ouhashi\": \"おうはし\",\n        \"oujano kaze\": \"王者之風\",\n        \"ouji tsukino\": \"王子月乃\",\n        \"ouka\": \"オウカ\",\n        \"ouka sushi\": \"桜花すし\",\n        \"oukawa shiya\": \"桜川シヤ\",\n        \"ouma bunshichirou\": \"逢摩文七郎\",\n        \"oshiume nyora\": \"押梅にょら\",\n        \"oumi noe\": \"近江のえ\",\n        \"ouno\": \"奥之\",\n        \"ounwm\": \"ounwm\",\n        \"ousawa kanata\": \"桜沢かなた\",\n        \"ouse riruka\": \"桜瀬りるか\",\n        \"over line\": \"オーバーライン\",\n        \"owa\": \"尾和\",\n        \"owahu\": \"おわふ\",\n        \"owal\": \"おわる\",\n        \"oxideengine\": \"OXIDEENGINE\",\n        \"oxxo\": \"OXXO\",\n        \"oxy\": \"おきし\",\n        \"oyaji\": \"オヤジ\",\n        \"oyama robi\": \"御山ロビ\",\n        \"oyuki\": \"おゆき\",\n        \"ozaki\": \"おざき\",\n        \"ozawa akifumi\": \"織澤あきふみ\",\n        \"ozawa aoi\": \"オザワアオイ\",\n        \"ozawa hiyori\": \"小沢ひより\",\n        \"ozawa manabu\": \"緒沢まなぶ\",\n        \"ozawa reido\": \"小泽零人\",\n        \"ozawa you\": \"小沢悠\",\n        \"ozora ituki\": \"大空樹\",\n        \"ozuno mahou\": \"緒図乃真朋\",\n        \"p no ji\": \"pの字\",\n        \"p senpuki\": \"P せんぷき\",\n        \"p tag\": \"Pタグ\",\n        \"pageratta\": \"ぱげらった\",\n        \"painpa\": \"パインパ\",\n        \"paintmusume\": \"ペイント娘\",\n        \"pal maison\": \"パルめぞん\",\n        \"paleatus\": \"paleatus\",\n        \"pan koojo\": \"パン☆工場\",\n        \"pana\": \"PANA\",\n        \"panbai\": \"PANBAI 旁白\",\n        \"panda\": \"ぱんだ\",\n        \"pandacorya\": \"ぱんだこりゃ\",\n        \"pandain\": \"パンダィン\",\n        \"pandatyama\": \"ぱんだちゃま\",\n        \"pang9943\": \"pang9943\",\n        \"panimi\": \"ぱに魅\",\n        \"panpa\": \"ぱんぱー\",\n        \"panta\": \"ぱん太\",\n        \"pao\": \"パオ\",\n        \"papa papan\": \"ぱぱ・ぱぱん\",\n        \"papepoxx\": \"PAPEPOX2\",\n        \"paper\": \"ぱぺる\",\n        \"pappa\": \"パッパ\",\n        \"paprika cider\": \"パプリカサイダー\",\n        \"paradise d\": \"PARADISE“D”\",\n        \"pararan\": \"ぱららん\",\n        \"parfait\": \"ぱふぇ\",\n        \"parins\": \"Parins\",\n        \"parmiria\": \"パーミリア\",\n        \"parua\": \"ぱるあ\",\n        \"paruparu\": \"ぱるぱる\",\n        \"pasdar\": \"pasdar\",\n        \"pasera\": \"ぱせら\",\n        \"pastachin\": \"パスタチン\",\n        \"pato-chan\": \"パトちゃん\",\n        \"patori\": \"ぱとり\",\n        \"patricia\": \"パトリシア\",\n        \"patrick hateman\": \"Patrick Hateman\",\n        \"pd\": \"Pd\",\n        \"peach\": \"Peach\",\n        \"peat lock\": \"ぴーと・ろっく\",\n        \"peke\": \"ぺけ\",\n        \"pekeko\": \"ペケこ\",\n        \"penguindou\": \"筆吟堂\",\n        \"peniken\": \"ぺに健\",\n        \"pensuke\": \"ぺんすけ\",\n        \"pepe\": \"ぺぺ\",\n        \"pepo\": \"ぺぽ\",\n        \"perimaru\": \"ぺり丸\",\n        \"permille\": \"permille\",\n        \"pero\": \"ぺろ\",\n        \"personality\": \"personality\",\n        \"peruri\": \"ぺるり\",\n        \"peso\": \"ペソ\",\n        \"petag2\": \"petaG2\",\n        \"pgb\": \"pgb\",\n        \"phantom\": \"ふぁんとむ\",\n        \"philan\": \"Philan\",\n        \"philly\": \"Philly\",\n        \"phoenicia masako\": \"フェニキア雅子\",\n        \"pi-ko\": \"ぴーこ\",\n        \"pia pia\": \"Pia☆Pia\",\n        \"piano\": \"ぴあの\",\n        \"piaroo\": \"Piaroo\",\n        \"pickles\": \"ピクルス\",\n        \"picpicgram\": \"ぴこぴこぐらむ\",\n        \"pide\": \"Piで\",\n        \"pierre norano\": \"ピエールのらの\",\n        \"pihii\": \"ぴひー\",\n        \"pikachi\": \"ぴかち\",\n        \"pikachurin\": \"ピカチュリン\",\n        \"pikaichi\": \"ぴかいち\",\n        \"pikath\": \"ぴかっち\",\n        \"pikazo\": \"Pikazo\",\n        \"pikeru\": \"ピケル\",\n        \"piku star cell\": \"ぴく☆せる\",\n        \"pikupikun\": \"ピクピクン\",\n        \"pilky\": \"ぴるきー\",\n        \"pimoco\": \"pimoco\",\n        \"pin vice\": \"PIN・VICE\",\n        \"pinakes\": \"ピナケス\",\n        \"pingure\": \"ピングレ\",\n        \"pinksel\": \"Pinksel\",\n        \"pino\": \"ぴの\",\n        \"pinta\": \"PINTA\",\n        \"pip\": \"PIP\",\n        \"pipa\": \"ぴぱ\",\n        \"pira\": \"ぴら\",\n        \"pirikara syuga\": \"ピリ辛シュガー\",\n        \"pirorun\": \"ぴろるん\",\n        \"pistanya\": \"ピスターニャ\",\n        \"piston\": \"ぴすとん\",\n        \"piyo\": \"PiYo\",\n        \"piyopiyo\": \"ぴよぴよ\",\n        \"pizanuko\": \"ぴざぬこ\",\n        \"pizi2 gou\": \"pizi2号\",\n        \"pj-1\": \"PJ-1\",\n        \"plasma beach\": \"プラズマビーチ\",\n        \"plum\": \"ぷらむ\",\n        \"plus\": \"プラス\",\n        \"pocchi\": \"ぽっち\",\n        \"poin\": \"ぽいん\",\n        \"poison needle\": \"Poison Needle\",\n        \"pokke\": \"ぽっけ\",\n        \"pokochin\": \"ぽこちん\",\n        \"pokota\": \"ぽこた\",\n        \"pokurouta\": \"ポクロウタ\",\n        \"pole\": \"ポール\",\n        \"polorinken\": \"ポロリン軒\",\n        \"poma\": \"poma\",\n        \"pomimiko\": \"ぽみみ子\",\n        \"pomupomu\": \"ぽむぽむ\",\n        \"ponchi\": \"ぽんち\",\n        \"ponde\": \"ぽんで\",\n        \"ponhosikotu\": \"PON☆骨\",\n        \"poni.\": \"ぽに。\",\n        \"ponkan 8\": \"ぽんかん⑧\",\n        \"ponkichi\": \"ぽんきち\",\n        \"ponkotsu\": \"ぽんこつ\",\n        \"ponpe matkachi\": \"尾形全\",\n        \"ponyuzu\": \"ぽんゆず\",\n        \"ponzu\": \"ぽん酢\",\n        \"popo\": \"popo\",\n        \"poponko\": \"ぽぽんこ\",\n        \"popopalt\": \"ぽぽぱると\",\n        \"nishi shizumu\": \"西しずむ\",\n        \"poriko\": \"ポリ子\",\n        \"poriuretan\": \"ぽりうれたん\",\n        \"poron\": \"ぽろん\",\n        \"poronatsu\": \"ポロなつ\",\n        \"porosuke\": \"ぽろすけ\",\n        \"porurin\": \"ポルリン\",\n        \"poshushi\": \"ぽしゅ氏\",\n        \"potsu\": \"ぽつ\",\n        \"potu\": \"ぽつ\",\n        \"powaito\": \"ぽわいと\",\n        \"poyamu\": \"ぽやむ\",\n        \"poyo equals namaste\": \"ポヨ=ナマステ\",\n        \"pozesuke\": \"ポゼ助\",\n        \"ppoint\": \"Pポイント\",\n        \"preggypenny\": \"PreggyPenny\",\n        \"president-p\": \"president-p\",\n        \"prhs\": \"Prhs\",\n        \"pri\": \"ぷり\",\n        \"princess lemanko\": \"プリンセスレマン子\",\n        \"project bellerophon\": \"Project Bellerophon\",\n        \"prophecy\": \"ぷろへしぃ\",\n        \"propolisee\": \"プロポリスEE\",\n        \"psohatten\": \"psohatten\",\n        \"ptai\": \"ptai\",\n        \"pu-en\": \"pu-en\",\n        \"pu2\": \"pu2\",\n        \"pua\": \"Pua\",\n        \"pucca\": \"ぷっか\",\n        \"puchida\": \"ぷちだ\",\n        \"puchii puuchii\": \"ぷーちぃ・ぷぅちぃ\",\n        \"pukara\": \"PUKARA\",\n        \"pukkunn\": \"ぷっくん\",\n        \"punita\": \"ぷにた\",\n        \"puniyama meroro\": \"ぷにやまめろろ\",\n        \"punyon\": \"プニョン\",\n        \"puranpuman\": \"ぷらんぷまん\",\n        \"purapa\": \"ぷらぱ\",\n        \"pureinn\": \"pureinn\",\n        \"puriko\": \"プリ子\",\n        \"purin\": \"ぷりん\",\n        \"puripuri jet\": \"プリプリJET\",\n        \"puripuri kikou shidan\": \"ぷりぷり機甲師団\",\n        \"puripuri uemon\": \"ぷりぷり大佐\",\n        \"purisa\": \"purisa\",\n        \"puritei\": \"ぷりてゐ\",\n        \"purplecroudhill\": \"紫雲山頂\",\n        \"puti\": \"ぷち\",\n        \"pyouryuu\": \"彪竜\",\n        \"pyz\": \"pyz\",\n        \"q1\": \"究一\",\n        \"qiqo\": \"qiqo\",\n        \"qko\": \"Q子\",\n        \"qoom\": \"くーム\",\n        \"quanxing\": \"光星\",\n        \"qudamomo\": \"Qudamomo\",\n        \"qunami himehiko\": \"九波ヒメヒコ\",\n        \"qutouten\": \"句読点\",\n        \"quu\": \"Quu\",\n        \"qzna\": \"qzna\",\n        \"r\": \"あーる\",\n        \"r-ex\": \"R-Ex\",\n        \"ra-men\": \"らーめん\",\n        \"rabbi\": \"らび\",\n        \"rabbit\": \"Rabbit\",\n        \"racer\": \"racer\",\n        \"racket\": \"らけっと\",\n        \"radio\": \"ラジオ\",\n        \"radiohead\": \"ラヂヲヘッド\",\n        \"raemz\": \"Raemz\",\n        \"rafuro\": \"ラフロ\",\n        \"ragetsu\": \"裸月\",\n        \"rai\": \"ライ\",\n        \"raiden\": \"らいでん\",\n        \"raijin maru\": \"雷神丸\",\n        \"raika\": \"ライカ\",\n        \"raimu\": \"莱夢\",\n        \"raipa zrx\": \"雷覇ZRX\",\n        \"rairarai\": \"らいらライ\",\n        \"raitei\": \"雷丁\",\n        \"raiun\": \"らいうん\",\n        \"rajii\": \"らじー\",\n        \"rakia\": \"rakiA\",\n        \"rakko\": \"らっこ\",\n        \"rakkyo\": \"ラッキョ\",\n        \"rakuda torino\": \"楽田トリノ\",\n        \"rakuji tarahi\": \"楽時たらひ\",\n        \"rakuria\": \"ラクリア\",\n        \"rama\": \"らま\",\n        \"ramble\": \"RAMBLE\",\n        \"ramdac 300\": \"RAMDAC 300\",\n        \"ramen-penguin\": \"拉麵企鵝\",\n        \"rami\": \"らみ\",\n        \"ramii\": \"らみぃ\",\n        \"ramototu\": \"ラモトツ\",\n        \"rampant404\": \"Contact\",\n        \"ramu\": \"らむ\",\n        \"ran\": \"RAN\",\n        \"ranaecho\": \"ranaECHO\",\n        \"ranke\": \"らんけ\",\n        \"rannero\": \"RanneRo\",\n        \"rarana\": \"ららな\",\n        \"rasahan\": \"ラサハン\",\n        \"rasson\": \"らっそん\",\n        \"rasukaru\": \"らすかる\",\n        \"rate\": \"RaTe\",\n        \"rati\": \"ラティ\",\n        \"rayze\": \"瑞氏\",\n        \"razy\": \"らじー\",\n        \"razz\": \"らず\",\n        \"recaro\": \"れかろ\",\n        \"red.d\": \"Red.D\",\n        \"redhair\": \"RedHair\",\n        \"redking\": \"れっどきんぐ\",\n        \"rei\": \"REI\",\n        \"rei park\": \"れいぱぁく\",\n        \"reigamk2\": \"麗牙Mk-2\",\n        \"reiji\": \"れゐぢ\",\n        \"reika\": \"零花\",\n        \"reimei\": \"黎明\",\n        \"reine\": \"レーヌ\",\n        \"reishiki aria\": \"零式アリア\",\n        \"rekisitaihoonoji\": \"レキシタイふのじ\",\n        \"reku\": \"れく\",\n        \"rela\": \"Rela\",\n        \"relm\": \"りるむ\",\n        \"remora\": \"remora\",\n        \"remu\": \"れむ\",\n        \"ren mizuha\": \"蓮みづは\",\n        \"ren suru\": \"れんする\",\n        \"rena\": \"れな\",\n        \"renge\": \"れんげ\",\n        \"rentaichou\": \"连队长\",\n        \"rentan\": \"煉丹\",\n        \"rescar\": \"れすか\",\n        \"reso\": \"れーそ\",\n        \"retasu\": \"れたすー\",\n        \"reto\": \"れと\",\n        \"retota\": \"れと太\",\n        \"ri-ru-\": \"りーるー\",\n        \"ri.\": \"ri.\",\n        \"tajima ria\": \"立嶋りあ\",\n        \"rian\": \"りあん\",\n        \"riboshika\": \"リボシカ\",\n        \"ricca\": \"りっか\",\n        \"ricchy\": \"ricchy\",\n        \"rice oomori\": \"ライスおおもり\",\n        \"rie\": \"RiE\",\n        \"rihi\": \"りひ\",\n        \"rihitozoire\": \"リヒトゾイレ\",\n        \"rii\": \"りい\",\n        \"rikamarika\": \"rikamarika\",\n        \"rikazu\": \"rikazu\",\n        \"riki\": \"利木\",\n        \"rikka\": \"立夏\",\n        \"rikoko\": \"りここ\",\n        \"rikomaru\": \"りこ丸\",\n        \"rikose\": \"リコセ\",\n        \"riku maru\": \"りくまる\",\n        \"rikudo inuhiko\": \"六堂犬彦\",\n        \"rikudou\": \"六道\",\n        \"rikudou koushi\": \"六道神士\",\n        \"rikume\": \"rikume\",\n        \"rikusu\": \"リクス\",\n        \"rikuto\": \"六兎\",\n        \"rimukoro\": \"リムコロ\",\n        \"rimviolet\": \"rimviolet\",\n        \"rin\": \"rin\",\n        \"rindoh\": \"竜瞳\",\n        \"rindou akira\": \"りんどうあきら\",\n        \"ringo\": \"りんご\",\n        \"ringo amee\": \"林檎あめぇ\",\n        \"ringo anu\": \"りんごあぬ\",\n        \"ringo no kisetsu.\": \"りんごの季節。\",\n        \"rinku\": \"りんく\",\n        \"rinno arara\": \"りんのあらら\",\n        \"rino nymphet\": \"Rino nymphet\",\n        \"rinoko\": \"リノコ\",\n        \"rinri kazuki\": \"倫理一輝\",\n        \"rinsun\": \"リンスン\",\n        \"rinta\": \"りんた\",\n        \"rinunu\": \"りぬぬ\",\n        \"rioemon\": \"緋良雪リオ\",\n        \"rioka\": \"rioka\",\n        \"rioko\": \"りおこ\",\n        \"ripton\": \"りぷとん\",\n        \"rir\": \"RIR\",\n        \"ririmat tsuruegar\": \"リリマット・ツルーガー\",\n        \"risa.\": \"りさ。\",\n        \"risei\": \"李星\",\n        \"risuou\": \"李子昴\",\n        \"risupu\": \"risupu\",\n        \"rit.\": \"rit.\",\n        \"rittiri\": \"リッティリ\",\n        \"rityou\": \"リチョウ\",\n        \"riumu\": \"りうむ\",\n        \"riuta gao\": \"りうたがお\",\n        \"rivale\": \"RIVALE\",\n        \"riyun\": \"RiYUN\",\n        \"ro\": \"ro\",\n        \"roche\": \"Roche\",\n        \"rocket kyoudai\": \"ロケット兄弟\",\n        \"rocket okaboshi\": \"ロケット岡星\",\n        \"rockmanwjh\": \"rockmanwjh\",\n        \"roco\": \"ロコ\",\n        \"rohgun\": \"老眼\",\n        \"rojione\": \"ロジオネ\",\n        \"roki\": \"Roki\",\n        \"rokko\": \"ロッコ\",\n        \"rokomaru\": \"ロコ丸\",\n        \"roku\": \"ロク\",\n        \"rokudou ashura\": \"六道阿修羅\",\n        \"rokujyou\": \"六畳\",\n        \"rokuku\": \"ろくく\",\n        \"rokumei kanau\": \"鹿鳴叶\",\n        \"rokumonsen kako\": \"六文銭カコ\",\n        \"rokuroichi\": \"ロクロイチ\",\n        \"rokusiru\": \"六汁\",\n        \"rokusuke\": \"ろくすけ\",\n        \"rokusyou kokuu\": \"緑青黒羽\",\n        \"rollei\": \"ローライ\",\n        \"rontan\": \"ろんたん\",\n        \"root001\": \"root001\",\n        \"roreru\": \"ろれる\",\n        \"roro\": \"ロロ\",\n        \"rorochannel\": \"ろろちゃんねる\",\n        \"roromo\": \"ろろも\",\n        \"rororogi mogera\": \"露々々木もげら\",\n        \"ros\": \"ROS\",\n        \"roshuu takehiro\": \"浪州建博\",\n        \"rou\": \"rou\",\n        \"rouka\": \"ろうか\",\n        \"route39\": \"Route39\",\n        \"roy tong-koh\": \"瑞東航\",\n        \"roze\": \"ロゼ\",\n        \"rozen\": \"ロゼン\",\n        \"rq\": \"RQ\",\n        \"rt.\": \"RT.\",\n        \"rubaka\": \"Rubaka\",\n        \"rucu\": \"るく\",\n        \"rucuk\": \"るく\",\n        \"rudo\": \"Rudo\",\n        \"rudoni\": \"ルドーニ\",\n        \"ruha69\": \"ruha69\",\n        \"rui\": \"RUI\",\n        \"ruiko\": \"RUIKO\",\n        \"ruirui\": \"るいるい\",\n        \"rukichi\": \"るきち\",\n        \"rumina\": \"るみな\",\n        \"rumiya\": \"るみや\",\n        \"rumiya isasa\": \"流宮いささ\",\n        \"run\": \"ルン\",\n        \"runa\": \"runa\",\n        \"rune\": \"るね\",\n        \"ruratto\": \"るらっと\",\n        \"ruri erika\": \"瑠璃えりか\",\n        \"ruri rarako\": \"瑠璃ららこ\",\n        \"ruri tsubame\": \"瑠璃燕\",\n        \"rurimaru\": \"瑠璃丸\",\n        \"ruroo\": \"るろお\",\n        \"rururu\": \"流×3♪\",\n        \"rusher verak\": \"ラッシャーヴェラク\",\n        \"rushi\": \"るし\",\n        \"rushsoldier\": \"RushSoldier\",\n        \"russia no dassouhei\": \"ロシヤの脱走兵\",\n        \"rutubo\": \"るつぼ\",\n        \"rux\": \"rux\",\n        \"rxjx\": \"RxJx\",\n        \"ryo.k\": \"りょう・K\",\n        \"ryoattoryo\": \"りょう@涼\",\n        \"ryoji\": \"Ryoji\",\n        \"ryokunyo\": \"りょうくんよ\",\n        \"ryokuoushoku\": \"緑黄色\",\n        \"ryokusiki\": \"緑式\",\n        \"ryokutya\": \"ryokutya\",\n        \"ryomaru\": \"りょまる\",\n        \"ryome gantai\": \"両目眼帯\",\n        \"ryosuke.\": \"涼助。\",\n        \"ryouei\": \"諒英\",\n        \"ryu\": \"RYU\",\n        \"ryu shou\": \"劉祥\",\n        \"ryu-akt\": \"Ryu-Akt\",\n        \"ryujin\": \"RYUJIN\",\n        \"ryuki\": \"リュウキ\",\n        \"ryumage\": \"りう☆めいじ\",\n        \"ryuno\": \"ryuno\",\n        \"ryunosuke\": \"龍之介\",\n        \"ryutou\": \"竜湯\",\n        \"ryuudou hiromi\": \"龍堂ひろみ\",\n        \"ryuuka ryou\": \"りゅうか綾\",\n        \"konoshige\": \"コノシゲ\",\n        \"ryuuna\": \"りゅうな\",\n        \"ryuutai niku\": \"流体肉\",\n        \"s\": \"S\",\n        \"s parameter\": \"S・パラミター\",\n        \"s-ram\": \"エスラム\",\n        \"s.kosugi\": \"S.濃すぎ\",\n        \"s.shimizu\": \"S.SHIMIZU\",\n        \"s73d\": \"s73d\",\n        \"saaya\": \"さあや\",\n        \"sabahito\": \"鯖人\",\n        \"sabaku\": \"砂漠\",\n        \"sabakui\": \"食鯖獣\",\n        \"sabaneko\": \"さばねこ\",\n        \"sabanoniwatori\": \"さばのにわとり\",\n        \"sabawo\": \"サバヲ\",\n        \"sabbath\": \"Sabbath\",\n        \"sabi wasabi\": \"錆わさび\",\n        \"sabuko\": \"サブコ\",\n        \"saburou\": \"サブロー\",\n        \"sacchi\": \"さっち\",\n        \"sachito\": \"サチト\",\n        \"sachuma\": \"さちゅま\",\n        \"saco\": \"saco\",\n        \"sad\": \"SAD\",\n        \"sadagorou\": \"貞五郎\",\n        \"sadahiro\": \"定宏\",\n        \"sadakichi\": \"さだ吉\",\n        \"sado\": \"さど\",\n        \"saebashi\": \"さえばし\",\n        \"saegusa kohaku\": \"冴草こはく\",\n        \"saegusa mutsumi\": \"さえぐさ睦\",\n        \"saeki kura\": \"佐伯倉\",\n        \"saeki takao\": \"冴樹高雄\",\n        \"saemon\": \"サエモン\",\n        \"safi\": \"さふぃ\",\n        \"sagakichi\": \"さがきち\",\n        \"sagami inumaru\": \"佐上犬丸\",\n        \"sagami rin\": \"相模琳\",\n        \"sagami yoshitsune\": \"沙神よしつね\",\n        \"sagano hellmer\": \"サガノヘルマー\",\n        \"sagano yuuji\": \"サガノユウジ\",\n        \"sahara\": \"サハラ\",\n        \"sai-go\": \"sai-go\",\n        \"saiga mayu\": \"栖賀まゆ\",\n        \"saigi\": \"サイギ\",\n        \"saijo satoru\": \"西條サトル\",\n        \"saika\": \"彩霞\",\n        \"saiki\": \"斉木\",\n        \"saiki efu\": \"彩樹衛生\",\n        \"saiki makiko\": \"斉木マキコ\",\n        \"saikirider\": \"サイキライダー\",\n        \"saikyo pink\": \"才京ぴんく\",\n        \"saint shiro\": \"聖シロー\",\n        \"sainyan\": \"さいにゃん\",\n        \"saipin\": \"さいピン\",\n        \"sairi\": \"サイリ\",\n        \"saita masataka\": \"才田雅孝\",\n        \"saito\": \"才斗\",\n        \"saito sakae\": \"さいとー栄\",\n        \"saito yahu\": \"サイトウヤフ\",\n        \"saitou\": \"斎藤\",\n        \"saitou natsuki\": \"斎藤なつき\",\n        \"saitou tomoyuki\": \"斉藤友之\",\n        \"saitou yamashironokami yukihiko\": \"齋藤山城守之彦\",\n        \"saitou yuuichi\": \"斉藤祐一\",\n        \"saizuka mio\": \"祭塚澪\",\n        \"saji\": \"さじ\",\n        \"saka\": \"さか\",\n        \"sakae\": \"サカエ\",\n        \"sakai hitoshi\": \"酒井仁\",\n        \"sakai meri\": \"境メリ\",\n        \"sakai ringo\": \"坂井リンゴ\",\n        \"sakaki imasato\": \"さかきいまさと\",\n        \"sakaki maki\": \"榊MAKI\",\n        \"sakaki naomoto\": \"さかきなおもと\",\n        \"sakaki shigeru\": \"榊しげる\",\n        \"sakaki tsui\": \"さかきツイ\",\n        \"sakaki yuino\": \"榊ゆいの\",\n        \"sakakibara kaorunaoko\": \"榊原薫奈緒子\",\n        \"sakakibara keisuke\": \"榊原圭介\",\n        \"sakamoto sarutomunto nerima\": \"坂本サルトムント練馬\",\n        \"sakana\": \"魚\",\n        \"sakana tomomi\": \"魚ともみ\",\n        \"sakasana\": \"さかさな\",\n        \"sakata kintoki\": \"坂田金時\",\n        \"sakawaki herodai\": \"サカワキヒロ太\",\n        \"sakayaki\": \"月代\",\n        \"sakazuki homare\": \"酒月ほまれ\",\n        \"sakemasu\": \"サケマス\",\n        \"saketanuki\": \"酒たぬき\",\n        \"saki\": \"saki\",\n        \"saki meguru\": \"咲巡留\",\n        \"sakida saki\": \"さきだ咲紀\",\n        \"sakifox\": \"sakifox\",\n        \"sakimi\": \"さきみ\",\n        \"sakimiya\": \"sakimiya\",\n        \"sakishita senmu\": \"さきしたせんむ\",\n        \"sakisita\": \"さきした\",\n        \"sakiyamama\": \"sakiyamama\",\n        \"sakiyo cake\": \"崎由けぇき\",\n        \"sako\": \"サコ\",\n        \"sakofu\": \"さこふ\",\n        \"sakokichi\": \"さこきち\",\n        \"saku\": \"saku\",\n        \"sakuganki\": \"削顔鬼\",\n        \"sakula\": \"SAKULA\",\n        \"sakumi\": \"サクミ\",\n        \"sakumichi\": \"さくみち\",\n        \"sakuna\": \"さくな\",\n        \"sakura alta\": \"桜あるた\",\n        \"sakura ashika\": \"さくらあしか\",\n        \"sakura bunchou\": \"桜文鳥\",\n        \"sakura hanatsumi\": \"佐倉はなつみ\",\n        \"sakura hiiro\": \"さくらひいろ\",\n        \"sakura ichika\": \"桜イチカ\",\n        \"sakura kotetsu\": \"桜小鉄\",\n        \"sakura mafumi\": \"佐倉まふみ\",\n        \"sakura masachi\": \"佐倉まさち\",\n        \"sakura mkii\": \"SAKURA・mkII\",\n        \"sakura moyon\": \"桜もよん\",\n        \"sakura pino\": \"咲楽ぴの\",\n        \"sakura pochi\": \"桜ポチ\",\n        \"sakura rio\": \"佐倉りお\",\n        \"sakura ryuuken\": \"桜りゅうけん\",\n        \"sakura sawa\": \"紗久楽さわ\",\n        \"sakura yukimi\": \"桜ゆきみ\",\n        \"sakuraba yuuki\": \"桜庭友紀\",\n        \"sakuragi rian\": \"桜木李杏\",\n        \"sakurai\": \"サクライ\",\n        \"sakurai aya\": \"桜井綾\",\n        \"sakurai energy\": \"櫻井エネルギー\",\n        \"sakurai kouki\": \"桜井コウキ\",\n        \"sakuraizumi yuu\": \"桜泉ゆう\",\n        \"sakuramaru\": \"さくらまる\",\n        \"sakuramochi\": \"桜餅\",\n        \"sakurano hinako\": \"桜乃ひな子\",\n        \"sakurano ru\": \"櫻野露\",\n        \"sakurazari hotori\": \"桜去ほとり\",\n        \"sakusaku\": \"sakusaku\",\n        \"sakusha fushou\": \"作者不詳\",\n        \"sakuya tsuitachi\": \"さくやついたち\",\n        \"sakw\": \"sakw\",\n        \"salamander\": \"サラマンダ\",\n        \"salmon\": \"サーモン\",\n        \"salty\": \"ソルティ\",\n        \"salty dog\": \"ソルティドッグ\",\n        \"sam\": \"Sam\",\n        \"same\": \"さめ\",\n        \"same kamaboko\": \"鮫かまぼこ\",\n        \"samejima minoru\": \"鮫島実\",\n        \"samoko\": \"さもこ\",\n        \"samozumo tooru\": \"さもずも融\",\n        \"sanada kana\": \"真田カナ\",\n        \"sanada mike\": \"真田ミケ\",\n        \"sanada rin\": \"真田鈴\",\n        \"sanada sin-ichi\": \"真田真壱\",\n        \"sanami\": \"さなみ\",\n        \"sanase nasa\": \"真世那沙\",\n        \"sanbasou\": \"さんば挿\",\n        \"sanbu kousaku\": \"三部耕作\",\n        \"sangatsu\": \"三月\",\n        \"sangou\": \"さんごう\",\n        \"sanjou tomomi\": \"三条友美\",\n        \"sanku\": \"三九\",\n        \"sankuro\": \"三九呂\",\n        \"sannyuutei shinta\": \"三乳亭しん太\",\n        \"sano lemon\": \"さのレモン\",\n        \"sano toshihide\": \"佐野俊英\",\n        \"sanomako\": \"さのまこ\",\n        \"sanpaku\": \"三泊\",\n        \"sanpatisiki\": \"38式\",\n        \"sansyouo\": \"山椒魚\",\n        \"santos\": \"サントス\",\n        \"sanuki ami\": \"さぬき亜美\",\n        \"sanukinokami takakage\": \"讃岐守隆影\",\n        \"sanwaribiki\": \"三割引\",\n        \"sanzo\": \"三三\",\n        \"sanzui\": \"酸水\",\n        \"saogokushi\": \"さおごくし\",\n        \"saotome mokono\": \"早乙女もこ乃\",\n        \"sape\": \"さぺ\",\n        \"sapphire\": \"サファイア\",\n        \"saraki\": \"saraki\",\n        \"saranaru takami\": \"皿成高味\",\n        \"saranoki chikara\": \"沙羅木力\",\n        \"sarashina ryouichi\": \"更科了一\",\n        \"sarfata\": \"さふぁ太\",\n        \"sarikyou\": \"サリキョウ\",\n        \"saru\": \"saru\",\n        \"saru pikkoro\": \"サル・ピッコロ\",\n        \"sarujie\": \"さるぢえ\",\n        \"saruno ikigimo\": \"さるのいきぎも\",\n        \"sas\": \"SAS\",\n        \"sasa\": \"ささ\",\n        \"sasa sakuno\": \"佐々さくの\",\n        \"sasagawa nagaru\": \"笹川ながる\",\n        \"sasai\": \"些細\",\n        \"sasaki\": \"ササキ\",\n        \"sasaki kuro\": \"ささきくろ\",\n        \"sasaki maru\": \"笹木まる\",\n        \"sasaki muu\": \"佐々木無宇\",\n        \"sasaki saki\": \"ササキ サキ\",\n        \"sasaki sasa\": \"笹木ささ\",\n        \"sasaki sasasa\": \"ささき笹々\",\n        \"sasaki shinpei\": \"佐々木慎平\",\n        \"sasaki tamaru\": \"佐々木珠流\",\n        \"sasaki teron\": \"佐々木てろん\",\n        \"sasakichi\": \"ささきち\",\n        \"sasamaru\": \"笹丸\",\n        \"sasamashin\": \"ササマシン\",\n        \"sasana\": \"sasana\",\n        \"sasanoha toro\": \"笹乃葉とろ\",\n        \"sasara\": \"ささら\",\n        \"sasato\": \"笹徒\",\n        \"sasayuki\": \"SASAYUKi\",\n        \"sashimi\": \"さしみ\",\n        \"sasizume soutarou\": \"差詰そうたろう\",\n        \"sasori butter\": \"さそりバター\",\n        \"sataken\": \"佐竹犬\",\n        \"satetsu\": \"サテツ\",\n        \"sato\": \"sato\",\n        \"sato seila\": \"佐藤せいら\",\n        \"satomi\": \"里美\",\n        \"satomi hidefumi\": \"さとみひでふみ\",\n        \"satomi hinako\": \"里海ひなこ\",\n        \"satomi hiroyuki\": \"里見ひろゆき\",\n        \"satomi sato\": \"里見サト\",\n        \"satonaka chora\": \"さとなか樗良\",\n        \"satonishi\": \"サトニシ\",\n        \"satoo aki\": \"さとうあき\",\n        \"satosi\": \"Satosi\",\n        \"satou\": \"佐藤\",\n        \"satou hagane\": \"佐藤はがね\",\n        \"satou iori\": \"佐藤イオリ\",\n        \"satou kana\": \"佐藤カナ\",\n        \"satou kimiatsu\": \"さとうきみあつ\",\n        \"satou makura\": \"さとう枕\",\n        \"satou masa\": \"沙藤昌\",\n        \"satou memeko\": \"さとうメメ子\",\n        \"satou rima\": \"佐藤りま\",\n        \"satou samu\": \"佐藤36\",\n        \"satou santouhei\": \"さとう三等兵\",\n        \"satou shouji\": \"佐藤想次\",\n        \"satou tomoyuki\": \"佐藤知行\",\n        \"satou toshio\": \"佐藤登志夫\",\n        \"satouori\": \"さとうおり\",\n        \"satozaki\": \"里崎\",\n        \"satsuki\": \"朔月\",\n        \"satsuki fumi\": \"皐月フミ\",\n        \"satsuki gen\": \"皐月幻\",\n        \"satsuki haru\": \"皐月ハル\",\n        \"satsuki mikazu\": \"皐月みかず\",\n        \"satsuki suzuran\": \"皐月すずらん\",\n        \"satsuki usagi\": \"皐月ウサギ\",\n        \"satsuki yuni\": \"佐月由仁\",\n        \"sattol\": \"さっとる\",\n        \"sattsu\": \"さっつ\",\n        \"sawa\": \"さわ\",\n        \"sawada daisuke\": \"沢田大介\",\n        \"sawai delta\": \"澤井デルタ\",\n        \"sawaki saki\": \"澤木沙樹\",\n        \"sawako\": \"サワコ\",\n        \"sawamura\": \"澤村\",\n        \"sawamura ao\": \"沢村青\",\n        \"sawamura kina\": \"さわむらきな\",\n        \"sawarano goan\": \"さわらの五庵\",\n        \"sawasaki\": \"沢崎\",\n        \"sawashiro kei\": \"沢城ケイ\",\n        \"sawatari hitoshi\": \"沢渡仁司\",\n        \"sawatei\": \"さわてぃ\",\n        \"sawori\": \"サヲリ\",\n        \"sayaka\": \"紗弥香\",\n        \"sayakata katsumi\": \"茶館カツミ\",\n        \"sayoshi ayumi\": \"作吉歩允\",\n        \"sayossa\": \"さよっさ\",\n        \"sayousuke\": \"さようすけ\",\n        \"sayun\": \"さゆん\",\n        \"sazanami kazuto\": \"漣一人\",\n        \"sazanami mio\": \"さざなみみぉ\",\n        \"scarlet\": \"スカーレット\",\n        \"sch-mit\": \"シューミット\",\n        \"school izumi\": \"すくーるいずみ\",\n        \"scope cat\": \"すこぉぷCAT\",\n        \"scotch\": \"スコチ\",\n        \"sdwing\": \"SDwing\",\n        \"seanji sariel\": \"セアンジ・サリエル\",\n        \"secco\": \"Secco\",\n        \"sedra cicir\": \"sedra・cicir\",\n        \"segami daisuke\": \"瀬上大輔\",\n        \"segawa\": \"瀬川\",\n        \"seguchi takahiro\": \"瀬口たかひろ\",\n        \"sei torao\": \"瀬井虎男\",\n        \"seidenki\": \"seidenki\",\n        \"seigo\": \"せいご\",\n        \"seiha\": \"Seiha\",\n        \"seihoukei\": \"せいほうけい\",\n        \"seiichi\": \"清一\",\n        \"seijirou kagechika\": \"せいじろうかげちか\",\n        \"seiju\": \"セイジュ\",\n        \"seiryou touya\": \"青凌とうや\",\n        \"seishinja\": \"精子ンジャ\",\n        \"seito a\": \"生徒A\",\n        \"sekiguchi hiroki\": \"セキグチヒロキ\",\n        \"sekihan\": \"せきはん\",\n        \"sekihara\": \"せきはら\",\n        \"sekino takehiro\": \"関野武弘\",\n        \"sekiyu\": \"石油\",\n        \"sella\": \"せら\",\n        \"semahiro\": \"せまひろ\",\n        \"semimaru semi\": \"蝉丸せみ\",\n        \"semino yuu\": \"蝉のゆう\",\n        \"sena chifuyu\": \"瀬奈茅冬*\",\n        \"sena monaco\": \"瀬菜モナコ\",\n        \"sena rinko\": \"瀬名鈴子\",\n        \"senakagashiri\": \"背中が尻\",\n        \"senba\": \"千羽\",\n        \"senbata roh\": \"せんばた楼\",\n        \"senbon torii\": \"千本トリイ\",\n        \"senda kouji\": \"千田耕司\",\n        \"sendorikun\": \"せんどりくん\",\n        \"senga migiri\": \"旋牙闇霧\",\n        \"sengoku aky\": \"千国AKY\",\n        \"sengoku-kun\": \"戦国くん\",\n        \"senju rion\": \"千樹りおん\",\n        \"senkan yamatoni\": \"戦艦大和煮\",\n        \"senke kagero\": \"千家カゲロー\",\n        \"senkou hanabi\": \"閃光花火\",\n        \"sennomori maitake\": \"千ノ森まいたけ\",\n        \"senomoto hisashi\": \"瀬之本久史\",\n        \"senor daietsu\": \"セニョール大悦\",\n        \"senpuyaro\": \"旋風野郎\",\n        \"senrabanshou\": \"千羅万象\",\n        \"senwa\": \"センワ\",\n        \"senya yomi\": \"千夜詠\",\n        \"seo haruto\": \"瀬尾春人\",\n        \"seo tatsuya\": \"瀬尾辰也\",\n        \"sera tooru\": \"瀬良透\",\n        \"serakichi.\": \"世羅吉。\",\n        \"seres ryu\": \"セレス龍\",\n        \"seresu\": \"せれす\",\n        \"seri nazuna\": \"せりなずな\",\n        \"serika\": \"セリカ\",\n        \"serikawa kazumi\": \"芹川一海\",\n        \"serikawa saki\": \"芹川沙樹\",\n        \"serimiya ransu\": \"芹宮らんす\",\n        \"serino itsuki\": \"芹野いつき\",\n        \"serizawa anne\": \"芹沢あんね\",\n        \"serizawa katsumi\": \"芹沢克己\",\n        \"serizawa nae\": \"芹澤ナエ\",\n        \"serizawa yuuji\": \"芹沢ゆーじ\",\n        \"sesame surigoma\": \"セサミすりごま\",\n        \"seseri\": \"せせり\",\n        \"sessa takuma\": \"浙佐拓馬\",\n        \"sesso nashiko\": \"節操なし子\",\n        \"sethxzoe\": \"sethxzoe\",\n        \"setouchi\": \"瀬戸内\",\n        \"setouchi kurage\": \"瀬戸内くらげ\",\n        \"setouchi sumako\": \"せとうちすま子\",\n        \"setsuna\": \"刹那\",\n        \"setsuna yui\": \"せつな唯\",\n        \"setuna rio\": \"刹那莉織\",\n        \"sezan\": \"sezan\",\n        \"sezoku\": \"セゾク\",\n        \"shaa peipei\": \"西北々\",\n        \"shachi\": \"しゃち\",\n        \"shadow\": \"Shadow\",\n        \"shaian\": \"しゃいあん\",\n        \"shain a\": \"社員A\",\n        \"shake\": \"しゃけ\",\n        \"samon shiu\": \"左門しう\",\n        \"shakeko\": \"しゃけこ\",\n        \"shamon\": \"沙門\",\n        \"shamorock heart\": \"シャモロックハート\",\n        \"shamp samurai\": \"SHAMP侍\",\n        \"sharaku seiya\": \"写裸苦聖也\",\n        \"shark yaminabe\": \"シャーク闇鍋\",\n        \"sharpffffff\": \"sharpFFFFFF\",\n        \"shayo\": \"しゃよー\",\n        \"shen yan\": \"哂言\",\n        \"shena excel\": \"椎名エクセル\",\n        \"shian\": \"しあん\",\n        \"shiawase 1500\": \"幸せ1500\",\n        \"shiawase ninaru\": \"幸瀬になる\",\n        \"shiawase no katachi\": \"幸せのかたち\",\n        \"shiba\": \"柴\",\n        \"shibainu\": \"柴犬\",\n        \"shibame\": \"しばあめ\",\n        \"shibari kana\": \"縛夏奈\",\n        \"shibaya\": \"しばや\",\n        \"shibire hitsuji\": \"シビレヒツジ\",\n        \"shibuki oroshi\": \"飛沫おろし\",\n        \"shibusawa hayato\": \"渋沢隼人\",\n        \"shichoson\": \"市町村\",\n        \"shidaka akikuni\": \"しだかあきくに\",\n        \"shidatsu takayuki\": \"紫妲たかゆき\",\n        \"shieko\": \"しえこ\",\n        \"shift\": \"shift\",\n        \"shigaoka touki\": \"志峨丘トウキ\",\n        \"shigatake\": \"シガタケ\",\n        \"shigatsu sekito\": \"卯月赤人\",\n        \"shigehira\": \"茂平\",\n        \"shigekix\": \"しげきっくす\",\n        \"shigi azusa\": \"鴫あずさ\",\n        \"shiguchi satoshi\": \"シグチサトシ\",\n        \"shigunyan\": \"しぐにゃん\",\n        \"shigure kyou\": \"しぐれ卿\",\n        \"shigure ryuunosuke\": \"時雨龍之介\",\n        \"shihou\": \"志方\",\n        \"shii\": \"しぃ\",\n        \"shiigetsu yuu\": \"詩月雄\",\n        \"shiina nami\": \"椎名波\",\n        \"shiino yuy\": \"椎野唯\",\n        \"shijima\": \"しじま\",\n        \"shijima kiri\": \"しじま嬉吏\",\n        \"shijima yukio\": \"四島由紀夫\",\n        \"shijimi\": \"しじみ\",\n        \"shijokko\": \"しじょっこ\",\n        \"shijou mako\": \"士嬢マコ(・c_・ )\",\n        \"shijou sadafumi\": \"四条定史\",\n        \"shikage nagi\": \"しかげなぎ\",\n        \"shikanari\": \"シカナリ\",\n        \"shikata haru\": \"志方ハル\",\n        \"shikato miyo\": \"しかとみよ\",\n        \"shiki satoshi\": \"土贵智志\",\n        \"shikigami azuma\": \"しきがみあずま\",\n        \"shikimura\": \"しきむら\",\n        \"shikino\": \"シキノ\",\n        \"shikniful\": \"shikniful\",\n        \"shikojo\": \"シコジョー\",\n        \"shikunikiwa\": \"しくにきわ\",\n        \"shikuta maru\": \"シクタ丸\",\n        \"shima\": \"シマ\",\n        \"shima kyousuke\": \"志摩京佑\",\n        \"shima mitsuru\": \"志摩みつる\",\n        \"shima seiryuu\": \"嶋成龍\",\n        \"shima syu\": \"しまシュー\",\n        \"shima takashi\": \"嶌隆\",\n        \"shimachiyo\": \"しまちよ\",\n        \"shimada kazuma\": \"島田和真\",\n        \"shimada robin\": \"嶋田ロビン\",\n        \"shimagarasu\": \"嶋鴉\",\n        \"shimamoto chise\": \"しまもとちせ\",\n        \"shimamoto harumi\": \"島本晴海。\",\n        \"shimamoto utsumi\": \"嶋元うつみ\",\n        \"shimano natsume\": \"しまのなつめ\",\n        \"shimataka\": \"しまたか\",\n        \"shimazaki lem\": \"島崎れむ\",\n        \"shimeji\": \"しめじ\",\n        \"shimeko\": \"しめ子\",\n        \"shimesaba\": \"しめさば\",\n        \"shimizu kiyoshi\": \"清水清\",\n        \"shimizu naotaka\": \"志水なおたか\",\n        \"shimo yamashi\": \"下やまし\",\n        \"shimoda\": \"下田\",\n        \"shimodaira tooko\": \"下平十子\",\n        \"shimofuri oniku\": \"しもふりおにく\",\n        \"shimokata kouzou\": \"霜方降造\",\n        \"shimomura\": \"シモムラ\",\n        \"shimomura keiko\": \"シモムラ\",\n        \"shimosan\": \"シモサン\",\n        \"shimotsuka\": \"しもつか\",\n        \"shimotsuki ria\": \"しもつきりあ\",\n        \"shimoyake\": \"しもやけ\",\n        \"shimoyama giruko\": \"下山ギルコ\",\n        \"shin\": \"真\",\n        \"shin en\": \"新苑\",\n        \"shin-go\": \"シンゴ\",\n        \"shinachiku\": \"しなちく\",\n        \"shinade kuro\": \"科手黒\",\n        \"shinano yura\": \"しなのゆら\",\n        \"shinda mane\": \"Shinda Mane\",\n        \"shindoro mondoro\": \"新泥もんどろー\",\n        \"shindou mayumi\": \"シンドウマユミ\",\n        \"shindou naoto\": \"新堂なおと\",\n        \"shingata juukidou mecha\": \"新型重機動メカ\",\n        \"shingo\": \"SHINGO\",\n        \"shinichi\": \"しんいち\",\n        \"shinjiro\": \"信じろ\",\n        \"shinkai\": \"真海\",\n        \"shinma mei\": \"シンマメイ\",\n        \"shinme\": \"新芽\",\n        \"shinno kei\": \"神野けい\",\n        \"shinnosuke\": \"慎之介\",\n        \"shinobu\": \"シノブ\",\n        \"shinobu akira\": \"篠部秋良\",\n        \"ninbyo nin\": \"忍猫\",\n        \"shinobu shou\": \"哀側翔\",\n        \"shinocco\": \"しのっこ\",\n        \"shinogi kei\": \"しのぎけい\",\n        \"shinonome tarou\": \"東雲太郎\",\n        \"shinonome yuu\": \"東雲優\",\n        \"shinozaki mizu\": \"シノザキミズ\",\n        \"shinozuki kou\": \"しのづき巧\",\n        \"shinshin\": \"しんしん\",\n        \"shinsou comachi\": \"深窓小町\",\n        \"shinta\": \"シン太\",\n        \"shintani\": \"森谷\",\n        \"shio\": \"しお\",\n        \"shio604\": \"塩604\",\n        \"shiogochi\": \"シオゴチ\",\n        \"shioiri numa\": \"汐入ぬま\",\n        \"shioji miduho\": \"汐路ミヅホ\",\n        \"shioko shou\": \"塩胡しょう\",\n        \"shiomeshi\": \"塩飯\",\n        \"shiomi yuusuke\": \"士臣佑介\",\n        \"shion\": \"しおん\",\n        \"shiono etorouji\": \"塩野干支郎次\",\n        \"shiono maki\": \"塩野まき\",\n        \"shiory\": \"shiory\",\n        \"shiosaba\": \"塩鯖ッ\",\n        \"shioya maico\": \"塩屋舞子\",\n        \"shiragiku\": \"白菊\",\n        \"shiraha mato\": \"白羽まと\",\n        \"shirahata\": \"白旗\",\n        \"shiraichigo\": \"しらいちご\",\n        \"shiraishi mamim\": \"白石まみむ\",\n        \"shirakaba\": \"shirakaba\",\n        \"shirakaba masara\": \"白樺まさら\",\n        \"shirakawa yoka\": \"白河桜花\",\n        \"shirane shiratsuki\": \"白嶺白月\",\n        \"shirasagi ug\": \"しらさぎゆうじ\",\n        \"shirasaka rio\": \"白坂りお\",\n        \"shirasaki sana\": \"しらさきさな\",\n        \"shiraso\": \"しらそ\",\n        \"shirasu reiji\": \"白州礼二\",\n        \"shirasu youichi\": \"白須遙一\",\n        \"shiratama azuki\": \"白玉アズキ\",\n        \"shiratama dango\": \"白玉团子\",\n        \"shiratama1gou\": \"白玉一号\",\n        \"shiratsuki shiori\": \"白月しおり\",\n        \"shirihito\": \"尻人\",\n        \"shiritani\": \"尻谷\",\n        \"shirizou\": \"シリ蔵\",\n        \"shiro\": \"しろ\",\n        \"shiroa urang\": \"白亜卯蘭\",\n        \"shirogane\": \"城兼\",\n        \"shirogisu\": \"シロギス\",\n        \"shirogoma rai\": \"白駒らい\",\n        \"shiroi\": \"シロイ\",\n        \"shiroi gunpan\": \"白井薫範\",\n        \"shiroi hakuto\": \"しろいはくと\",\n        \"shiroi kuroneko\": \"白い黒猫\",\n        \"shiroi noria\": \"城井のりあ\",\n        \"shiroishi gatta\": \"白石ガッタ\",\n        \"shirokai mua\": \"白貝みゅあ\",\n        \"shirokarasu\": \"白からす\",\n        \"shirokitsune\": \"しろきつね\",\n        \"shiroku mako\": \"しろくまこ\",\n        \"shirokuro\": \"いれぐ白黒\",\n        \"shiromitsu daiya\": \"白蜜ダイヤ\",\n        \"shiromitsu suzaku\": \"しろみつスザク\",\n        \"shiromuu\": \"しろむー\",\n        \"shirona mikoto\": \"白奈美琴\",\n        \"shironeko haru\": \"白猫ハル\",\n        \"shironeko sanbou\": \"白猫参謀\",\n        \"shirono jia\": \"白野ジア\",\n        \"shirony\": \"しろにい\",\n        \"shiroobi\": \"しろおび\",\n        \"shiroshi\": \"しろし\",\n        \"shirosuzu\": \"しろすず\",\n        \"shirota\": \"代田\",\n        \"shirota kuronosuke\": \"白田クロノスケ\",\n        \"shirota kurota\": \"シロタクロタ\",\n        \"shirotsumekusa\": \"城爪草\",\n        \"shiroya\": \"白弥\",\n        \"shiru\": \"汁\",\n        \"shiruko jiru\": \"しるこ汁\",\n        \"shishido kurou\": \"宍戸くろう\",\n        \"shishigai\": \"シシガイ\",\n        \"shishiji\": \"ししじ\",\n        \"shishimaru\": \"獅子丸\",\n        \"shishimaru kenya\": \"ししまるけんや\",\n        \"shishiotome\": \"ししおとめ\",\n        \"shiso\": \"SHISO\",\n        \"shisui\": \"シスイ\",\n        \"shisui ao\": \"シスイ青\",\n        \"shisuka\": \"シスカ\",\n        \"shitaji mochimochi\": \"下地もちもち\",\n        \"shitori\": \"Shitori\",\n        \"shitou fumiaki\": \"志藤ふみあき\",\n        \"shitsuji kuma\": \"執事クマ\",\n        \"shiun\": \"紫雲陽\",\n        \"shiva\": \"shiva\",\n        \"shivharu\": \"シブハル\",\n        \"shiwo.\": \"しを。\",\n        \"shizaki masayuki\": \"士崎雅雪\",\n        \"shizuki shinra\": \"獅月しんら\",\n        \"shizuku\": \"しずく\",\n        \"shizuna miyuri\": \"しずなみゆり\",\n        \"shizuru\": \"シズル\",\n        \"sho-tan\": \"sho-tan\",\n        \"sho-yan\": \"しょーやん\",\n        \"shocco\": \"しょこ\",\n        \"shoco\": \"shoco\",\n        \"shocora\": \"ショコラ\",\n        \"shoda norihiro\": \"しょうだのりひろ\",\n        \"shogo\": \"shogo\",\n        \"shokora\": \"ショコラ\",\n        \"shotenin matori\": \"書店院まとり\",\n        \"shougeki no hirayama\": \"衝撃の平山\",\n        \"shouhei\": \"しょーへー\",\n        \"shouji bc\": \"庄司BC\",\n        \"shouji haruzo\": \"障子張蔵\",\n        \"shouki\": \"しょうき\",\n        \"shourin kiyoshi\": \"松林清\",\n        \"shoutarou\": \"ショウタロウ\",\n        \"show\": \"Show\",\n        \"showronpopy\": \"しょうろんぽぴー\",\n        \"shozo\": \"SHOZO\",\n        \"shri\": \"shri\",\n        \"shrine\": \"シュライン\",\n        \"shu cream\": \"シュクリム\",\n        \"shuffle\": \"shuffle\",\n        \"shuga\": \"しゅがぁ\",\n        \"shuma\": \"しゅま\",\n        \"shunjou shuusuke\": \"春城秋介\",\n        \"shunzou\": \"しゅんぞう\",\n        \"shuragyoku mami\": \"珠羅玉魔魅\",\n        \"shuu\": \"じゅう\",\n        \"shuui takahiro\": \"しゅうい☆たかひろ\",\n        \"shuurin\": \"シュウリン\",\n        \"shuuto\": \"シュウト\",\n        \"shuz\": \"shuz\",\n        \"sian\": \"しあん\",\n        \"sibamura\": \"しばむら\",\n        \"sibusawa eiki\": \"澁澤鋭樹\",\n        \"sid alice\": \"獅童ありす\",\n        \"sid daisuke\": \"士土大介\",\n        \"sieles\": \"しーるず\",\n        \"sigma rio\": \"しぐまりお\",\n        \"sigmarion\": \"シグマリオン\",\n        \"silinder\": \"silinder\",\n        \"silky\": \"しるきー\",\n        \"simama\": \"simama\",\n        \"sin\": \"sin\",\n        \"sin iti\": \"シン・イチ\",\n        \"sindo aoi\": \"新堂葵\",\n        \"sinensian\": \"Sinensian\",\n        \"sinohara sinome\": \"しのはらしのめ\",\n        \"sinori\": \"しのり\",\n        \"sinzan\": \"sinzan\",\n        \"sippufx\": \"しっぷfx\",\n        \"siratama nikukyuu\": \"しらたま肉球\",\n        \"sirazawa kousi\": \"白沢宏志\",\n        \"sirofugu\": \"白フグ\",\n        \"sirokoma\": \"白狛\",\n        \"sirokuma\": \"しろくま\",\n        \"sirou\": \"Sirou\",\n        \"siroyuki\": \"しろゆき\",\n        \"sirpent\": \"さあぺんと\",\n        \"sisakugata\": \"試咲型\",\n        \"sisei\": \"しせい\",\n        \"sisochair\": \"sisochair\",\n        \"sisui kyouko\": \"しすいきょうこ\",\n        \"siva.\": \"シヴァ。\",\n        \"sizma\": \"SIZMA\",\n        \"skemaid\": \"スケメイド\",\n        \"sknr\": \"SKNR\",\n        \"skpresents\": \"skpresents\",\n        \"sl8-all\": \"SL8-all\",\n        \"smile yuu\": \"スマイル幽\",\n        \"so-ma\": \"そーま\",\n        \"sob\": \"Sob\",\n        \"soda\": \"soda\",\n        \"soda lychee\": \"曹田らいち\",\n        \"softoof\": \"ソフトーフ\",\n        \"soga\": \"Soga\",\n        \"sohya\": \"そーや\",\n        \"soi\": \"Soi\",\n        \"soket\": \"そけっと\",\n        \"soko wa miwaku no lemon kyou\": \"そこは魅惑の檸檬郷\",\n        \"sol\": \"そる\",\n        \"sola\": \"sola\",\n        \"solar milk\": \"そらみる\",\n        \"solid lum\": \"SOLID LUM\",\n        \"solomon k\": \"そろもんK\",\n        \"solopipb\": \"ソロピップB\",\n        \"some sumiko\": \"染墨子\",\n        \"somejima\": \"ソメジマ\",\n        \"somemaru\": \"染マル\",\n        \"someya miho\": \"染谷みほ\",\n        \"son\": \"SoN\",\n        \"son palace\": \"ソンパレス\",\n        \"sonnano ari\": \"村菜野有梨\",\n        \"sono chiyoko\": \"園千代子\",\n        \"sono.\": \"その。\",\n        \"sonobe kazuaki\": \"園部一晶\",\n        \"sonohen no zako\": \"その辺のザコ\",\n        \"sonokawa sono\": \"園河ソノ\",\n        \"sonote\": \"sonote\",\n        \"sora\": \"ソラ\",\n        \"sora mame\": \"そら豆\",\n        \"zegga\": \"絶牙\",\n        \"sora tokumo\": \"空十雲\",\n        \"soraga-\": \"そらがー\",\n        \"sorami\": \"そらみ\",\n        \"sorami sio\": \"そらみしお\",\n        \"sorane miki\": \"空音美樹\",\n        \"sorani\": \"sorani\",\n        \"sorano kanata\": \"空乃カナタ\",\n        \"sorano natsumi\": \"ソラノ夏実\",\n        \"sorano umi\": \"空野海\",\n        \"soranona\": \"ソラノナ\",\n        \"sorano suzume\": \"天ノ雀\",\n        \"sorato\": \"そらと\",\n        \"sorawa reo\": \"そらわれお\",\n        \"sorono\": \"sorono\",\n        \"soso\": \"そそ\",\n        \"soso-zagri\": \"そそざぐり\",\n        \"sot\": \"sot\",\n        \"sou\": \"そう\",\n        \"sou akiko\": \"奏亜希子\",\n        \"soubi\": \"そーび\",\n        \"souchou\": \"曹长\",\n        \"souda gumi\": \"創田ぐみ\",\n        \"souen hiro\": \"蒼鉛ヒロ\",\n        \"souichi\": \"そういち\",\n        \"souko souji\": \"倉子倉次\",\n        \"soukoban\": \"倉庫番\",\n        \"soukurou\": \"双九朗\",\n        \"soul\": \"Soul\",\n        \"souma tatsuya\": \"そうま竜也\",\n        \"souma monooki2tsu tokage\": \"双馬・物置2つ・蜥蜴\",\n        \"souseiou\": \"創世王\",\n        \"sousen\": \"Sousen\",\n        \"soushin souma\": \"創神蒼魔\",\n        \"souto\": \"草人\",\n        \"soutome emu\": \"五月女えむ\",\n        \"sovayu\": \"そば湯\",\n        \"sowjun\": \"宗純\",\n        \"soyane\": \"そやね\",\n        \"soyoki\": \"そよき\",\n        \"sparrow\": \"雀\",\n        \"special g\": \"すぺしゃるじー\",\n        \"speed\": \"speed\",\n        \"squarewave29\": \"矩形波\",\n        \"ssz\": \"SSZ\",\n        \"st.germain-sal\": \"さんぢぇるまん・猿\",\n        \"st.retcher\": \"ST.レッチャー\",\n        \"stain\": \"STAIN\",\n        \"stealth changing line\": \"ステルス改行\",\n        \"stealth moko\": \"ステルスもこ\",\n        \"stem\": \"stem\",\n        \"stereotype\": \"stereotype\",\n        \"stiel\": \"すてぃえる\",\n        \"stigaya\": \"チガヤ\",\n        \"stir\": \"ステア\",\n        \"subachi\": \"すばち\",\n        \"subaru\": \"スバル\",\n        \"subuina 81r\": \"スブイナ81R\",\n        \"sudoo kaoru\": \"すどおかおる\",\n        \"sudou\": \"すどー\",\n        \"suehiro yoshiyuki\": \"末廣よしゆき\",\n        \"suemitsu dicca\": \"すえみつぢっか\",\n        \"sueyuu\": \"すえゆう\",\n        \"sugai\": \"スガイ\",\n        \"sugaleon\": \"スガレオン\",\n        \"sugamon\": \"すがもん\",\n        \"sugar picola\": \"しゅがーピコラ\",\n        \"sugata uri\": \"菅田うり\",\n        \"sugawara miyako\": \"菅原ミヤコ\",\n        \"sugayama\": \"菅山\",\n        \"sugii tsukasa\": \"すぎいつかさ\",\n        \"sugimura tomokazu\": \"杉村友和\",\n        \"sugita ranpaku\": \"過ぎた卵白\",\n        \"sugitomo kazuhiro\": \"杉友カヅヒロ\",\n        \"sugiyama genshou\": \"すぎやま現象\",\n        \"sugiyama yuzuki\": \"杉山ゆずき\",\n        \"sugoi hi\": \"すごい火\",\n        \"sugoi kinniku\": \"すごいきんにく\",\n        \"sugoku zako\": \"すごく雑魚\",\n        \"suhara shiina\": \"須原シイナ\",\n        \"suhoi\": \"すほい\",\n        \"sui\": \"sui\",\n        \"suien\": \"翠燕\",\n        \"suihei kiki\": \"水兵きき\",\n        \"suihi\": \"すいひ\",\n        \"suika\": \"酔花\",\n        \"suika koron\": \"酔花ころん\",\n        \"suika soda\": \"すいかソーダ\",\n        \"suiren\": \"睡蓮\",\n        \"suiren touru\": \"水簾藤流\",\n        \"suirenka\": \"翠錬華\",\n        \"suisen toilet\": \"水洗トイレ\",\n        \"suishin tenra\": \"水心天羅\",\n        \"suisui\": \"すいすい\",\n        \"sukage\": \"須影\",\n        \"suke6\": \"スケ6\",\n        \"sukedai\": \"すけだい\",\n        \"sukeichi\": \"すけいち\",\n        \"sukeya kurov\": \"助谷クロウ\",\n        \"suki na mono wa yakiniku\": \"好きなものは焼肉\",\n        \"sukima man\": \"すきま満\",\n        \"sukiyoshi shinji\": \"好善信士\",\n        \"sukumizu\": \"すくみづ\",\n        \"sukumo\": \"すくも\",\n        \"sukunahiko\": \"少名彦\",\n        \"sumeragi bron\": \"スメラギバロン\",\n        \"sumeragi kohaku\": \"すめらぎ琥珀\",\n        \"sumeragi kou\": \"すめらぎこう\",\n        \"sumeragi seisuke\": \"皇征介\",\n        \"sumeragi yuusuke\": \"皇裕介\",\n        \"sumeshi\": \"酢飯\",\n        \"sumihey\": \"すみ兵\",\n        \"sumio\": \"すみおー\",\n        \"sumisaki yuduna\": \"住咲ゆづな\",\n        \"sumisumi\": \"スミスミ\",\n        \"sumitomo\": \"すみとも\",\n        \"sumizaki\": \"炭崎\",\n        \"sumomo ex\": \"すももEX\",\n        \"sumomo pink\": \"すももぴんく\",\n        \"suna\": \"すな\",\n        \"sunahara izuko\": \"砂原何処\",\n        \"sunameri\": \"すなめり\",\n        \"sunao\": \"スナオ\",\n        \"sundomeya\": \"すんどめ屋\",\n        \"sunshow\": \"さんしょう\",\n        \"sunson\": \"SUNSON\",\n        \"supopo\": \"すぽぽ\",\n        \"suppy\": \"スッピー\",\n        \"supurai\": \"すぷらい\",\n        \"suradora\": \"すらドラ\",\n        \"suruga rinu\": \"駿河りぬ\",\n        \"susuanpan\": \"煤あんぱん\",\n        \"susugu\": \"ススグ\",\n        \"suto\": \"すと\",\n        \"suu\": \"すう\",\n        \"suv\": \"SUV\",\n        \"suzu\": \"すず\",\n        \"suzu kazumi\": \"寿杜缶住\",\n        \"suzuhara kouki\": \"鈴原考樹\",\n        \"suzuho hotaru\": \"鈴穗ほたる\",\n        \"suzui narumi\": \"鈴井ナルミ\",\n        \"suzukawa rino\": \"鈴川梨乃\",\n        \"suzuki address\": \"木あどれす\",\n        \"suzuki amaharu\": \"涼樹天晴\",\n        \"suzuki ganma\": \"鈴木がんま\",\n        \"suzuki kimuchi\": \"鈴木キムチ\",\n        \"suzuki metal\": \"鈴木メタル\",\n        \"suzuki mey\": \"すずきめい\",\n        \"suzuki nene\": \"鈴樹ねね\",\n        \"suzuki sakura\": \"鈴輝 桜\",\n        \"suzuki shina\": \"鈴木志奈\",\n        \"suzuki sinobu\": \"鈴木忍\",\n        \"suzuki takeo\": \"鈴木岳生\",\n        \"suzuki toto\": \"すずきとと\",\n        \"suzumaru\": \"すずまる\",\n        \"suzumiya\": \"涼御夜\",\n        \"suzumiya kazuki\": \"涼宮和貴\",\n        \"suzumiya kiriha\": \"鈴宮きりは\",\n        \"suzumori uina\": \"鈴森ういな\",\n        \"suzune rai\": \"鈴根らい\",\n        \"suzune yuuji\": \"鈴音ゆうじ\",\n        \"suzunokei\": \"スズノケイ\",\n        \"suzunomoku\": \"すずのもく\",\n        \"suzurame\": \"スズラメ\",\n        \"suzuri\": \"石見すずり\",\n        \"suzusato rinka\": \"鈴里厘花\",\n        \"suzusawa aki\": \"鈴沢秋\",\n        \"suzuse\": \"涼瀬\",\n        \"suzushiro nazuna\": \"蘿蔔なずな\",\n        \"suzushiro yutaka\": \"すずしろゆたか\",\n        \"suzushiro\": \"すずしろ\",\n        \"suzuta yume\": \"鈴田ゆめ\",\n        \"swa\": \"SWA\",\n        \"swakichi\": \"すわきち\",\n        \"syanal\": \"しゃーなる\",\n        \"syaneko\": \"しゃねこ\",\n        \"syaraku\": \"しゃらく\",\n        \"sync\": \"sync\",\n        \"syou\": \"syou\",\n        \"syougo kota\": \"省吾こた\",\n        \"syouji\": \"将司\",\n        \"syouryuupen\": \"しょーりゅーぺん\",\n        \"syowmaru\": \"翔丸\",\n        \"syoyu\": \"しょーゆ\",\n        \"syu\": \"川上修一\",\n        \"syunichi\": \"しゅにち\",\n        \"syunzo\": \"しゅんぞう\",\n        \"syutaro\": \"秋太郎\",\n        \"t\": \"T\",\n        \"t-factory\": \"T factory\",\n        \"t-hiko\": \"T彦\",\n        \"t-zok\": \"T-ZOK\",\n        \"t.cylinder\": \"円柱\",\n        \"ta\": \"ta\",\n        \"ta and a\": \"TA&A\",\n        \"ta152\": \"Ta152\",\n        \"taankee\": \"た～んけー\",\n        \"tabe koji\": \"たべ・こーじ\",\n        \"tabo\": \"tabo\",\n        \"taca\": \"taca\",\n        \"tachi tsubaki\": \"太刀椿\",\n        \"tachibana\": \"たちばな\",\n        \"tachibana chata\": \"橘チャタ\",\n        \"tachibana hisui\": \"橘ヒスイ\",\n        \"tachibana naoki\": \"断華ナオキ\",\n        \"tachibana riuta\": \"橘りうた\",\n        \"tachibana sakuya\": \"たちばなさくや\",\n        \"tachibana satsuki\": \"橘颯希\",\n        \"tachibanaei\": \"たちばなえい\",\n        \"koyama shigeru\": \"こやま滋\",\n        \"tachitsu teto\": \"舘津テト\",\n        \"tacky\": \"tacky\",\n        \"tada atsunori\": \"ただ☆あつのり\",\n        \"tadano happa\": \"ただのはっぱ\",\n        \"tadano kagekichi\": \"唯野影吉\",\n        \"tadano kushami\": \"唯乃くしゃみ\",\n        \"tadano myoushi\": \"忠之みょうし\",\n        \"tagame gengoroh\": \"田亀源五郎\",\n        \"tagro\": \"TAGRO\",\n        \"taguchi\": \"たグち\",\n        \"taguchi kirei\": \"田口綺麗\",\n        \"taguchi makoto\": \"田口まこと\",\n        \"tahara anco\": \"田原あんこ\",\n        \"tahibo\": \"誰罷慕\",\n        \"tai\": \"泰\",\n        \"tai0201\": \"帯\",\n        \"taiki\": \"大気\",\n        \"taiki ken\": \"大気KEN\",\n        \"taikuu jikan\": \"滞空時間\",\n        \"taira\": \"たいら\",\n        \"taira hajime\": \"たいらはじめ\",\n        \"taira kosaka\": \"平こさか\",\n        \"taira kouichirou\": \"平光一郎\",\n        \"tairame\": \"タイラメ\",\n        \"taireru\": \"たいれる\",\n        \"tairyo ryou\": \"大呂亮\",\n        \"taishi\": \"たいし\",\n        \"taishow tanaka\": \"たいしょう田中\",\n        \"taiyaki\": \"たいやき\",\n        \"taji\": \"たじ\",\n        \"tajima ryuushi\": \"タジマ粒子\",\n        \"tajima yasue\": \"田嶋安恵\",\n        \"tak\": \"T@k\",\n        \"tak-u\": \"TAK-U\",\n        \"taka pon\": \"タカ☆ぽん\",\n        \"taka sena\": \"嵩世菜\",\n        \"takabatake enaga\": \"高畠エナガ\",\n        \"takadoya akira\": \"たかどやあきら\",\n        \"takagari mitsuru\": \"鷹狩みつる\",\n        \"takagi kyou\": \"高木喬\",\n        \"takahagi kemono\": \"タカハギケモノ\",\n        \"takahan\": \"タカはん\",\n        \"takaha momo\": \"高羽もも\",\n        \"takahara sea-gull\": \"高原シーガル\",\n        \"takahashi\": \"多花ハシ\",\n        \"takahashi konnyaku\": \"高橋こんにゃく\",\n        \"takahashi mako\": \"タカハシマコ\",\n        \"takahashi note\": \"タカハシノヲト\",\n        \"takahashi record\": \"高橋レコード\",\n        \"takahashi yoshiki\": \"高橋良喜\",\n        \"takahashikun\": \"高橋君\",\n        \"takahiko\": \"たかひこ\",\n        \"takahirou ringu\": \"たかひろーりんぐ\",\n        \"takahisa kunihiro\": \"鷹久邦弘\",\n        \"takai biki\": \"高井美姫\",\n        \"takaishi fuu\": \"高石ふう\",\n        \"takako\": \"タカコ\",\n        \"takaku shouko\": \"高久尚子\",\n        \"takaku toshihiko\": \"高久としひこ\",\n        \"takaku tubby\": \"高句タビー\",\n        \"takamiya\": \"たかみや\",\n        \"takamiya sakura\": \"鷹宮沙玖羅\",\n        \"takamori3\": \"たかもり3\",\n        \"takamoto akisa\": \"上下右左\",\n        \"takamura tabisuke\": \"高村旅輔\",\n        \"takana yu-ki\": \"鷹那優輝\",\n        \"takanabe chitose\": \"高鍋千歳\",\n        \"takanaru\": \"たかなる\",\n        \"takanashi ayumu\": \"小鳥遊\",\n        \"takanashi china\": \"たかなし知那\",\n        \"takanashi haruto\": \"たかなしはると\",\n        \"takanashi kei\": \"小鳥遊啓\",\n        \"takanashi nozomi\": \"高梨のぞみ\",\n        \"takanashi shiro\": \"高梨志郎\",\n        \"takano hayato\": \"たかのはやと\",\n        \"takano iori\": \"高野庵\",\n        \"takano masayuki\": \"高野真之\",\n        \"takano uaka\": \"たかのうあか\",\n        \"takano yuu\": \"高野有\",\n        \"takanotume\": \"たかのつめ\",\n        \"takao hiroi\": \"高緒拾\",\n        \"takao ukyou\": \"高雄右京\",\n        \"takao yori\": \"高尾鷹浬\",\n        \"takaoka chikara\": \"高岡智空\",\n        \"takapi\": \"たかぴ\",\n        \"takara akihito\": \"宝あきひと\",\n        \"takaryoo\": \"たかりょー\",\n        \"takasaki akira\": \"高崎晶\",\n        \"takasaki karin\": \"高崎かりん\",\n        \"takasaki maco\": \"高崎まこ\",\n        \"takasaki ryo\": \"貴崎涼\",\n        \"takasaki takemaru\": \"高崎たけまる\",\n        \"takase hiroe\": \"貴瀬博恵\",\n        \"takase muh\": \"高瀬むぅ\",\n        \"takashina urara\": \"高階麗\",\n        \"takasumi miduki\": \"貴澄美月\",\n        \"takatora\": \"タカトラ\",\n        \"takatsuki ichi\": \"タカツキイチ\",\n        \"takatsuki nagy\": \"高槻ナギー\",\n        \"takatsuki shuuya\": \"高月柊也\",\n        \"takatuka ramune\": \"鷹柄ラムネ\",\n        \"takaya yoshiyuki\": \"鷹屋ヨシユキ\",\n        \"takayama chihiro\": \"高山千尋\",\n        \"takayamanon\": \"タカヤマノン\",\n        \"takayuki hiyori\": \"Evo.R.B\",\n        \"take takeshi\": \"武猛\",\n        \"take toshiaki\": \"武俊彰\",\n        \"takea saki\": \"たけあ崎\",\n        \"takeashiro\": \"たけあしろ\",\n        \"takeda\": \"たけだ\",\n        \"takeda sora\": \"武田空\",\n        \"takedake\": \"タケダケ\",\n        \"takei tsukasa\": \"タケイツカサ\",\n        \"takemaru\": \"タケマル\",\n        \"takemitz\": \"たけみつ\",\n        \"takemori shintarou\": \"竹森真太郎\",\n        \"takenaka hideo\": \"武中英雄\",\n        \"takenoko\": \"takenoko\",\n        \"takenoko maru\": \"たけのこ丸\",\n        \"takenoko seijin\": \"たけのこ星人\",\n        \"takenouchi suama\": \"竹之内すあま\",\n        \"takepon\": \"たけぽん\",\n        \"takeponian\": \"たけぽにあん\",\n        \"takese nono\": \"高瀬乃々\",\n        \"takeshima eku\": \"竹嶋えく\",\n        \"takeshisu\": \"タケシス\",\n        \"takeshita kenjirou\": \"竹下けんじろう\",\n        \"taketora suzume\": \"竹虎スズメ\",\n        \"takeu\": \"たけう\",\n        \"takeuchi reona\": \"竹内玲于奈\",\n        \"takeuma\": \"たけうま\",\n        \"takewakamaru\": \"武若丸\",\n        \"takewan\": \"たけわん\",\n        \"takeyama kaki\": \"たけやまかき\",\n        \"takeyama shimeji\": \"茸山しめじ\",\n        \"taki re-ki\": \"滝れーき\",\n        \"takimoto satoru\": \"滝本悟\",\n        \"takineko\": \"タキ猫\",\n        \"takizawa hajime\": \"瀧澤春\",\n        \"takkii\": \"たっきぃ\",\n        \"takku\": \"たっく\",\n        \"tako\": \"たこ\",\n        \"tako kuboh\": \"蛸公方\",\n        \"takorice\": \"たこらいす\",\n        \"takotyu\": \"たこちゅう\",\n        \"takoya kiki\": \"多胡屋きき\",\n        \"takoyaki\": \"たこ焼き\",\n        \"takto\": \"TAKTO\",\n        \"taku\": \"タク\",\n        \"taku hiraku\": \"拓ヒラク\",\n        \"takuji yuusaku\": \"卓二雄作\",\n        \"takuma\": \"琢磨\",\n        \"takuma tomomasa\": \"たくま朋正\",\n        \"takumi na muchi\": \"たくみな無知\",\n        \"takumi rohan\": \"たくみ露伴\",\n        \"takura mahiro\": \"田倉まひろ\",\n        \"takuteks\": \"TAKUTEKS\",\n        \"tama\": \"tama\",\n        \"tama ii\": \"たまつー\",\n        \"tama kifuyu\": \"たまきふゆ\",\n        \"tamachi\": \"たまち\",\n        \"tamachie\": \"たまちえ\",\n        \"tamaco\": \"tamaco\",\n        \"tamagawa chiruru\": \"多摩川ちるる\",\n        \"tamagawa yakkyou\": \"多摩川やっきょう\",\n        \"tamagawa yukimaru\": \"多摩川雪丸\",\n        \"tamago\": \"煌月忍\",\n        \"tamago meshi\": \"たまごめし\",\n        \"tamahiro\": \"たまひろ\",\n        \"tamahiyo\": \"たまひよ\",\n        \"tamaki kaoru\": \"環かおる\",\n        \"tamaki nozomu\": \"環望\",\n        \"tamaki yayoi\": \"珠樹やよい\",\n        \"tamaki yui\": \"タマキ結\",\n        \"tamamo ozen\": \"たまも御前\",\n        \"tamanegi\": \"たまねぎ\",\n        \"tamaoki benkyo\": \"玉置勉強\",\n        \"tamaran niisan\": \"たまらん兄さん\",\n        \"tamaru\": \"たまる\",\n        \"tamaru makoto\": \"田丸まこと\",\n        \"tamarun\": \"タマラン\",\n        \"tamatsuyada\": \"たまつやだ\",\n        \"tame\": \"ため\",\n        \"tamekou\": \"ためこう\",\n        \"tami-k\": \"TAMI-K\",\n        \"tamifull\": \"たみふる\",\n        \"tamiko\": \"たみこ\",\n        \"tamineko\": \"タミネコ\",\n        \"tamo\": \"たも\",\n        \"tamochi\": \"田持\",\n        \"tamon ketsuyuki\": \"多門結之\",\n        \"tamori tadaji\": \"たもりただぢ\",\n        \"tamu\": \"たむ\",\n        \"tamuhi\": \"タムヒ\",\n        \"tamura searchlight\": \"田村サーチライト\",\n        \"tamura shimeji\": \"田村シメジ\",\n        \"tana\": \"TANA\",\n        \"tanabe\": \"TANABE\",\n        \"tanaka keigo\": \"たなかけいご\",\n        \"tanaka kumubou\": \"田中伍某\",\n        \"tanaka penta\": \"田中ペン太\",\n        \"tanaka rin\": \"田中琳\",\n        \"tanaka sei\": \"田中セイ\",\n        \"tanaka tarou\": \"田中太郎\",\n        \"tanakamori yokota\": \"田中森よこた\",\n        \"tanakana\": \"たなかな\",\n        \"tanba kuromame\": \"丹波KURO豆\",\n        \"tanemura arina\": \"種村有菜\",\n        \"tanenashi kuribo\": \"たねなしくりぼ\",\n        \"tanenashi miya\": \"種梨みや\",\n        \"tange rin\": \"丹下凛\",\n        \"tango-tango\": \"tango-tango\",\n        \"taniguchi daisuke\": \"谷口大介\",\n        \"tanihara natsuki\": \"たにはらなつき\",\n        \"tanimura marika\": \"谷村まりか\",\n        \"tanizakura shidare\": \"谷桜しだれ\",\n        \"tanken harahara\": \"探検はらはら\",\n        \"tankslayer equals san\": \"タンクスレイヤー=サン\",\n        \"tano\": \"たの\",\n        \"tanoma suzume\": \"たのますずめ\",\n        \"tanpopo shunmaru\": \"たんぽぽ隼丸\",\n        \"tansui shirasu\": \"淡水シラス\",\n        \"tanufude\": \"たぬふで\",\n        \"tanuki\": \"たぬき\",\n        \"tanuma yuuichirou\": \"田沼雄一郎\",\n        \"tanunosuke\": \"たぬ之助\",\n        \"tanutan\": \"たぬたん\",\n        \"tanzi\": \"丹治\",\n        \"tao\": \"たお\",\n        \"tapisuke\": \"たぴすけ\",\n        \"tappa\": \"たっぱ\",\n        \"tar\": \"TAR\",\n        \"tarakan\": \"たらかん\",\n        \"tarazoo\": \"たらぞお\",\n        \"tare\": \"たれ\",\n        \"tare mayuzou\": \"タレ眉ぞう\",\n        \"tarekatsu\": \"TARE活\",\n        \"tarihou\": \"タリホウ\",\n        \"tarinu\": \"足りぬ\",\n        \"tariyoshi\": \"たりよし\",\n        \"taro\": \"taro\",\n        \"taro-san\": \"たろさん\",\n        \"taropun\": \"たろプン\",\n        \"taroro\": \"たろろ\",\n        \"tarte\": \"タルト\",\n        \"tarutarugungun\": \"たるたるぐんぐん\",\n        \"taryl.\": \"たりる｡\",\n        \"tasa urara\": \"たさうらら\",\n        \"tasuku\": \"助\",\n        \"tasuro kuzuha\": \"たすろくずは\",\n        \"tataru\": \"タタル\",\n        \"tatejima.\": \"縦縞。\",\n        \"tateno tomoki\": \"タテノトモキ\",\n        \"sennohito.\": \"線の人。\",\n        \"tatsuhiko\": \"たつひこ\",\n        \"tatsumiya motokazu\": \"たつみやもとかず\",\n        \"tatsumu kyou\": \"龍武京\",\n        \"tatsuneko\": \"たつねこ\",\n        \"tatsunosuke yukiya\": \"逹之介ユキヤ\",\n        \"tatsuoka miyoshi\": \"龍岡巳葦\",\n        \"tatsuya\": \"tatsuya\",\n        \"tatunokosso\": \"タツノコッソ\",\n        \"tau\": \"tau\",\n        \"tavor\": \"Tavor\",\n        \"taya takashi\": \"たやたかし\",\n        \"tayuta yuu\": \"たゆた☆ゆう\",\n        \"teaindian\": \"紅茶インディアン\",\n        \"tear\": \"Tear\",\n        \"tec\": \"TEC\",\n        \"tecchan\": \"てっちゃん\",\n        \"techizou\": \"てちぞう\",\n        \"techno\": \"てくの\",\n        \"teckei\": \"TEcKei\",\n        \"tedain\": \"てだいん\",\n        \"tegdor\": \"てぐどら\",\n        \"tegura yuuki\": \"テグラユウキ\",\n        \"tehen\": \"てへん\",\n        \"tei-oh-k-takamuro\": \"TEI-OH-K-TAKAMURO\",\n        \"teil\": \"teil\",\n        \"teitaraku\": \"ていた楽\",\n        \"teka\": \"てか\",\n        \"tekkyuu\": \"鉄球\",\n        \"teko\": \"てこ\",\n        \"tekuteku\": \"てくてく\",\n        \"teltelhousi\": \"てるてる法師\",\n        \"ten\": \"貂\",\n        \"ten ga\": \"天駕\",\n        \"ten no hoshi\": \"天ノ星\",\n        \"tenamaru\": \"テナマル\",\n        \"tenchuumaru\": \"天誅丸\",\n        \"tenchuunan\": \"天誅男\",\n        \"tendou itsuki\": \"天堂樹\",\n        \"tendou kuon\": \"天童久遠\",\n        \"tendou makura\": \"天童まくら\",\n        \"tengudake\": \"テングダケ\",\n        \"tenji\": \"てんじ\",\n        \"tenjiku rounin\": \"天竺浪人\",\n        \"tenju\": \"天咒\",\n        \"tenkawa ai\": \"天河藍\",\n        \"tenken\": \"てんけん\",\n        \"tenma\": \"天馬\",\n        \"tenmaso\": \"てんまそ\",\n        \"tenori\": \"てのり\",\n        \"tenrai\": \"天籟\",\n        \"tenshou akira\": \"天祥輝\",\n        \"tenteko\": \"てんてこ\",\n        \"tentenkingyo\": \"てんてんきんぎょ\",\n        \"tenyati\": \"TenYati\",\n        \"tenyuu\": \"てんゆ～\",\n        \"tenzaki kanna\": \"天崎かんな\",\n        \"tera\": \"TERA\",\n        \"terada\": \"寺田\",\n        \"terada tera\": \"寺田てら\",\n        \"terai daikichi\": \"寺イ大吉\",\n        \"teramoto kaoru\": \"寺本薫\",\n        \"terashi\": \"てらし\",\n        \"terasu mc\": \"テラスmc\",\n        \"terazip\": \"テラzip\",\n        \"teri terio\": \"てりてりお\",\n        \"terry hijiri\": \"照井聖\",\n        \"teru\": \"てる\",\n        \"terufuu\": \"てるふう\",\n        \"terujirou\": \"晃次郎\",\n        \"teruwi\": \"てるうぃ\",\n        \"teruyama momiji\": \"照山紅葉\",\n        \"tes\": \"tes\",\n        \"teshio\": \"てしお\",\n        \"tete\": \"tete\",\n        \"tetoga\": \"てとが\",\n        \"tetora\": \"てとら\",\n        \"tetramax\": \"てとらまっくす\",\n        \"tetsu kazuna\": \"鉄カズナ\",\n        \"tetsubirei\": \"てつびれい\",\n        \"tetsukui\": \"鐡喰\",\n        \"tetsumi\": \"哲美\",\n        \"tetsunohiji\": \"てつのひじ\",\n        \"tetsuya\": \"テツヤ\",\n        \"tetubuta\": \"鉄豚\",\n        \"tetujin momoko\": \"鉄人桃子\",\n        \"tetumiya\": \"鉄宮\",\n        \"thanat\": \"たなと\",\n        \"the fall guy\": \"フォール・ガイ\",\n        \"the orz\": \"the_orz\",\n        \"thor\": \"THOR\",\n        \"tickzou\": \"てぃくぞー\",\n        \"tid\": \"TID\",\n        \"tief\": \"Tief\",\n        \"tiger\": \"タイガー\",\n        \"tiger shark\": \"大牙射悪\",\n        \"tigusa suzume\": \"千草雀\",\n        \"tilm\": \"ティルム\",\n        \"tim\": \"TIM\",\n        \"tima\": \"ちぃま\",\n        \"timato\": \"ちまと\",\n        \"timuni\": \"チムニ\",\n        \"ting\": \"Ting\",\n        \"tipo\": \"ティーポ\",\n        \"tira\": \"Tira\",\n        \"tirotata\": \"ちろたた\",\n        \"titiduki\": \"チチヅキ\",\n        \"tiv\": \"Tiv\",\n        \"tj-type1\": \"TJ-type1\",\n        \"tk\": \"TK\",\n        \"tkdash\": \"TKDASH\",\n        \"tks\": \"TKS\",\n        \"tnsk\": \"TNSK\",\n        \"tobari\": \"とばり\",\n        \"tobimura\": \"鳶村\",\n        \"tobunda jet\": \"飛ぶんだジェット\",\n        \"toby\": \"だぶるあーる\",\n        \"tocky\": \"Tocky\",\n        \"toda kaduki\": \"とだかづき\",\n        \"todd oyamada\": \"トッド小山田\",\n        \"todoroki shusei\": \"等々力秋声\",\n        \"tofu\": \"とうふ\",\n        \"togame\": \"とがめ\",\n        \"togashi\": \"トガシ\",\n        \"toge toge\": \"棘棘\",\n        \"togo\": \"とーご\",\n        \"toguchi masaya\": \"トグチマサヤ\",\n        \"tohani\": \"とーはに\",\n        \"tohno tatsuki\": \"遠野タツキ\",\n        \"toi\": \"Toi\",\n        \"toi amatsu\": \"とい天津\",\n        \"toichi\": \"トイチ\",\n        \"toilet\": \"といれ\",\n        \"toilet komoru\": \"トイレ籠\",\n        \"toine hoko\": \"樋音歩琥\",\n        \"toitoi\": \"といとい\",\n        \"toka\": \"toka\",\n        \"tokachi genjuurou\": \"十勝源十郎\",\n        \"tokei\": \"時計\",\n        \"tokei usagi\": \"とけーうさぎ\",\n        \"tokeiya-san\": \"時計屋さん\",\n        \"toki\": \"トキ\",\n        \"tokiai haya\": \"伽藍快\",\n        \"tokihama jiro\": \"時浜次郎\",\n        \"tokimachi eisei\": \"トキマチ★エイセイ\",\n        \"tokimal yoshihisa\": \"時丸佳久\",\n        \"tokino\": \"時乃\",\n        \"tokinobutt\": \"ときのぶっと\",\n        \"tokinon\": \"ときのん\",\n        \"tokio\": \"ときお\",\n        \"tokisaka mugi\": \"時坂夢戲\",\n        \"tokisana\": \"トキサナ\",\n        \"tokita monta\": \"刻田門大\",\n        \"tokitoki\": \"ときとき\",\n        \"tokiwa kanenari\": \"常磐兼成\",\n        \"tokiwa wako\": \"ときわようこ\",\n        \"tokiwa youko\": \"常葉ヨウコ\",\n        \"tokiwa yutaka\": \"ときわゆたか\",\n        \"tokizumi emishi\": \"時積恵美之\",\n        \"tokkou kujira\": \"特攻くじら\",\n        \"tokonaru\": \"トコナル\",\n        \"tokonone\": \"床音\",\n        \"tokorot\": \"tokorot\",\n        \"tokorotenf\": \"ところてんf\",\n        \"tokoyo\": \"常世\",\n        \"tokoyo akashi\": \"常夜あかし\",\n        \"tokoyon\": \"tokoyon\",\n        \"toku\": \"特\",\n        \"toku soncho\": \"とく村長\",\n        \"tokuda shinnosuke\": \"徳田しんのすけ\",\n        \"tokugawa miyo\": \"徳川みよ\",\n        \"tokui supermarket\": \"徳井スーパーマーケット\",\n        \"tokumei hero\": \"匿名ヒーロー\",\n        \"tokunaga\": \"とくなが\",\n        \"tokunomura\": \"とおくのむら\",\n        \"tokurito\": \"とくりと\",\n        \"tokusa lico\": \"砥草りこ\",\n        \"tokutan\": \"とくたん\",\n        \"tokyo\": \"tokyo\",\n        \"tokyokyoto\": \"東京京都\",\n        \"tololi\": \"とろり\",\n        \"tom\": \"トム\",\n        \"tom keith\": \"とむ・きーす\",\n        \"toma\": \"TOMA\",\n        \"tomakomai\": \"とまこまい\",\n        \"tomatomato\": \"トマトマト\",\n        \"tome\": \"トメ\",\n        \"tomekichi\": \"とめきち\",\n        \"tometo\": \"とめと\",\n        \"tomihero\": \"トミヒロ\",\n        \"tomisawa chinatsu\": \"とみさわ千夏\",\n        \"tomite\": \"とみて\",\n        \"tomiyama akiji\": \"兎耳山アキジ\",\n        \"tomiyoshi\": \"トミヨシ\",\n        \"tomneko\": \"吐夢猫\",\n        \"tomo takino\": \"智タキノ\",\n        \"tomoe\": \"巴萌\",\n        \"tomoe kiko\": \"トモエキコ\",\n        \"tomoe tenbu\": \"巴天舞\",\n        \"tomohara michiya\": \"友原道哉\",\n        \"tomoharu\": \"トモハル\",\n        \"tomohiro\": \"ともひろ\",\n        \"tomojo\": \"ともじょー\",\n        \"tomoki shikata\": \"志方朋季\",\n        \"tomomaya\": \"tomomaya\",\n        \"tomona\": \"tomona\",\n        \"tomosuke\": \"ともすけ\",\n        \"tomotsuka haruomi\": \"ともつか治臣\",\n        \"tomoya\": \"ともや\",\n        \"tomoya kankurou\": \"友屋勘九郎\",\n        \"tomto\": \"Tomto\",\n        \"tomu\": \"tomu\",\n        \"tonbo\": \"トンボ\",\n        \"tonchan\": \"とんちゃん\",\n        \"tonikaku\": \"兎に角\",\n        \"tonnosuke\": \"とんのすけ\",\n        \"tonotani\": \"とのたに\",\n        \"tonpu\": \"とんぷ\",\n        \"tonsuke\": \"とんすけ\",\n        \"tonten\": \"トンテン\",\n        \"tooco\": \"Tooco\",\n        \"tooda shunkei\": \"遠田春景\",\n        \"tooka\": \"とーか\",\n        \"toono yayoi\": \"十野弥生\",\n        \"tooya\": \"十矢\",\n        \"tooya daisuke\": \"遠矢大介\",\n        \"topo\": \"とぽ\",\n        \"tora\": \"虎\",\n        \"torai ryuu\": \"虎井 龍\",\n        \"toraisi666\": \"とらいし666\",\n        \"torajimaneko\": \"とらじまねこ\",\n        \"torakichi\": \"とらきち\",\n        \"toran\": \"とらん\",\n        \"toraneko\": \"トラ猫\",\n        \"kyukyutto\": \"キュキュット\",\n        \"tori\": \"トリ◯\",\n        \"tori hikari\": \"とりひかり\",\n        \"tori mogura\": \"鳥土竜\",\n        \"tori nice par\": \"とりナイスパー\",\n        \"toria\": \"とりあ\",\n        \"toribami sasami\": \"鳥喰ささみ\",\n        \"torigoshi yayoi\": \"鳥越やよい\",\n        \"torikawa\": \"鳥皮\",\n        \"toriki cooya\": \"とりきくーや\",\n        \"torimaki\": \"鳥巻\",\n        \"torimaru\": \"トリ○\",\n        \"torino munenik\": \"トリノ宗肉\",\n        \"torisan\": \"鳥三\",\n        \"torisana\": \"トリサナ\",\n        \"torishimo\": \"とりしも\",\n        \"toritora\": \"酉寅\",\n        \"toriumi kapiko\": \"鳥海かぴこ\",\n        \"toroi\": \"toroi\",\n        \"tororo\": \"とろろ\",\n        \"torque\": \"トルク\",\n        \"toryuu\": \"十竜\",\n        \"tos-tos-f-ski\": \"とすとすFスキー\",\n        \"tosa\": \"トサ\",\n        \"tosh\": \"tosh\",\n        \"toshihiro\": \"トシヒロ\",\n        \"toshiki yuuji\": \"としきゆうぢ\",\n        \"toshio\": \"としお\",\n        \"toshizo\": \"トシぞー\",\n        \"toto nemigi\": \"ととねみぎ\",\n        \"totofumi\": \"ととふみ\",\n        \"totoki kikaku\": \"十時企画\",\n        \"totokichi\": \"トトキチ\",\n        \"totto\": \"totto\",\n        \"tottori sakyuu\": \"鳥取砂丘\",\n        \"toudori\": \"トウドリ\",\n        \"toudou fumika\": \"藤堂冬美香\",\n        \"toufu majin\": \"とうふ魔神\",\n        \"touga kotobuki\": \"塔河寿\",\n        \"touge hiro\": \"峠比呂\",\n        \"toujou\": \"東條\",\n        \"touko\": \"東子\",\n        \"touma nao\": \"藤馬奈緒\",\n        \"tourou\": \"灯籠\",\n        \"touta\": \"淘汰\",\n        \"toutaku\": \"董卓\",\n        \"touya\": \"と～や\",\n        \"touya tsuduru\": \"塔夜綴\",\n        \"tow\": \"tow\",\n        \"towa\": \"とわ\",\n        \"towai raito\": \"問合来人\",\n        \"towamin\": \"とわみん\",\n        \"tower\": \"ToWeR\",\n        \"toya hayato\": \"トヤハヤト\",\n        \"toyama jigoku\": \"外山じごく\",\n        \"toyama nanao\": \"とやま七生\",\n        \"toyo\": \"とよ\",\n        \"toyoman\": \"TOYOMAN\",\n        \"toyomaru\": \"十夜丸\",\n        \"toyoshima yuusaku\": \"豊島ゆーさく\",\n        \"tozakura nagomi\": \"都桜和\",\n        \"transition\": \"transition\",\n        \"trickster\": \"TrickSter\",\n        \"trident\": \"トライデント\",\n        \"trista\": \"トリスタ\",\n        \"trump\": \"Trump\",\n        \"try\": \"TRY\",\n        \"tsubaki hara\": \"ツバキハラ\",\n        \"tsubaki metasu\": \"椿めたす\",\n        \"tsubakiya meguru\": \"椿屋めぐる\",\n        \"tsubakiyama parry\": \"椿山パリィ\",\n        \"tsubasa\": \"ツバサ\",\n        \"tsucaco\": \"tsucaco\",\n        \"tsuchiya tarou\": \"土屋太郎\",\n        \"tsuda akira\": \"津田 晶\",\n        \"tsugaru\": \"Tsugaru\",\n        \"tsugu\": \"つぐ\",\n        \"tsugumi\": \"tsugumi\",\n        \"tsugumi nagisa\": \"ツグミ渚\",\n        \"tsuina\": \"tsuina\",\n        \"tsuino sumika\": \"終野すみか\",\n        \"tsuizi\": \"ついじ\",\n        \"tsuji\": \"ツジ\",\n        \"tsuji takeshi\": \"辻武司\",\n        \"tsujigiri\": \"つじぎり\",\n        \"tsujimaru\": \"辻丸\",\n        \"tsukadama\": \"つかだま\",\n        \"tsukasa jun\": \"司淳\",\n        \"tsukasa ningyou\": \"司人形\",\n        \"tsuki neko\": \"月猫\",\n        \"tsuki yoshimi\": \"月嘉\",\n        \"tsukigami\": \"月咬\",\n        \"tsukigami chronica\": \"月上クロニカ\",\n        \"tsukiji\": \"月路\",\n        \"tsukikage hisashi\": \"月影久\",\n        \"tsukikage manmaru\": \"月影満丸\",\n        \"tsukimi kirara\": \"月見キララ\",\n        \"tsukinami kousuke\": \"月並甲介\",\n        \"tsukino\": \"月野\",\n        \"tsukino wakuma\": \"月野輪熊\",\n        \"tsukino yuuya\": \"月野悠也\",\n        \"tsukinose maro\": \"月之瀬まろ\",\n        \"tsukishima kai\": \"月島改\",\n        \"tsukishima mist\": \"月島ミスト\",\n        \"tsukishima takafuyu\": \"月島隆冬\",\n        \"tsukuba kensuu\": \"つくばケンスウ\",\n        \"tsukumizu yuu\": \"月水憂\",\n        \"tsukumo\": \"九十九\",\n        \"tsukumo gou\": \"19号\",\n        \"tsukumo kazuki\": \"ツクモカヅキ\",\n        \"tsukumo matoro\": \"月雲まとろ\",\n        \"tsukushino makoto\": \"つくしの真琴\",\n        \"tsukuyomi sazin\": \"月読さじん\",\n        \"tsumetoro\": \"つめとろ\",\n        \"tsumitani daisuke\": \"罪谷死輔\",\n        \"tsumugi\": \"つむぎ\",\n        \"tsumumi\": \"つむみ\",\n        \"tsuna\": \"ツナ\",\n        \"tsuna onigiri\": \"ツナおにぎり\",\n        \"tsunami\": \"ツナミ\",\n        \"tsunamushi\": \"つなむし\",\n        \"tsunapiko\": \"TSUNAPIKO\",\n        \"tsunbeji\": \"つんべじ\",\n        \"tsune yoshi\": \"常好し\",\n        \"tsuneyoshi\": \"つねよし\",\n        \"tsuno\": \"つの\",\n        \"tsunoame kazuya\": \"角雨和八\",\n        \"tsunoda mag\": \"つのだ★まぐ\",\n        \"tsunoda saburoo\": \"つのだサブロー\",\n        \"tsunomiya katsuki\": \"津宮伽月\",\n        \"tsunsuki\": \"ツンスキ\",\n        \"tsurimiya gen\": \"釣宮弦\",\n        \"tsuru\": \"つる\",\n        \"tsurugi\": \"Tsurugi\",\n        \"tsurugi ai\": \"剑城蓝\",\n        \"tsurugi hikaru\": \"つるぎ輝\",\n        \"tsurugi wakarou\": \"鶴亀ワカロー\",\n        \"tsurugi yasuyuki\": \"剣康之\",\n        \"tsurukame\": \"ツルKAME\",\n        \"tsuruma megumi\": \"つるまめぐみ\",\n        \"tsurumaki kazuya\": \"鶴巻和哉\",\n        \"tsusauto\": \"津差宇土\",\n        \"tsutsumi\": \"包\",\n        \"tsutsumi akari\": \"つつみあかり\",\n        \"tsutsumori\": \"筒森\",\n        \"tsuwabuki raishi\": \"石蕗らいし\",\n        \"tsuyoshi\": \"津義\",\n        \"tsuzuki kazuhiko\": \"都築和彦\",\n        \"tsuzuki masumi\": \"つづきますみ\",\n        \"tsuzura\": \"つづら\",\n        \"tsuzurao kaya\": \"九尾かや\",\n        \"tsuzuri\": \"水瀬修\",\n        \"tt\": \"tt\",\n        \"ttl\": \"ttl\",\n        \"ttomm\": \"TTOMM\",\n        \"ttuunn\": \"つん\",\n        \"tukamori syuuji\": \"ツカモリシュウジ\",\n        \"tukazi\": \"つかぢ\",\n        \"tukii yasiro\": \"月井やしろ\",\n        \"tukikage nemu\": \"月影ネム\",\n        \"tukise mizuna\": \"月瀬水無\",\n        \"tukisiro saya\": \"月白沙耶\",\n        \"tukito\": \"月兎\",\n        \"tukumo keiichi\": \"九十九K1\",\n        \"tukusi hirokazu\": \"土筆ヒロカズ\",\n        \"tulip\": \"ちゅーりっふ。\",\n        \"tuna milk\": \"つなみるく\",\n        \"tuyo\": \"tuyo\",\n        \"twilight\": \"TWILIGHT\",\n        \"tyanaka\": \"てぃゃなか\",\n        \"tyatubo\": \"ちゃつぼ\",\n        \"tyauke\": \"茶請\",\n        \"tyke\": \"たいく\",\n        \"tyongera.\": \"ちょんげら。\",\n        \"typehatena\": \"たいぷはてな\",\n        \"tyrant sugawara\": \"タイラント菅原\",\n        \"tyranu\": \"ティラヌー\",\n        \"tyuda\": \"ちゅだ\",\n        \"tyuuten\": \"蟲天\",\n        \"u\": \"う\",\n        \"u nitro\": \"うにとろ\",\n        \"u-1\": \"U-1\",\n        \"u-hi\": \"U-hi\",\n        \"u-k\": \"U-K\",\n        \"u-ko\": \"U子\",\n        \"u-ring\": \"うーりん\",\n        \"u-ta\": \"u-ta\",\n        \"u35\": \"U35\",\n        \"ubanis\": \"うばにす\",\n        \"uchi-uchi keyaki\": \"内々欅\",\n        \"uchida shou\": \"内田翔\",\n        \"uchiga\": \"ウチガ\",\n        \"uchikura\": \"内座\",\n        \"uchiyan\": \"ウチやん\",\n        \"uchoten\": \"有頂天\",\n        \"uchuu ika\": \"宇宙烏賊\",\n        \"udon\": \"うどん\",\n        \"uduki sonowo\": \"空月苑生\",\n        \"ueda rieko\": \"上田リエコ\",\n        \"ueda ryou\": \"植田亮\",\n        \"uehara ari\": \"上原あり\",\n        \"uehasu\": \"上蓮\",\n        \"uehiro\": \"うえひろ\",\n        \"uemukai dai\": \"上向だい\",\n        \"ueno ebisen\": \"上野えびせん\",\n        \"ueno juubai\": \"上野十倍\",\n        \"ueno meguru\": \"植野メグル\",\n        \"ueno naoya\": \"ウエノ直哉\",\n        \"ueshima haruki\": \"上嶋ハルキ\",\n        \"uesugi shingo\": \"上杉信五\",\n        \"uetake\": \"植竹\",\n        \"ueto seri\": \"上戸セリ\",\n        \"ugatsu matsuki\": \"うがつ末期\",\n        \"ugeppa\": \"うげっぱ\",\n        \"ugetsu\": \"ウゲツ\",\n        \"ugo\": \"ゆうご\",\n        \"ugou gou\": \"うごうゴウ\",\n        \"uguisu kagura\": \"莺神乐\",\n        \"uhhii\": \"うっひー\",\n        \"uin\": \"uin\",\n        \"uirotuzi yumihiko\": \"外郎辻ゆみ彦\",\n        \"uirou\": \"うぃろう\",\n        \"ukatu jyuzou\": \"迂闊十臓\",\n        \"ukikotatsu\": \"うきこたつ\",\n        \"ukita tougo\": \"宇岐多冬梧\",\n        \"uku\": \"uku\",\n        \"ukyo rst\": \"ukyo_rst\",\n        \"ukyochu\": \"うきょちゅう\",\n        \"ulrich\": \"うるりひ\",\n        \"ultone\": \"うるとん\",\n        \"ultrabuster\": \"ウルトラバスター\",\n        \"uma\": \"UMA\",\n        \"umadura grenouille\": \"馬面グルヌイユ\",\n        \"umanosuke\": \"馬の助\",\n        \"umayadono ohji\": \"厩戸王子\",\n        \"ume\": \"うめ\",\n        \"umehara suzuko\": \"梅原スズコ\",\n        \"umekichi\": \"ウメ吉\",\n        \"umekko\": \"うめっこ\",\n        \"umemachi syouji\": \"梅町将二\",\n        \"umeran\": \"うめらん\",\n        \"umetarou\": \"梅太郎\",\n        \"umezo\": \"うめ蔵\",\n        \"umezu yoko\": \"梅津葉子\",\n        \"umi kurage\": \"海海月\",\n        \"umi tamako\": \"うみたまこ\",\n        \"umiazuma kakeru\": \"うみあずまかける\",\n        \"umibouzu\": \"うみぼうず\",\n        \"umichika\": \"うみちか\",\n        \"umihoshi minori\": \"海星みのり\",\n        \"umihotaru harumare\": \"海蛍はるまれ\",\n        \"umineko akira\": \"海猫明\",\n        \"umino haine\": \"海野灰猫\",\n        \"umino sachi\": \"海野幸\",\n        \"umino yayoi\": \"海野やよい\",\n        \"uminya\": \"うみにゃ\",\n        \"umipro\": \"umiプロ\",\n        \"umiyama misaki\": \"宇美山ミサキ\",\n        \"umiyume\": \"紅壱\",\n        \"umu rahi\": \"有無らひ\",\n        \"umuga yasusi\": \"U無我仁\",\n        \"un-moto\": \"云元\",\n        \"una\": \"うな\",\n        \"unacchi\": \"うなっち\",\n        \"unadare\": \"うなだれ\",\n        \"unamu\": \"うなむ\",\n        \"unazuki\": \"うなづき\",\n        \"unbalance\": \"UnBaLanCE\",\n        \"unepon\": \"うねぱん\",\n        \"uneta\": \"うねた\",\n        \"uni\": \"うに\",\n        \"uni-corn\": \"Uni-corn\",\n        \"unico kasumi\": \"ゆにこかすみ\",\n        \"unikura\": \"うに蔵\",\n        \"uniskie seagal\": \"ウニスキー・セガール\",\n        \"unknown\": \"春香\",\n        \"uno ryoku\": \"温野りょく\",\n        \"unohanat\": \"うのはな透\",\n        \"unomi\": \"うのみ\",\n        \"unoqlo\": \"UNOQLO\",\n        \"unoshima kanaka\": \"卯ノ島カナカ\",\n        \"unp\": \"UNp\",\n        \"untue\": \"ウンツエ\",\n        \"unwikkii\": \"うぃっきい\",\n        \"unyo\": \"うにょ\",\n        \"uona telepin\": \"うおなてれぴん\",\n        \"ura\": \"URA\",\n        \"ura dramatic\": \"裏ドラマチック\",\n        \"ura ichiko\": \"裏一子\",\n        \"uradoori nukemichi\": \"裏通抜道\",\n        \"uraharukon\": \"うらはるこん\",\n        \"urakami sosogi\": \"浦上そそぎ\",\n        \"urakawa opera\": \"浦河おぺら\",\n        \"urakuso\": \"うらくそ\",\n        \"urakusog\": \"有楽そG\",\n        \"uranfu\": \"うらんふ\",\n        \"urano mami\": \"浦乃まみ\",\n        \"urashima yuuhi\": \"浦島ゆうひ\",\n        \"uraura\": \"uraura\",\n        \"urayama\": \"うらやま\",\n        \"urec\": \"UREC\",\n        \"urekemo lala\": \"熟獣LaLa\",\n        \"ureshino megumi\": \"嬉野めぐみ\",\n        \"ureup\": \"うれあっぷ\",\n        \"uriboh\": \"ウリ坊\",\n        \"urin\": \"卯林\",\n        \"urivo\": \"ウリボぅ\",\n        \"uro\": \"ウロ | 雨露\",\n        \"uro-g\": \"Uro-G\",\n        \"urokozuki\": \"ウロコヅキ\",\n        \"uron\": \"うろん\",\n        \"urotsuki\": \"うろつき\",\n        \"urozuki akira\": \"宇路月\",\n        \"urushi\": \"ウルシ\",\n        \"urutsu\": \"ウルツ\",\n        \"uruu\": \"うるう\",\n        \"uryu sango\": \"瓜生珊瑚\",\n        \"us them\": \"あすぜむ\",\n        \"usa\": \"ウサ\",\n        \"usa usagi\": \"うさうさぎ\",\n        \"usagi ink\": \"うさぎいンく\",\n        \"usagi kei\": \"宇佐木恵\",\n        \"usaki\": \"うさき\",\n        \"usako\": \"ウサ小\",\n        \"usami rui\": \"ウサミルイ\",\n        \"usami suruga\": \"うさみするが\",\n        \"usano riko\": \"兎野りこ\",\n        \"usen\": \"ユウセン\",\n        \"ushi\": \"うし\",\n        \"ushi mochi\": \"うしもち\",\n        \"ushitora tatsumi\": \"丑寅たつみ\",\n        \"usi\": \"usi\",\n        \"usimanu\": \"うしまぬ\",\n        \"usoneko\": \"うそねこ\",\n        \"usso\": \"USSO\",\n        \"usuchi.\": \"うすちー。\",\n        \"usui\": \"薄\",\n        \"usuke bou\": \"うすけ坊\",\n        \"usuki\": \"薄稀\",\n        \"usurai\": \"うすら氷\",\n        \"usyuuri\": \"白ぅ～凪ぃ\",\n        \"uta\": \"唄\",\n        \"utage\": \"宴\",\n        \"utahara\": \"ウタハラ\",\n        \"utakata nagi\": \"UTAKATA凪\",\n        \"utako\": \"うた子\",\n        \"utana\": \"うたな\",\n        \"utano\": \"うた乃\",\n        \"utanone sion\": \"うたのねしおん\",\n        \"utase yui\": \"うたせゆい\",\n        \"utida k\": \"ウチダケイ\",\n        \"utsubo kazura\": \"うつぼかずら\",\n        \"utsugi tsuguha\": \"空木次葉\",\n        \"utsuki\": \"うー☆月\",\n        \"utsurogi angu\": \"空木あんぐ\",\n        \"uttorikun\": \"うっとりくん\",\n        \"utu\": \"utu\",\n        \"uwano sora\": \"ウワノソラ\",\n        \"uzukinoko\": \"うづきのこ\",\n        \"uzunoki tamaki\": \"渦の木環\",\n        \"uzura no tamago\": \"うずらのたまご\",\n        \"v-mag\": \"v-mag\",\n        \"vae\": \"ヴァエ\",\n        \"val\": \"val\",\n        \"valero\": \"ヴァレロ\",\n        \"valiant\": \"ばりあんと\",\n        \"vanadium\": \"Vanadium\",\n        \"vancho\": \"ばんちょー\",\n        \"vanilla\": \"vanilla\",\n        \"vanilla coke\": \"ヴァニラコーク\",\n        \"vanilla cream\": \"ヴァニラCREAM\",\n        \"vanity\": \"VANITY\",\n        \"varein\": \"Varein\",\n        \"velfro\": \"べるふろ\",\n        \"velzhe\": \"ベルゼ\",\n        \"ven\": \"ヴェン\",\n        \"venomlin\": \"venomlin\",\n        \"vice\": \"vice\",\n        \"vinny\": \"vinny\",\n        \"virth\": \"ばぁす\",\n        \"vivi\": \"びび\",\n        \"vogue\": \"vogue\",\n        \"volcano shigeru\": \"ボルケーノ滋\",\n        \"vt\": \"VT\",\n        \"vulcan nure\": \"ヴぁるかん濡\",\n        \"vyo\": \"べぃお\",\n        \"walzrj erorider\": \"W18\",\n        \"wabuki\": \"わぶき\",\n        \"wacoco waco\": \"輪子湖わこ\",\n        \"wada erika\": \"和田エリカ\",\n        \"wadachi kururu\": \"わだちくるる\",\n        \"wadanaka\": \"ワダナカ\",\n        \"wadatsumi\": \"わだつみ\",\n        \"waga na wa masamichi\": \"我が名は正道\",\n        \"wagahai hakushaku\": \"ワガハイ伯爵\",\n        \"waira\": \"猥裸\",\n        \"waka\": \"わか\",\n        \"wakachiko\": \"わかちこ\",\n        \"wakaki tamiki\": \"若木民喜\",\n        \"wakamesan\": \"ワカメさん\",\n        \"wakamiya teresa\": \"我宮てれさ\",\n        \"wakatsuki\": \"若月\",\n        \"wako\": \"わこ\",\n        \"wakura\": \"わくら\",\n        \"wakyo\": \"Wakyo\",\n        \"wamuko\": \"わむこ\",\n        \"wamusato haru\": \"和六里ハル\",\n        \"wan-pyo\": \"王彪\",\n        \"wanaata\": \"わなあた\",\n        \"wanao\": \"わなお\",\n        \"wanashiro giovanna\": \"和南城ジョアンナ\",\n        \"wanderer\": \"Wanderer\",\n        \"wanie digital\": \"ワニデジタル\",\n        \"wanriky\": \"腕力\",\n        \"wantaro\": \"ワン夕口\",\n        \"wap\": \"WaP\",\n        \"wapokichi\": \"わぽ吉\",\n        \"warabi yuuzou\": \"わらびゆうぞう\",\n        \"warashibe\": \"わらしべ\",\n        \"warashina mama\": \"わらしなママ\",\n        \"waroko\": \"ワロコ\",\n        \"warp mind\": \"warp_mind\",\n        \"wasa beef\": \"わさビーフ\",\n        \"wasabi yuuma\": \"わさび悠馬\",\n        \"wasamo\": \"わさも\",\n        \"wase rin\": \"早生リン\",\n        \"washima\": \"washima\",\n        \"washimi yu-ko\": \"わしみゆーこ\",\n        \"washimori\": \"鷲森\",\n        \"washizuka sho\": \"鷲塚翔\",\n        \"wasizuu\": \"わしず\",\n        \"wassyoi\": \"WASSYOI\",\n        \"wasu\": \"ワス\",\n        \"wata motsu\": \"綿もつ\",\n        \"wata-ruh\": \"わた・るぅー\",\n        \"wataichi meko\": \"綿市めこ\",\n        \"watanabe ignica\": \"渡辺イグニカ\",\n        \"watanabe yoshimasa\": \"わたなべよしまさ\",\n        \"watanabe yuuna\": \"渡辺ゆうな\",\n        \"watanuki kaname\": \"四月朔日要\",\n        \"watanuki lon\": \"綿貫ろん\",\n        \"watao\": \"わたお\",\n        \"watarai\": \"度会\",\n        \"wataru\": \"渉\",\n        \"watase rei\": \"渡瀬玲\",\n        \"watase sakana\": \"渡瀬さかな\",\n        \"wataya\": \"綿谷\",\n        \"watayoshi\": \"わたよし\",\n        \"watchie\": \"わっちー\",\n        \"watts\": \"Watts\",\n        \"wave\": \"WAVE\",\n        \"waves\": \"waves\",\n        \"wawa\": \"和々\",\n        \"wawon\": \"ワヲン\",\n        \"waysin\": \"Waysin\",\n        \"wazuka\": \"ワズカ\",\n        \"we53\": \"we53\",\n        \"wedge\": \"WEDGE\",\n        \"wemu\": \"ゑむ\",\n        \"white\": \"ほわいと\",\n        \"who are you\": \"風亜 ゆう\",\n        \"wing bird\": \"WING☆BIRD\",\n        \"winopz\": \"WinOPZ\",\n        \"winte\": \"winte\",\n        \"winter\": \"うぃんたぁ\",\n        \"wk.\": \"wk.\",\n        \"wkar\": \"WKAR\",\n        \"wm\": \"wm\",\n        \"wokasiya\": \"ヲカシヤ\",\n        \"woody\": \"WOODY\",\n        \"woof\": \"woof\",\n        \"workaholic\": \"若堀久\",\n        \"woza\": \"うぉざ\",\n        \"wtwinmk2nd\": \"WTwinMkⅡ2nd\",\n        \"www\": \"www\",\n        \"wx\": \"WX\",\n        \"x6suke\": \"X6suke\",\n        \"xain\": \"ザイン\",\n        \"xanadu\": \"Xanadu\",\n        \"xe\": \"Xe\",\n        \"xelvy\": \"xelvy\",\n        \"xeph\": \"Xeph\",\n        \"xi daisei\": \"クスィー大誠\",\n        \"xiaohua\": \"消化\",\n        \"xiaowoo\": \"小武\",\n        \"xiarobo\": \"しあろぼ\",\n        \"xii\": \"イニ\",\n        \"xiin\": \"xiin\",\n        \"xopc\": \"XOPC\",\n        \"xxzero\": \"xxzero\",\n        \"y\": \"Y\",\n        \"ya\": \"ヤッ\",\n        \"yabuki mao\": \"矢吹マオ\",\n        \"yabuno uguisu\": \"やぶのうぐいす\",\n        \"yaburebouki akuta\": \"破箒芥\",\n        \"yac\": \"YAC\",\n        \"yace\": \"YAce\",\n        \"yachan\": \"やちゃん\",\n        \"yachi\": \"ヤチ\",\n        \"yada masaka\": \"やだ！まさかっ\",\n        \"yadapoteto\": \"やだぽてと\",\n        \"yadokari genpachirou\": \"宿借り源八郎\",\n        \"yadoroku 7\": \"やどろく7\",\n        \"yae\": \"八重\",\n        \"yaeba\": \"やえば\",\n        \"yaebane\": \"八重羽根\",\n        \"yaeda nagumo\": \"八重田なぐも\",\n        \"yaegashi nan\": \"八重樫南\",\n        \"yaeto\": \"yaeto\",\n        \"yagami dai\": \"八神大\",\n        \"yagami sanjin\": \"矢上参仁\",\n        \"yagami shimei\": \"八神士明\",\n        \"yagezawa tetsuyuki\": \"やげざわてつゆき\",\n        \"yagi yuu\": \"山羊ゆう\",\n        \"yagumo kengou\": \"八雲剣豪\",\n        \"yahakin\": \"やはきん\",\n        \"yajiro masaru\": \"野城まさる\",\n        \"yajuu\": \"野獣\",\n        \"yakata soukei\": \"屋形宗慶\",\n        \"yaki ohagi\": \"やきおはぎ\",\n        \"yakisoba ohmori\": \"やきそばおおもり\",\n        \"yakisobapantarou\": \"ヤキソバぱん太郎\",\n        \"yakob\": \"やこぶ\",\n        \"yakuta tetsuya\": \"やくたてつや\",\n        \"yakuwa ken\": \"八鍬健\",\n        \"yakuzaishi\": \"薬剤師\",\n        \"yam\": \"yam\",\n        \"yama\": \"YAMA\",\n        \"pokoten\": \"ぽこてん\",\n        \"yamabatake\": \"山場岳\",\n        \"yamaboshi-kun\": \"やまぼしくん\",\n        \"yamabuki mook\": \"山吹ムック\",\n        \"yamaburo\": \"やまぶろ\",\n        \"yamachan\": \"やまちゃん\",\n        \"yamada\": \"ヤマダ\",\n        \"yamada ako\": \"山田あこ\",\n        \"yamada enako\": \"山田エナ子\",\n        \"yamada kou\": \"山田こう\",\n        \"yamada non\": \"やまだノン\",\n        \"yamada satoshi\": \"山田サトシ\",\n        \"yamada shiguma\": \"山田シグ魔\",\n        \"yamada shuutarou\": \"山田秋太郎\",\n        \"yamada takashi\": \"山田高嗣\",\n        \"yamada yuumi\": \"やまだゆうみ\",\n        \"yamadori\": \"山鳥\",\n        \"yamadori kodi\": \"山鳥こぢ\",\n        \"yamagiwa yuusuke\": \"山際悠介\",\n        \"yamaguchi\": \"ヤマグチ\",\n        \"yamaguchi nao\": \"やまぐち なお\",\n        \"yamaguchi shinji\": \"やまぐちしんじ\",\n        \"yamaguchi shunichi\": \"山口俊一\",\n        \"yamaguchi ugou\": \"やまぐち羽轟\",\n        \"yamai\": \"山井\",\n        \"yamai sakatarou\": \"山井坂太郎 or 山井逆太郎\",\n        \"yamaimo torotoro\": \"山いもとろとろ\",\n        \"yamaishi\": \"山石\",\n        \"yamaishi joe\": \"山石ジョウ\",\n        \"yamaiso\": \"やまいそ\",\n        \"yamakawa yuu\": \"山河勇\",\n        \"yamako\": \"やまこ\",\n        \"yamamoh\": \"やまもー\",\n        \"yamamoto atsuji\": \"山本貴嗣\",\n        \"yamamoto canponi\": \"やまもと かんぽに\",\n        \"yamamoto johanne\": \"山本夜羽音\",\n        \"yamamoto kaori\": \"山本佳織\",\n        \"yamamoto ryuusuke\": \"はせ☆裕\",\n        \"yamamoto tomomitsu\": \"山本ともみつ\",\n        \"yamamura natsuru\": \"山村なつる\",\n        \"yamane masahiro\": \"やまねまさひろ\",\n        \"yamaneko suzume\": \"山猫スズメ\",\n        \"yamano\": \"やまの\",\n        \"yamano konzaburo\": \"山野紺三郎\",\n        \"yamaori\": \"yamaori\",\n        \"yamashita masahiro\": \"山下正浩\",\n        \"yamashita woory\": \"山下うり\",\n        \"yamato\": \"YAMATO\",\n        \"yamato akami\": \"大和あかみ\",\n        \"yamato masaomi\": \"やまと将臣\",\n        \"yamato nadeshiko\": \"大和なでしこ\",\n        \"yamato nyaon\": \"ヤマトにゃ音\",\n        \"yamato osamushi\": \"大和乃 史\",\n        \"yamato techno\": \"大和テクノ\",\n        \"yamatodanuki\": \"大和狸\",\n        \"yamaura shou\": \"山浦章\",\n        \"yamazaki show\": \"夜魔咲翔\",\n        \"yameru doushi\": \"病める同志\",\n        \"yameta takashi\": \"止田卓史\",\n        \"yami no naka\": \"闇の中\",\n        \"yamikage missa\": \"闇影みさ\",\n        \"yaminoki\": \"やみのき\",\n        \"yamisupi\": \"やみすぴ\",\n        \"yamizawa\": \"ヤミザワ\",\n        \"yamizora hikari\": \"闇空光\",\n        \"yamome\": \"ヤモメ\",\n        \"yamoto\": \"yamoto\",\n        \"yan\": \"ヤン\",\n        \"yana\": \"也な\",\n        \"yanagi\": \"柳\",\n        \"yanagi hirohiko\": \"柳ひろひこ\",\n        \"yanagida fumita\": \"柳田史太\",\n        \"yanagie\": \"やなぎー\",\n        \"yanagise\": \"やなぎせ\",\n        \"yanase kotatsu\": \"柳瀬こたつ\",\n        \"yanasegawabeya\": \"柳瀬川部屋\",\n        \"yaneura meteor impact\": \"屋根裏メテオインパクト\",\n        \"yang\": \"ヤン\",\n        \"yankopi\": \"やんこぴ\",\n        \"yano\": \"Yano\",\n        \"yano rahna\": \"夜乃らあな\",\n        \"yano takumi\": \"香川友信\",\n        \"yano toshinori\": \"矢野トシノリ\",\n        \"yanokake\": \"やのかけ\",\n        \"yanonoshin\": \"やののしん\",\n        \"yao.\": \"YaO.\",\n        \"yaomai\": \"やおまい\",\n        \"yappen\": \"ヤッペン\",\n        \"yappy\": \"yappy\",\n        \"yarii shimeta\": \"枪衣七五三太\",\n        \"yas\": \"yas\",\n        \"yasaka\": \"弥栄\",\n        \"yasaka minato\": \"八坂ミナト\",\n        \"yasha\": \"yasha\",\n        \"yashai\": \"やしゃい\",\n        \"yashichii\": \"やしちぃ\",\n        \"yashiki third\": \"屋敷さーど\",\n        \"yashima koto\": \"屋嶋コト\",\n        \"yashio taiga\": \"八潮タイガー\",\n        \"yashiro\": \"社\",\n        \"yashiro ryo\": \"八代涼\",\n        \"yason shain\": \"ヤソン社員\",\n        \"yass\": \"yass\",\n        \"yasu rintarou\": \"安麟太郎\",\n        \"yasuaki\": \"ヤスアキ\",\n        \"yasuda\": \"YASUDA\",\n        \"yasuda katsunori\": \"安田かつのり\",\n        \"yasuhara tsukasa\": \"安原司\",\n        \"yasumon\": \"yasumon\",\n        \"yasumori zen\": \"安森然\",\n        \"yasunaga kouichirou\": \"安永航一郎\",\n        \"yasunao\": \"やすなお\",\n        \"yasuto\": \"泰斗\",\n        \"yat\": \"yat\",\n        \"yata\": \"yata\",\n        \"yataneko\": \"ヤタネコ\",\n        \"yatano\": \"やたの\",\n        \"yatengetu\": \"夜天月\",\n        \"yato hikaru\": \"八仁ヒカル\",\n        \"yatsuashi matomo\": \"ヤツアシマトモ\",\n        \"yatsufusa hajime\": \"八房一\",\n        \"yatsugami tenchou\": \"八ツ神店長\",\n        \"yatsuka yuhata\": \"夜束ユハタ\",\n        \"yatsushima tetsuya\": \"八嶋テツヤ\",\n        \"yatsuzaki\": \"八咲\",\n        \"yatuzaki\": \"やつざき\",\n        \"yautsuro\": \"ヤウツロ\",\n        \"yawaraka concrete\": \"やわらかコンクリート\",\n        \"yawaraka midori\": \"やわらかみどり\",\n        \"yayo\": \"夜与\",\n        \"yayoi kotoyuki\": \"弥生ことゆき\",\n        \"yayoichi\": \"夜よいち\",\n        \"yazawa oke\": \"矢澤おけ\",\n        \"yazawa owl\": \"Yazawa Owl\",\n        \"yazuki aoi\": \"野月あおい\",\n        \"yellowseeds\": \"YellowSeeds\",\n        \"yequo\": \"イエクオ\",\n        \"yf studio\": \"YF Studio\",\n        \"yk\": \"yk\",\n        \"yo-jin\": \"YO-JIN\",\n        \"yo-suke\": \"yo-suke\",\n        \"yo2\": \"YO2\",\n        \"yoban\": \"よばん\",\n        \"yocchi\": \"よっち\",\n        \"yodare\": \"よだれ\",\n        \"yodori\": \"よどり\",\n        \"yoekosukii\": \"ヨエコスキー\",\n        \"yofukashi\": \"夜ふかし\",\n        \"yogiri neo\": \"夜霧音緒\",\n        \"yohi\": \"よひ\",\n        \"yohinori\": \"ヨヒノリ\",\n        \"yoichi\": \"よいち\",\n        \"yoihoshi hikari\": \"宵星ヒカリ\",\n        \"yoikuma\": \"酔\",\n        \"yoki\": \"よーき\",\n        \"yokko\": \"よっこ～\",\n        \"yokkyun\": \"よっきゅん\",\n        \"yoko\": \"yoko\",\n        \"yoko juusuke\": \"横十輔\",\n        \"yoko mawatari\": \"馬渡ようこ\",\n        \"yokohachi\": \"よこはち\",\n        \"yokosima\": \"横縞\",\n        \"yokota mamoru\": \"横田守\",\n        \"yokoyama kouji\": \"横山コウジ\",\n        \"yokoyama michiru\": \"横山ミチル\",\n        \"yokoyama naoki\": \"よこやまなおき\",\n        \"yokoyama negi\": \"横山葱\",\n        \"yoku\": \"ヨク\",\n        \"yokuran\": \"翼卵\",\n        \"yomiclone\": \"yomiclone\",\n        \"yomoda yomo\": \"よもだよも\",\n        \"yomogi\": \"よもぎ\",\n        \"yomogi ringo\": \"よもぎりんご\",\n        \"yomogiya keita\": \"よもぎや敬太\",\n        \"yomosaka\": \"よもさか\",\n        \"yomotsuka tsukasa\": \"四方塚ツカサ\",\n        \"yomoyama akira\": \"四方山哲\",\n        \"yonaga\": \"よなが\",\n        \"yonbangai\": \"4番街\",\n        \"yone\": \"ヨネ\",\n        \"yonekura\": \"米蔵\",\n        \"yonekura hisaki\": \"米倉久記\",\n        \"yonekura kihiro\": \"米倉きひろ\",\n        \"yonemaru\": \"よねまる\",\n        \"yonezou\": \"よねぞう\",\n        \"yonige-ya no kyou\": \"夜逃げ屋の恭\",\n        \"yonu\": \"よる\",\n        \"yoo oona\": \"よーな\",\n        \"yorihito\": \"頼一\",\n        \"yoriko\": \"よりこ\",\n        \"yorisuke\": \"よりすけ\",\n        \"yoriu mushi\": \"寄生虫\",\n        \"yoroshiku tarou\": \"夜露死苦汰楼\",\n        \"yorozu\": \"よろづ\",\n        \"yoru yoru\": \"ヨルヨル\",\n        \"yorutori\": \"よるとり\",\n        \"yosage yoshikazu\": \"よさげよしかず\",\n        \"yosai\": \"葉才\",\n        \"yoshi\": \"yoshi\",\n        \"yoshi keto\": \"よしけ～と\",\n        \"yoshi-puu\": \"よしぷー\",\n        \"yoshida gorou\": \"吉田悟郎\",\n        \"yoshida goten\": \"吉田御殿\",\n        \"yoshida hajime\": \"吉田創\",\n        \"yoshida masahiko\": \"吉田正彦\",\n        \"yoshida nami\": \"吉田浪\",\n        \"yoshida negi\": \"よしだねぎ\",\n        \"yoshida yoshimi\": \"よしだよしみ\",\n        \"yoshiga fuumi\": \"吉賀ふうみ\",\n        \"yoshihara maito\": \"芳原舞人\",\n        \"kasaki yoshihiko\": \"加崎善彦\",\n        \"yoshii toshinari\": \"由衣利成\",\n        \"yoshiizumi hana\": \"よしいずみはな\",\n        \"yoshijima ataru\": \"よしじまあたる\",\n        \"yoshiki\": \"YOSHIKI\",\n        \"yoshimiya chitose\": \"義宮ちとせ\",\n        \"yoshimoto ayumu\": \"芳本あゆむ\",\n        \"yoshimune\": \"よしむね\",\n        \"yoshimura\": \"吉村\",\n        \"yoshimura kentaro\": \"よしむらけんたろー\",\n        \"yoshinaga eikichi\": \"吉永えいきち\",\n        \"yoshinari ayaka\": \"吉成綾加\",\n        \"yoshino kasa\": \"よしのかさ\",\n        \"yoshino sora\": \"吉乃そら\",\n        \"yoshino.\": \"よしの。\",\n        \"yoshiragi\": \"ヨシラギ\",\n        \"yoshiron\": \"よしろん\",\n        \"yoshiten\": \"よし天\",\n        \"yoshitora\": \"YOSHITORA\",\n        \"momomo momo\": \"桃萌 百\",\n        \"yoshiwo\": \"よしを\",\n        \"yoshiyuki\": \"ヨシユキ\",\n        \"yoshizane akihiro\": \"好実昭博\",\n        \"yoshizawa kei\": \"吉沢蛍\",\n        \"yoshizawa mayu\": \"よしざわ真由\",\n        \"yoshizawa megane\": \"吉沢メガネ\",\n        \"yoshizawa miyabi\": \"吉沢雅\",\n        \"yoshizawa tomoaki\": \"吉澤友章\",\n        \"yoshizawa vanilla\": \"芳澤ばにら\",\n        \"yositama\": \"英戦\",\n        \"yosomono\": \"よそ者\",\n        \"yosuke\": \"ヨースケ\",\n        \"yosyo-\": \"ヨショー\",\n        \"yotaka\": \"yotaka\",\n        \"yotarou\": \"夜太弄\",\n        \"yotsuba yuiko\": \"四葉ゆいこ\",\n        \"yotsura\": \"寄弦\",\n        \"yotsuya mika\": \"よつやみか\",\n        \"yottan\": \"ヨッタン\",\n        \"you2\": \"YOU2\",\n        \"you3.\": \"you3｡\",\n        \"youdou\": \"謡堂\",\n        \"youichirou w\": \"よーいちろーW\",\n        \"youjomodoki\": \"ヨウジョモドキ\",\n        \"youka\": \"よーか\",\n        \"youkan\": \"ようかん\",\n        \"youma kachie\": \"夜馬勝絵\",\n        \"youtou sadamitsu\": \"妖刀定光\",\n        \"yowashi\": \"よわし\",\n        \"yoyo\": \"YoYo\",\n        \"yoyoyoyou\": \"よよよよう\",\n        \"yozi\": \"YoZi\",\n        \"yozo\": \"yozo\",\n        \"yts takana\": \"YTS 鷹那\",\n        \"yu\": \"YU\",\n        \"yu-ri\": \"YU-RI\",\n        \"yu-ya\": \"熊耶\",\n        \"yua\": \"夕海\",\n        \"yuam\": \"ゆあま\",\n        \"yucchris\": \"ゆっ栗栖\",\n        \"yuchi\": \"ゆち\",\n        \"yuchitose\": \"ゆうちとせ\",\n        \"yuda-chan\": \"湯田ちゃん\",\n        \"yude pea\": \"茹でピー\",\n        \"yuduki kei\": \"雪月佳\",\n        \"yuduki kisa\": \"柚希妃紗\",\n        \"yuge\": \"ゆげ\",\n        \"yui-7\": \"YUI_7\",\n        \"yuika\": \"ゆいか\",\n        \"yuima yutaka\": \"ゆいまゆたか\",\n        \"yuisaki takumi\": \"結崎拓海\",\n        \"yuitsu\": \"ゆいつ\",\n        \"yukagen tenyu\": \"湯加減てんゆ～\",\n        \"yukako\": \"ゆかこ\",\n        \"yukaran nosuke\": \"ゆからんのすけ\",\n        \"yukatama\": \"ゆかたま\",\n        \"yukataro\": \"ゆかたろ\",\n        \"yukawa mario\": \"湯川まりお\",\n        \"yuki mau\": \"有希まう\",\n        \"yuki seriya\": \"yuki seriya\",\n        \"yuki tomoshi\": \"幸灯\",\n        \"yukia\": \"ゆきあ\",\n        \"yukian\": \"Yukian\",\n        \"yukibana\": \"雪華\",\n        \"yukichi-san\": \"ゆきちさん\",\n        \"yukiguni eringi\": \"雪国エリンギ\",\n        \"yukiharu\": \"にゃわて荘\",\n        \"yukihime haruka\": \"雪姫はるか\",\n        \"yukihoshi kokoro\": \"雪星こころ\",\n        \"yukimachi tounosuke\": \"雪町灯之助\",\n        \"yukimai\": \"ゆきまい\",\n        \"yukimaro yukky\": \"ゆきまろゆっきー\",\n        \"yukimaru.\": \"雪丸。\",\n        \"yukimi\": \"由木彌\",\n        \"yukimi iris\": \"雪味あいりす\",\n        \"yukimino yukio\": \"雪見野ユキオ\",\n        \"yukimitsu\": \"ゆきみつ\",\n        \"yukimura hajime\": \"雪村一\",\n        \"yukimura tsugumi\": \"ゆきむらつぐみ\",\n        \"yukina\": \"ゆきな\",\n        \"yukina funa\": \"幸奈ふな\",\n        \"yukino\": \"ゆきの\",\n        \"yukino yukikaze\": \"ゆきのゆきかぜ\",\n        \"yukiri takashi\": \"結桐たかし\",\n        \"yukishiro yima\": \"雪白イマ\",\n        \"yukisiro arte\": \"雪代あるて\",\n        \"yukitaka\": \"柚木貴\",\n        \"yukito\": \"雪人\",\n        \"yukitsuka tsukasa\": \"ゆきつかつかさ\",\n        \"yukiusagi\": \"ゆきうさぎ\",\n        \"yukiwo\": \"ユキヲ\",\n        \"yukiya\": \"雪哉\",\n        \"yukiyanagi yui\": \"雪柳唯依\",\n        \"yukizuki chikuba\": \"雪月竹馬\",\n        \"yukke-ani\": \"ゆっけ兄\",\n        \"yukke.\": \"ゆっけ。\",\n        \"yukki\": \"ゆっき\",\n        \"yukko\": \"ゆっこ\",\n        \"yukkyun\": \"ユッキュン\",\n        \"yuku\": \"ゆく\",\n        \"yukyu ponzu\": \"悠久ポン酢\",\n        \"yuma\": \"ゆーま\",\n        \"yuma ryouhei\": \"ゆま亮平\",\n        \"yumaman\": \"ゆままん\",\n        \"yumbo anahoru\": \"ゆんぼあなほる\",\n        \"yume\": \"夢\",\n        \"yumegi\": \"ユメギ\",\n        \"yumegi atsuki\": \"ゆめぎあつき\",\n        \"yumemiya subaru\": \"夢宮すばる\",\n        \"yumeno shiya\": \"夢ノ紫也\",\n        \"yumesato makura\": \"夢里まくら\",\n        \"yumeutsutsu hideki\": \"夢現ひでき\",\n        \"yumi ichirou\": \"友美イチロウ\",\n        \"yumiya\": \"ゆみや\",\n        \"yuna\": \"由那\",\n        \"yunagi kahoru\": \"夕凪薫\",\n        \"yuniba\": \"ゆにば\",\n        \"yunioshi\": \"ゆにおし\",\n        \"yuno shigure\": \"雪乃時雨\",\n        \"yunodon\": \"ゆのどん\",\n        \"yunoka gashuu\": \"ゆのか雅愁\",\n        \"yunokawa yosomi\": \"温泉川よそ見\",\n        \"yunoki yu\": \"柚木ユウ\",\n        \"yunopanchako\": \"ゆのぱんちゃこ\",\n        \"yunosuke\": \"ゆのすけ\",\n        \"yurarin\": \"yurarin\",\n        \"yurei\": \"ゆーれー\",\n        \"yuri kamome\": \"友梨かもめ\",\n        \"yuri tamashii\": \"百合魂\",\n        \"yuri tohru\": \"百合融\",\n        \"yuriaki\": \"ユリアキ\",\n        \"yurige\": \"ゆりげ\",\n        \"yurihara aki\": \"百合原明\",\n        \"yurikawa\": \"ゆりかわ\",\n        \"yuririn\": \"ゆりりん\",\n        \"yuriwhale\": \"Yuriwhale\",\n        \"yusa ikuyoshi\": \"遊佐育美\",\n        \"yusui\": \"ゆすい\",\n        \"yusura\": \"山桜桃\",\n        \"yutakame\": \"ゆたかめ\",\n        \"yuto\": \"yuto\",\n        \"yutori-nu\": \"ゆとりーぬ\",\n        \"yutsuki tsuzuri\": \"愉月綴\",\n        \"yuu\": \"由宇\",\n        \"yuu sagi\": \"ユウサギ\",\n        \"yuuga\": \"遊賀\",\n        \"yuuga momiji\": \"夕雅紅葉\",\n        \"yuuge\": \"夕餉\",\n        \"yuugo\": \"ユーゴ\",\n        \"ariuo\": \"有魚\",\n        \"yuuhi\": \"雄飛\",\n        \"yuuhi alpha\": \"悠飛あるふぁ\",\n        \"yuuichi\": \"ゆういち\",\n        \"yuuk\": \"yuuk\",\n        \"yuuka rei\": \"優華麗\",\n        \"yuuki alice\": \"夕姫ありす\",\n        \"yuuki haruka\": \"結城遥\",\n        \"yuuki hb\": \"ユウキHB\",\n        \"yuuki hide\": \"悠希ヒデ\",\n        \"yuuki mia\": \"結城みあ\",\n        \"yuuki mitsuru\": \"結城みつる\",\n        \"yuuki miya\": \"結城美夜\",\n        \"yuuki miyabi\": \"結城みやび\",\n        \"yuuki noco\": \"悠樹ノコ\",\n        \"yuuki ray\": \"ユウキレイ\",\n        \"yuuki ryo\": \"結城稜\",\n        \"yuuki satoru\": \"結城さとる\",\n        \"yuuki tomoka\": \"ゆうきともか\",\n        \"yuuki tsumugi\": \"ゆうきつむぎ\",\n        \"yuuki yu\": \"結城結\",\n        \"yuumazume\": \"ゆうまずめ\",\n        \"yuumi takako\": \"夕海たかこ\",\n        \"yuumyago\": \"ゆうみゃご\",\n        \"yuunagi show\": \"夕凪ショウ\",\n        \"yuuno\": \"ゆうの\",\n        \"yuunyan\": \"ゆうにゃん\",\n        \"yuuri\": \"遊離\",\n        \"yuurin\": \"佑りん\",\n        \"yuusa riki\": \"ゆうさ理姫\",\n        \"yuusei iori\": \"遊星庵\",\n        \"yuusuke asazume\": \"麻爪佑助\",\n        \"yuuta\": \"湯唄\",\n        \"yuuyake roji\": \"夕焼け路地\",\n        \"yuya\": \"悠夜\",\n        \"yuyu\": \"ゆゆ\",\n        \"yuzaki\": \"ユウザキ\",\n        \"yuzco\": \"ゆずこ\",\n        \"yuzn\": \"ゆずん\",\n        \"yuzu ramune\": \"柚子ラムネ\",\n        \"yuzu syrup\": \"ゆずしろっぷ\",\n        \"yuzucky\": \"ゆずっきー\",\n        \"yuzuka\": \"柚夏\",\n        \"yuzuki makii\": \"柚木まき\",\n        \"yuzuki rin\": \"柚木鈴\",\n        \"yuzuki ruri\": \"柚木ルリ\",\n        \"yuzuki suzu\": \"柚木鈴\",\n        \"yuzuki yu\": \"柚木ゆう\",\n        \"yuzuki yua\": \"柚月ゆあ\",\n        \"yuzuki yuno\": \"柚木ゆの\",\n        \"yuzuko syou\": \"ゆずこしょう\",\n        \"yuzupon\": \"ゆずぽん\",\n        \"yuzuriha\": \"杠\",\n        \"yuzushiko\": \"ゆずしこ\",\n        \"yuzuyoukan\": \"ゆずようかん\",\n        \"z-s-e\": \"z-s-e\",\n        \"z26\": \"Z26\",\n        \"zacro\": \"柘榴\",\n        \"zakiko\": \"ザキコ\",\n        \"zakkunpoppu\": \"雑君保プ\",\n        \"zakotv\": \"ZakoTV\",\n        \"zakuro\": \"ざくろ\",\n        \"zama shouji\": \"座間翔二\",\n        \"zan\": \"ZAN\",\n        \"zaneri\": \"ザネリ\",\n        \"zangi\": \"ざんぎ\",\n        \"zarasi\": \"ざらし\",\n        \"zariya ranmaru\": \"座裏屋蘭丸\",\n        \"zasan\": \"ざさん\",\n        \"zasha\": \"ザシャ\",\n        \"zashiki ushi\": \"座敷牛\",\n        \"zassyu\": \"ザッシュ\",\n        \"zawa\": \"ざわ\",\n        \"zawameki\": \"ざわめき\",\n        \"zawar\": \"ZawarC\",\n        \"zax\": \"Zax\",\n        \"zekkyosyu\": \"絶巨主\",\n        \"zekkyou\": \"絶叫\",\n        \"zeku\": \"ゼク\",\n        \"zen\": \"ZEN\",\n        \"zen.\": \"ぜん。\",\n        \"zen33n\": \"Zen33n\",\n        \"zen9\": \"zen9\",\n        \"zengo\": \"前後\",\n        \"zenki\": \"ぜんき\",\n        \"zenra\": \"全裸\",\n        \"zenra yashiki\": \"全裸屋敷\",\n        \"zentam\": \"ゼンタム\",\n        \"zephi\": \"ゼフィ\",\n        \"zephid\": \"ゼフィド\",\n        \"raianonzika\": \"RaianOnzika\",\n        \"zero\": \"zero\",\n        \"zero punch\": \"ぜろぽんち\",\n        \"zero tanuki\": \"零狸\",\n        \"zessekaishonen\": \"絶世界少年\",\n        \"zest\": \"ゼスト\",\n        \"zettaizetumei\": \"絶対絶命\",\n        \"zetz\": \"ぜっつ\",\n        \"zima\": \"Zima\",\n        \"zin\": \"ZiN\",\n        \"zinan\": \"ジナン\",\n        \"zinno\": \"zinno\",\n        \"zion\": \"ZION\",\n        \"ziz\": \"ziz\",\n        \"zo\": \"ぞ\",\n        \"zol\": \"ZOL\",\n        \"zono\": \"ぞの\",\n        \"zonta\": \"ぞん太\",\n        \"zorane\": \"ぞらね\",\n        \"zourion\": \"ゾウリオン\",\n        \"zukky\": \"Zukky\",\n        \"zummy\": \"Zummy\",\n        \"zumo8\": \"ずも8\",\n        \"zun nyannyan\": \"ズンにゃんにゃん\",\n        \"zundamochi\": \"ずんだ餅\",\n        \"zundarinda\": \"ズンダリンダ\",\n        \"zunta\": \"Zunta\",\n        \"zuru\": \"ズル\",\n        \"zutta\": \"Zutta\",\n        \"zuzu\": \"ズズ\",\n        \"zyaroh akira\": \"邪琅明\",\n        \"zyougen\": \"上弦\",\n        \"zyulokuya\": \"十録屋\",\n        \"zzinzinz\": \"なめジョン\",\n        \"zzz\": \"zzz\",\n        \"1up\": \"1UP\",\n        \"6zo\": \"6zo\",\n        \"anzheli\": \"Anzheli\",\n        \"cfr\": \"CFR\",\n        \"inagita\": \"INAGITA\",\n        \"inside\": \"Inside\",\n        \"kashiko akira\": \"かしこ村\",\n        \"kururururu\": \"くるるるる\",\n        \"murayamamon\": \"村山門\",\n        \"nanohana800\": \"なのはな800\",\n        \"nns\": \"nnS\",\n        \"norainu\": \"野良犬\",\n        \"noysca\": \"noysca\",\n        \"styx\": \"STYX\",\n        \"takamiya hairi\": \"たかみやはいり\",\n        \"tinmeshi\": \"珍飯\",\n        \"utatane\": \"うたたね\",\n        \"tomodachi\": \"Tomodachi\",\n        \"puracotte\": \"Puracotte＊ぷらこ\",\n        \"tsuyuhisa fumi\": \"露久ふみ\",\n        \"hinoshita akame\": \"日之下あかめ\",\n        \"ryokuchamichi\": \"緑茶みち\",\n        \"mamimi\": \"Mamimi\",\n        \"mujin bensin\": \"無人\",\n        \"jima\": \"じま\",\n        \"miyama tsubakime\": \"美山椿芽\",\n        \"haku89\": \"haku89\",\n        \"shengtian\": \"升天\",\n        \"tezuka osamu\": \"手冢治虫\",\n        \"oyuyu\": \"おゆゆ\",\n        \"mo oku\": \"MO:OKU\",\n        \"rounds chen\": \"RoundsChen\",\n        \"tsubame\": \"つばめ\",\n        \"ushinomiya\": \"うしのみや\",\n        \"yoikorogashi\": \"よいころがし\",\n        \"natsu jam\": \"夏ジャム\",\n        \"aosawa yuki\": \"青沢由紀\",\n        \"inui nuinu\": \"犬居ぬいぬ\",\n        \"2no.\": \"2no.\",\n        \"h.carrrrrrot\": \"カロロット\",\n        \"toriattogununu\": \"とりあっとぐぬぬ\",\n        \"harrishero\": \"ハリスヒロ\",\n        \"potatorinrin\": \"孟達\",\n        \"hotter daimon\": \"掘多大門\",\n        \"cirilla\": \"CIRILLA\",\n        \"tsunakama\": \"ツナかま\",\n        \"yoshida ninn\": \"吉田にん\",\n        \"yukimura yukio\": \"雪村雪緒\",\n        \"akiyoshi amelie\": \"秋芳あめり\",\n        \"shikibe tsuko\": \"色辺つこ\",\n        \"yusha-m\": \"Yusha-M\",\n        \"kuroboshi kouhaku\": \"黑星红白（饭冢武史）\",\n        \"aji taro\": \"AJ/鯵太郎\",\n        \"aizen pochi\": \"愛染ぽち\",\n        \"nagatsuki hatsuka\": \"長月はつか\",\n        \"kotobuki haruki\": \"琴吹はるき\",\n        \"kou kou ax\": \"口口AX\",\n        \"madoka tsukumo\": \"円つくも\",\n        \"takeda hinata\": \"武田日向\",\n        \"tsuyuri inu\": \"栗花落淫雨\",\n        \"minagi koh\": \"海凪コウ\",\n        \"mumumu seijin\": \"むむむ星人\",\n        \"redchicken\": \"붉은닭\",\n        \"shirai bebe\": \"白井べべ\",\n        \"nekosaki aoi\": \"猫崎葵\",\n        \"kakuchou no okina\": \"拡張の翁\",\n        \"shiawase na choshoku.\": \"幸せな朝食。\",\n        \"cenangam\": \"CeNanGam\",\n        \"tabasco pasta\": \"タバスコパスタ\",\n        \"gin eiji\": \"銀エイジ\",\n        \"yan-baru\": \"やんBARU\",\n        \"hanasaka houcha\": \"花咲方茶\",\n        \"fallen-leaves\": \"Fallen落叶\",\n        \"hanayama\": \"はなやま\",\n        \"kusoniku yokichi\": \"糞肉与吉\",\n        \"hatoba akane\": \"波止場茜\",\n        \"hachi no hachihachi\": \"はちの八八\",\n        \"rhasta\": \"牛乳重工\",\n        \"melailai\": \"么赖赖\",\n        \"da mao banlangen\": \"大猫板蓝根\",\n        \"touwa nikuman\": \"空72色\",\n        \"yushi quetzalli\": \"羽蛇Quetzalli\",\n        \"fukuro daizi\": \"Fukuro袋子\",\n        \"tsukumo nikyu\": \"九十九弐級\",\n        \"uten ameka\": \"雨天あめか\",\n        \"sakuraba rokusuke\": \"樱庭六辅\",\n        \"aoyama akira\": \"苍山哲\",\n        \"kamitake\": \"鱗物\",\n        \"k-ko\": \"K子\",\n        \"sisyamo 2 percent\": \"sisyamo2%\",\n        \"metacora\": \"めたこら\",\n        \"kangoku meika\": \"監獄銘菓\",\n        \"souseki\": \"層積\",\n        \"manno\": \"まんの\",\n        \"tamada heijun\": \"玉田平准\",\n        \"nagai go\": \"永井豪\",\n        \"takamaru\": \"鷹丸\",\n        \"nidaime\": \"二代目\",\n        \"minato ojitan\": \"湊おじたん\",\n        \"orukoa\": \"orukoa\",\n        \"karakuri musha\": \"からくり武者\",\n        \"neisan\": \"ねいさん\",\n        \"takekawa sin\": \"武川慎\",\n        \"galbany denryuu\": \"ガルバニー電流\",\n        \"utsunomiya ukatsu\": \"郁之宫迂阔\",\n        \"suito\": \"すいと\",\n        \"kura\": \"倉\",\n        \"ayasaka\": \"綾坂\",\n        \"akusema\": \"あくせま\",\n        \"takumichi\": \"Taku道\",\n        \"ramanda\": \"ラマンダ\",\n        \"suimi\": \"水深\",\n        \"totoyama keiji\": \"魚山ケイジ\",\n        \"konery\": \"ｺﾈﾘｨ＠(ヽ'ω`)\",\n        \"cocomachi\": \"ここまち\",\n        \"mizuse kiseki\": \"星の紅茶\",\n        \"momomo gasshuukoku\": \"ももも合衆国\",\n        \"nameless peasant\": \"皮三豆\",\n        \"minamoto kosada\": \"源康定\",\n        \"mukatsuku\": \"ム菓ツク（むか）\",\n        \"akiamare\": \"あきあまれ\",\n        \"sakuragi yomi\": \"樱木黄泉\",\n        \"suichuu hanabi\": \"水中花火\",\n        \"enmanuelart\": \"enmanuelart\",\n        \"shirosaba\": \"白サバ\",\n        \"cslucaris\": \"CSLucaris\",\n        \"4riasensei\": \"フォリア\",\n        \"matsuda\": \"ユウスケ\",\n        \"rasen kyofu kaku\": \"ラセン恐怖閣\",\n        \"damenahito\": \"だめなひと\",\n        \"satou teruhito\": \"佐藤辉人\",\n        \"yamada tahichi\": \"山田タヒチ\",\n        \"nijiiro tyahantei\": \"虹色チャーハン亭\",\n        \"ikemura hiroichi\": \"池村ヒロイチ\",\n        \"kizaki masuta\": \"季崎ますた\",\n        \"komera\": \"こめら\",\n        \"kurotane\": \"くろたね\",\n        \"toushiki yubune\": \"橙織ゆぶね\",\n        \"shimada panda\": \"しま田ぱんだ\",\n        \"kakei kei\": \"花兄けい\",\n        \"kudou hisashi\": \"くどうひさし\",\n        \"yuuzuki hijiri\": \"夕月ひじり\",\n        \"koumashiro\": \"こうましろ\",\n        \"denpouya chamaru\": \"伝法谷ちゃまる\",\n        \"miazi\": \"miazi\",\n        \"namagome negi\": \"瑠川ねぎ\",\n        \"ebi fry teishoku\": \"ぐえー/エビフライ定食\",\n        \"shishido sakura\": \"宍戸沙玖来\",\n        \"pontaro\": \"ぽんたろ\",\n        \"ikawa waki\": \"わき\",\n        \"aizawa marimo\": \"愛沢 まりも\",\n        \"moyamoya\": \"モヤモヤ\",\n        \"okabe gyoza\": \"尾壁餃子\",\n        \"shizuhime\": \"静姬\",\n        \"kagawa yusaku\": \"香川悠作\",\n        \"daito\": \"daito\",\n        \"nakamura asumiko\": \"中村明日美子\",\n        \"muto\": \"醤油エビ\",\n        \"dokuneko noil\": \"毒猫ノイル\",\n        \"urabe katsuto\": \"浦辺克斗\",\n        \"minakami rin\": \"ミナカミ\",\n        \"koyomania\": \"Koyomania\",\n        \"magowasabi\": \"magowasabi\",\n        \"kurigami\": \"kurigamiin\",\n        \"renetan\": \"レネタン\",\n        \"hi\": \"Hi\",\n        \"kitsune choukan\": \"きつね長官\",\n        \"kagura kurumi\": \"神楽くるみ\",\n        \"yaemugura\": \"八重葎\",\n        \"pottsness\": \"pottsness\",\n        \"kimyou chourui\": \"奇妙鸟类\",\n        \"kawakami minoru\": \"川上稔\",\n        \"omulet tomato\": \"オムレットマト\",\n        \"hyouta\": \"俵太\",\n        \"asaomi shimura\": \"アサオミ志群\",\n        \"ooban yaki\": \"大伴ヤキ\",\n        \"yoshida killy\": \"吉田Killy\",\n        \"tou\": \"トウ\",\n        \"natsusaka\": \"夏坂\",\n        \"tempura dozaemon\": \"天妇罗土左卫门\",\n        \"furatsu\": \"ふらつ\",\n        \"matsui yasutsugu\": \"松井康治（郁那和なにろ）\",\n        \"inari bancha\": \"稻荷ばん茶\",\n        \"pumpkinspicelatte\": \"pumpkinspice\",\n        \"sca-ji\": \"SCA-自\",\n        \"shichi ouji\": \"七王子\",\n        \"mankai beesuke\": \"満開べえスケ\",\n        \"hiiragi yuichi\": \"柊裕一\",\n        \"mukaino kei\": \"向野圭衣\",\n        \"sogom\": \"裕珍\",\n        \"bk-mita\": \"灰濁クロム\",\n        \"sanjiro\": \"さんじろ♨\",\n        \"atelier30\": \"Atelier30\",\n        \"magnificent sexy gals\": \"Magnificent\",\n        \"yoshinari you\": \"吉成曜\",\n        \"sirosoil\": \"白土\",\n        \"chinpan\": \"チンパン\",\n        \"chocoro\": \"チョコロ\",\n        \"sasaki shounen\": \"佐佐木少年\",\n        \"haruno tomoya\": \"春野友矢\",\n        \"pirorikin\": \"ピロリ菌\",\n        \"hayama junichi\": \"羽山淳一\",\n        \"kureha\": \"クレハ\",\n        \"kinomiki\": \"きのみき\",\n        \"ao plus beni\": \"青十紅\",\n        \"ruzhai\": \"儒宅\",\n        \"hukairi botan\": \"深煎り牡丹\",\n        \"katano chika\": \"片野ちか\",\n        \"shirai samoedo\": \"白井サモエド\",\n        \"madana\": \"まだな\",\n        \"squchan\": \"SquChan\",\n        \"mikamin\": \"みかみん\",\n        \"nakamori\": \"なかもり\",\n        \"gittangittan\": \"ギッタンギッタン\",\n        \"kuroda kurota\": \"黒田くろた\",\n        \"inui hana\": \"犬居葉菜\",\n        \"yukai na factory\": \"愉快なFactory\",\n        \"otsunosuke\": \"乙の助\",\n        \"sada sadao\": \"佐田さだお\",\n        \"asakura clock\": \"朝倉クロック\",\n        \"koromotake\": \"ころもたけ\",\n        \"hashina tamaki\": \"葉科たまき\",\n        \"kusogaki\": \"くそガキ\",\n        \"aestheticc-meme\": \"ミームクリーム\",\n        \"denkou nyako\": \"電光にゃコ\",\n        \"hamico\": \"はみこ\",\n        \"takeru\": \"たける\",\n        \"yamoge\": \"やもげ\",\n        \"taguchi monyata\": \"田口もにゃ太\",\n        \"sushiyama\": \"寿司山\",\n        \"kaminari doon\": \"カミナリ・ドーン\",\n        \"ayanakitori\": \"アヤナキトリ\",\n        \"yukoring\": \"優子鈴\",\n        \"fjsmu\": \"fjsmu（ふじしむ）\",\n        \"tomari\": \"トマリ\",\n        \"miso tanuki inka teikoku\": \"みそたぬきインカ帝国\",\n        \"asakawa\": \"浅川\",\n        \"fellatrix\": \"fellatrix\",\n        \"bone hiko\": \"骨彦\",\n        \"yuzuhara moke\": \"柚原もけ\",\n        \"eryu\": \"えりゅ\",\n        \"micosivaa\": \"神輿葉\",\n        \"doritoru\": \"どりとる\",\n        \"nagina\": \"なぎな\",\n        \"ura kaizokudan\": \"裏海俗団\",\n        \"tsuda hitokuchi\": \"津田ヒトクチ\",\n        \"sakura ab\": \"さくらAB\",\n        \"sevengar\": \"せぶんがー\",\n        \"jagi iwa\": \"ジャギ岩\",\n        \"seneto\": \"セネト\",\n        \"unosero\": \"うのせろ\",\n        \"murasaki shingou\": \"紫信号\",\n        \"meriibe\": \"めりーべ\",\n        \"hoshina mimiwo\": \"星奈みみヲ\",\n        \"sakauchi waka\": \"坂内若\",\n        \"sagami yuki\": \"さがみおきば\",\n        \"miyanose you\": \"宮ノ瀬陽\",\n        \"tsukiyo\": \"月夜\",\n        \"nakkar\": \"Nakkar\",\n        \"bippew\": \"Bippew\",\n        \"omegazero01\": \"Omegazero01\",\n        \"diesel\": \"でーぜる\",\n        \"sincos\": \"サインこす\",\n        \"lshiki\": \"Lshiki\",\n        \"asahina yoshitosi\": \"朝比奈吉利（420号高速道路）\",\n        \"mithril rim\": \"みすりるリム\",\n        \"matsunaga kouyou\": \"松永紅葉\",\n        \"muta no yoi oniku\": \"mutaの良いお肉\",\n        \"hokkyoku hotaru\": \"北極ホタル\",\n        \"sunhyun\": \"そんひょん\",\n        \"mizuno yukimi\": \"みずの雪見\",\n        \"greem bang\": \"GreemBang\",\n        \"bibimbub\": \"Bibimbub\",\n        \"kuni-kun\": \"クニくん\",\n        \"mushihara\": \"虫原\",\n        \"momomomo hakushaku\": \"モモモーモー伯爵\",\n        \"takaoka sui\": \"高岡彗\",\n        \"gatoh ganaha\": \"我藤がなは\",\n        \"shirasu\": \"しらす\",\n        \"kandata nijou\": \"神多二丞\",\n        \"saipaco.\": \"SAIPACo.\",\n        \"jj.jj\": \"JJ.JJ\",\n        \"ringo club\": \"りんごくらぶ\",\n        \"usatsuka eiji\": \"兔冢英志\",\n        \"ishii takamori\": \"石井高森\",\n        \"coro fae\": \"Coro Fae\",\n        \"piuta\": \"piuta\",\n        \"meeko\": \"めえこ（めえお）\",\n        \"kuroni bokujou\": \"クロニ\",\n        \"himiya zyo-zu\": \"比宮じょーず\",\n        \"hinageshi\": \"雏罂粟\",\n        \"unknown showhey\": \"马岛祥平\",\n        \"saito naoki\": \"斋藤直葵\",\n        \"yoshiku\": \"四々九\",\n        \"kakage\": \"かかげ\",\n        \"nibiiro shizuka\": \"鈍色玄\",\n        \"kousaka tohru\": \"香坂透\",\n        \"aikolik\": \"AIKOlik\",\n        \"2bls\": \"2bls\",\n        \"utagawa yosiero\": \"歌川芳江呂\",\n        \"allenes\": \"ALLENES\",\n        \"haiironpada\": \"灰色ンパダ\",\n        \"hanamaluo\": \"ハナマルオ\",\n        \"kuroto yu\": \"黒兎ゆう\",\n        \"sugue tetto\": \"スグエ鉄塔\",\n        \"sorayama hajime\": \"空山基\",\n        \"hotate-chan\": \"ほたてちゃん\",\n        \"akai same\": \"かふぇいん中毒\",\n        \"takano tomohiro\": \"高野友宏\",\n        \"ameno shigure\": \"雨野时雨\",\n        \"ushi kousen\": \"牛工船\",\n        \"eroi-roe\": \"エロ井ロエ\",\n        \"camekirin\": \"かめきりん\",\n        \"mayonaka taroupho\": \"真夜中足穗\",\n        \"sharekoube\": \"メカしゃれこうべ\",\n        \"mizusane\": \"みづさね\",\n        \"ninda hayo\": \"忍田波葉\",\n        \"delta chimaki\": \"▲ちまき\",\n        \"menbou\": \"めんぼー\",\n        \"uishi poru\": \"羽衣石ぽる\",\n        \"momoyama hato\": \"モモヤマハト\",\n        \"inukami inoji\": \"犬上いの字\",\n        \"ichikawa noa\": \"一河のあ\",\n        \"mary-san\": \"メリサン\",\n        \"auman zureedus\": \"オーマンズリーダス\",\n        \"maeshima shigeki\": \"前嶋重機\",\n        \"nanquanzl\": \"南拳蟑狼\",\n        \"janggun\": \"jeneral\",\n        \"eros o gutsugutsu nikonda megane\": \"エロスをぐつぐつ煮込んだメガネ\",\n        \"sekkei\": \"雪景\",\n        \"mouja\": \"モウじゃ\",\n        \"hararame\": \"はららめ\",\n        \"shiba aya\": \"柴あや\",\n        \"kiyoshi\": \"キヨシ\",\n        \"shiworiita\": \"シヲリイタ\",\n        \"kitakawa touta\": \"北河トウタ\",\n        \"okiha\": \"沖葉\",\n        \"uekura eku\": \"上倉エク\",\n        \"dendoro kakariya\": \"澱泥カカリヤ\",\n        \"cucchiore\": \"くっきおーれ\",\n        \"konbu wakame\": \"昆布わかめ\",\n        \"omusubi korori\": \"緒結ころり\",\n        \"memeyu\": \"めめゆ\",\n        \"onokana\": \"斧カナ\",\n        \"masuda miyaka\": \"枠田ちさき\",\n        \"arima zin\": \"有马侭\",\n        \"silver dog\": \"シルバードッグ\",\n        \"shihira tatsuya\": \"四平龙也\",\n        \"aoki seishin\": \"碧木诚心\",\n        \"tachibana takashi\": \"橘孝志\",\n        \"sekai ichii\": \"世界一位\",\n        \"maroya kayo\": \"まろや伽夜\",\n        \"kobayashi ritz\": \"小林立\",\n        \"hiroki\": \"宏き\",\n        \"emoto shikeko\": \"えもと しけこ\",\n        \"gogopanda\": \"ごーごーぱんだ\",\n        \"naminori kamome\": \"波乗かもめ\",\n        \"tyontyon\": \"てょんてょん\",\n        \"soejima shigenori\": \"副岛成记\",\n        \"chisunosuke\": \"ちすの助\",\n        \"sakurayashiki tonkotsu\": \"桜屋敷とんこつ\",\n        \"fukumoto masahisa\": \"福本真久\",\n        \"signo mandara\": \"シグノマンダラ\",\n        \"tobiume sayu\": \"飞梅さゆ\",\n        \"omitsu\": \"えびおみつ\",\n        \"hangetsuban sonshou\": \"半月板损伤\",\n        \"tottotonero tarou.\": \"とっととねろ太郎。\",\n        \"nakagomi\": \"中込\",\n        \"d.\": \"D.\",\n        \"oyu\": \"おゆ\",\n        \"pononozo\": \"ぽののぞ\",\n        \"hirota shimaguni\": \"浩田岛国\",\n        \"mutou tetsu\": \"武藤铁\",\n        \"agachi\": \"あがち\",\n        \"shiina shinya\": \"椎名深夜\",\n        \"touketsu\": \"卜ウケツ\",\n        \"hoshina meito\": \"星名めいと\",\n        \"nanonanno\": \"なのなんの\",\n        \"kuroseimu\": \"クロセイム\",\n        \"teppo\": \"鉄歩\",\n        \"mochio\": \"白蜜モチ\",\n        \"kitagawa zayaku\": \"北川ざやく\",\n        \"saito tsubame\": \"齋藤燕\",\n        \"aohonoo\": \"蒼炎\",\n        \"tamayura banko\": \"玉ぼん\",\n        \"tamaki nao\": \"玉姫なお\",\n        \"inonaka kawazu\": \"胃ノ中かわず\",\n        \"saiogauma\": \"塞翁が马\",\n        \"usui yui\": \"碓氷汐泉\",\n        \"raiou\": \"raiou\",\n        \"yokoyari mengo\": \"横枪萌果\",\n        \"alexanderdinh\": \"Alexanderdinh\",\n        \"toubaru rairu\": \"桃原らいる\",\n        \"murao mio\": \"村生未央\",\n        \"toriyaro\": \"トリヤロウ\",\n        \"umeda nautilus\": \"梅田ノーチラス\",\n        \"komura\": \"コムラ\",\n        \"dakkoku jiro\": \"脱壳次郎\",\n        \"futatsuno-peanuts\": \"ふたつのピーナツ\",\n        \"kanzarin\": \"カンザリン\",\n        \"nemurinemu\": \"ねむりねむ\",\n        \"wusui yangcong\": \"五岁洋葱\",\n        \"yuga\": \"ゆがー\",\n        \"akadashi\": \"赤だし\",\n        \"hitakamo\": \"ひたかも\",\n        \"osaki\": \"オオサキ\",\n        \"usa otome\": \"うさおとめ\",\n        \"hatsuuni ikura\": \"初雲丹いくら\",\n        \"asano yomichi\": \"朝野よみち\",\n        \"fuguta-ke\": \"フグタ家\",\n        \"namahiyu\": \"なまひゆ\",\n        \"keise.\": \"慧瀬。\",\n        \"zandoro\": \"ざんどろ\",\n        \"rinaka moruchi\": \"モルんち\",\n        \"tachi\": \"タチ\",\n        \"metsubushi\": \"メツブシ\",\n        \"iuui\": \"イウウイ\",\n        \"cham22\": \"cham22\",\n        \"ie\": \"ie\",\n        \"kokushi\": \"黑司\",\n        \"matsuri seishiro\": \"マツリセイシロウ\",\n        \"mameroku\": \"豆六\",\n        \"chigusa minori\": \"千種みのり\",\n        \"xiaomu\": \"筱牧\",\n        \"petra\": \"佩城\",\n        \"akano murasaki\": \"アカノムラサキ\",\n        \"wood cube\": \"小木蹬子\",\n        \"pentagon\": \"ぺんたごん\",\n        \"radio sensei\": \"ラジオ先生\",\n        \"suitshark\": \"Suitshark\",\n        \"honashi\": \"Honashi\",\n        \"hayanye r\": \"はやにぇR\",\n        \"awamiku\": \"あわこと\",\n        \"barakey\": \"バラキー\",\n        \"ricerice\": \"飯桶君\",\n        \"ahbai\": \"阿白\",\n        \"parsley\": \"パセリ\",\n        \"ochin-sama\": \"おちんさま\",\n        \"takafumi\": \"たかふみ\",\n        \"rkrk12\": \"rkrk12\",\n        \"yurishima shiro\": \"ゆりしましろ\",\n        \"purumetal\": \"ぷるめたる\",\n        \"nicolai no yome\": \"ニコライの嫁（nicolai）\",\n        \"sukusan\": \"SukuSan\",\n        \"noya macoto\": \"ノヤマコト\",\n        \"ryouta\": \"りょうた\",\n        \"shijiu\": \"いけめる\",\n        \"sorimachi toufu\": \"反町豆腐\",\n        \"shibatora\": \"柴寅\",\n        \"cowbow\": \"矼房\",\n        \"yamada kintetsu\": \"山田金铁\",\n        \"kudou maimu\": \"九童まいむ\",\n        \"iwamoto kuyo\": \"いーなん\",\n        \"pilaf modoki\": \"ぴらふもどき\",\n        \"uenosuke\": \"↑野介\",\n        \"inoue makito\": \"井植莳人\",\n        \"mudoochi\": \"むどおち\",\n        \"mori manpei\": \"森万平\",\n        \"frogsnake\": \"蛙记\",\n        \"tearontaron\": \"てぃーろんたろん\",\n        \"tonee\": \"Tonee\",\n        \"rangu\": \"らんぐ\",\n        \"icomochi\": \"イコモチ\",\n        \"hongshi\": \"紅世\",\n        \"shibori kasu\": \"搾り課す\",\n        \"sensiya\": \"千氏夜\",\n        \"aruto naruto\": \"有人成徒\",\n        \"denbu momo\": \"でんぶ腿\",\n        \"gogatsu unagi\": \"五月うなぎ\",\n        \"uko\": \"うこ\",\n        \"ishimari yuuya\": \"イシマリユウヤ\",\n        \"mannen junyuuki\": \"万年授乳期(ジュニー)\",\n        \"putama\": \"ぷ玉\",\n        \"waka mochi ta\": \"わかもち太\",\n        \"mmchair\": \"MM\",\n        \"arisugawa kotone\": \"有栖川琴音\",\n        \"hitonitati\": \"ひとにたち\",\n        \"ryou\": \"涼\",\n        \"ono elle\": \"える\",\n        \"usitora tatumi\": \"牛虎たつみ\",\n        \"takashima shoa\": \"高嶋しょあ\",\n        \"half horse hanma\": \"半馬ハンマ\",\n        \"ekimae machinaka\": \"駅前街中\",\n        \"hoyhoy colo\": \"ホイホイこーろ\",\n        \"noyama\": \"のやま\",\n        \"araizumi rui\": \"新泉留衣\",\n        \"hui yin\": \"慧骃\",\n        \"pineapple panda\": \"鳳梨ぱんだ\",\n        \"qiandai yiyu\": \"Qiandai以宇\",\n        \"kacyu\": \"卡丘\",\n        \"bagelbomb\": \"Bagelbomb\",\n        \"kitano yukito\": \"北乃ゆきと\",\n        \"haruri\": \"HARURI\",\n        \"sumina en\": \"澄名エン\",\n        \"jinja eru\": \"神社えーる\",\n        \"nukeru\": \"ヌケル\",\n        \"musui ethanol\": \"無水エタノール\",\n        \"mori sinrisk\": \"森シンリスク\",\n        \"moegi\": \"萌黄おじさん\",\n        \"kikomuhito\": \"着込む人\",\n        \"elegant\": \"えれがんと\",\n        \"tonyman plus\": \"トニーマン+\",\n        \"shimetsuki tanki\": \"湿月タンキ\",\n        \"yuukey\": \"ゆーきぃ\",\n        \"wu qing yan hui gang\": \"无情烟灰缸\",\n        \"yoshimura bitchmotor\": \"吉村ビッチモーター\",\n        \"mochimoon curry\": \"餅月カレン\",\n        \"yukimochi kinako\": \"幸餅きなこ\",\n        \"houraku\": \"HOURAKU\",\n        \"nagatsuki misoka\": \"长月みそか\",\n        \"wosushi\": \"をすし\",\n        \"kiyohara hiro\": \"清原纮\",\n        \"yakiuni\": \"烧きうに\",\n        \"inui ayu\": \"犬井あゆ\",\n        \"osanai shiina\": \"小山内しいな\",\n        \"umino ryo\": \"海野りょう\",\n        \"daruma jd\": \"だるまJD\",\n        \"gsus\": \"GSUS\",\n        \"gucchian\": \"ぐっち庵\",\n        \"uekura ryona\": \"上倉RyoNA\",\n        \"kusothumu\": \"くそつむ\",\n        \"ashitaba mofu\": \"明日葉もふ\",\n        \"yoshitomi akihito\": \"吉富昭仁\",\n        \"lestart\": \"lestart\",\n        \"shiono\": \"しおの\",\n        \"semino hazuki\": \"セミノハヅキ\",\n        \"yasumi mirakichi\": \"やすみみらきち\",\n        \"tsukunendo\": \"つくねんど\",\n        \"okachimachi tamachi\": \"御徒町たまち\",\n        \"jmg\": \"JMG\",\n        \"ueshita\": \"うえした\",\n        \"mintaro\": \"みんたろう\",\n        \"bergyb\": \"博哥\",\n        \"yukimochi\": \"ゆきもち\",\n        \"jury\": \"じゅらい\",\n        \"yandama\": \"やんだま\",\n        \"youngjijii\": \"ヤングじじい\",\n        \"kawazoe taichi\": \"河添太一\",\n        \"mochikushi\": \"もちくし\",\n        \"shaggy susu\": \"Shaggy SUSU\",\n        \"xiao bai tian\": \"小白天\",\n        \"suzukawa\": \"凉河\",\n        \"kizuna\": \"絆\",\n        \"natsume yochiki\": \"よちき\",\n        \"modare\": \"モ誰\",\n        \"momoshiki\": \"ももしき\",\n        \"momochi chia\": \"桃稚 ちあ\",\n        \"skai kun\": \"Skai_kun\",\n        \"tsuyatsuya\": \"艶々\",\n        \"star shadow magician\": \"STAR影法师\",\n        \"sakai\": \"坂井\",\n        \"reiichi\": \"零壱\",\n        \"akichi\": \"空き地\",\n        \"kouzu sousuke\": \"兴津惣介\",\n        \"lemon snail\": \"Lemon Snail\",\n        \"zirba\": \"Zirba\",\n        \"fyxfd\": \"肥油小分队\",\n        \"karei\": \"かれい\",\n        \"arashiya\": \"嵐屋\",\n        \"yamamoto yumiko\": \"山本由美子\",\n        \"zurikishi\": \"ずり騎士\",\n        \"himeno mikan\": \"姫野蜜柑\",\n        \"fujimura q\": \"藤村久\",\n        \"kaneko naoya\": \"カネコナオヤ\",\n        \"grimgrim\": \"grimgrim\",\n        \"makochan42\": \"まこちあ\",\n        \"wagashi\": \"和菓子\",\n        \"kayama yuichiro\": \"鹿山裕一郎\",\n        \"iranon\": \"冬灯\",\n        \"takanaga kouhei\": \"高永浩平\",\n        \"shuru-ban\": \"しゅる版\",\n        \"yoongonji\": \"尹坤志\",\n        \"mobuta\": \"モブ太\",\n        \"xiaozi xiao\": \"笑笑饺子\",\n        \"shura\": \"朱雷\",\n        \"kokonobi\": \"九尾\",\n        \"pooh\": \"ぷぅ\",\n        \"irono\": \"ゐろの\",\n        \"isshi pyuma\": \"一志ピューマ\",\n        \"mamerakko\": \"豆ラッコニキ\",\n        \"amakusa tobari\": \"天草帳\",\n        \"sasaki mutsumi\": \"ささきむつみ\",\n        \"murabito toufuten\": \"村人豆腐店\",\n        \"kuma ashi s\": \"熊足S\",\n        \"sasai nakoto\": \"茶彩なこと\",\n        \"hina\": \"氷菜\",\n        \"yozakura souki\": \"夜桜ソウキ\",\n        \"susukumo nagi\": \"煤雲なぎ\",\n        \"cielo\": \"CIELO\",\n        \"hekoman\": \"へこまん\",\n        \"ichinosono yui\": \"一之园唯\",\n        \"rindow masaki\": \"あるでぃ\",\n        \"orihika\": \"おりひか\",\n        \"scottie\": \"スコッティ\",\n        \"makin\": \"まきん\",\n        \"myamo\": \"ミャモ\",\n        \"pedopetton\": \"ぺどぺっとん\",\n        \"mikozin\": \"ミコジン\",\n        \"imajin kouji\": \"イマジン孝二\",\n        \"meisuke\": \"めーすけ\",\n        \"kotobuki mairo\": \"寿まいろ\",\n        \"minato yuu\": \"湊ゆう\",\n        \"ameko\": \"あめこ\",\n        \"senda hisamaru\": \"せんだ寿丸\",\n        \"fujiwara noa\": \"藤原のあ\",\n        \"ryoutani kana\": \"両谷哉\",\n        \"hoshino rao\": \"星野らお\",\n        \"jankey\": \"ジャンキー\",\n        \"nettsuu\": \"ねっつー\",\n        \"point takashi\": \"みるく工房\",\n        \"wakatake\": \"わかたけ\",\n        \"aak\": \"aak\",\n        \"rabu\": \"ラブ\",\n        \"uni toshiki\": \"ウニトシキ\",\n        \"teikuuhikou\": \"低空飞行\",\n        \"iwami yasoya\": \"石见やそや\",\n        \"mittsuman\": \"みっつまん\",\n        \"chinetsu\": \"ちねつ\",\n        \"akausu ko\": \"赤薄红\",\n        \"otona no sexy ehon\": \"大人のSEXY絵本\",\n        \"hogeramu\": \"ほげらむ\",\n        \"raikou\": \"らい公\",\n        \"raku\": \"乐\",\n        \"karaage\": \"唐扬\",\n        \"jinze\": \"今沢\",\n        \"hosigarasu\": \"干しガラス\",\n        \"koyama harutarou\": \"コヤマハルタロウ\",\n        \"iketatsu shizuru\": \"池竜静留\",\n        \"kogara tsugumi\": \"小雀つぐみ\",\n        \"papipukepo\": \"ぱぴぷけぽ\",\n        \"yomogi mametaro\": \"よもぎ豆太郎\",\n        \"yasuda yasuhiro\": \"保田やすひろ\",\n        \"minazuki miyabi\": \"水無月雅\",\n        \"okome taberu\": \"おこめタベル\",\n        \"nagase tooru\": \"長瀬 徹\",\n        \"az slash hybrid\": \"をん（AZ/HYBRID）\",\n        \"shirabii\": \"しらび\",\n        \"ushio kiyoshi\": \"潮汐きよし\",\n        \"yumemi teer\": \"夢見てぇる\",\n        \"kisaragi sonami\": \"生肉\",\n        \"nishi yasuaki\": \"西ヤスアキ\",\n        \"higashi taishi\": \"東太子\",\n        \"kokudou juunigou\": \"国道12号\",\n        \"sushi yuusha toro\": \"寿司勇者トロ\",\n        \"sandbox\": \"砂场\",\n        \"yunamaro\": \"ゆなまろ\",\n        \"810eru\": \"草葉える\",\n        \"mochiduki riku\": \"望月りく\",\n        \"asoka\": \"あそか\",\n        \"komiya yuuta\": \"小宮裕太\",\n        \"inchou no naka no hito\": \"いんちょ～の中の人\",\n        \"asakura hayate\": \"朝倉はやて\",\n        \"yutaka izubuchi\": \"出渕裕\",\n        \"tachibana-ko\": \"橘子\",\n        \"toridamono\": \"トリダモノ\",\n        \"yoshimura takuya\": \"吉村拓哉\",\n        \"yuki no arashi\": \"雪之岚\",\n        \"yiduan\": \"异端\",\n        \"kii kanna\": \"紀伊カンナ\",\n        \"watosu mama\": \"わとす\",\n        \"wodae\": \"ヲダエ\",\n        \"nagoyaka jirou\": \"なごやか次郎\",\n        \"kyonta\": \"きょんた\",\n        \"amakawa gumi\": \"甘皮ぐみ\",\n        \"blvefo9\": \"blvefo9\",\n        \"nyaon\": \"にゃおん\",\n        \"fuugetsu makoto\": \"楓月誠\",\n        \"rebutsu\": \"りぶつ\",\n        \"choi moz\": \"ちょいもず\",\n        \"miyazaki usagi\": \"みやざきうさぎ\",\n        \"touchuu kasou\": \"冬虫夏草\",\n        \"cbmus\": \"cbmus\",\n        \"torii yoshitsuna\": \"鳥居ヨシツナ\",\n        \"mannack\": \"まんなく\",\n        \"miwerjooggetser\": \"無名老圖\",\n        \"shimohara\": \"しもはら\",\n        \"kazutake hazano\": \"和武はざの\",\n        \"kanpancake\": \"kanpancake\",\n        \"satoh sugar\": \"砂藤シュガー\",\n        \"okura-chan\": \"おくらちゃん\",\n        \"bannou\": \"万能\",\n        \"rokita\": \"ろきた\",\n        \"naruya shin\": \"なるやしん\",\n        \"tamura-chan\": \"田村ちゃん\",\n        \"nyum\": \"にゅむ\",\n        \"tsunako\": \"つなこ\",\n        \"amagai tarou\": \"おるだん\",\n        \"takota konu\": \"蛸田こぬ\",\n        \"made rokuri\": \"迄ロクリ\",\n        \"charin\": \"チャリン\",\n        \"usodi\": \"ウソヂ\",\n        \"chairoino\": \"茶色いの\",\n        \"sugiyama\": \"杉山\",\n        \"antifreez3\": \"天凉多喝防冻液\",\n        \"norihito\": \"仁人\",\n        \"ogatatei\": \"緒方てい\",\n        \"aota sora\": \"あおたそら\",\n        \"4uu\": \"4UU\",\n        \"miginer\": \"みぎなー\",\n        \"kenko shindan-chan\": \"健康診断ちゃん\",\n        \"hibari\": \"雲雀ひな\",\n        \"neko no youchuu\": \"猫の幼虫\",\n        \"to hegemonikon\": \"ト！ヘーゲモニコン\",\n        \"agagaga\": \"あがががが\",\n        \"namekuji\": \"なめくじ\",\n        \"bonnou obaa-chan\": \"煩悩おばあちゃん\"\n    },\n    \"cosplayer\": {\n        \"otohara an\": \"乙原あん\",\n        \"rioko\": \"凉凉子\",\n        \"atsuki\": \"あつき\",\n        \"hane ame\": \"雨波\",\n        \"chunmomo\": \"蠢沫沫\",\n        \"kalinka fox\": \"Kalynka Fox\",\n        \"nora fawn\": \"Nora Fawn\",\n        \"saku\": \"サク\",\n        \"arty huang\": \"Arty亚缇\",\n        \"carry key\": \"Carry Key\",\n        \"valery himera\": \"Valery Himera\",\n        \"vinnegal\": \"Vinnegal\",\n        \"nath sokolova\": \"Nath Sokolova\",\n        \"virtual geisha\": \"Virtual Geisha\",\n        \"kaya huang\": \"KaYa 萱\",\n        \"sayako\": \"さやこ\",\n        \"mikomi hokina\": \"Mikomi Hokina\",\n        \"akane araragi\": \"Akane Araragi\",\n        \"lenfried\": \"lenfried\",\n        \"xidaidai\": \"习呆呆\",\n        \"senluo caituan\": \"森萝财团\",\n        \"pigma\": \"Pigman\",\n        \"abaoyeshituniang\": \"阿包也是兔娘\",\n        \"kimmie mi\": \"蜜蜜子\",\n        \"aqua area\": \"水淼Aqua\",\n        \"erzuo nisa\": \"二佐nisa\",\n        \"sola\": \"Sola\",\n        \"tsuki desu\": \"Tsuki Desu\",\n        \"kokura chiyo\": \"小倉ちよ\",\n        \"g44 wa kizutsukanai\": \"G44不会受伤\",\n        \"okita rinka\": \"冲田凛花\",\n        \"nekokoyoshi\": \"爆机少女喵小吉\",\n        \"akemi101xoxo\": \"Akemi101xoxo\",\n        \"hoshilily\": \"星之迟迟\",\n        \"yurikodxd\": \"YurikoDxD\",\n        \"yuuforia\": \"Yuuforia\",\n        \"lovelyspacekitten\": \"LovelySpaceKitten\",\n        \"uyuy\": \"UyUy\",\n        \"alicekyo\": \"Alicekyo\",\n        \"baoer mysterial\": \"宝儿Mysterial\",\n        \"menmentan\": \"焖焖碳\",\n        \"rio-chan\": \"愛瀬りおな\",\n        \"siao ding\": \"小丁\",\n        \"franxcos\": \"FranXcos\",\n        \"junkenstein\": \"Junkenstein\",\n        \"helly von valentine\": \"Helly von Valentine\",\n        \"penkarui\": \"Penkarui\",\n        \"mizhimaoqiu\": \"蜜汁猫裘\",\n        \"refeen\": \"Refeen\",\n        \"ely cosplay\": \"ElyEE子\",\n        \"azami\": \"Azami\",\n        \"mercurylamp\": \"水銀燈\",\n        \"niyeye\": \"你烨烨\",\n        \"yaoyaoqwq\": \"软妹摇摇乐\",\n        \"maria desu\": \"Maria Desu\",\n        \"hidori rose\": \"Hidori Rose\",\n        \"ai lei jiang\": \"少女映画\",\n        \"shimotsuki\": \"霜月shimo\",\n        \"hua qi hana\": \"花柒Hana\",\n        \"lostwind10\": \"猫と爪呸罗呸罗\",\n        \"xue qi-sama\": \"雪琪SAMA\",\n        \"larissa rochefort\": \"Larissa Rochefort\",\n        \"kitaro\": \"Kitaro绮太郎\",\n        \"banbanko\": \"半半子\",\n        \"aninnyan\": \"桜井宁宁\",\n        \"nagisa\": \"NAGISA魔物喵\",\n        \"katiecakey\": \"Katie Cakey\",\n        \"linzi jiang\": \"凛子酱\",\n        \"cherry neko\": \"桜桃喵\",\n        \"kuuko w\": \"Kuuko W\",\n        \"luo xiaoli miao\": \"洛璃LoLiSAMA\",\n        \"yaokoututu\": \"咬一口兔娘\",\n        \"yuki astra\": \"雪晴Astra\",\n        \"niannian d\": \"念念_D\",\n        \"tyouduki maryou\": \"蝶月真綾\",\n        \"ringo mitsuki\": \"林檎蜜纪\",\n        \"tokar\": \"浵卡Tokar\",\n        \"saotome love\": \"早乙女らぶ\",\n        \"tsubomin\": \"つぼみん\",\n        \"omimi\": \"おみみ\",\n        \"sakura noa\": \"桜のぁ\",\n        \"yuricha\": \"YURICHA\",\n        \"na-san\": \"なーさん\",\n        \"mashiro yuki\": \"真白ゆき\",\n        \"alina becker\": \"Alina Becker\",\n        \"shizuku honami\": \"穂南しずく\",\n        \"lmusicl\": \"lMusicl\",\n        \"masako yume\": \"Masako Yume\",\n        \"ain nguyen\": \"Ain Nguyễn\",\n        \"oniksiya sofinikum\": \"Oniksiya Sofinikum\"\n    },\n    \"male\": {\n        \"age progression\": \"年龄增长\",\n        \"age regression\": \"返老还童\",\n        \"dilf\": \"熟男\",\n        \"infantilism\": \"幼稚型\",\n        \"old man\": \"老人\",\n        \"shotacon\": \"正太\",\n        \"toddlercon\": \"幼儿\",\n        \"amputee\": \"截肢\",\n        \"big muscles\": \"大肌肉\",\n        \"body modification\": \"身体改造\",\n        \"conjoined\": \"连体\",\n        \"doll joints\": \"关节娃娃\",\n        \"gijinka\": \"拟人化\",\n        \"inflation\": \"腹部膨胀\",\n        \"invisible\": \"透明\",\n        \"multiple arms\": \"多臂\",\n        \"muscle\": \"肌肉\",\n        \"muscle growth\": \"肌肉成长\",\n        \"stretching\": \"拉伸\",\n        \"tailjob\": \"尾交\",\n        \"wings\": \"翅膀\",\n        \"absorption\": \"吸收\",\n        \"petrification\": \"石化\",\n        \"transformation\": \"变身\",\n        \"alien\": \"外星人👽\",\n        \"angel\": \"天使\",\n        \"bat boy\": \"蝙蝠男\",\n        \"bear boy\": \"狗熊男\",\n        \"bee boy\": \"蜂男\",\n        \"bird boy\": \"鸟男\",\n        \"bunny boy\": \"兔子男孩\",\n        \"catboy\": \"猫男\",\n        \"centaur\": \"半人马\",\n        \"cowman\": \"牛男\",\n        \"deer boy\": \"鹿男孩\",\n        \"demon\": \"恶魔\",\n        \"dog boy\": \"狗男孩\",\n        \"draenei\": \"德莱尼\",\n        \"elephant boy\": \"象男孩\",\n        \"fairy\": \"仙子🧚‍♂️\",\n        \"fox boy\": \"狐男\",\n        \"frog boy\": \"青蛙男孩\",\n        \"furry\": \"毛茸茸\",\n        \"giraffe boy\": \"长颈鹿男\",\n        \"ghost\": \"幽灵👻\",\n        \"goblin\": \"哥布林\",\n        \"harpy\": \"鸟人\",\n        \"horse boy\": \"马男孩\",\n        \"human on furry\": \"人毛\",\n        \"hyena boy\": \"鬣狗男孩\",\n        \"insect boy\": \"昆虫男孩\",\n        \"kappa\": \"河童\",\n        \"lizard guy\": \"蜥蜴男孩\",\n        \"merman\": \"人鱼🧜‍♂️\",\n        \"minotaur\": \"牛头人\",\n        \"monkey boy\": \"猴男孩\",\n        \"monster\": \"怪物\",\n        \"mouse boy\": \"鼠男孩\",\n        \"necrophilia\": \"奸尸\",\n        \"oni\": \"鬼\",\n        \"orc\": \"半兽人\",\n        \"otter boy\": \"水獭男孩\",\n        \"panda boy\": \"熊猫男\",\n        \"pig man\": \"猪男\",\n        \"plant boy\": \"植物男孩\",\n        \"raccoon boy\": \"浣熊男孩\",\n        \"robot\": \"机器人🤖\",\n        \"shark boy\": \"鲨男孩\",\n        \"sheep boy\": \"羊男孩\",\n        \"slime\": \"史莱姆\",\n        \"slime boy\": \"史莱姆男孩\",\n        \"snake boy\": \"蛇男\",\n        \"spider boy\": \"蜘蛛男\",\n        \"squid boy\": \"乌贼男\",\n        \"squirrel boy\": \"松鼠男\",\n        \"skunk boy\": \"臭鼬男\",\n        \"tentacles\": \"触手\",\n        \"vampire\": \"吸血鬼🧛‍♂️\",\n        \"wolf boy\": \"狼男孩\",\n        \"zombie\": \"僵尸🧟‍♂️\",\n        \"animal on animal\": \"兽兽\",\n        \"animal on furry\": \"兽毛\",\n        \"bear\": \"熊🐻\",\n        \"bestiality\": \"兽交\",\n        \"bull\": \"牛🐂\",\n        \"camel\": \"骆驼🐫\",\n        \"cat\": \"猫🐈\",\n        \"crab\": \"螃蟹🦀\",\n        \"deer\": \"鹿🦌\",\n        \"dinosaur\": \"恐龙🦖\",\n        \"dog\": \"狗🐕\",\n        \"dolphin\": \"海豚🐬\",\n        \"donkey\": \"驴\",\n        \"dragon\": \"龙🐉\",\n        \"eel\": \"鳗鱼\",\n        \"elephant\": \"象🐘\",\n        \"fish\": \"鱼🐟\",\n        \"fox\": \"狐狸🦊\",\n        \"frog\": \"青蛙🐸\",\n        \"goat\": \"山羊🐐\",\n        \"gorilla\": \"猩猩🦍\",\n        \"horse\": \"马🐎\",\n        \"insect\": \"昆虫🐜\",\n        \"kangaroo\": \"袋鼠\",\n        \"lion\": \"狮🦁\",\n        \"maggot\": \"蛆🐛\",\n        \"monkey\": \"猴🐒\",\n        \"mouse\": \"鼠🐀\",\n        \"octopus\": \"章鱼🐙\",\n        \"ostrich\": \"鸵鸟\",\n        \"panther\": \"豹🐆\",\n        \"pegasus\": \"天马\",\n        \"pig\": \"猪🐖\",\n        \"rabbit\": \"兔🐇\",\n        \"reptile\": \"爬虫\",\n        \"rhinoceros\": \"犀牛🦏\",\n        \"sheep\": \"绵羊🐏\",\n        \"shark\": \"鲨🦈\",\n        \"slug\": \"蛞蝓\",\n        \"snake\": \"蛇🐍\",\n        \"spider\": \"蜘蛛🕷\",\n        \"tiger\": \"虎🐅\",\n        \"turtle\": \"龟🐢\",\n        \"unicorn\": \"独角兽🦄\",\n        \"whale\": \"鲸🐋\",\n        \"wolf\": \"狼🐺\",\n        \"worm\": \"蠕虫\",\n        \"zebra\": \"斑马🦓\",\n        \"giant\": \"巨人\",\n        \"growth\": \"巨大化\",\n        \"midget\": \"侏儒\",\n        \"miniguy\": \"迷你男孩\",\n        \"shrinking\": \"缩小\",\n        \"tall man\": \"高个男\",\n        \"albino\": \"白化\",\n        \"body writing\": \"身体写作\",\n        \"body painting\": \"身体绘画\",\n        \"dark skin\": \"黑皮\",\n        \"freckles\": \"雀斑\",\n        \"gyaru-oh\": \"黄毛\",\n        \"large tattoo\": \"全身纹身\",\n        \"lipstick mark\": \"口红印\",\n        \"scar\": \"瘢痕\",\n        \"skinsuit\": \"人皮衣\",\n        \"tanlines\": \"晒痕\",\n        \"anorexic\": \"瘦骨嶙峋\",\n        \"bbm\": \"胖男人\",\n        \"ssbbm\": \"超级胖男人\",\n        \"weight gain\": \"体重增加\",\n        \"ahegao\": \"阿黑颜\",\n        \"beauty mark\": \"美人痣\",\n        \"brain fuck\": \"脑交🧠\",\n        \"cockslapping\": \"屌掴\",\n        \"crown\": \"王冠👑\",\n        \"elf\": \"精灵🧝‍♂️\",\n        \"facesitting\": \"坐脸\",\n        \"facial hair\": \"胡子\",\n        \"gasmask\": \"防毒面具\",\n        \"halo\": \"光环\",\n        \"hood\": \"帽兜\",\n        \"horns\": \"角\",\n        \"kemonomimi\": \"兽耳\",\n        \"kigurumi pajama\": \"动物连体睡衣\",\n        \"makeup\": \"化妆\",\n        \"masked face\": \"假面\",\n        \"mouth mask\": \"口罩\",\n        \"thick eyebrows\": \"浓眉\",\n        \"afro\": \"爆炸头\",\n        \"bald\": \"秃顶\",\n        \"drill hair\": \"螺旋辫\",\n        \"eye-covering bang\": \"长刘海\",\n        \"hair buns\": \"丸子头\",\n        \"hairjob\": \"发丝交\",\n        \"pixie cut\": \"精灵头\",\n        \"ponytail\": \"马尾辫\",\n        \"prehensile hair\": \"抓握发\",\n        \"shaved head\": \"光头\",\n        \"twintails\": \"双马尾\",\n        \"very long hair\": \"超长发\",\n        \"body swap\": \"换身\",\n        \"chloroform\": \"迷药\",\n        \"corruption\": \"堕落\",\n        \"drugs\": \"药物\",\n        \"drunk\": \"醉酒\",\n        \"emotionless sex\": \"性冷淡\",\n        \"mind break\": \"洗脑\",\n        \"mind control\": \"催眠\",\n        \"moral degeneration\": \"道德退化\",\n        \"parasite\": \"寄生\",\n        \"personality excretion\": \"人格排泄\",\n        \"possession\": \"附身\",\n        \"shared senses\": \"感官共享\",\n        \"sleeping\": \"睡觉\",\n        \"blindfold\": \"遮眼布\",\n        \"closed eyes\": \"闭眼\",\n        \"crying\": \"流泪\",\n        \"dark sclera\": \"深色巩膜\",\n        \"eye penetration\": \"插入眼睛\",\n        \"eyemask\": \"眼部面具\",\n        \"eyepatch\": \"眼罩\",\n        \"glasses\": \"眼镜👓\",\n        \"heterochromia\": \"异色瞳\",\n        \"monoeye\": \"独眼\",\n        \"sunglasses\": \"太阳镜🕶\",\n        \"unusual pupils\": \"异瞳\",\n        \"nose fuck\": \"鼻交\",\n        \"nose hook\": \"鼻吊钩\",\n        \"smell\": \"气味\",\n        \"big lips\": \"大嘴唇💋\",\n        \"blowjob\": \"口交\",\n        \"blowjob face\": \"口交颜\",\n        \"braces\": \"牙套\",\n        \"burping\": \"打嗝\",\n        \"coprophagia\": \"食粪\",\n        \"deepthroat\": \"深喉\",\n        \"double blowjob\": \"一口二鸟\",\n        \"foot licking\": \"舔足\",\n        \"gag\": \"口塞\",\n        \"gokkun\": \"饮精\",\n        \"kissing\": \"接吻💏\",\n        \"long tongue\": \"长舌👅\",\n        \"multimouth blowjob\": \"多口口交\",\n        \"piss drinking\": \"饮尿\",\n        \"rimjob\": \"舔肛\",\n        \"saliva\": \"唾液\",\n        \"smoking\": \"吸烟🚬\",\n        \"tooth brushing\": \"刷牙\",\n        \"unusual teeth\": \"异齿\",\n        \"vomit\": \"呕吐🤮\",\n        \"vore\": \"吞食\",\n        \"asphyxiation\": \"窒息\",\n        \"collar\": \"项圈\",\n        \"hanging\": \"绞刑\",\n        \"leash\": \"狗链\",\n        \"armpit licking\": \"腋下舔\",\n        \"armpit sex\": \"腋交\",\n        \"hairy armpits\": \"腋毛\",\n        \"fisting\": \"拳交💪\",\n        \"gloves\": \"手套\",\n        \"handjob\": \"打手枪\",\n        \"multiple handjob\": \"多重打手枪\",\n        \"big areolae\": \"大乳晕\",\n        \"big breasts\": \"巨乳\",\n        \"breast expansion\": \"乳房膨胀\",\n        \"breast feeding\": \"哺乳\",\n        \"lactation\": \"母乳\",\n        \"milking\": \"挤奶\",\n        \"paizuri\": \"乳交\",\n        \"big nipples\": \"大乳头\",\n        \"dark nipples\": \"暗色乳头\",\n        \"dicknipples\": \"阴茎乳头\",\n        \"inverted nipples\": \"乳头内陷\",\n        \"nipple birth\": \"乳头出产\",\n        \"nipple fuck\": \"乳穴性交\",\n        \"nipple piercing\": \"乳头穿孔\",\n        \"nipple stimulation\": \"乳头刺激\",\n        \"cumflation\": \"精液膨胀\",\n        \"navel fuck\": \"肚脐奸\",\n        \"pregnant\": \"怀孕\",\n        \"stomach deformation\": \"腹部变形\",\n        \"chastity belt\": \"贞操带\",\n        \"crotch tattoo\": \"淫纹\",\n        \"genital piercing\": \"性器穿孔\",\n        \"hairy\": \"多毛\",\n        \"mesuiki\": \"干高潮\",\n        \"multiple orgasms\": \"连续高潮\",\n        \"no balls\": \"无蛋\",\n        \"pantyjob\": \"内裤交\",\n        \"pubic stubble\": \"阴毛茬\",\n        \"urethra insertion\": \"尿道插入\",\n        \"adventitious penis\": \"畸位阴茎\",\n        \"ball caressing\": \"揉蛋\",\n        \"balls expansion\": \"睾丸生长\",\n        \"ball sucking\": \"吸球\",\n        \"balljob\": \"球交\",\n        \"big balls\": \"大睾丸\",\n        \"big penis\": \"大根\",\n        \"cloaca insertion\": \"泄殖腔插入\",\n        \"cockphagia\": \"阴茎吞食\",\n        \"cock ring\": \"锁精环\",\n        \"frottage\": \"阴茎摩擦🤺\",\n        \"horse cock\": \"马根\",\n        \"huge penis\": \"巨根\",\n        \"multiple penises\": \"鸡鸡复鸡鸡\",\n        \"penis birth\": \"阴茎出产\",\n        \"penis enlargement\": \"阴茎生长\",\n        \"phimosis\": \"包茎\",\n        \"prostate massage\": \"前列腺按摩\",\n        \"retractable penis\": \"可伸缩阴茎\",\n        \"smegma\": \"阴垢\",\n        \"cervix prolapse\": \"宫颈脱垂\",\n        \"clit insertion\": \"阴蒂插入\",\n        \"clit stimulation\": \"阴蒂刺激\",\n        \"cunnilingus\": \"舔阴\",\n        \"unbirth\": \"入阴\",\n        \"vaginal birth\": \"阴道出产\",\n        \"anal\": \"爆肛\",\n        \"anal birth\": \"肛门出产\",\n        \"anal intercourse\": \"肛交\",\n        \"analphagia\": \"肛门吞食\",\n        \"anal prolapse\": \"脱肛\",\n        \"ass expansion\": \"臀部膨胀\",\n        \"assjob\": \"尻交\",\n        \"big ass\": \"大屁股\",\n        \"enema\": \"灌肠\",\n        \"farting\": \"放屁\",\n        \"multiple assjob\": \"多重尻交\",\n        \"pegging\": \"爆菊\",\n        \"spanking\": \"打屁股\",\n        \"tail\": \"尾巴\",\n        \"tailphagia\": \"尾巴吞食\",\n        \"eggs\": \"产卵\",\n        \"gaping\": \"敞口\",\n        \"large insertions\": \"大玩具\",\n        \"nakadashi\": \"中出\",\n        \"prolapse\": \"脱垂\",\n        \"leg lock\": \"勾腿\",\n        \"sumata\": \"股间性交\",\n        \"denki anma\": \"电气按摩\",\n        \"foot insertion\": \"足插入\",\n        \"footjob\": \"足交\",\n        \"multiple footjob\": \"多重足交\",\n        \"sockjob\": \"袜交🧦\",\n        \"animegao\": \"头壳\",\n        \"apron\": \"围裙\",\n        \"bandages\": \"绷带\",\n        \"bike shorts\": \"自行车短裤\",\n        \"bikini\": \"比基尼👙\",\n        \"bloomers\": \"布鲁马\",\n        \"bodystocking\": \"连身袜\",\n        \"bodysuit\": \"紧身衣裤\",\n        \"bride\": \"婚纱\",\n        \"business suit\": \"西装\",\n        \"butler\": \"管家\",\n        \"cashier\": \"收银员\",\n        \"cheerleader\": \"啦啦队员\",\n        \"chinese dress\": \"旗袍\",\n        \"christmas\": \"圣诞装🎅\",\n        \"clothed female nude male\": \"裸男\",\n        \"clown\": \"小丑🤡\",\n        \"condom\": \"避孕套\",\n        \"corset\": \"紧身胸衣\",\n        \"cosplaying\": \"Cosplay\",\n        \"crossdressing\": \"异性装\",\n        \"detached sleeves\": \"分离袖子\",\n        \"diaper\": \"尿布\",\n        \"dougi\": \"练功服🥋\",\n        \"exposed clothing\": \"开洞装\",\n        \"fishnets\": \"渔网\",\n        \"fundoshi\": \"六尺褌\",\n        \"garter belt\": \"吊袜带\",\n        \"gothic lolita\": \"哥特萝莉装\",\n        \"gymshorts\": \"运动短裤\",\n        \"haigure\": \"高叉装\",\n        \"headphones\": \"头戴式耳机\",\n        \"high heels\": \"高跟鞋\",\n        \"hijab\": \"头巾\",\n        \"hotpants\": \"热裤\",\n        \"kimono\": \"和服👘\",\n        \"kindergarten uniform\": \"幼儿园制服\",\n        \"kunoichi\": \"女忍装\",\n        \"lab coat\": \"白大褂\",\n        \"latex\": \"乳胶紧身衣\",\n        \"leotard\": \"紧身衣\",\n        \"lingerie\": \"情趣内衣\",\n        \"living clothes\": \"生物衣\",\n        \"magical girl\": \"魔法少女\",\n        \"maid\": \"女仆装\",\n        \"mecha boy\": \"机男\",\n        \"metal armor\": \"金属盔甲\",\n        \"miko\": \"巫女装\",\n        \"military\": \"军装\",\n        \"nazi\": \"纳粹军装\",\n        \"ninja\": \"忍者装\",\n        \"nun\": \"修女服\",\n        \"nurse\": \"护士装\",\n        \"painted nails\": \"美甲\",\n        \"pantyhose\": \"连裤袜\",\n        \"pasties\": \"乳贴\",\n        \"piercing\": \"穿孔\",\n        \"pirate\": \"海盗服\",\n        \"policeman\": \"警服\",\n        \"priest\": \"牧师服\",\n        \"randoseru\": \"书包\",\n        \"schoolboy uniform\": \"男生制服\",\n        \"schoolgirl uniform\": \"女生制服\",\n        \"school gym uniform\": \"学校体操服\",\n        \"school swimsuit\": \"死库水\",\n        \"scrotal lingerie\": \"阴囊袋\",\n        \"small penis\": \"小小鸟\",\n        \"shimapan\": \"条纹胖次\",\n        \"stewardess\": \"空姐服\",\n        \"steward\": \"男空乘服\",\n        \"stirrup legwear\": \"马镫裤\",\n        \"stockings\": \"长筒袜\",\n        \"straitjacket\": \"拘束衣\",\n        \"sundress\": \"夏装\",\n        \"swimsuit\": \"泳装\",\n        \"tabi socks\": \"足袋\",\n        \"thigh high boots\": \"高筒靴\",\n        \"tiara\": \"宝冠\",\n        \"tights\": \"厚连裤袜\",\n        \"tracksuit\": \"运动服\",\n        \"waiter\": \"男侍者装\",\n        \"waitress\": \"女侍者装\",\n        \"wet clothes\": \"湿身\",\n        \"witch\": \"女巫装\",\n        \"double anal\": \"双插肛门\",\n        \"gang rape\": \"轮奸\",\n        \"group\": \"乱交\",\n        \"harem\": \"后宫\",\n        \"layer cake\": \"夹心蛋糕\",\n        \"mmm threesome\": \"男3P\",\n        \"multiple straddling\": \"多人跨骑\",\n        \"oyakodon\": \"父子丼\",\n        \"shimaidon\": \"兄弟丼\",\n        \"triple anal\": \"三插肛门\",\n        \"twins\": \"双胞胎\",\n        \"all the way through\": \"消化道贯穿\",\n        \"double penetration\": \"双重插入\",\n        \"triple penetration\": \"三重插入\",\n        \"clamp\": \"夹具\",\n        \"glory hole\": \"寻欢洞\",\n        \"machine\": \"机械奸\",\n        \"onahole\": \"飞机杯\",\n        \"pillory\": \"枷具\",\n        \"pole dancing\": \"钢管舞\",\n        \"sex toys\": \"性玩具\",\n        \"speculum\": \"扩张器\",\n        \"strap-on\": \"穿戴式阳具\",\n        \"syringe\": \"注射器\",\n        \"tail plug\": \"尾塞\",\n        \"tube\": \"插管\",\n        \"unusual insertions\": \"异物插入\",\n        \"vacbed\": \"真空床\",\n        \"whip\": \"鞭打\",\n        \"wooden horse\": \"木马\",\n        \"wormhole\": \"虫洞\",\n        \"oil\": \"油\",\n        \"underwater\": \"水下\",\n        \"blood\": \"血液\",\n        \"apparel bukkake\": \"穿衣颜射\",\n        \"bukkake\": \"颜射\",\n        \"cum bath\": \"精液浴\",\n        \"giant sperm\": \"巨大精子\",\n        \"internal urination\": \"内部排尿\",\n        \"omorashi\": \"漏尿\",\n        \"public use\": \"肉便器\",\n        \"scat\": \"粪便💩\",\n        \"sweating\": \"出汗\",\n        \"urination\": \"排尿\",\n        \"chikan\": \"痴汉\",\n        \"rape\": \"强奸\",\n        \"bdsm\": \"调教\",\n        \"domination loss\": \"统治丢失\",\n        \"food on body\": \"男体盛\",\n        \"forniphilia\": \"人体家具\",\n        \"human cattle\": \"人类饲养\",\n        \"josou seme\": \"女装攻\",\n        \"orgasm denial\": \"高潮禁止\",\n        \"petplay\": \"人宠\",\n        \"slave\": \"奴隶\",\n        \"smalldom\": \"逆体格差\",\n        \"tickling\": \"挠痒\",\n        \"bondage\": \"束缚\",\n        \"fanny packing\": \"人肉腰包\",\n        \"harness\": \"挽具\",\n        \"shibari\": \"捆绑\",\n        \"stuck in wall\": \"卡在墙上\",\n        \"abortion\": \"堕胎\",\n        \"cannibalism\": \"食人\",\n        \"cbt\": \"虐屌\",\n        \"dismantling\": \"拆解\",\n        \"guro\": \"猎奇\",\n        \"electric shocks\": \"电击\",\n        \"ryona\": \"凌虐\",\n        \"snuff\": \"杀害\",\n        \"torture\": \"拷打\",\n        \"trampling\": \"践踏\",\n        \"wrestling\": \"摔角\",\n        \"autofellatio\": \"自吹\",\n        \"clone\": \"克隆\",\n        \"masturbation\": \"自慰\",\n        \"phone sex\": \"电话性爱\",\n        \"selfcest\": \"自交\",\n        \"solo action\": \"自摸\",\n        \"table masturbation\": \"桌角自慰\",\n        \"blind\": \"失明\",\n        \"handicapped\": \"残疾\",\n        \"mute\": \"哑巴\",\n        \"full tour\": \"消化道游览\",\n        \"cuntboy\": \"人妖♀\",\n        \"feminization\": \"女性化\",\n        \"gender change\": \"性转换\",\n        \"gender morph\": \"女体化\",\n        \"otokofutanari\": \"扶他\",\n        \"bisexual\": \"双性恋\",\n        \"dickgirl on male\": \"扶上男\",\n        \"first person perspective\": \"第一人称视角\",\n        \"x-ray\": \"透视\",\n        \"blackmail\": \"要挟\",\n        \"coach\": \"教练\",\n        \"impregnation\": \"受孕\",\n        \"mesugaki\": \"雄小鬼\",\n        \"prostitution\": \"卖淫\",\n        \"teacher\": \"教师\",\n        \"tomgirl\": \"伪娘\",\n        \"tutor\": \"家庭教师\",\n        \"virginity\": \"丧失童贞\",\n        \"vtuber\": \"虚拟主播\",\n        \"widower\": \"鳏夫\",\n        \"yandere\": \"病娇\",\n        \"yaoi\": \"男同\",\n        \"males only\": \"纯男性⚣\",\n        \"pussyboys only\": \"纯扶他\",\n        \"sole male\": \"单男主\",\n        \"sole pussyboy\": \"单扶他\",\n        \"cheating\": \"出轨\",\n        \"netorare\": \"NTR\",\n        \"netorase\": \"绿帽癖\",\n        \"swinging\": \"换夫\",\n        \"brother\": \"兄弟\",\n        \"cousin\": \"表兄弟\",\n        \"father\": \"父亲\",\n        \"grandfather\": \"祖父\",\n        \"incest\": \"乱伦\",\n        \"inseki\": \"姻亲\",\n        \"uncle\": \"叔叔\",\n        \"exhibitionism\": \"露阴癖\",\n        \"filming\": \"摄像\",\n        \"forced exposure\": \"强制暴露\",\n        \"hidden sex\": \"隐蔽性交\",\n        \"humiliation\": \"屈辱\",\n        \"voyeurism\": \"偷窥\",\n        \"low bestiality\": \"低存在兽交\",\n        \"low guro\": \"低存在猎奇\",\n        \"low scat\": \"低存在排便\",\n        \"low shotacon\": \"低存在正太\",\n        \"low smegma\": \"低存在阴垢\",\n        \"focus anal\": \"高存在肛交\",\n        \"focus blowjob\": \"高存在口交\",\n        \"focus paizuri\": \"高存在乳交\"\n    },\n    \"female\": {\n        \"age progression\": \"年龄增长\",\n        \"age regression\": \"返老还童\",\n        \"infantilism\": \"幼稚型\",\n        \"lolicon\": \"萝莉\",\n        \"milf\": \"熟女\",\n        \"old lady\": \"老女人\",\n        \"toddlercon\": \"幼女\",\n        \"amputee\": \"截肢\",\n        \"big muscles\": \"大肌肉\",\n        \"body modification\": \"身体改造\",\n        \"conjoined\": \"连体\",\n        \"doll joints\": \"关节娃娃\",\n        \"gijinka\": \"拟人化\",\n        \"inflation\": \"腹部膨胀\",\n        \"invisible\": \"透明\",\n        \"multiple arms\": \"多臂\",\n        \"multiple breasts\": \"多乳房\",\n        \"muscle\": \"肌肉\",\n        \"muscle growth\": \"肌肉成长\",\n        \"shapening\": \"平面化\",\n        \"stretching\": \"拉伸\",\n        \"tailjob\": \"尾交\",\n        \"wingjob\": \"翼交\",\n        \"wings\": \"翅膀\",\n        \"absorption\": \"吸收\",\n        \"futanarization\": \"扶她化\",\n        \"petrification\": \"石化\",\n        \"transformation\": \"变身\",\n        \"alien girl\": \"外星女👽\",\n        \"angel\": \"天使\",\n        \"bat girl\": \"蝙蝠娘\",\n        \"bear girl\": \"狗熊娘\",\n        \"bee girl\": \"蜂女\",\n        \"bird girl\": \"鸟娘\",\n        \"bunny girl\": \"兔女郎\",\n        \"catgirl\": \"猫女\",\n        \"centaur\": \"半人马\",\n        \"cowgirl\": \"牛女孩\",\n        \"deer girl\": \"鹿女孩\",\n        \"demon girl\": \"恶魔女孩\",\n        \"dog girl\": \"狗女孩\",\n        \"draenei\": \"德莱尼\",\n        \"elephant girl\": \"象女孩\",\n        \"fairy\": \"仙女🧚‍♀️\",\n        \"frog girl\": \"青蛙女孩\",\n        \"fox girl\": \"狐女\",\n        \"furry\": \"毛茸茸\",\n        \"giraffe girl\": \"长颈鹿娘\",\n        \"ghost\": \"幽灵👻\",\n        \"goblin\": \"哥布林\",\n        \"harpy\": \"鸟人\",\n        \"horse girl\": \"马女孩\",\n        \"human on furry\": \"人毛\",\n        \"hyena girl\": \"鬣狗女孩\",\n        \"insect girl\": \"昆虫女孩\",\n        \"kappa\": \"河童\",\n        \"lizard girl\": \"蜥蜴女孩\",\n        \"mermaid\": \"美人鱼🧜‍♀️\",\n        \"monkey girl\": \"猴女孩\",\n        \"monster girl\": \"魔物娘\",\n        \"mouse girl\": \"鼠女孩\",\n        \"necrophilia\": \"奸尸\",\n        \"oni\": \"鬼\",\n        \"orc\": \"半兽人\",\n        \"otter girl\": \"水獭女孩\",\n        \"panda girl\": \"熊猫娘\",\n        \"pig girl\": \"猪女\",\n        \"plant girl\": \"植物女孩\",\n        \"raccoon girl\": \"浣熊女孩\",\n        \"robot\": \"机器人🤖\",\n        \"shark girl\": \"鲨女孩\",\n        \"sheep girl\": \"羊女孩\",\n        \"slime\": \"史莱姆\",\n        \"slime girl\": \"史莱姆女孩\",\n        \"snail girl\": \"蜗牛女孩\",\n        \"snake girl\": \"蛇女\",\n        \"spider girl\": \"蜘蛛娘\",\n        \"squid girl\": \"乌贼娘\",\n        \"squirrel girl\": \"松鼠娘\",\n        \"skunk girl\": \"臭鼬娘\",\n        \"tentacles\": \"触手\",\n        \"vampire\": \"吸血鬼🧛‍♀️\",\n        \"wolf girl\": \"狼女孩\",\n        \"zombie\": \"僵尸🧟‍♀️\",\n        \"animal on animal\": \"兽兽\",\n        \"animal on furry\": \"兽毛\",\n        \"bear\": \"熊🐻\",\n        \"bestiality\": \"兽交\",\n        \"cat\": \"猫🐈\",\n        \"cow\": \"牛🐄\",\n        \"crab\": \"螃蟹🦀\",\n        \"deer\": \"鹿🦌\",\n        \"dinosaur\": \"恐龙🦕\",\n        \"dog\": \"狗🐩\",\n        \"dolphin\": \"海豚🐬\",\n        \"donkey\": \"驴\",\n        \"dragon\": \"龙🐉\",\n        \"eel\": \"鳗鱼\",\n        \"elephant\": \"象🐘\",\n        \"fish\": \"鱼🐟\",\n        \"fox\": \"狐狸🦊\",\n        \"frog\": \"青蛙🐸\",\n        \"goat\": \"山羊🐐\",\n        \"horse\": \"马🐎\",\n        \"insect\": \"昆虫🐜\",\n        \"kangaroo\": \"袋鼠\",\n        \"lioness\": \"狮🦁\",\n        \"maggot\": \"蛆🐛\",\n        \"monkey\": \"猴🐒\",\n        \"mouse\": \"鼠🐁\",\n        \"octopus\": \"章鱼🦑\",\n        \"pegasus\": \"天马\",\n        \"pig\": \"猪🐖\",\n        \"rabbit\": \"兔🐇\",\n        \"reptile\": \"爬虫\",\n        \"rhinoceros\": \"犀牛🦏\",\n        \"sheep\": \"绵羊🐑\",\n        \"shark\": \"鲨🦈\",\n        \"slug\": \"蛞蝓\",\n        \"snake\": \"蛇🐍\",\n        \"spider\": \"蜘蛛🕷\",\n        \"tiger\": \"虎🐅\",\n        \"turtle\": \"龟🐢\",\n        \"unicorn\": \"独角兽🦄\",\n        \"whale\": \"鲸🐋\",\n        \"wolf\": \"狼🐺\",\n        \"worm\": \"蠕虫\",\n        \"zebra\": \"斑马🦓\",\n        \"giantess\": \"女巨人\",\n        \"growth\": \"巨大化\",\n        \"midget\": \"侏儒\",\n        \"minigirl\": \"迷你女孩\",\n        \"shrinking\": \"缩小\",\n        \"tall girl\": \"高个女\",\n        \"albino\": \"白化\",\n        \"body writing\": \"身体写作\",\n        \"body painting\": \"身体绘画\",\n        \"dark skin\": \"黑皮\",\n        \"freckles\": \"雀斑\",\n        \"gyaru\": \"辣妹\",\n        \"large tattoo\": \"全身纹身\",\n        \"lipstick mark\": \"口红印\",\n        \"scar\": \"瘢痕\",\n        \"skinsuit\": \"人皮衣\",\n        \"tanlines\": \"晒痕\",\n        \"anorexic\": \"瘦骨嶙峋\",\n        \"bbw\": \"胖女人\",\n        \"ssbbw\": \"超级胖女人\",\n        \"weight gain\": \"体重增加\",\n        \"ahegao\": \"阿黑颜\",\n        \"beauty mark\": \"美人痣\",\n        \"brain fuck\": \"脑交🧠\",\n        \"cockslapping\": \"屌掴\",\n        \"crown\": \"王冠👑\",\n        \"ear fuck\": \"耳交👂\",\n        \"elf\": \"精灵🧝‍♀️\",\n        \"facesitting\": \"坐脸\",\n        \"facial hair\": \"胡子\",\n        \"gasmask\": \"防毒面具\",\n        \"halo\": \"光环\",\n        \"headless\": \"无头\",\n        \"hood\": \"帽兜\",\n        \"horns\": \"角\",\n        \"kemonomimi\": \"兽耳\",\n        \"kigurumi pajama\": \"动物连体睡衣\",\n        \"makeup\": \"化妆\",\n        \"masked face\": \"假面\",\n        \"mouth mask\": \"口罩\",\n        \"thick eyebrows\": \"浓眉\",\n        \"afro\": \"爆炸头\",\n        \"bald\": \"秃顶\",\n        \"drill hair\": \"螺旋辫\",\n        \"eye-covering bang\": \"长刘海\",\n        \"hair buns\": \"丸子头\",\n        \"hairjob\": \"发丝交\",\n        \"pixie cut\": \"精灵头\",\n        \"ponytail\": \"马尾辫\",\n        \"prehensile hair\": \"抓握发\",\n        \"shaved head\": \"光头\",\n        \"twintails\": \"双马尾\",\n        \"very long hair\": \"超长发\",\n        \"body swap\": \"换身\",\n        \"chloroform\": \"迷药\",\n        \"corruption\": \"堕落\",\n        \"drugs\": \"药物\",\n        \"drunk\": \"醉酒\",\n        \"emotionless sex\": \"性冷淡\",\n        \"mind break\": \"洗脑\",\n        \"mind control\": \"催眠\",\n        \"moral degeneration\": \"道德退化\",\n        \"parasite\": \"寄生\",\n        \"personality excretion\": \"人格排泄\",\n        \"possession\": \"附身\",\n        \"shared senses\": \"感官共享\",\n        \"sleeping\": \"睡觉\",\n        \"blindfold\": \"遮眼布\",\n        \"closed eyes\": \"闭眼\",\n        \"crying\": \"流泪\",\n        \"cum in eye\": \"眼射\",\n        \"dark sclera\": \"深色巩膜\",\n        \"eye penetration\": \"插入眼睛\",\n        \"eyemask\": \"眼部面具\",\n        \"eyepatch\": \"眼罩\",\n        \"glasses\": \"眼镜👓\",\n        \"heterochromia\": \"异色瞳\",\n        \"monoeye\": \"独眼\",\n        \"sunglasses\": \"太阳镜🕶\",\n        \"unusual pupils\": \"异瞳\",\n        \"nose fuck\": \"鼻交\",\n        \"nose hook\": \"鼻吊钩\",\n        \"smell\": \"气味\",\n        \"adventitious mouth\": \"畸位口\",\n        \"big lips\": \"大嘴唇💋\",\n        \"blowjob\": \"口交\",\n        \"blowjob face\": \"口交颜\",\n        \"braces\": \"牙套\",\n        \"burping\": \"打嗝\",\n        \"coprophagia\": \"食粪\",\n        \"deepthroat\": \"深喉\",\n        \"double blowjob\": \"一口二鸟\",\n        \"foot licking\": \"舔足\",\n        \"gag\": \"口塞\",\n        \"gokkun\": \"饮精\",\n        \"kissing\": \"接吻💏\",\n        \"long tongue\": \"长舌👅\",\n        \"multimouth blowjob\": \"多口口交\",\n        \"piss drinking\": \"饮尿\",\n        \"rimjob\": \"舔肛\",\n        \"saliva\": \"唾液\",\n        \"smoking\": \"吸烟🚬\",\n        \"tooth brushing\": \"刷牙\",\n        \"unusual teeth\": \"异齿\",\n        \"vomit\": \"呕吐🤮\",\n        \"vore\": \"吞食\",\n        \"asphyxiation\": \"窒息\",\n        \"collar\": \"项圈\",\n        \"hanging\": \"绞刑\",\n        \"leash\": \"狗链\",\n        \"armpit licking\": \"腋下舔\",\n        \"armpit sex\": \"腋交\",\n        \"hairy armpits\": \"腋毛\",\n        \"fingering\": \"指法\",\n        \"fisting\": \"拳交💪\",\n        \"gloves\": \"手套\",\n        \"handjob\": \"打手枪\",\n        \"multiple handjob\": \"多重打手枪\",\n        \"big areolae\": \"大乳晕\",\n        \"big breasts\": \"巨乳\",\n        \"breast expansion\": \"乳房膨胀\",\n        \"breast feeding\": \"哺乳\",\n        \"breast reduction\": \"乳房缩小\",\n        \"gigantic breasts\": \"极乳\",\n        \"huge breasts\": \"超乳\",\n        \"lactation\": \"母乳\",\n        \"milking\": \"挤奶\",\n        \"multiple paizuri\": \"多重乳交\",\n        \"oppai loli\": \"巨乳萝莉\",\n        \"paizuri\": \"乳交\",\n        \"clothed paizuri\": \"穿衣乳交\",\n        \"small breasts\": \"贫乳\",\n        \"big nipples\": \"大乳头\",\n        \"dark nipples\": \"暗色乳头\",\n        \"dicknipples\": \"阴茎乳头\",\n        \"inverted nipples\": \"乳头内陷\",\n        \"multiple nipples\": \"多乳头\",\n        \"nipple birth\": \"乳头出产\",\n        \"nipple expansion\": \"乳头膨胀\",\n        \"nipple fuck\": \"乳穴性交\",\n        \"nipple piercing\": \"乳头穿孔\",\n        \"nipple stimulation\": \"乳头刺激\",\n        \"cumflation\": \"精液膨胀\",\n        \"navel fuck\": \"肚脐奸\",\n        \"pregnant\": \"怀孕\",\n        \"stomach deformation\": \"腹部变形\",\n        \"ball-less shemale\": \"无蛋人妖\",\n        \"chastity belt\": \"贞操带\",\n        \"crotch tattoo\": \"淫纹\",\n        \"full-packaged futanari\": \"有蛋扶她\",\n        \"genital piercing\": \"性器穿孔\",\n        \"hairy\": \"多毛\",\n        \"mesuiki\": \"干高潮\",\n        \"multiple orgasms\": \"连续高潮\",\n        \"pantyjob\": \"内裤交\",\n        \"pubic stubble\": \"阴毛茬\",\n        \"urethra insertion\": \"尿道插入\",\n        \"adventitious penis\": \"畸位阴茎\",\n        \"ball caressing\": \"揉蛋\",\n        \"balls expansion\": \"睾丸生长\",\n        \"ball sucking\": \"吸球\",\n        \"balljob\": \"球交\",\n        \"big balls\": \"大睾丸\",\n        \"big penis\": \"大根\",\n        \"cockphagia\": \"阴茎吞食\",\n        \"cock ring\": \"锁精环\",\n        \"frottage\": \"阴茎摩擦🤺\",\n        \"horse cock\": \"马根\",\n        \"huge penis\": \"巨根\",\n        \"multiple penises\": \"鸡鸡复鸡鸡\",\n        \"penis birth\": \"阴茎出产\",\n        \"penis enlargement\": \"阴茎生长\",\n        \"phimosis\": \"包茎\",\n        \"prostate massage\": \"前列腺按摩\",\n        \"retractable penis\": \"可伸缩阴茎\",\n        \"smegma\": \"阴垢\",\n        \"adventitious vagina\": \"畸位阴道\",\n        \"big clit\": \"大阴蒂\",\n        \"big vagina\": \"大阴道\",\n        \"cervix penetration\": \"宫颈穿透\",\n        \"cervix prolapse\": \"宫颈脱垂\",\n        \"clit growth\": \"阴蒂生长\",\n        \"clit insertion\": \"阴蒂插入\",\n        \"clit stimulation\": \"阴蒂刺激\",\n        \"cunnilingus\": \"舔阴\",\n        \"defloration\": \"破处\",\n        \"multiple vaginas\": \"多阴道\",\n        \"tribadism\": \"贝合\",\n        \"unbirth\": \"入阴\",\n        \"vaginal birth\": \"阴道出产\",\n        \"anal\": \"爆肛\",\n        \"anal birth\": \"肛门出产\",\n        \"anal intercourse\": \"肛交\",\n        \"analphagia\": \"肛门吞食\",\n        \"anal prolapse\": \"脱肛\",\n        \"ass expansion\": \"臀部膨胀\",\n        \"assjob\": \"尻交\",\n        \"big ass\": \"大屁股\",\n        \"enema\": \"灌肠\",\n        \"farting\": \"放屁\",\n        \"multiple assjob\": \"多重尻交\",\n        \"spanking\": \"打屁股\",\n        \"tail\": \"尾巴\",\n        \"tailphagia\": \"尾巴吞食\",\n        \"eggs\": \"产卵\",\n        \"gaping\": \"敞口\",\n        \"large insertions\": \"大玩具\",\n        \"nakadashi\": \"中出\",\n        \"prolapse\": \"脱垂\",\n        \"kneepit sex\": \"膝下性交\",\n        \"leg lock\": \"勾腿\",\n        \"legjob\": \"腿交\",\n        \"sumata\": \"股间性交\",\n        \"denki anma\": \"电气按摩\",\n        \"foot insertion\": \"足插入\",\n        \"footjob\": \"足交\",\n        \"multiple footjob\": \"多重足交\",\n        \"sockjob\": \"袜交🧦\",\n        \"animegao\": \"头壳\",\n        \"apron\": \"围裙\",\n        \"bandages\": \"绷带\",\n        \"vaginal sticker\": \"阴贴\",\n        \"bandaid\": \"创可贴\",\n        \"bike shorts\": \"自行车短裤\",\n        \"bikini\": \"比基尼👙\",\n        \"bloomers\": \"布鲁马\",\n        \"bodystocking\": \"连身袜\",\n        \"bodysuit\": \"紧身衣裤\",\n        \"bride\": \"婚纱\",\n        \"business suit\": \"西装\",\n        \"butler\": \"管家\",\n        \"cashier\": \"收银员\",\n        \"cheerleader\": \"啦啦队员\",\n        \"chinese dress\": \"旗袍\",\n        \"christmas\": \"圣诞装🤶\",\n        \"clothed male nude female\": \"裸女\",\n        \"clown\": \"小丑🤡\",\n        \"condom\": \"避孕套\",\n        \"corset\": \"紧身胸衣\",\n        \"cosplaying\": \"Cosplay\",\n        \"crossdressing\": \"异性装\",\n        \"detached sleeves\": \"分离袖子\",\n        \"diaper\": \"尿布\",\n        \"dougi\": \"练功服🥋\",\n        \"exposed clothing\": \"开洞装\",\n        \"fishnets\": \"渔网\",\n        \"fundoshi\": \"六尺褌\",\n        \"garter belt\": \"吊袜带\",\n        \"gothic lolita\": \"哥特萝莉装\",\n        \"gymshorts\": \"运动短裤\",\n        \"haigure\": \"高叉装\",\n        \"headphones\": \"头戴式耳机\",\n        \"high heels\": \"高跟鞋\",\n        \"hijab\": \"头巾\",\n        \"hotpants\": \"热裤\",\n        \"kimono\": \"和服👘\",\n        \"kindergarten uniform\": \"幼儿园制服\",\n        \"kunoichi\": \"女忍装\",\n        \"lab coat\": \"白大褂\",\n        \"latex\": \"乳胶紧身衣\",\n        \"leotard\": \"紧身衣\",\n        \"lingerie\": \"情趣内衣\",\n        \"living clothes\": \"生物衣\",\n        \"magical girl\": \"魔法少女\",\n        \"maid\": \"女仆装\",\n        \"mecha girl\": \"机娘\",\n        \"metal armor\": \"金属盔甲\",\n        \"miko\": \"巫女装\",\n        \"military\": \"军装\",\n        \"nazi\": \"纳粹军装\",\n        \"nun\": \"修女服\",\n        \"nurse\": \"护士装\",\n        \"painted nails\": \"美甲\",\n        \"pantyhose\": \"连裤袜\",\n        \"pasties\": \"乳贴\",\n        \"piercing\": \"穿孔\",\n        \"pirate\": \"海盗服\",\n        \"policewoman\": \"警服\",\n        \"ponygirl\": \"小马女\",\n        \"race queen\": \"赛车女郎\",\n        \"randoseru\": \"书包\",\n        \"sarashi\": \"缠胸布\",\n        \"schoolboy uniform\": \"男生制服\",\n        \"schoolgirl uniform\": \"女生制服\",\n        \"school gym uniform\": \"学校体操服\",\n        \"school swimsuit\": \"死库水\",\n        \"scrotal lingerie\": \"阴囊袋\",\n        \"small penis\": \"小小鸟\",\n        \"shimapan\": \"条纹胖次\",\n        \"stewardess\": \"空姐服\",\n        \"stirrup legwear\": \"马镫裤\",\n        \"stockings\": \"长筒袜\",\n        \"straitjacket\": \"拘束衣\",\n        \"sundress\": \"夏装\",\n        \"swimsuit\": \"泳装\",\n        \"tabi socks\": \"足袋\",\n        \"thigh high boots\": \"高筒靴\",\n        \"tiara\": \"宝冠\",\n        \"tights\": \"厚连裤袜\",\n        \"tracksuit\": \"运动服\",\n        \"transparent clothing\": \"透明服装\",\n        \"waiter\": \"男侍者装\",\n        \"waitress\": \"女侍者装\",\n        \"wet clothes\": \"湿身\",\n        \"witch\": \"女巫装\",\n        \"double anal\": \"双插肛门\",\n        \"double vaginal\": \"双插阴道\",\n        \"fff threesome\": \"女3P\",\n        \"fft threesome\": \"女扶女3P\",\n        \"gang rape\": \"轮奸\",\n        \"group\": \"乱交\",\n        \"harem\": \"后宫\",\n        \"layer cake\": \"夹心蛋糕\",\n        \"multiple straddling\": \"多人跨骑\",\n        \"oyakodon\": \"母女丼\",\n        \"shimaidon\": \"姐妹丼\",\n        \"triple anal\": \"三插肛门\",\n        \"triple vaginal\": \"三插阴道\",\n        \"ttf threesome\": \"扶女扶3P\",\n        \"ttt threesome\": \"扶3P\",\n        \"twins\": \"双胞胎\",\n        \"all the way through\": \"消化道贯穿\",\n        \"double penetration\": \"双重插入\",\n        \"triple penetration\": \"三重插入\",\n        \"clamp\": \"夹具\",\n        \"glory hole\": \"寻欢洞\",\n        \"machine\": \"机械奸\",\n        \"onahole\": \"飞机杯\",\n        \"pillory\": \"枷具\",\n        \"pole dancing\": \"钢管舞\",\n        \"real doll\": \"充气娃娃\",\n        \"sex toys\": \"性玩具\",\n        \"speculum\": \"扩张器\",\n        \"strap-on\": \"穿戴式阳具\",\n        \"syringe\": \"注射器\",\n        \"tail plug\": \"尾塞\",\n        \"tube\": \"插管\",\n        \"unusual insertions\": \"异物插入\",\n        \"vacbed\": \"真空床\",\n        \"whip\": \"鞭打\",\n        \"wooden horse\": \"木马\",\n        \"wormhole\": \"虫洞\",\n        \"oil\": \"油\",\n        \"underwater\": \"水下\",\n        \"blood\": \"血液\",\n        \"squirting\": \"潮吹\",\n        \"apparel bukkake\": \"穿衣颜射\",\n        \"bukkake\": \"颜射\",\n        \"cum bath\": \"精液浴\",\n        \"cum swap\": \"交换精液\",\n        \"giant sperm\": \"巨大精子\",\n        \"internal urination\": \"内部排尿\",\n        \"menstruation\": \"经血\",\n        \"omorashi\": \"漏尿\",\n        \"public use\": \"肉便器\",\n        \"scat\": \"粪便💩\",\n        \"scat insertion\": \"粪便插入\",\n        \"sweating\": \"出汗\",\n        \"urination\": \"排尿\",\n        \"chikan\": \"痴汉\",\n        \"rape\": \"强奸\",\n        \"bdsm\": \"调教\",\n        \"femdom\": \"女性主导\",\n        \"domination loss\": \"统治丢失\",\n        \"food on body\": \"女体盛\",\n        \"forniphilia\": \"人体家具\",\n        \"human cattle\": \"人类饲养\",\n        \"orgasm denial\": \"高潮禁止\",\n        \"petplay\": \"人宠\",\n        \"slave\": \"奴隶\",\n        \"smalldom\": \"逆体格差\",\n        \"tickling\": \"挠痒\",\n        \"bondage\": \"束缚\",\n        \"fanny packing\": \"人肉腰包\",\n        \"harness\": \"挽具\",\n        \"shibari\": \"捆绑\",\n        \"stuck in wall\": \"卡在墙上\",\n        \"abortion\": \"堕胎\",\n        \"cannibalism\": \"食人\",\n        \"catfight\": \"猫斗\",\n        \"cbt\": \"虐屌\",\n        \"cuntbusting\": \"阴道破坏\",\n        \"dismantling\": \"拆解\",\n        \"guro\": \"猎奇\",\n        \"electric shocks\": \"电击\",\n        \"ryona\": \"凌虐\",\n        \"snuff\": \"杀害\",\n        \"torture\": \"拷打\",\n        \"trampling\": \"践踏\",\n        \"wrestling\": \"摔角\",\n        \"autofellatio\": \"自吹\",\n        \"autopaizuri\": \"自乳交\",\n        \"clone\": \"克隆\",\n        \"masturbation\": \"自慰\",\n        \"phone sex\": \"电话性爱\",\n        \"selfcest\": \"自交\",\n        \"solo action\": \"自摸\",\n        \"table masturbation\": \"桌角自慰\",\n        \"blind\": \"失明\",\n        \"handicapped\": \"残疾\",\n        \"mute\": \"哑巴\",\n        \"full tour\": \"消化道游览\",\n        \"futanari\": \"扶她\",\n        \"gender change\": \"性转换\",\n        \"gender morph\": \"男体化\",\n        \"shemale\": \"人妖♂\",\n        \"bisexual\": \"双性恋\",\n        \"dickgirl on dickgirl\": \"扶上扶\",\n        \"dickgirl on female\": \"扶上女\",\n        \"male on dickgirl\": \"男上扶\",\n        \"first person perspective\": \"第一人称视角\",\n        \"x-ray\": \"透视\",\n        \"blackmail\": \"要挟\",\n        \"coach\": \"教练\",\n        \"impregnation\": \"受孕\",\n        \"mesugaki\": \"雌小鬼\",\n        \"prostitution\": \"卖淫\",\n        \"teacher\": \"教师\",\n        \"tomboy\": \"假小子\",\n        \"tutor\": \"家庭教师\",\n        \"vtuber\": \"虚拟主播\",\n        \"widow\": \"寡妇\",\n        \"yandere\": \"病娇\",\n        \"yuri\": \"百合\",\n        \"dickgirls only\": \"纯扶她\",\n        \"females only\": \"纯女性⚢\",\n        \"sole dickgirl\": \"单扶她\",\n        \"sole female\": \"单女主\",\n        \"cheating\": \"出轨\",\n        \"netorare\": \"NTR\",\n        \"netorase\": \"绿帽癖\",\n        \"swinging\": \"换妻\",\n        \"aunt\": \"阿姨\",\n        \"cousin\": \"表姐妹\",\n        \"daughter\": \"女儿\",\n        \"granddaughter\": \"孙女\",\n        \"grandmother\": \"祖母\",\n        \"incest\": \"乱伦\",\n        \"inseki\": \"姻亲\",\n        \"mother\": \"母亲\",\n        \"niece\": \"侄女\",\n        \"sister\": \"姐妹\",\n        \"exhibitionism\": \"露阴癖\",\n        \"filming\": \"摄像\",\n        \"forced exposure\": \"强制暴露\",\n        \"hidden sex\": \"隐蔽性交\",\n        \"humiliation\": \"屈辱\",\n        \"voyeurism\": \"偷窥\",\n        \"low bestiality\": \"低存在兽交\",\n        \"low guro\": \"低存在猎奇\",\n        \"low lolicon\": \"低存在萝莉\",\n        \"low scat\": \"低存在排便\",\n        \"low smegma\": \"低存在阴垢\",\n        \"focus anal\": \"高存在肛交\",\n        \"focus blowjob\": \"高存在口交\",\n        \"focus paizuri\": \"高存在乳交\"\n    },\n    \"mixed\": {\n        \"animal on animal\": \"兽兽\",\n        \"body swap\": \"换身\",\n        \"multimouth blowjob\": \"多口口交\",\n        \"multiple handjob\": \"多重打手枪\",\n        \"frottage\": \"阴茎摩擦🤺\",\n        \"multiple assjob\": \"多重尻交\",\n        \"multiple footjob\": \"多重足交\",\n        \"nudism\": \"裸体主义\",\n        \"ffm threesome\": \"女男女3P\",\n        \"gang rape\": \"轮奸\",\n        \"group\": \"乱交\",\n        \"mmf threesome\": \"男女男3P\",\n        \"mmt threesome\": \"男扶男3P\",\n        \"mtf threesome\": \"男扶女3P\",\n        \"oyakodon\": \"亲子丼\",\n        \"shimaidon\": \"手足丼\",\n        \"ttm threesome\": \"扶扶男3P\",\n        \"twins\": \"双胞胎\",\n        \"incest\": \"乱伦\",\n        \"inseki\": \"姻亲\"\n    },\n    \"other\": {\n        \"yukkuri\": \"油库里\",\n        \"dakimakura\": \"抱枕\",\n        \"time stop\": \"时间停止⏱️\",\n        \"3d\": \"3D\",\n        \"3d imageset\": \"3D图片集\",\n        \"ai generated\": \"AI生成\",\n        \"anaglyph\": \"红蓝3D\",\n        \"animated\": \"动图\",\n        \"comic\": \"西方漫画\",\n        \"extraneous ads\": \"外部广告\",\n        \"figure\": \"手办\",\n        \"full color\": \"全彩\",\n        \"game manual\": \"游戏手册\",\n        \"game sprite\": \"像素画\",\n        \"how to\": \"教程\",\n        \"multipanel sequence\": \"多格序列\",\n        \"multi-work series\": \"系列作品\",\n        \"non-h imageset\": \"无H图片集\",\n        \"paperchild\": \"纸片人\",\n        \"redraw\": \"重绘\",\n        \"screenshots\": \"截图\",\n        \"sketch lines\": \"线稿\",\n        \"stereoscopic\": \"立体图\",\n        \"story arc\": \"故事线\",\n        \"themeless\": \"无主题\",\n        \"western cg\": \"西方CG\",\n        \"western non-h\": \"西方无H\",\n        \"western imageset\": \"西方图集\",\n        \"uncensored\": \"无修正\",\n        \"mosaic censorship\": \"马赛克修正\",\n        \"full censorship\": \"完全修正\",\n        \"hardcore\": \"硬核\",\n        \"non-nude\": \"无露点\",\n        \"already uploaded\": \"已上传\",\n        \"defaced\": \"污损\",\n        \"forbidden content\": \"禁止内容\",\n        \"realporn\": \"真人色情\",\n        \"replaced\": \"已替换\",\n        \"compilation\": \"汇编\",\n        \"incomplete\": \"缺页\",\n        \"missing cover\": \"缺封面\",\n        \"out of order\": \"顺序错乱\",\n        \"sample\": \"样本\",\n        \"scanmark\": \"扫描水印\",\n        \"watermarked\": \"水印\",\n        \"anthology\": \"选集\",\n        \"artbook\": \"画集\",\n        \"goudoushi\": \"合作本\",\n        \"novel\": \"小说\",\n        \"soushuuhen\": \"总集篇\",\n        \"tankoubon\": \"单行本\",\n        \"variant set\": \"变体集\",\n        \"webtoon\": \"条漫\",\n        \"caption\": \"说明文字\",\n        \"rough grammar\": \"语法差\",\n        \"rough translation\": \"渣翻\",\n        \"nudity only\": \"仅裸体\",\n        \"no penetration\": \"无插入\"\n    }\n}"
  },
  {
    "path": "assets/tags_tw.json",
    "content": "{\n    \"rows\": {\n        \"female\": \"女性\",\n        \"male\": \"男性\",\n        \"mixed\": \"混合\",\n        \"language\": \"語言\",\n        \"other\": \"其他\",\n        \"group\": \"團隊\",\n        \"artist\": \"藝術家\",\n        \"cosplayer\": \"Coser\",\n        \"parody\": \"原作\",\n        \"character\": \"角色\",\n        \"reclass\": \"重新分類\",\n        \"temp\": \"臨時\"\n    },\n    \"reclass\": {\n        \"doujinshi\": \"同人誌\",\n        \"manga\": \"漫畫\",\n        \"artistcg\": \"畫師CG\",\n        \"gamecg\": \"遊戲CG\",\n        \"non-h\": \"無H\",\n        \"imageset\": \"圖集\",\n        \"western\": \"西方\",\n        \"cosplay\": \"Cosplay\",\n        \"misc\": \"雜項\",\n        \"asianporn\": \"亞洲色情\",\n        \"private\": \"私有\"\n    },\n    \"language\": {\n        \"afrikaans\": \"南非語\",\n        \"albanian\": \"阿爾巴尼亞語\",\n        \"arabic\": \"阿拉伯語\",\n        \"aramaic\": \"阿拉姆語\",\n        \"armenian\": \"亞美尼亞語\",\n        \"bengali\": \"孟加拉語\",\n        \"bosnian\": \"波斯尼亞語\",\n        \"bulgarian\": \"保加利亞語\",\n        \"burmese\": \"緬甸語\",\n        \"catalan\": \"加泰羅尼亞語\",\n        \"cebuano\": \"宿霧語\",\n        \"chinese\": \"漢語\",\n        \"cree\": \"克里語\",\n        \"creole\": \"克里奧爾語\",\n        \"croatian\": \"克羅埃西亞語\",\n        \"czech\": \"捷克語\",\n        \"danish\": \"丹麥語\",\n        \"dutch\": \"荷蘭語\",\n        \"english\": \"英語\",\n        \"esperanto\": \"世界語\",\n        \"estonian\": \"愛沙尼亞語\",\n        \"finnish\": \"芬蘭語\",\n        \"french\": \"法語\",\n        \"georgian\": \"喬治亞語\",\n        \"german\": \"德語\",\n        \"greek\": \"希臘語\",\n        \"gujarati\": \"古吉拉特語\",\n        \"hebrew\": \"希伯來語\",\n        \"hindi\": \"印地語\",\n        \"hmong\": \"苗語\",\n        \"hungarian\": \"匈牙利語\",\n        \"icelandic\": \"冰島語\",\n        \"indonesian\": \"印尼語\",\n        \"irish\": \"愛爾蘭語\",\n        \"italian\": \"義大利語\",\n        \"japanese\": \"日語\",\n        \"javanese\": \"爪哇語\",\n        \"kannada\": \"卡納達語\",\n        \"kazakh\": \"哈薩克語\",\n        \"khmer\": \"高棉語\",\n        \"korean\": \"韓語\",\n        \"kurdish\": \"庫爾德語\",\n        \"ladino\": \"猶太西班牙語\",\n        \"lao\": \"寮國語\",\n        \"latin\": \"拉丁語\",\n        \"latvian\": \"拉脫維亞語\",\n        \"marathi\": \"馬拉地語\",\n        \"mongolian\": \"蒙古語\",\n        \"ndebele\": \"恩德貝萊語\",\n        \"nepali\": \"尼泊爾語\",\n        \"norwegian\": \"挪威語\",\n        \"oromo\": \"奧羅莫語\",\n        \"papiamento\": \"帕皮阿門託語\",\n        \"pashto\": \"普什圖語\",\n        \"persian\": \"波斯語\",\n        \"polish\": \"波蘭語\",\n        \"portuguese\": \"葡萄牙語\",\n        \"punjabi\": \"旁遮普語\",\n        \"romanian\": \"羅馬尼亞語\",\n        \"russian\": \"俄語\",\n        \"sango\": \"桑戈語\",\n        \"sanskrit\": \"梵語\",\n        \"serbian\": \"塞爾維亞語\",\n        \"shona\": \"紹納語\",\n        \"slovak\": \"斯洛伐克語\",\n        \"slovenian\": \"斯洛維尼亞語\",\n        \"somali\": \"索馬利亞語\",\n        \"spanish\": \"西班牙語\",\n        \"swahili\": \"斯瓦希里語\",\n        \"swedish\": \"瑞典語\",\n        \"tagalog\": \"他加祿語\",\n        \"tamil\": \"泰米爾語\",\n        \"telugu\": \"泰盧固語\",\n        \"thai\": \"泰語\",\n        \"tibetan\": \"藏語\",\n        \"tigrinya\": \"提格雷尼亞語\",\n        \"turkish\": \"土耳其語\",\n        \"ukrainian\": \"烏克蘭語\",\n        \"urdu\": \"烏爾都語\",\n        \"vietnamese\": \"越南語\",\n        \"welsh\": \"威爾士語\",\n        \"yiddish\": \"意第緒語\",\n        \"zulu\": \"祖魯語\",\n        \"speechless\": \"無語言\",\n        \"text cleaned\": \"文字清除\",\n        \"translated\": \"翻譯\",\n        \"rewrite\": \"改寫\"\n    },\n    \"parody\": {\n        \"86\": \"86 -不存在的战区-\",\n        \"300\": \"300\",\n        \"original\": \"原创\",\n        \"touhou project\": \"东方Project\",\n        \"moetan\": \"萌单✏️\",\n        \"kanon\": \"Kanon❄\",\n        \"air\": \"AIR🕊\",\n        \"clannad\": \"CLANNAD👪\",\n        \"angel beats\": \"Angel Beats!❤\",\n        \"charlotte\": \"Charlotte🌠\",\n        \"little busters\": \"Little Busters!⚾🐈\",\n        \"rewrite\": \"Rewrite\",\n        \"ore no imouto ga konna ni kawaii wake ga nai\": \"我的妹妹不可能那么可爱\",\n        \"kantai collection\": \"舰队Collection\",\n        \"pokemon\": \"精灵宝可梦\",\n        \"higurashi no naku koro ni\": \"寒蝉鸣泣之时🔪\",\n        \"saki\": \"天才麻将少女🀄️\",\n        \"puella magi madoka magica\": \"魔法少女小圆\",\n        \"puella magi madoka magica side story magia record\": \"魔法纪录 魔法少女小圆外传\",\n        \"toradora\": \"龙与虎\",\n        \"lotte no omocha\": \"露蒂的玩具\",\n        \"sword art online\": \"刀剑神域\",\n        \"sword art online alternative gun gale online\": \"刀剑神域外传Gun Gale Online\",\n        \"to love-ru\": \"出包王女\",\n        \"ro-kyu-bu\": \"萝球社🏀\",\n        \"tantei opera milky holmes\": \"侦探歌剧 少女福尔摩斯🔎\",\n        \"hyperdimension neptunia\": \"超次元游戏：海王星🎮\",\n        \"love live\": \"LoveLive! School idol project\",\n        \"love live sunshine\": \"Love Live! Sunshine!!\",\n        \"love live nijigasaki high school idol club\": \"LoveLive!虹咲学园学园偶像同好会\",\n        \"sora no otoshimono\": \"天降之物\",\n        \"boku wa tomodachi ga sukunai\": \"我的朋友很少\",\n        \"vocaloid\": \"VOCALOID\",\n        \"voiceroid\": \"VOICEROID\",\n        \"date a live\": \"约会大作战\",\n        \"the idolmaster\": \"偶像大师\",\n        \"my little pony friendship is magic\": \"小马宝莉：友谊就是魔法🐎\",\n        \"himouto umaru-chan\": \"干物妹！小埋\",\n        \"bakemonogatari\": \"化物语\",\n        \"yahari ore no seishun love come wa machigatteiru\": \"我的青春恋爱物语果然有问题\",\n        \"tengen toppa gurren lagann\": \"天元突破\",\n        \"cardcaptor sakura\": \"魔卡少女樱\",\n        \"mayoi neko overrun\": \"迷途猫OverRun\",\n        \"outbreak company\": \"萌萌侵略者\",\n        \"kyoukai no kanata\": \"境界的彼方\",\n        \"hataraku maou-sama\": \"打工吧！魔王大人\",\n        \"haiyore nyaruko-san\": \"潜行吧！奈亚子\",\n        \"hentai ouji to warawanai neko\": \"变态王子与不笑猫\",\n        \"nagi no asukara\": \"来自风平浪静的明天\",\n        \"sekai seifuku bouryaku no zvezda\": \"世界征服～谋略之星～\",\n        \"no game no life\": \"游戏人生\",\n        \"barakamon\": \"元气囝仔\",\n        \"divine gate\": \"神圣之门\",\n        \"sayonara zetsubou sensei\": \"再见！绝望先生\",\n        \"highschool of the dead\": \"学园默示录\",\n        \"gakkou gurashi\": \"学园孤岛\",\n        \"a channel\": \"A频道\",\n        \"granblue fantasy\": \"碧蓝幻想\",\n        \"gundam\": \"高达\",\n        \"gundam age\": \"机动战士高达AGE\",\n        \"gundam 00\": \"机动战士高达00\",\n        \"gundam 0080\": \"机动战士高达0080 口袋里的战争\",\n        \"gundam 0083\": \"机动战士高达0083 星尘回忆录\",\n        \"gundam unicorn\": \"机动战士高达UC\",\n        \"gundam f91\": \"机动战士高达F91\",\n        \"gundam seed\": \"机动战士高达SEED\",\n        \"gundam seed destiny\": \"机动战士高达SEED DESTINY\",\n        \"gundam zz\": \"机动战士高达ZZ\",\n        \"mobile suit gundam\": \"机动战士高达\",\n        \"mobile suit gundam lost war chronicles\": \"机动战士高达战记 Lost War Chronicles\",\n        \"mobile suit gundam tekketsu no orphans\": \"机动战士高达 铁血的孤儿\",\n        \"gundam wing\": \"新机动战记高达W\",\n        \"gundam build fighters\": \"高达创战者\",\n        \"gundam build fighters try\": \"高达创战者TRY\",\n        \"gundam build divers\": \"高达创形者\",\n        \"gundam g no reconguista\": \"高达G之复国运动\",\n        \"gundam x\": \"机动新世纪高达X\",\n        \"victory gundam\": \"机动战士V高达\",\n        \"zeta gundam\": \"机动战士Z高达\",\n        \"g gundam\": \"机动武斗传G高达\",\n        \"turn a gundam\": \"∀高达\",\n        \"kiniro mosaic\": \"黄金拼图\",\n        \"gochuumon wa usagi desu ka\": \"请问您今天要来点兔子吗？\",\n        \"non non biyori\": \"悠哉日常大王\",\n        \"oda nobuna no yabou\": \"织田信奈的野望\",\n        \"tamako market\": \"玉子市场\",\n        \"yama no susume\": \"向山进发\",\n        \"pripara\": \"美妙天堂\",\n        \"sora no method\": \"天体的秩序\",\n        \"accel world\": \"加速世界\",\n        \"dungeon ni deai o motomeru no wa machigatteiru darou ka\": \"在地下城寻求邂逅是否搞错了什么\",\n        \"c cube\": \"C³-魔方少女-\",\n        \"shingeki no kyojin\": \"进击的巨人\",\n        \"onidere\": \"鬼骄\",\n        \"infinite stratos\": \"无限斯特拉托斯\",\n        \"disgaea\": \"魔界战记\",\n        \"chuunibyou demo koi ga shitai\": \"中二病也要谈恋爱！\",\n        \"ano hi mita hana no namae wo bokutachi wa mada shiranai\": \"我们仍未知道那天所看见的花的名字。\",\n        \"amagi brilliant park\": \"甘城光辉游乐园\",\n        \"hidan no aria\": \"绯弹的亚莉亚🔫\",\n        \"steinsgate\": \"命运石之门\",\n        \"lucky star\": \"幸运☆星\",\n        \"zero no tsukaima\": \"零之使魔\",\n        \"shakugan no shana\": \"灼眼的夏娜\",\n        \"the melancholy of haruhi suzumiya\": \"凉宫春日的忧郁\",\n        \"kannagi\": \"神薙\",\n        \"kashimashi\": \"女生爱女生\",\n        \"to heart\": \"ToHeart\",\n        \"toheart2\": \"ToHeart2\",\n        \"k-on\": \"轻音少女\",\n        \"he is my master\": \"我的主人\",\n        \"code geass\": \"叛逆的鲁鲁修\",\n        \"naruto\": \"火影忍者\",\n        \"school rumble\": \"校园迷糊大王\",\n        \"mahou sensei negima\": \"魔法老师\",\n        \"uq holder\": \"悠久持有者！\",\n        \"neon genesis evangelion\": \"新世纪福音战士\",\n        \"hidamari sketch\": \"向阳素描\",\n        \"mahou shoujo lyrical nanoha\": \"魔法少女奈叶\",\n        \"rosario vampire\": \"十字架与吸血鬼\",\n        \"pretty cure\": \"光之美少女\",\n        \"futari wa pretty cure\": \"光之美少女\",\n        \"futari wa precure splash star\": \"光之美少女 Splash Star\",\n        \"yes precure 5\": \"Yes! 光之美少女5\",\n        \"fresh precure\": \"光之美少女：幸福精灵\",\n        \"heartcatch precure\": \"光之美少女：甜蜜天使！\",\n        \"suite precure\": \"光之美少女：美乐天使\",\n        \"smile precure\": \"Smile 光之美少女！\",\n        \"dokidoki precure\": \"心跳！光之美少女\",\n        \"happinesscharge precure\": \"幸福爆发 光之美少女！\",\n        \"go princess precure\": \"Go! 公主 光之美少女\",\n        \"maho girls precure\": \"魔法使 光之美少女！\",\n        \"kirakira precure a la mode\": \"光之美少女：食尚甜心\",\n        \"hugtto precure\": \"拥抱！光之美少女\",\n        \"star twinkle precure\": \"星光闪亮☆光之美少女\",\n        \"jojos bizarre adventure\": \"JOJO的奇妙冒险\",\n        \"pangya\": \"魔法飞球\",\n        \"shokugeki no soma\": \"食戟之灵\",\n        \"working\": \"迷糊餐厅🍴\",\n        \"kono subarashii sekai ni syukufuku o\": \"为美好的世界献上祝福！\",\n        \"ore no kanojo to osananajimi ga shuraba sugiru\": \"我女友与青梅竹马的惨烈修罗场\",\n        \"ore no nounai sentakushi ga gakuen love comedy wo zenryoku de jama shiteiru\": \"我的脑内恋碍选项\",\n        \"overwatch\": \"守望先锋\",\n        \"halo\": \"光环\",\n        \"mass effect\": \"质量效应\",\n        \"half-life\": \"半衰期\",\n        \"portal\": \"传送门\",\n        \"the witcher\": \"巫师\",\n        \"the elder scrolls\": \"上古卷轴\",\n        \"defense of the ancients\": \"刀塔\",\n        \"re zero kara hajimeru isekai seikatsu\": \"Re：从零开始的异世界生活\",\n        \"saenai heroine no sodatekata\": \"路人女主的养成方法\",\n        \"koihime musou\": \"恋姬†无双\",\n        \"senran kagura\": \"闪乱神乐\",\n        \"kobayashi-san-chi no maid dragon\": \"小林家的龙女仆\",\n        \"new game\": \"NEW GAME!\",\n        \"shirobako\": \"白箱\",\n        \"girlish number\": \"少女编号\",\n        \"gabriel dropout\": \"珈百璃的堕落\",\n        \"chobits\": \"人形电脑天使心\",\n        \"dead or alive\": \"死或生\",\n        \"eromanga sensei\": \"埃罗芒阿老师\",\n        \"dorei to no seikatsu\": \"与奴隶的生活 -Teaching Feeling-\",\n        \"girls und panzer\": \"少女与战车\",\n        \"seto no hanayome\": \"濑户的花嫁\",\n        \"brave witches\": \"无畏魔女\",\n        \"strike witches\": \"强袭魔女\",\n        \"kemono friends\": \"兽娘动物园\",\n        \"league of legends\": \"英雄联盟\",\n        \"kill la kill\": \"斩服少女\",\n        \"dagashi kashi\": \"粗点心战争\",\n        \"street fighter\": \"街头霸王\",\n        \"fate grand order\": \"Fate/Grand Order\",\n        \"fate stay night\": \"Fate/stay night\",\n        \"fate apocrypha\": \"Fate/Apocrypha\",\n        \"fate zero\": \"Fate/Zero\",\n        \"fate hollow ataraxia\": \"Fate/hollow ataraxia\",\n        \"fate extra\": \"Fate/EXTRA\",\n        \"fate kaleid liner prisma illya\": \"Fate/kaleid liner 魔法少女☆伊莉雅\",\n        \"mahou tsukai no yoru\": \"魔法使之夜\",\n        \"kara no kyoukai\": \"空之境界\",\n        \"canaan\": \"迦南\",\n        \"tsukihime\": \"月姬\",\n        \"kimi no na wa.\": \"你的名字。\",\n        \"mashiro iro symphony\": \"纯白交响曲\",\n        \"dragon quest\": \"勇者斗恶龙\",\n        \"dragon quest i\": \"勇者斗恶龙I\",\n        \"dragon quest ii\": \"勇者斗恶龙II 恶灵的众神\",\n        \"dragon quest iii\": \"勇者斗恶龙III 传说的开始\",\n        \"dragon quest iv\": \"勇者斗恶龙IV 被引导的人们\",\n        \"dragon quest v\": \"勇者斗恶龙V 天空的新娘\",\n        \"dragon quest vi\": \"勇者斗恶龙VI 幻之大地\",\n        \"dragon quest vii\": \"勇者斗恶龙VII 伊甸的战士们\",\n        \"dragon quest viii\": \"勇者斗恶龙VIII 天空、碧海、大地与被诅咒的公主\",\n        \"dragon quest ix\": \"勇者斗恶龙IX 星空的守护者\",\n        \"dragon quest x\": \"勇者斗恶龙X 觉醒的五种族 Online\",\n        \"dragon quest xi\": \"勇者斗恶龙XI 追寻逝去的时光\",\n        \"dragon quest dai no daibouken\": \"勇者斗恶龙 达尔大冒险\",\n        \"dragon quest monsters\": \"勇者斗恶龙怪兽篇\",\n        \"dragon quest yuusha abel densetsu\": \"勇者斗恶龙 勇者阿贝尔传说\",\n        \"dragon quest heroes\": \"勇者斗恶龙 英雄\",\n        \"left 4 dead\": \"求生之路\",\n        \"bloodrayne\": \"吸血莱恩\",\n        \"star wars\": \"星球大战\",\n        \"shin megami tensei\": \"真·女神转生\",\n        \"shin megami tensei devil children\": \"真·女神转生 恶魔之子\",\n        \"devil survivor\": \"女神异闻录 恶魔幸存者\",\n        \"persona\": \"女神异闻录\",\n        \"persona 2\": \"女神异闻录2\",\n        \"persona 3\": \"女神异闻录3\",\n        \"persona 4\": \"女神异闻录4\",\n        \"persona 5\": \"女神异闻录5\",\n        \"monsters inc.\": \"怪兽电力公司\",\n        \"hai to gensou no grimgar\": \"灰与幻想的格林姆迦尔\",\n        \"pretty rhythm\": \"美妙旋律\",\n        \"mamono musume zukan\": \"魔物娘图鉴\",\n        \"getsuyoubi no tawawa\": \"星期一的丰满\",\n        \"phantasy star\": \"梦幻之星\",\n        \"phantasy star 2\": \"梦幻之星II 不归的终点\",\n        \"phantasy star online\": \"梦幻之星Online\",\n        \"phantasy star online 2\": \"梦幻之星Online 2\",\n        \"phantasy star portable 2\": \"梦幻之星：携带版2\",\n        \"phantasy star universe\": \"梦幻之星 宇宙\",\n        \"phantasy star zero\": \"梦幻之星ZERO\",\n        \"arms\": \"ARMS\",\n        \"astro boy\": \"铁臂阿童木\",\n        \"detective conan\": \"名侦探柯南\",\n        \"ore twintail ni narimasu.\": \"我，要成为双马尾\",\n        \"kiss x sis\": \"亲吻姐姐\",\n        \"kimikiss\": \"君吻\",\n        \"super sonico\": \"超级索尼子\",\n        \"final fantasy\": \"最终幻想\",\n        \"final fantasy ii\": \"最终幻想II\",\n        \"final fantasy iii\": \"最终幻想III\",\n        \"final fantasy iv\": \"最终幻想IV\",\n        \"final fantasy v\": \"最终幻想V\",\n        \"final fantasy vi\": \"最终幻想VI\",\n        \"final fantasy vii\": \"最终幻想VII\",\n        \"final fantasy viii\": \"最终幻想VIII\",\n        \"final fantasy ix\": \"最终幻想IX\",\n        \"final fantasy x\": \"最终幻想X\",\n        \"final fantasy x-2\": \"最终幻想X-2\",\n        \"final fantasy xi\": \"最终幻想XI\",\n        \"final fantasy xii\": \"最终幻想XII\",\n        \"final fantasy xiii\": \"最终幻想XIII\",\n        \"final fantasy xiv\": \"最终幻想XIV\",\n        \"final fantasy xv\": \"最终幻想XV\",\n        \"final fantasy crystal chronicles\": \"最终幻想水晶编年史\",\n        \"final fantasy tactics\": \"最终幻想战略版\",\n        \"final fantasy tactics advance\": \"最终幻想战略版Advance\",\n        \"dissidia final fantasy\": \"最终幻想大乱斗\",\n        \"final fantasy unlimited\": \"最终幻想：无限\",\n        \"final fantasy type-0\": \"最终幻想 零式\",\n        \"kill me baby\": \"爱杀宝贝\",\n        \"shinryaku ika musume\": \"侵略！乌贼娘\",\n        \"one piece\": \"海贼王\",\n        \"dragon ball\": \"龙珠\",\n        \"dragon ball z\": \"龙珠Z\",\n        \"dragon ball gt\": \"龙珠GT\",\n        \"dragon ball super\": \"龙珠超\",\n        \"sakurasou no pet na kanojo\": \"樱花庄的宠物女孩\",\n        \"myriad colors phantom world\": \"无彩限的怪灵世界\",\n        \"soul eater\": \"噬魂师\",\n        \"urara meirochou\": \"Urara迷路帖\",\n        \"ranma 12\": \"乱马½\",\n        \"yosuga no sora\": \"缘之空\",\n        \"fire emblem if\": \"火焰之纹章 if\",\n        \"fire emblem\": \"火焰之纹章\",\n        \"fire emblem awakening\": \"火焰之纹章 觉醒\",\n        \"fire emblem gaiden\": \"火焰之纹章外传\",\n        \"fire emblem seisen no keifu\": \"火焰之纹章 圣战之系谱\",\n        \"fire emblem thracia 776\": \"火焰之纹章 多拉基亚776\",\n        \"fire emblem fuuin no tsurugi\": \"火焰之纹章 封印之剑\",\n        \"fire emblem rekka no ken\": \"火焰之纹章 烈火之剑\",\n        \"fire emblem the sacred stones\": \"火焰之纹章 圣魔之光石\",\n        \"fire emblem path of radiance\": \"火焰之纹章 苍炎之轨迹\",\n        \"fire emblem radiant dawn\": \"火焰之纹章 晓之女神\",\n        \"fire emblem mystery of the emblem\": \"火焰之纹章 纹章之谜\",\n        \"fire emblem heroes\": \"火焰之纹章 英雄\",\n        \"gintama\": \"银魂\",\n        \"panty and stocking with garterbelt\": \"吊带袜天使\",\n        \"kamen rider\": \"假面骑士\",\n        \"kamen rider decade\": \"假面骑士Decade\",\n        \"kamen rider amazon\": \"假面骑士亚马逊\",\n        \"kamen rider wizard\": \"假面骑士Wizard\",\n        \"kamen rider drive\": \"假面骑士Drive\",\n        \"kamen rider ex-aid\": \"假面骑士EX-AID\",\n        \"kamen rider w\": \"假面骑士W\",\n        \"kamen rider hibiki\": \"假面骑士响鬼\",\n        \"kamen rider kabuto\": \"假面骑士Kabuto\",\n        \"kamen rider den-o\": \"假面骑士电王\",\n        \"kamen rider fourze\": \"假面骑士Fourze\",\n        \"kamen rider ooo\": \"假面骑士OOO\",\n        \"kaiji\": \"赌博默示录\",\n        \"my hero academia\": \"我的英雄学院\",\n        \"shinmai maou no testament\": \"新妹魔王的契约者\",\n        \"youjo senki\": \"幼女战记\",\n        \"touken ranbu\": \"刀剑乱舞\",\n        \"teen titans\": \"少年泰坦\",\n        \"undertale\": \"传说之下\",\n        \"five nights at freddys\": \"在弗雷迪的五个夜晚\",\n        \"one punch man\": \"一拳超人\",\n        \"black rock shooter\": \"黑岩射手\",\n        \"dragons crown\": \"龙之皇冠\",\n        \"noir\": \"黑街二人组\",\n        \"guilty crown\": \"罪恶王冠\",\n        \"nana\": \"娜娜\",\n        \"nier\": \"尼尔\",\n        \"nier automata\": \"尼尔：机械纪元\",\n        \"psycho-pass\": \"心理测量者\",\n        \"ben 10\": \"少年骇客\",\n        \"hey arnold\": \"嘿，阿诺德！\",\n        \"bungou stray dogs\": \"文豪Stray Dogs\",\n        \"gugure kokkuri-san\": \"银仙\",\n        \"zootopia\": \"疯狂动物城\",\n        \"umineko no naku koro ni\": \"海猫鸣泣之时\",\n        \"ah my goddess\": \"我的女神\",\n        \"denpa onna to seishun otoko\": \"电波女与青春男\",\n        \"mirai nikki\": \"未来日记\",\n        \"oshiete galko-chan\": \"告诉我！辣妹子酱\",\n        \"eureka 7\": \"交响诗篇\",\n        \"darkstalkers\": \"恶魔战士\",\n        \"x-men\": \"X战警\",\n        \"x-men evolution\": \"X战警：进化\",\n        \"ichigo 100\": \"草莓100%\",\n        \"tonari no kaibutsu-kun\": \"邻座的怪同学\",\n        \"danganronpa\": \"弹丸论破\",\n        \"koutetsujou no kabaneri\": \"甲铁城的卡巴内利\",\n        \"yu-gi-oh\": \"游戏王\",\n        \"yu-gi-oh 5ds\": \"游戏王5D's\",\n        \"yu-gi-oh zexal\": \"游戏王ZEXAL\",\n        \"yu-gi-oh arc-v\": \"游戏王ARC-V\",\n        \"yu-gi-oh gx\": \"游戏王－怪兽之决斗GX\",\n        \"yu-gi-oh vrains\": \"游戏王VRAINS\",\n        \"kimi ni todoke\": \"好想告诉你\",\n        \"akatsuki no yona\": \"晨曦公主\",\n        \"onii-chan dakedo ai sae areba kankeinai yo ne\": \"就算是哥哥，有爱就没问题了，对吧\",\n        \"oniichan no koto nanka zenzen suki janain dakara ne\": \"腹黑妹妹控兄记!!\",\n        \"sora no woto\": \"空之音\",\n        \"occult academy\": \"世纪末超自然学院\",\n        \"gatchaman crowds\": \"科学小飞侠Crowds\",\n        \"saya no uta\": \"沙耶之歌\",\n        \"vividred operation\": \"绯色战姬\",\n        \"kodomo no jikan\": \"萝莉的时间\",\n        \"shuffle\": \"Shuffle!\",\n        \"power rangers\": \"超能战士\",\n        \"rune soldier\": \"魔法战士李维\",\n        \"kirby\": \"星之卡比\",\n        \"sakura quest\": \"樱花任务\",\n        \"aldnoah.zero\": \"ALDNOAH.ZERO\",\n        \"maoyuu maou yuusha\": \"魔王勇者\",\n        \"splatoon\": \"喷射战士\",\n        \"prunus girl\": \"樱桃少女\",\n        \"king of fighters\": \"拳皇\",\n        \"love plus\": \"爱相随\",\n        \"love hina\": \"纯情房东俏房客\",\n        \"akagami no shirayukihime\": \"赤发的白雪姬\",\n        \"minami-ke\": \"南家三姐妹\",\n        \"queens blade\": \"女王之刃\",\n        \"sekirei\": \"鹡鸰女神\",\n        \"yuuki yuuna wa yuusha de aru\": \"结城友奈是勇者\",\n        \"blazblue\": \"苍翼默示录\",\n        \"frame arms girl\": \"机甲少女\",\n        \"busou shinki\": \"武装神姬\",\n        \"bayonetta\": \"猎天使魔女\",\n        \"devil may cry\": \"鬼泣\",\n        \"tekken\": \"铁拳\",\n        \"super mario brothers\": \"超级马力欧兄弟\",\n        \"spider-man\": \"蜘蛛侠\",\n        \"gunsmith cats\": \"猫眼女枪手\",\n        \"puzzle and dragons\": \"智龙迷城\",\n        \"senki zesshou symphogear\": \"战姬绝唱Symphogear\",\n        \"shaman king\": \"通灵王\",\n        \"gegege no kitarou\": \"怪怪怪的鬼太郎\",\n        \"marmalade boy\": \"橘子酱男孩\",\n        \"esper mami\": \"超能力魔美\",\n        \"fushigi no umi no nadia\": \"蓝宝石之谜\",\n        \"martian successor nadesico\": \"机动战舰抚子\",\n        \"kino no tabi\": \"奇诺之旅\",\n        \"infinite ryvius\": \"无限的未知\",\n        \"machine robo\": \"天威勇士\",\n        \"rage of bahamut\": \"巴哈姆特之怒\",\n        \"kono naka ni hitori imouto ga iru\": \"其中1个是妹妹\",\n        \"sailor moon\": \"美少女战士\",\n        \"dog days\": \"犬勇者物语\",\n        \"onegai teacher\": \"拜托了☆老师\",\n        \"onegai twins\": \"拜托了☆双子星\",\n        \"rinne no lagrange\": \"轮回的拉格朗日\",\n        \"monster musume no iru nichijou\": \"魔物娘的相伴日常\",\n        \"black lagoon\": \"黑礁\",\n        \"steven universe\": \"史帝芬宇宙\",\n        \"the legend of zelda\": \"塞尔达传说\",\n        \"totally spies\": \"少女特工组\",\n        \"the legend of korra\": \"科拉传奇\",\n        \"kangoku senkan\": \"监狱战舰\",\n        \"prison school\": \"监狱学园\",\n        \"macross\": \"超时空要塞\",\n        \"the super dimension fortress macross\": \"超时空要塞Macross\",\n        \"macross 7\": \"超时空要塞7\",\n        \"macross frontier\": \"超时空要塞F\",\n        \"macross plus\": \"超时空要塞Plus\",\n        \"macross delta\": \"超时空要塞Δ\",\n        \"macross vf-x\": \"超时空要塞VF-X\",\n        \"little red riding hood\": \"小红帽\",\n        \"gekkan shoujo nozaki-kun\": \"月刊少女野崎君\",\n        \"girl friend beta\": \"临时女友\",\n        \"bakuman\": \"食梦者\",\n        \"nisekoi\": \"伪恋\",\n        \"blade and soul\": \"剑灵\",\n        \"inu x boku ss\": \"妖狐×仆SS\",\n        \"guilty gear\": \"罪恶装备\",\n        \"nanatsu no taizai\": \"七大罪\",\n        \"starcraft\": \"星际争霸\",\n        \"alice in wonderland\": \"爱丽丝梦游仙境\",\n        \"ikkitousen\": \"一骑当千\",\n        \"g.i. joe\": \"特种部队\",\n        \"metroid\": \"银河战士\",\n        \"metal gear solid\": \"合金装备\",\n        \"tomb raider\": \"古墓丽影\",\n        \"xena warrior princess\": \"战士公主西娜\",\n        \"the fifth element\": \"第五元素\",\n        \"terminator\": \"终结者\",\n        \"yurikuma arashi\": \"百合熊风暴\",\n        \"adventure time\": \"探险时光\",\n        \"strike the blood\": \"噬血狂袭\",\n        \"valkyrie drive\": \"女武神驱动\",\n        \"saber marionette\": \"机械女神\",\n        \"dance with devils\": \"与魔共舞\",\n        \"samurai 7\": \"七武士\",\n        \"samurai jack\": \"杰克武士\",\n        \"samurai deeper kyo\": \"鬼眼狂刀\",\n        \"samurai pizza cats\": \"功夫猫党\",\n        \"samurai spirits\": \"侍魂\",\n        \"hyakka ryouran samurai girls\": \"百花缭乱 武士少女\",\n        \"samurai champloo\": \"混沌武士\",\n        \"afro samurai\": \"爆炸头武士\",\n        \"samurai sentai shinkenger\": \"侍战队真剑者\",\n        \"samurai flamenco\": \"武士弗拉明戈\",\n        \"onechambara bikini samurai squad\": \"忌血的继承者\",\n        \"samurai warriors\": \"战国无双\",\n        \"dynasty warriors\": \"真·三国无双\",\n        \"demons souls\": \"恶魔之魂\",\n        \"seiken densetsu\": \"圣剑传说\",\n        \"seiken densetsu 3\": \"圣剑传说3\",\n        \"kore wa zombie desu ka\": \"这个是僵尸吗？\",\n        \"ojamajo doremi\": \"小魔女DoReMi\",\n        \"terra formars\": \"火星异种\",\n        \"spirited away\": \"千与千寻\",\n        \"el hazard\": \"神秘的世界\",\n        \"langrisser\": \"梦幻模拟战\",\n        \"slayers\": \"秀逗魔导士\",\n        \"grendizer\": \"UFO机器人 古连泰沙\",\n        \"keroro gunsou\": \"Keroro军曹\",\n        \"sakura taisen\": \"樱花大战\",\n        \"saint seiya\": \"圣斗士星矢\",\n        \"agent aika\": \"海底娇娃蓝华\",\n        \"city hunter\": \"城市猎人\",\n        \"super robot wars\": \"超级机器人大战\",\n        \"super robot wars w\": \"超级机器人大战W\",\n        \"super robot wars k\": \"超级机器人大战K\",\n        \"super robot wars z 2nd\": \"第2次超级机器人大战Z\",\n        \"endless frontier\": \"无限边界：超级机器人大战OG传说\",\n        \"hellsing\": \"地狱之歌\",\n        \"super black jack\": \"兔女郎的诱惑\",\n        \"hell teacher nube\": \"地狱老师\",\n        \"hitsugi no chaika\": \"棺姬嘉依卡\",\n        \"kishin douji zenki\": \"鬼神童子\",\n        \"muv-luv\": \"Muv-Luv\",\n        \"muv-luv alternative total eclipse\": \"Muv-Luv Alternative Total eclipse\",\n        \"dangaioh\": \"破邪大星弹劾皇\",\n        \"3x3 eyes\": \"三只眼\",\n        \"bakuretsu hunters\": \"爆走猎人\",\n        \"vampire princess miyu\": \"吸血姬美夕\",\n        \"reco love\": \"真爱记录\",\n        \"spice and wolf\": \"狼与香辛料\",\n        \"youkai watch\": \"妖怪手表\",\n        \"battle programmer shirase\": \"战争程序员白濑\",\n        \"kung fu panda\": \"功夫熊猫\",\n        \"star vs. the forces of evil\": \"星蝶公主\",\n        \"the amazing world of gumball\": \"阿甘妙世界\",\n        \"wakfu\": \"沃土\",\n        \"wander over yonder\": \"宇宙小奇兵\",\n        \"batman\": \"蝙蝠侠\",\n        \"resident evil\": \"生化危机\",\n        \"kim possible\": \"麻辣女孩\",\n        \"jinrui wa suitai shimashita\": \"人类衰退之后\",\n        \"miss machiko\": \"真知子老师\",\n        \"gaogaigar\": \"勇者王\",\n        \"hibike euphonium\": \"吹响！上低音号\",\n        \"ragnarok online\": \"仙境传说\",\n        \"no more heroes\": \"英雄不再\",\n        \"akuma no riddle\": \"恶魔之谜\",\n        \"overlord\": \"不死者之王\",\n        \"full ani\": \"Fullani\",\n        \"full metal panic\": \"全金属狂潮\",\n        \"fullmetal alchemist\": \"钢之炼金术师\",\n        \"full moon o sagashite\": \"寻找满月\",\n        \"full metal daemon muramasa\": \"装甲恶鬼村正\",\n        \"futsuu no joshikousei ga locodol yattemita.\": \"普通女高中生要做当地偶像\",\n        \"fallout\": \"辐射\",\n        \"fancy lala\": \"梦幻拉拉\",\n        \"final fight\": \"快打旋风\",\n        \"beauty and the beast\": \"美女与野兽\",\n        \"baka to test to shoukanjuu\": \"笨蛋测验召唤兽\",\n        \"arcana heart\": \"圣灵之心\",\n        \"heroman\": \"HEROMAN\",\n        \"anyamaru tantei kiruminzoo\": \"动物侦探奇鲁米\",\n        \"kyoukai senjou no horizon\": \"境界线上的地平线\",\n        \"rwby\": \"RWBY\",\n        \"lupin iii\": \"鲁邦三世\",\n        \"ensemble stars\": \"偶像梦幻祭\",\n        \"ajin\": \"亚人\",\n        \"kingdom hearts\": \"王国之心\",\n        \"tobaku haouden zero\": \"赌博霸王传 零\",\n        \"kannazuki no miko\": \"神无月的巫女\",\n        \"haikyuu\": \"排球少年!!\",\n        \"free\": \"Free! 男子游泳部\",\n        \"itsuka tenma no kuro usagi\": \"曾几何时天魔的黑兔\",\n        \"magic knight rayearth\": \"魔法骑士雷亚斯\",\n        \"kochikame\": \"乌龙派出所\",\n        \"bakusou kyoudai lets and go\": \"四驱兄弟\",\n        \"the powerpuff girls\": \"飞天小女警\",\n        \"powerpuff girls z\": \"飞天小女警Z\",\n        \"omoikkiri kagaku adventure sou nanda\": \"充满干劲十足的科学冒险—神秘智慧石\",\n        \"wedding peach\": \"爱天使传说 婚纱桃子\",\n        \"fushigiboshi no futagohime\": \"不可思议星球的☆双胞胎公主\",\n        \"aquarion\": \"创圣的亚库艾里翁\",\n        \"aquarion logos\": \"创圣的亚库艾里翁LOGOS\",\n        \"aquarion evol\": \"创圣的亚库艾里翁EVOL\",\n        \"welcome to the n.h.k.\": \"欢迎加入NHK！\",\n        \"sakurako-san no ashimoto ni wa shitai ga umatteiru\": \"樱子小姐的脚下埋着尸体\",\n        \"shimoneta to iu gainen ga sonzai shinai taikutsu na sekai\": \"下流梗不存在的灰暗世界\",\n        \"kyonyuu fantasy\": \"巨乳幻想\",\n        \"puyo puyo\": \"噗哟噗哟\",\n        \"kaku-san-sei million arthur\": \"扩散性百万亚瑟王\",\n        \"genji tsuushin agedama\": \"电脑小奇侠\",\n        \"dennou coil\": \"电脑线圈\",\n        \"god eater\": \"噬神者\",\n        \"demi-chan wa kataritai\": \"亚人酱有话要说\",\n        \"akazukin chacha\": \"小红帽恰恰\",\n        \"idol janshi suchie-pai\": \"美少女雀士\",\n        \"twin angels\": \"淫兽圣战\",\n        \"shadow lady\": \"月光淑女\",\n        \"oboro muramasa\": \"胧村正\",\n        \"zettai bouei leviathan\": \"绝对防卫利维坦\",\n        \"tokimeki memorial\": \"心跳回忆\",\n        \"future card buddyfight\": \"未来卡 搭档对战\",\n        \"fun fun pharmacy\": \"不可思议魔法药店\",\n        \"aiura\": \"校园日记 AIURA\",\n        \"gokujou seitokai\": \"极上学生会\",\n        \"show by rock\": \"Show By Rock!!\",\n        \"star fox\": \"星际火狐\",\n        \"white album\": \"白色相簿❄\",\n        \"tenchi muyo\": \"天地无用！\",\n        \"variable geo\": \"格斗女神\",\n        \"ashita no nadja\": \"明日的娜嘉\",\n        \"goldfish warning\": \"魔力小金鱼\",\n        \"mazinger z\": \"魔神Z\",\n        \"magi the labyrinth of magic\": \"魔笛MAGI\",\n        \"ultraman\": \"奥特曼\",\n        \"we bare bears\": \"咱们裸熊\",\n        \"gravity falls\": \"怪诞小镇\",\n        \"karakai jouzu no takagi-san\": \"擅长捉弄人的高木同学\",\n        \"goshogun\": \"战国魔神豪将军\",\n        \"plawres sanshiro\": \"无敌三四郎\",\n        \"hime-chans ribbon\": \"缎带魔法少女\",\n        \"taimanin asagi\": \"对魔忍阿莎姬\",\n        \"makai kishi ingrid\": \"魔界骑士英格丽德\",\n        \"taimanin yukikaze\": \"对魔忍雪风\",\n        \"kick-ass\": \"海扁王\",\n        \"gad guard\": \"钢铁守护者\",\n        \"tears to tiara\": \"提亚拉之泪\",\n        \"tenshi no inai 12-gatsu\": \"天使不在的12月\",\n        \"comic party\": \"漫画同人会\",\n        \"kizuato\": \"痕\",\n        \"sentimental graffiti\": \"青涩宝贝\",\n        \"bleach\": \"死神\",\n        \"hayate no gotoku\": \"旋风管家\",\n        \"yoake mae yori ruriiro na\": \"更胜黎明前的琉璃色\",\n        \"fortune arterial\": \"FORTUNE ARTERIAL\",\n        \"princess holiday\": \"公主假日 ~回转苹果亭的一千零一夜~\",\n        \"tsuki wa higashi ni hi wa nishi ni\": \"东月西阳\",\n        \"daitoshokan no hitsujikai\": \"大图书馆的牧羊人\",\n        \"aiyoku no eustia\": \"秽翼的尤斯蒂娅\",\n        \"rokka no yuusha\": \"六花的勇者\",\n        \"seiren\": \"清恋\",\n        \"oniisama e...\": \"亲亲天使心\",\n        \"long riders\": \"长骑美眉\",\n        \"flower knight girl\": \"美少女花骑士\",\n        \"mitsudomoe\": \"超元气三姐妹\",\n        \"no-rin\": \"农林\",\n        \"space battleship yamato\": \"宇宙战舰大和号\",\n        \"utawarerumono\": \"传颂之物\",\n        \"utawarerumono itsuwari no kamen\": \"传颂之物 虚伪的假面\",\n        \"highschool dxd\": \"恶魔高校D×D\",\n        \"the world god only knows\": \"只有神知道的世界\",\n        \"mabinogi\": \"洛奇\",\n        \"m.u.g.e.n\": \"MUGEN\",\n        \"summon night\": \"召唤之夜\",\n        \"mai-hime\": \"舞-HiME\",\n        \"mai-otome\": \"舞-乙HiME\",\n        \"hyouka\": \"冰菓\",\n        \"ookami-san to shichinin no nakama-tachi\": \"大神与七位伙伴\",\n        \"machine-doll wa kizutsukanai\": \"机巧少女不会受伤\",\n        \"its not my fault that im not popular\": \"我不受欢迎，怎么想都是你们的错！\",\n        \"mouretsu pirates\": \"迷你裙宇宙海贼\",\n        \"gantz\": \"杀戮都市\",\n        \"angry birds\": \"愤怒的小鸟\",\n        \"zero kara hajimeru mahou no sho\": \"从零开始的魔法书\",\n        \"knights of sidonia\": \"希德尼娅的骑士\",\n        \"sket dance\": \"学园救援团\",\n        \"summer wars\": \"夏日大作战\",\n        \"flcl\": \"特别的她\",\n        \"the girl who leapt through time\": \"穿越时空的少女\",\n        \"inazuma eleven\": \"闪电十一人\",\n        \"battle royale\": \"大逃杀\",\n        \"archaic sealed heat\": \"远古封印之炎\",\n        \"fruits basket\": \"水果篮子\",\n        \"tari tari\": \"TARI TARI\",\n        \"the legend of heroes\": \"英雄传说\",\n        \"the legend of the legendary heroes\": \"传说中勇者的传说\",\n        \"the last of us\": \"最后生还者\",\n        \"wall-e\": \"机器人总动员\",\n        \"alpha teens on machines\": \"A.T.O.M.\",\n        \"tera\": \"神谕之战\",\n        \"digimon\": \"数码宝贝\",\n        \"digimon adventure\": \"数码宝贝大冒险\",\n        \"digimon tamers\": \"数码宝贝03驯兽师之王\",\n        \"digimon frontier\": \"数码宝贝04无限地带\",\n        \"digimon savers\": \"数码宝贝05拯救者\",\n        \"digimon xros wars\": \"数码宝贝06合体战争\",\n        \"digimon universe appli monsters\": \"数码宝贝宇宙-应用怪兽\",\n        \"snow white and the seven dwarfs\": \"白雪公主和七个小矮人\",\n        \"shadowverse\": \"影之诗\",\n        \"eyeshield 21\": \"光速跑者21号\",\n        \"skullgirls\": \"骷髅女孩\",\n        \"the ring\": \"午夜凶铃\",\n        \"the lord of the rings\": \"指环王\",\n        \"the matrix\": \"黑客帝国\",\n        \"evil dead\": \"鬼玩人\",\n        \"from dusk till dawn\": \"杀出个黎明\",\n        \"the sims\": \"模拟人生\",\n        \"the big o\": \"魅影巨神\",\n        \"the lion king\": \"狮子王\",\n        \"frozen\": \"冰雪奇缘\",\n        \"mortal kombat\": \"格斗之王\",\n        \"aladdin\": \"阿拉丁\",\n        \"the little mermaid\": \"小美人鱼\",\n        \"atlantis the lost empire\": \"亚特兰蒂斯：失落的帝国\",\n        \"sengoku otome\": \"战国少女～桃色异传～\",\n        \"monster hunter\": \"怪物猎人\",\n        \"sennen sensou aigis\": \"千年战争Aigis\",\n        \"star ocean 3\": \"星之海洋3\",\n        \"kokoro connect\": \"心灵链环\",\n        \"robopon\": \"机甲宝贝\",\n        \"upotte\": \"枪械少女!!\",\n        \"tokyo mew mew\": \"东京喵喵\",\n        \"mahoromatic\": \"魔力女管家\",\n        \"sister princess\": \"妹妹公主\",\n        \"ace attorney\": \"逆转裁判\",\n        \"tiger and bunny\": \"老虎和兔子\",\n        \"ghost in the shell\": \"攻壳机动队\",\n        \"hunter x hunter\": \"全职猎人\",\n        \"howls moving castle\": \"哈尔的移动城堡\",\n        \"kikis delivery service\": \"魔女宅急便\",\n        \"ace combat\": \"皇牌空战\",\n        \"mermaid melody pichi pichi pitch\": \"人鱼的旋律\",\n        \"attack no. 1\": \"女排No.1\",\n        \"devilman\": \"恶魔人\",\n        \"la seine no hoshi\": \"月光女侠\",\n        \"winx club\": \"魔法俏佳人\",\n        \"cats eye\": \"猫眼三姐妹\",\n        \"transformers\": \"变形金刚\",\n        \"high school fleet\": \"高校舰队\",\n        \"shinmai fukei kiruko-san\": \"新人女警斩子小姐\",\n        \"how to train your dragon\": \"驯龙高手\",\n        \"hacka doll\": \"骇客娃娃\",\n        \"kaiju girls\": \"怪兽娘\",\n        \"shinrabansho\": \"神罗万象\",\n        \"azumanga daioh\": \"阿滋漫画大王\",\n        \"galaxy fight\": \"银河快打\",\n        \"youkai hyakkitan\": \"妖怪百姬谭\",\n        \"papa no iu koto wo kikinasai\": \"要听爸爸的话！\",\n        \"himegoto\": \"搞姬日常\",\n        \"nogizaka haruka no himitsu\": \"乃木坂春香的秘密\",\n        \"south park\": \"南方公园\",\n        \"soushin shoujo matoi\": \"装神少女小缠\",\n        \"kindaichi shounen no jikenbo\": \"金田一少年事件簿\",\n        \"kekkai sensen\": \"血界战线\",\n        \"tokyo afterschool summoners\": \"东京放课后召唤师\",\n        \"saga frontier\": \"沙加开拓者\",\n        \"twelve kingdoms\": \"十二国记\",\n        \"atelier series\": \"炼金工作室\",\n        \"atelier marie\": \"玛莉的工作室\",\n        \"atelier elie\": \"艾莉的工作室\",\n        \"atelier lilie\": \"莉莉的工作室\",\n        \"atelier judie\": \"尤蒂的工作室\",\n        \"atelier iris\": \"伊莉斯的工作室\",\n        \"mana khemia\": \"玛娜传奇\",\n        \"atelier rorona\": \"罗罗娜的工作室\",\n        \"atelier totori\": \"托托莉的工作室\",\n        \"atelier meruru\": \"梅露露的工作室\",\n        \"atelier ayesha\": \"爱夏的工作室\",\n        \"atelier escha and logy\": \"艾斯卡与罗吉的工作室\",\n        \"atelier shallie\": \"夏莉的工作室\",\n        \"atelier sophie\": \"索菲的工作室\",\n        \"atelier firis\": \"菲莉丝的工作室\",\n        \"atelier lulua\": \"露露亚的工作室\",\n        \"atelier ryza\": \"莱莎的工作室\",\n        \"atelier lina\": \"莉娜的工作室\",\n        \"my neighbor totoro\": \"龙猫\",\n        \"professor layton\": \"雷顿教授\",\n        \"bubblegum crisis\": \"泡泡糖危机\",\n        \"kamikaze kaitou jeanne\": \"神风怪盗贞德\",\n        \"boruto\": \"博人传\",\n        \"kuromukuro\": \"黑骸\",\n        \"minecraft\": \"我的世界\",\n        \"world masterpiece theater\": \"世界名作剧场\",\n        \"the adventures of tom sawyer\": \"汤姆·索亚历险记\",\n        \"les miserables shoujo cosette\": \"悲惨世界 少女珂赛特\",\n        \"lucy of the southern rainbow\": \"南方彩虹的露西\",\n        \"tico of the seven seas\": \"七海的堤可\",\n        \"space adventure cobra\": \"哥布拉传奇\",\n        \"cutey honey\": \"甜心战士\",\n        \"megazone 23\": \"无限地带23\",\n        \"ganbare robocon\": \"加油啊！！小露宝\",\n        \"moero robocon\": \"燃烧吧！！小露宝\",\n        \"rainbow sentai robin\": \"彩虹战队罗宾\",\n        \"remi nobodys girl\": \"无家可归的孩子蕾米\",\n        \"revolutionary girl utena\": \"少女革命\",\n        \"corrector yui\": \"Cyber守护星\",\n        \"steel angel kurumi\": \"钢铁天使胡桃\",\n        \"zoids\": \"ZOIDS\",\n        \"world of warcraft\": \"魔兽世界\",\n        \"diablo\": \"暗黑破坏神\",\n        \"star trek\": \"星际迷航\",\n        \"binan koukou chikyuu bouei-bu love\": \"美男高校地球防卫部LOVE!\",\n        \"asobi ni iku yo\": \"玩伴猫耳娘\",\n        \"assassins creed\": \"刺客信条\",\n        \"peter pan\": \"小飞侠\",\n        \"romeos blue skies\": \"罗密欧的蓝天\",\n        \"3000 leagues in search of mother\": \"三千里寻母记\",\n        \"alps no shoujo heidi\": \"阿尔卑斯山的少女\",\n        \"anne of green gables\": \"绿山墙的安妮\",\n        \"futari no lotte\": \"我与我 两个绿蒂\",\n        \"katri girl of the meadows\": \"牧场上的少女卡特莉\",\n        \"the bush baby\": \"大草原上的小天使 灌丛婴猴\",\n        \"the story of perrine\": \"佩琳物语\",\n        \"dr. slump\": \"阿拉蕾\",\n        \"zettai muteki raijin-oh\": \"绝对无敌\",\n        \"dirty pair\": \"搞怪拍档\",\n        \"ai no wakakusa monogatari\": \"爱的小妇人物语\",\n        \"the story of pollyanna\": \"爱少女波丽安娜物语\",\n        \"princess sarah\": \"小公主莎拉\",\n        \"tobe isami\": \"伊沙米大冒险\",\n        \"doraemon\": \"哆啦A梦\",\n        \"pretty sammy\": \"魔法少女砂沙美\",\n        \"ochame na futago\": \"青葱岁月\",\n        \"miracle girl limit-chan\": \"奇迹少女理美\",\n        \"mahou no yousei persia\": \"魔法妖精贝露莎\",\n        \"minky momo\": \"魔法公主明琪桃子\",\n        \"majokko megu-chan\": \"魔女Megu\",\n        \"creamy mami\": \"我是小甜甜\",\n        \"magical angel sweet mint\": \"欢欢仙子\",\n        \"sally the witch\": \"魔法使莎莉\",\n        \"mahou shoujo lalabel\": \"魔法少女拉拉贝尔\",\n        \"hana no ko lunlun\": \"花仙子\",\n        \"magical emi\": \"魔法之星爱美\",\n        \"floral magician mary bell\": \"俏皮小花仙\",\n        \"mahou tsukai chappy\": \"魔法使恰比\",\n        \"marvelous melmo\": \"神奇糖\",\n        \"pastel yumi\": \"魔法偶像神笔由美\",\n        \"laputa castle in the sky\": \"天空之城\",\n        \"appleseed\": \"苹果核战记\",\n        \"himitsu no akko-chan\": \"亚子的秘密\",\n        \"yawara\": \"以柔克刚\",\n        \"cyborg 009\": \"人造人009\",\n        \"future boy conan\": \"未来少年柯南\",\n        \"muka muka paradise\": \"为食龙少爷\",\n        \"the goose that laid the golden eggs\": \"下金蛋的鹅\",\n        \"andersen monogatari\": \"安徒生童话\",\n        \"cinderella\": \"灰姑娘\",\n        \"k.o. beast\": \"KO世纪三兽士\",\n        \"trapp family story\": \"崔普一家物语\",\n        \"wakakusa monogatari nan to jo-sensei\": \"小妇人物语 南与乔老师\",\n        \"watashi no ashinaga ojisan\": \"长腿叔叔\",\n        \"nurse angel ririka sos\": \"守护天使莉莉佳\",\n        \"youre under arrest\": \"逮捕令\",\n        \"phantom quest corp\": \"幽幻怪社\",\n        \"urusei yatsura\": \"福星小子\",\n        \"attacker you\": \"胜利女排\",\n        \"giant gorg\": \"巨神GORG\",\n        \"gunslinger girl\": \"神枪少女\",\n        \"yu yu hakusho\": \"幽游白书\",\n        \"stella no mahou\": \"斯特拉的魔法\",\n        \"hinako note\": \"雏子的笔记\",\n        \"hoozuki no reitetsu\": \"鬼灯的冷彻\",\n        \"daiya no ace\": \"钻石王牌\",\n        \"durarara\": \"无头骑士异闻录 DuRaRaRa!!\",\n        \"supernatural\": \"邪恶力量\",\n        \"koi to senkyo to chocolate\": \"恋爱与选举与巧克力\",\n        \"goblin slayer\": \"哥布林杀手\",\n        \"dungeon meshi\": \"迷宫饭\",\n        \"kanokon\": \"我的狐仙女友\",\n        \"ladies versus butlers\": \"大小姐×执事！\",\n        \"arpeggio of blue steel\": \"苍蓝钢铁的琶音\",\n        \"maken-ki\": \"魔剑姬！\",\n        \"expelled from paradise\": \"乐园追放 -Expelled from Paradise-\",\n        \"glasslip\": \"玻璃之唇\",\n        \"hanasaku iroha\": \"花开伊吕波\",\n        \"akaneiro ni somaru saka\": \"茜色染红的街道\",\n        \"hoshizora e kakaru hashi\": \"架向星空之桥\",\n        \"gj-bu\": \"GJ部\",\n        \"kaze no yojimbo\": \"旋风之用心棒\",\n        \"kishin taisen gigantic formula\": \"机神大战-巨型方程式\",\n        \".hack\": \".hack\",\n        \".hacksign\": \".hack//SIGN\",\n        \".hackg.u.\": \".hack//G.U.\",\n        \".hackroots\": \".hack//Roots\",\n        \".hacklegend of the twilight\": \".hack//黄昏的腕轮传说\",\n        \"log horizon\": \"记录的地平线\",\n        \"kamisama minarai himitsu no cocotama\": \"见习神明 秘密的COCOTAMA\",\n        \"phantom of inferno\": \"幻灵镇魂曲\",\n        \"dramatical murder\": \"戏剧性谋杀\",\n        \"robotics notes\": \"机器人笔记\",\n        \"rampo kitan game of laplace\": \"乱步奇谭 拉普拉斯的游戏\",\n        \"gravity rush\": \"重力眩晕\",\n        \"cowboy bebop\": \"星际牛仔\",\n        \"wii fit\": \"Wii Fit\",\n        \"uta no prince-sama\": \"歌之王子殿下\",\n        \"hime chen otogi chikku idol lilpri\": \"变身！公主偶像\",\n        \"ib\": \"Ib\",\n        \"ichigo mashimaro\": \"草莓棉花糖\",\n        \"yuusha ni narenakatta ore wa shibushibu shuushoku wo ketsui shimashita.\": \"当不成勇者的我，只好认真找工作了。\",\n        \"chrono crusade\": \"圣枪修女\",\n        \"lost universe\": \"宇宙刑警\",\n        \"amanchu\": \"蓝海少女！\",\n        \"mangaka-san to assistant-san to\": \"漫画家与助手\",\n        \"sisters natsu no saigo no hi\": \"SISTERS～夏最后之日～\",\n        \"tokyo 7th sisters\": \"东京 7th Sisters\",\n        \"7th dragon\": \"第七龙神\",\n        \"project blue earth sos\": \"蓝色计划-地球SOS\",\n        \"sakura hime\": \"樱姬华传\",\n        \"the 3rd birthday\": \"第三次生日\",\n        \"asuka 120\": \"飞鸟120% 燃烧的学园祭\",\n        \"jumping rabbit\": \"小兔飞飞\",\n        \"the fairly oddparents\": \"反斗家族\",\n        \"amagami\": \"圣诞之吻\",\n        \"fosters home for imaginary friends\": \"亲亲麻吉\",\n        \"futurama\": \"飞出个未来\",\n        \"kimi ga yobu megiddo no oka de\": \"你在米吉多之丘的呼唤\",\n        \"kuroko no basuke\": \"黑子的篮球\",\n        \"boku to maou\": \"魔王与我\",\n        \"cerberus\": \"刻耳柏洛斯\",\n        \"robot girls z\": \"机器人少女Z\",\n        \"akibas trip\": \"秋叶原之旅\",\n        \"bravely default\": \"勇气默示录\",\n        \"madan no ou to vanadis\": \"魔弹之王与战姬\",\n        \"star driver\": \"STAR DRIVER 闪亮的塔科特\",\n        \"tales of\": \"传说\",\n        \"tales of phantasia\": \"幻想传说\",\n        \"tales of destiny\": \"宿命传说\",\n        \"tales of eternia\": \"永恒传说\",\n        \"tales of symphonia\": \"仙乐传说\",\n        \"tales of rebirth\": \"重生传说\",\n        \"tales of legendia\": \"遗迹传说\",\n        \"tales of the abyss\": \"深渊传说\",\n        \"tales of innocence\": \"圣洁传说\",\n        \"tales of vesperia\": \"薄暮传说\",\n        \"tales of hearts\": \"心灵传说\",\n        \"tales of graces\": \"圣恩传说\",\n        \"tales of xillia\": \"无尽传说\",\n        \"tales of zestiria\": \"情热传说\",\n        \"tales of berseria\": \"狂战传说\",\n        \"tales of asteria\": \"星彩传说\",\n        \"little witch academia\": \"小魔女学园\",\n        \"rokudenashi majutsu koushi to akashic records\": \"不正经的魔术讲师与禁忌教典\",\n        \"martial champion\": \"武术冠军\",\n        \"virtua fighter\": \"VR战士\",\n        \"muscle bomber\": \"摔跤霸王\",\n        \"aria\": \"水星领航员\",\n        \"rozen maiden\": \"蔷薇少女\",\n        \"soulcalibur\": \"魂之系列\",\n        \"empowered\": \"Empowered\",\n        \"parasite eve\": \"寄生前夜\",\n        \"predator\": \"铁血战士\",\n        \"underworld\": \"黑夜传说\",\n        \"danny phantom\": \"幻影丹尼\",\n        \"the loud house\": \"喧闹一家亲\",\n        \"nodame cantabile\": \"交响情人梦\",\n        \"another\": \"Another\",\n        \"valkyria chronicles\": \"战场女武神\",\n        \"princess lover\": \"公主恋人\",\n        \"witchblade\": \"魔女之刃\",\n        \"warship girls\": \"战舰少女\",\n        \"sexfriend\": \"SEXFRIEND\",\n        \"school days\": \"日在校园\",\n        \"walkure romanze\": \"少女骑士物语\",\n        \"majin bone\": \"魔神之骨\",\n        \"starry sky\": \"Starry☆Sky\",\n        \"amano megumi ha sukidarake\": \"天野惠浑身是破绽！\",\n        \"yowamushi pedal\": \"飚速宅男\",\n        \"black cat\": \"黑猫\",\n        \"superjail\": \"超级监狱\",\n        \"superman\": \"超人\",\n        \"iron man\": \"钢铁侠\",\n        \"iron man armored adventures\": \"钢铁侠：装甲冒险\",\n        \"jackie chan adventures\": \"成龙历险记\",\n        \"avengers\": \"复仇者联盟\",\n        \"monster\": \"怪物\",\n        \"jungle wa itsumo hare nochi guu\": \"热带雨林的爆笑生活\",\n        \"w.i.t.c.h.\": \"魔力W.i.t.c.h.\",\n        \"ninja gaiden\": \"忍者外传\",\n        \"otome wa boku ni koishiteru\": \"少女爱上姐姐\",\n        \"fairy tail\": \"妖精的尾巴\",\n        \"oni chichi\": \"鬼父\",\n        \"clamp gakuen tanteidan\": \"CLAMP学园侦探团\",\n        \"soredemo machi wa mawatteiru\": \"女仆咖啡厅\",\n        \"happy tree friends\": \"欢乐树的朋友们\",\n        \"kare kano\": \"他和她的事情\",\n        \"spongebob squarepants\": \"海绵宝宝\",\n        \"wizard of oz\": \"绿野仙踪\",\n        \"cream lemon\": \"乳霜柠檬\",\n        \"dream c club\": \"梦幻俱乐部\",\n        \"katekyo hitman reborn\": \"家庭教师HITMAN REBORN!\",\n        \"tsugumomo\": \"怪怪守护神\",\n        \"the simpsons\": \"辛普森一家\",\n        \"ano natsu de matteru\": \"在盛夏等待\",\n        \"net ghost pipopa\": \"网络精灵PIPOPA\",\n        \"dominion tank police\": \"特搜战车队\",\n        \"ruin explorers\": \"秘境探险\",\n        \"streets of rage\": \"怒之铁拳\",\n        \"yume no crayon oukoku\": \"梦之蜡笔王国\",\n        \"megaman\": \"洛克人\",\n        \"megaman zero\": \"洛克人ZERO\",\n        \"megaman zx\": \"洛克人ZX\",\n        \"mega man x\": \"洛克人X\",\n        \"megaman battle network\": \"洛克人EXE\",\n        \"mega man legends\": \"洛克人DASH\",\n        \"mega man star force\": \"流星洛克人\",\n        \"konjiki no gash\": \"金色的卡修\",\n        \"super doll licca-chan\": \"丽佳公主\",\n        \"kasumin\": \"妙妙魔法屋\",\n        \"di gi charat\": \"铃铛猫娘\",\n        \"lamento\": \"挽歌\",\n        \"dexters laboratory\": \"德克斯特的实验室\",\n        \"mahoujin guru guru\": \"咕噜咕噜魔法阵\",\n        \"mon colle knights\": \"六门天外\",\n        \"is\": \"I\\\"s\",\n        \"beast wars\": \"百变金刚\",\n        \"wonder project j2\": \"J计划2\",\n        \"nights into dreams...\": \"梦精灵\",\n        \"waku waku 7\": \"火热火热7\",\n        \"okusan\": \"新手人妻\",\n        \"gakkou no kaidan\": \"学校怪谈\",\n        \"gear fighter dendoh\": \"GEAR战士电童\",\n        \"hand maid may\": \"袖珍女侍小梅\",\n        \"vandread\": \"银河冒险战记\",\n        \"mahou shoujo ai\": \"魔法少女爱\",\n        \"ys\": \"伊苏\",\n        \"yumeria\": \"梦物语\",\n        \"re creators\": \"Re:CREATORS\",\n        \"gasaraki\": \"饿沙罗鬼\",\n        \"yuyushiki\": \"悠悠式\",\n        \"sonic the hedgehog\": \"刺猬索尼克\",\n        \"beat blades haruka\": \"超昂闪忍遥\",\n        \"hikaru no go\": \"棋魂\",\n        \"rosenkreuzstilette\": \"蔷薇十字小剑\",\n        \"kuon no kizuna\": \"久远之绊\",\n        \"viper gts\": \"蝰蛇GTS\",\n        \"dragon age\": \"龙腾世纪\",\n        \"nyan koi\": \"猫愿三角恋\",\n        \"another lady innocent\": \"Front Innocent\",\n        \"historys strongest disciple kenichi\": \"史上最强弟子兼一\",\n        \"growlanser\": \"梦幻骑士\",\n        \"kono bijutsubu ni wa mondai ga aru\": \"这个美术社大有问题！\",\n        \"seikon no qwaser\": \"圣痕炼金士\",\n        \"high school kimengumi\": \"高校奇面组\",\n        \"onmyou taisenki\": \"阴阳大战记\",\n        \"ao no kanata no four rhythm\": \"苍之彼方的四重奏\",\n        \"captain commando\": \"名将\",\n        \"voltage fighter gowcaizer\": \"超人学园钢帝王\",\n        \"legend of lemnear\": \"极黑之翼\",\n        \"duel masters\": \"决斗大师\",\n        \"battle spirits\": \"战斗之魂\",\n        \"galaxy express 999\": \"银河铁道999\",\n        \"gaiking\": \"新大空魔龙\",\n        \"girls frontline\": \"少女前线\",\n        \"zettai karen children\": \"绝对可怜CHILDREN\",\n        \"selector infected wixoss\": \"选择感染者WIXOSS\",\n        \"chain chronicle\": \"锁链战记\",\n        \"the vision of escaflowne\": \"圣天空战记\",\n        \"kodomo no omocha\": \"玩偶游戏\",\n        \"quiz nanairo dreams\": \"七彩梦\",\n        \"rival schools\": \"私立正义学园\",\n        \"medabots\": \"徽章战士\",\n        \"zettai junpaku mahou shoujo\": \"绝对纯白魔法少女\",\n        \"namiuchigiwa no muromi-san\": \"人鱼又上钩\",\n        \"kuttsukiboshi\": \"紧扣的星星\",\n        \"maria-sama ga miteru\": \"圣母在上\",\n        \"youkoso jitsuryoku shijou shugi no kyoushitsu e\": \"欢迎来到实力至上主义的教室\",\n        \"kakegurui\": \"狂赌之渊\",\n        \"hajimete no gal\": \"第一次的辣妹\",\n        \"medaka box\": \"最强会长黑神\",\n        \"suisei no gargantia\": \"翠星之加尔刚蒂亚\",\n        \"mayo chiki\": \"迷茫管家与懦弱的我\",\n        \"rance\": \"兰斯\",\n        \"brave police j-decker\": \"勇者警察\",\n        \"witch craft works\": \"魔女的使命\",\n        \"heavy object\": \"重装武器\",\n        \"baby princess\": \"宝贝公主\",\n        \"bioshock\": \"生化奇兵\",\n        \"bioshock infinite\": \"生化奇兵：无限\",\n        \"akame ga kill\": \"斩·赤红之瞳！\",\n        \"harry potter\": \"哈利波特\",\n        \"tom and jerry\": \"猫和老鼠\",\n        \"mahouka koukou no rettousei\": \"魔法科高中的劣等生\",\n        \"euphoria\": \"euphoria\",\n        \"tangled\": \"长发公主\",\n        \"inside out\": \"头脑特工队\",\n        \"danball senki\": \"纸箱战机\",\n        \"hyper police\": \"猫狐警探\",\n        \"cosmic baton girl comet-san\": \"彗星公主\",\n        \"zone of the enders\": \"终极地带\",\n        \"photo kano\": \"写真女友\",\n        \"the kabocha wine\": \"南瓜酒\",\n        \"joshi shougakusei hajimemashita\": \"今天开始当女子小学生\",\n        \"cardfight vanguard\": \"卡片战斗先导者\",\n        \"the onechanbara\": \"THE 御姐玫瑰\",\n        \"gosick\": \"GOSICK\",\n        \"beyblade\": \"战斗陀螺\",\n        \"big hero 6\": \"超能陆战队\",\n        \"yuragisou no yuuna-san\": \"汤摇庄的幽奈同学\",\n        \"teekyuu\": \"女高网球部\",\n        \"jinsei\": \"人生\",\n        \"rail wars\": \"RAIL WARS! -日本国有铁道公安队-\",\n        \"rokujouma no shinryakusha\": \"三坪房间的侵略者！？\",\n        \"sabagebu\": \"生存游戏社\",\n        \"occultic nine\": \"超自然9人组\",\n        \"fist of the north star\": \"北斗神拳\",\n        \"monster girl quest\": \"勇者大战魔物娘\",\n        \"ghost sweeper mikami\": \"GS美神 极乐大作战！！\",\n        \"battle athletes\": \"大运动会\",\n        \"knights of ramune\": \"柠檬汽水骑士\",\n        \"saint tail\": \"怪盗圣少女\",\n        \"kyouran kazoku nikki\": \"狂乱家族日记\",\n        \"2x2 shinobuden\": \"酷伊忍者传\",\n        \"marriage royale\": \"皇家新娘\",\n        \"choukou tenshi escalayer\": \"超昂天使 Escalayer\",\n        \"mahou senshi sweet knights\": \"魔法战士 Sweet Knights\",\n        \"read or die\": \"R.O.D\",\n        \"uchuu no stellvia\": \"宇宙星路\",\n        \"ore monogatari\": \"俺物语!!\",\n        \"yuruyuri\": \"摇曳百合\",\n        \"death note\": \"死亡笔记\",\n        \"cooking papa\": \"妙厨老爹\",\n        \"rumble roses\": \"火爆玫瑰\",\n        \"genshiken\": \"现视研\",\n        \"pia carrot e youkoso\": \"欢迎来到Pia Carrot!!\",\n        \"pia carrot e youkoso 2\": \"欢迎来到Pia Carrot!!2\",\n        \"pia carrot e youkoso 3\": \"欢迎来到Pia Carrot!!3\",\n        \"bokutachi wa benkyou ga dekinai\": \"我们真的学不来\",\n        \"netoge no yome wa onnanoko ja nai to omotta\": \"线上游戏的老婆不可能是女生？\",\n        \"schoolgirl strikers\": \"学园少女突袭者\",\n        \"danna ga nani o itteiru ka wakaranai ken\": \"关于完全听不懂老公在说什么的事\",\n        \"golden sun\": \"黄金太阳\",\n        \"the grim adventures of billy and mandy\": \"爱酷一族\",\n        \"inspector gadget\": \"神探加杰特\",\n        \"the life and times of juniper lee\": \"魔法少女Juniper Lee\",\n        \"sousei no onmyouji\": \"双星之阴阳师\",\n        \"sengoku collection\": \"战国Collection\",\n        \"doctor strange\": \"奇异博士\",\n        \"knights and magic\": \"骑士&魔法\",\n        \"mahou shoujo ikusei keikaku\": \"魔法少女育成计划\",\n        \"arslan senki\": \"亚尔斯兰战记\",\n        \"chousoku henkei gyrozetter\": \"超速变形螺旋杰特\",\n        \"kengan ashura\": \"拳愿阿修罗\",\n        \"tonari no miko-san wa minna warau\": \"邻家的巫女在微笑\",\n        \"aikatsu\": \"偶活学园！\",\n        \"aho-girl\": \"笨女孩\",\n        \"azur lane\": \"碧蓝航线\",\n        \"isekai shokudou\": \"异世界食堂\",\n        \"baccano\": \"永生之酒\",\n        \"berserk\": \"剑风传奇\",\n        \"isekai wa smartphone to tomo ni.\": \"带着智能手机闯荡异世界。\",\n        \"atelier tanaka\": \"田中是年龄=没女朋友的魔法师\",\n        \"servant x service\": \"跟班×服务\",\n        \"bakuon\": \"爆音少女！！\",\n        \"inou-battle wa nichijou-kei no naka de\": \"日常系的异能战斗\",\n        \"denkigai no honya-san\": \"电器街的漫画店\",\n        \"bladedance of elementalers\": \"精灵使的剑舞\",\n        \"da capo\": \"初音岛\",\n        \"da capo ii\": \"初音岛II\",\n        \"da capo iii\": \"初音岛III\",\n        \"tejina senpai\": \"魔术前辈\",\n        \"valkyrie no bouken\": \"女武士大冒险\",\n        \"mugen senshi valis\": \"梦幻战士\",\n        \"dream hunter rem\": \"梦猎人丽梦\",\n        \"made in abyss\": \"来自深渊\",\n        \"wonder momo\": \"神奇桃子\",\n        \"hero bank\": \"英雄银行\",\n        \"monsuno\": \"兽旋战斗\",\n        \"tengai makyou\": \"天外魔境\",\n        \"wingman\": \"银翼超人\",\n        \"fight ippatsu juuden-chan\": \"魔力充电娘\",\n        \"needless\": \"超能力大战\",\n        \"the sacred blacksmith\": \"圣剑锻造师\",\n        \"kampfer\": \"肯普法\",\n        \"onmyoji\": \"阴阳师\",\n        \"brynhildr in the darkness\": \"极黑的布伦希尔特\",\n        \"super real mahjong\": \"超真实麻将\",\n        \"journey to the west\": \"西游记\",\n        \"busou renkin\": \"武装炼金\",\n        \"jigoku shoujo\": \"地狱少女\",\n        \"midori no hibi\": \"美鸟的日记\",\n        \"seirei no moribito\": \"精灵守护者\",\n        \"air gear\": \"飞轮少年\",\n        \"bamboo blade\": \"竹刀少女\",\n        \"dance in the vampire bund\": \"吸血鬼同盟\",\n        \"freezing\": \"零度战姬\",\n        \"omamori himari\": \"守护猫娘绯鞠\",\n        \"shinkyoku soukai polyphonica\": \"神曲奏界Polyphonica\",\n        \"tenjou tenge\": \"天上天下\",\n        \"unbalance x unbalance\": \"萌道鲜师\",\n        \"ange vierge\": \"圣洁天使\",\n        \"blend s\": \"调教咖啡厅\",\n        \"command and conquer\": \"命令与征服\",\n        \"uninhabited planet survive\": \"星球流浪记\",\n        \"fatal fury\": \"饿狼传说\",\n        \"princess crown\": \"公主王冠\",\n        \"burst angel\": \"爆裂天使\",\n        \"k\": \"K\",\n        \"prince of tennis\": \"网球王子\",\n        \"lord of lords ryu knight\": \"霸王大系龙骑士\",\n        \"tonde buurin\": \"飞天少女猪\",\n        \"nano core\": \"纳米核心\",\n        \"elsword\": \"艾尔之光\",\n        \"betterman\": \"进化战记\",\n        \"tenshi ni narumon\": \"天使不设防！\",\n        \"kamen no maid guy\": \"假面男仆\",\n        \"etrian odyssey\": \"世界树的迷宫\",\n        \"in search of the lost future\": \"寻找失去的未来\",\n        \"art of fighting\": \"龙虎之拳\",\n        \"burning force\": \"燃烧战队\",\n        \"golden axe\": \"战斧\",\n        \"popful mail\": \"啵咕物语\",\n        \"the wing of madoola\": \"玛多拉之翼\",\n        \"gakusen toshi asterisk\": \"学战都市Asterisk\",\n        \"tokyo ghoul\": \"东京食尸鬼\",\n        \"doki doki literature club\": \"心动文学俱乐部！\",\n        \"regalia the three sacred stars\": \"雷加利亚三圣星\",\n        \"kaze no densetsu xanadu\": \"风之传说XANADU\",\n        \"tower of druaga\": \"迷宫塔\",\n        \"valkyrie profile\": \"北欧女神\",\n        \"serial experiments lain\": \"玲音\",\n        \"ansatsu kyoushitsu\": \"暗杀教室\",\n        \"mirrors edge\": \"镜之边缘\",\n        \"galilei donna\": \"伽利略少女\",\n        \"teenage mutant ninja turtles\": \"忍者神龟\",\n        \"all purpose cultural cat girl nuku nuku\": \"万能文化猫娘\",\n        \"absolute duo\": \"绝对双刃\",\n        \"avatar\": \"阿凡达\",\n        \"avatar the last airbender\": \"降世神通：最后的气宗\",\n        \"coppelion\": \"核爆末世录\",\n        \"maison ikkoku\": \"相聚一刻\",\n        \"mikakunin de shinkoukei\": \"未确认进行式\",\n        \"tasogare otome x amnesia\": \"黄昏少女×失忆\",\n        \"guild wars\": \"激战\",\n        \"battle girl high school\": \"战斗女子高校\",\n        \"nausicaa of the valley of the wind\": \"风之谷\",\n        \"porco rosso\": \"红猪\",\n        \"princess mononoke\": \"幽灵公主\",\n        \"the secret world of arrietty\": \"借东西的小人阿莉埃蒂\",\n        \"mimi wo sumaseba\": \"侧耳倾听\",\n        \"space patrol luluco\": \"宇宙巡警露露子\",\n        \"shakunetsu no takkyuu musume\": \"灼热的乒乓球娘\",\n        \"silver spoon\": \"银之匙\",\n        \"imouto sae ireba ii.\": \"如果有妹妹就好了。\",\n        \"bang dream\": \"BanG Dream!\",\n        \"fantasy earth zero\": \"幻想大陆\",\n        \"fantastic four\": \"神奇四侠\",\n        \"wonder woman\": \"神奇女侠\",\n        \"family guy\": \"恶搞之家\",\n        \"galaxy angel\": \"银河天使\",\n        \"nurse witch komugi\": \"魔法护士小麦\",\n        \"popotan\": \"蒲公英之恋\",\n        \"xenoblade\": \"异度之刃\",\n        \"xenoblade x\": \"异度之刃X\",\n        \"xenoblade chronicles 2\": \"异度之刃2\",\n        \"xenogears\": \"异度装甲\",\n        \"xenosaga\": \"异度传说\",\n        \"shining sword romance\": \"剑芒罗曼史\",\n        \"shining in the darkness\": \"光明与黑暗\",\n        \"shining force\": \"光明力量\",\n        \"shining force exa\": \"光明力量EXA\",\n        \"shining force feather\": \"光明力量 羽翼\",\n        \"shining soul\": \"光明之魂\",\n        \"shining tears\": \"光明之泪\",\n        \"shining wind\": \"光明之风\",\n        \"shining hearts\": \"光明之心\",\n        \"shining blade\": \"光明之刃\",\n        \"shining ark\": \"光明之舟\",\n        \"shining resonance\": \"光明之响\",\n        \"lunar silver star story\": \"露娜 银河之星物语\",\n        \"lunar eternal blue\": \"露娜 永恒之蓝\",\n        \"maria holic\": \"玛莉亚狂热\",\n        \"boku no pico\": \"我的Pico\",\n        \"azure striker gunvolt\": \"苍蓝雷霆：刚巴尔特\",\n        \"narutaru\": \"星星公主\",\n        \"bokusatsu tenshi dokuro-chan\": \"扑杀天使朵库萝\",\n        \"rick and morty\": \"瑞克和莫蒂\",\n        \"slow start\": \"Slow Start\",\n        \"princess principal\": \"Princess Principal\",\n        \"sangokushi taisen\": \"三国志大战\",\n        \"sengoku taisen\": \"战国大战\",\n        \"chinpui\": \"大耳鼠\",\n        \"pani poni dash\": \"不可思议的教室\",\n        \"suigetsu\": \"水月\",\n        \"mizuiro\": \"水色\",\n        \"dragonaut\": \"龙鸣\",\n        \"under night in-birth\": \"夜下降生\",\n        \"world trigger\": \"境界触发者\",\n        \"mouse\": \"MØUSE\",\n        \"atashinchi\": \"我们这一家\",\n        \"crayon shin-chan\": \"蜡笔小新\",\n        \"looney tunes\": \"乐一通\",\n        \"yuru camp\": \"摇曳露营△\",\n        \"saiki kusuo no psi nan\": \"齐木楠雄的灾难\",\n        \"monster strike\": \"怪物弹珠\",\n        \"noragami\": \"野良神\",\n        \"z slash x\": \"Z/X\",\n        \"shin angyo onshi\": \"新暗行御史\",\n        \"kouchuu ouja mushiking\": \"甲虫王者\",\n        \"darling in the franxx\": \"DARLING in the FRANXX\",\n        \"fairy fencer f\": \"妖精剑士f\",\n        \"honkai gakuen\": \"崩坏学园\",\n        \"quiz magic academy\": \"问答魔法学院\",\n        \"houseki no kuni\": \"宝石之国\",\n        \"atlach-nacha\": \"ATLACH＝NACHA\",\n        \"princess maker\": \"美少女梦工场\",\n        \"grisaia no kajitsu\": \"灰色的果实\",\n        \"sakura trick\": \"樱Trick\",\n        \"pop team epic\": \"pop子和pipi美的日常\",\n        \"lollipop chainsaw\": \"电锯甜心\",\n        \"alternative girls\": \"妃十三学园 Alternative Girls\",\n        \"deadpool\": \"死侍\",\n        \"mitsuboshi colors\": \"三颗星彩色冒险\",\n        \"nekopara\": \"猫娘乐园\",\n        \"keijo\": \"竞女!!!!!!!!\",\n        \"the emoji movie\": \"表情奇幻冒险\",\n        \"animal crossing\": \"动物之森\",\n        \"black clover\": \"黑色五叶草\",\n        \"blues clues\": \"蓝色斑点狗\",\n        \"cooking mama\": \"料理妈妈\",\n        \"dragons lair\": \"龙穴历险记\",\n        \"romance of the three kingdoms\": \"三国演义\",\n        \"death march kara hajimaru isekai kyousoukyoku\": \"爆肝工程师的异世界狂想曲\",\n        \"shironeko project\": \"白猫计划\",\n        \"toji no miko\": \"刀使之巫女\",\n        \"major\": \"棒球大联盟\",\n        \"sora yori mo tooi basho\": \"比宇宙更远的地方\",\n        \"border break\": \"边境保卫战\",\n        \"last period\": \"最终休止符 -无止境的螺旋物语-\",\n        \"stella glow\": \"星光幻歌\",\n        \"ryuuou no oshigoto\": \"龙王的工作！\",\n        \"uma musume pretty derby\": \"赛马娘Pretty Derby🐎\",\n        \"os-tan\": \"OS娘\",\n        \"sunohara-sou no kanrinin-san\": \"春原庄的管理员小姐\",\n        \"yotsubato\": \"四叶妹妹！\",\n        \"dragon nest\": \"龙之谷\",\n        \"kuroinu kedakaki seijo wa hakudaku ni somaru\": \"黑兽～被白浊沾污的高傲圣女～\",\n        \"initial d\": \"头文字D\",\n        \"final romance\": \"对战偶像麻雀：最终罗曼史\",\n        \"violet evergarden\": \"紫罗兰永恒花园\",\n        \"sokkou seitokai\": \"速攻学生会\",\n        \"shantae\": \"桑塔\",\n        \"nekojishi\": \"家有大猫\",\n        \"tomo-chan wa onnanoko\": \"小智是女孩啦！\",\n        \"strawberry panic\": \"惊爆草莓\",\n        \"isekai izakaya nobu\": \"异世界居酒屋「阿信」\",\n        \"alias carnival\": \"ALIA's CARNIVAL!\",\n        \"tesagure bukatsu-mono\": \"摸索吧！部活剧\",\n        \"dna2\": \"DNA²\",\n        \"guardians of the galaxy\": \"银河护卫队\",\n        \"legendz\": \"龙王传说\",\n        \"cross ange\": \"天使与龙的轮舞\",\n        \"dungeon fighter online\": \"地下城与勇士\",\n        \"warhammer\": \"战锤\",\n        \"rakudai kishi no cavalry\": \"落第骑士英雄谭\",\n        \"xxxholic\": \"×××HOLiC\",\n        \"beatless\": \"BEATLESS\",\n        \"ao no exorcist\": \"青之驱魔师\",\n        \"gate - jieitai kano chi nite kaku tatakaeri\": \"GATE奇幻自卫队\",\n        \"playerunknowns battlegrounds\": \"绝地求生\",\n        \"masamune-kun no revenge\": \"政宗君的复仇\",\n        \"hataraku saibou\": \"工作细胞\",\n        \"binbougami ga\": \"穷神来了\",\n        \"princess connect\": \"公主连结Re:Dive\",\n        \"kuzu no honkai\": \"人渣的本愿\",\n        \"elfen lied\": \"妖精的旋律\",\n        \"katanagatari\": \"刀语\",\n        \"plastic memories\": \"可塑性记忆\",\n        \"ijiranaide nagatoro-san\": \"不要欺负我，长瀞同学\",\n        \"bijin onna joushi takizawa-san\": \"美女上司泷泽小姐\",\n        \"bible black\": \"黑暗圣经\",\n        \"uzaki-chan wa asobitai\": \"宇崎酱想要玩耍！\",\n        \"one kagayaku kisetsu e\": \"ONE～光辉的季节～\",\n        \"guardian heroes\": \"守护英雄\",\n        \"the incredibles\": \"超人总动员\",\n        \"yakitate japan\": \"日式面包王\",\n        \"planetarian\": \"星之梦\",\n        \"cave story\": \"洞窟物语\",\n        \"btooom\": \"BTOOOM!惊爆游戏\",\n        \"nichijou\": \"日常\",\n        \"isekai maou to shoukan shoujo no dorei majutsu\": \"异界少女召唤术\",\n        \"winnie the pooh\": \"小熊维尼\",\n        \"bravest warriors\": \"无惧勇士\",\n        \"candy candy\": \"小甜甜\",\n        \"moana\": \"海洋奇缘\",\n        \"scooby-doo\": \"叔比狗\",\n        \"miraculous ladybug\": \"瓢虫少女\",\n        \"inazuma eleven go\": \"闪电十一人GO\",\n        \"mushibugyo\": \"虫奉行\",\n        \"kid icarus\": \"光神话 帕尔提娜之镜\",\n        \"legend of queen opala\": \"奥帕拉女王传奇\",\n        \"shoujo kageki revue starlight\": \"少女歌剧Revue Starlight\",\n        \"deathsmiles\": \"死亡微笑\",\n        \"kaitou joker\": \"怪盗Joker\",\n        \"qualidea code\": \"Qualidea Code\",\n        \"shuumatsu no izetta\": \"终末的伊泽塔\",\n        \"donkey kong\": \"大金刚\",\n        \"whistle\": \"哨声响起\",\n        \"ore ga suki nano wa imouto dakedo imouto ja nai\": \"我喜欢的是小说里的你\",\n        \"seishun buta yarou wa bunny girl senpai no yume o minai\": \"青春猪头少年不会梦到兔女郎学姐\",\n        \"ssss.gridman\": \"SSSS.GRIDMAN\",\n        \"barbie\": \"芭比娃娃\",\n        \"hellboy\": \"地狱男爵\",\n        \"akebi no mi\": \"山姬之实\",\n        \"stardew valley\": \"星露谷物语\",\n        \"tensei shitara slime datta ken\": \"关于我转生变成史莱姆这档事\",\n        \"quiz rpg mahoutsukai to kuroneko no wiz\": \"黑猫维兹\",\n        \"boku no dorei shoukan\": \"我的奴隶妓院\",\n        \"silent mobius\": \"魔法阵都市\",\n        \"sora wo kakeru shoujo\": \"穿越宇宙的少女\",\n        \"cevio\": \"CeVIO\",\n        \"gotoubun no hanayome\": \"五等分的新娘\",\n        \"pan de peace\": \"面包带来和平\",\n        \"borderlands\": \"无主之地\",\n        \"usagi-chan de cue\": \"天生兔女郎\",\n        \"ueno-san wa bukiyou\": \"笨拙之极的上野\",\n        \"wake up girls\": \"Wake Up, Girls!\",\n        \"golden kamuy\": \"黄金神威\",\n        \"komi-san wa komyushou desu.\": \"古见同学有交流障碍症\",\n        \"kaguya-sama wa kokurasetai\": \"辉夜大小姐想让我告白\",\n        \"watashi ni tenshi ga maiorita\": \"天使降临到我身边！\",\n        \"darkest dungeon\": \"暗黑地牢\",\n        \"idol wars z\": \"IDOL WARS Z\",\n        \"sewayaki kitsune no senko-san\": \"贤惠幼妻仙狐小姐\",\n        \"shomin sample\": \"我被绑架到贵族女校当“庶民样本”\",\n        \"arknights\": \"明日方舟\",\n        \"kimetsu no yaiba\": \"鬼灭之刃\",\n        \"tenki no ko\": \"天气之子\",\n        \"arifureta shokugyou de sekai saikyou\": \"平凡职业造就世界最强\",\n        \"asobi asobase\": \"游戏3人娘\",\n        \"zombie land saga\": \"佐贺偶像是传奇\",\n        \"nazo no kanojo x\": \"谜样女友X\",\n        \"shoujo shuumatsu ryokou\": \"少女终末旅行\",\n        \"dumbbell nan kilo moteru\": \"流汗吧!健身少女\",\n        \"thumbelina\": \"拇指姑娘\",\n        \"masou gakuen hxh\": \"魔装学园H×H\",\n        \"hundred\": \"百武装战记\",\n        \"dr. stone\": \"石纪元\",\n        \"uchi no ko no tame naraba ore wa moshikashitara maou mo taoseru kamo shirenai\": \"为了女儿，我说不定连魔王都能干掉。\",\n        \"tsujou kougeki ga zentai kougeki de 2-kai kougeki no okaasan wa suki desu ka\": \"普通攻击是全体二连击，这样的妈妈你喜欢吗？\",\n        \"wagaya no oinari-sama\": \"我家有个狐仙大人\",\n        \"enen no shouboutai\": \"炎炎消防队\",\n        \"lord el-melloi ii sei no jikenbo\": \"君主·埃尔梅罗二世事件簿\",\n        \"inuyasha\": \"犬夜叉\",\n        \"jashin-chan dropkick\": \"邪神与厨二病少女\",\n        \"ishuzoku reviewers\": \"异种族风俗娘评鉴指南\",\n        \"d-frag\": \"属性同好会\",\n        \"heavens memo pad\": \"神的记事本\",\n        \"houkago play\": \"放课后play\",\n        \"ookiku furikabutte\": \"王牌投手 振臂高挥\",\n        \"black bullet\": \"漆黑的子弹\",\n        \"mawaru penguindrum\": \"回转企鹅罐\",\n        \"ben-to\": \"便·当\",\n        \"one week friends\": \"一周的朋友\",\n        \"sanoba witch\": \"魔女的夜宴\",\n        \"tonari no seki-kun\": \"上课小动作\",\n        \"high score girl\": \"高分少女\",\n        \"claymore\": \"大剑\",\n        \"sinoalice\": \"死亡爱丽丝\",\n        \"machikado mazoku\": \"街角魔族\",\n        \"the hunchback of notre dame\": \"钟楼怪人\",\n        \"kodoku no gourmet\": \"孤独的美食家\",\n        \"kishuku gakkou no juliet\": \"寄宿学校的朱丽叶\",\n        \"kemurikusa\": \"烟草\",\n        \"tate no yuusha no nariagari\": \"盾之勇者成名录\",\n        \"watashi nouryoku wa heikinchi de tte itta yo ne\": \"我，不是说了能力要平均值么！\",\n        \"itai no wa iya nano de bougyoryoku ni kyokufuri shitai to omoimasu.\": \"因为太怕痛就全点防御力了\",\n        \"rurouni kenshin\": \"浪客剑心\",\n        \"gankutsuou\": \"岩窟王\",\n        \"kiddy grade\": \"天使特警\",\n        \"yat space travel agency\": \"星际漫游YAYAYA\",\n        \"teisou gyakuten sekai\": \"贞操逆转世界\",\n        \"mondaiji-tachi ga isekai kara kuru sou desu yo\": \"问题儿童都来自异世界？\",\n        \"alice gear aegis\": \"机战少女Alice\",\n        \"houkago no pleiades\": \"放学后的昴星团\",\n        \"senren banka\": \"千恋＊万花\",\n        \"kiratto pri chan\": \"美妙☆频道\",\n        \"cafe stella to shinigami no chou\": \"星光咖啡馆与死神之蝶\",\n        \"riddle joker\": \"RIDDLE JOKER\",\n        \"grand theft auto\": \"侠盗猎车手\",\n        \"hitori bocchi no marumaru seikatsu\": \"一个人的OO小日子\",\n        \"asteroid in love\": \"恋爱小行星\",\n        \"koi wa ameagari no you ni\": \"恋如雨止\",\n        \"fire emblem three houses\": \"火焰之纹章 风花雪月\",\n        \"kanojo okarishimasu\": \"租借女友\",\n        \"15 bishoujo hyouryuuki\": \"15美少女漂流记\",\n        \"ore no natsuyasumi\": \"我的暑假\",\n        \"shinchou yuusha kono yuusha ga ore tueee kuse ni shinchou sugiru\": \"这个勇者明明超强却过分慎重\",\n        \"helltaker\": \"Helltaker\",\n        \"cyborg kuro-chan\": \"超级酷乐猫\",\n        \"oretachi ni tsubasa wa nai\": \"我们没有翅膀\",\n        \"blade of the immortal\": \"无限之住人\",\n        \"nande koko ni sensei ga\": \"为什么老师会在这里！？\",\n        \"what happens in vegas\": \"情迷拉斯维加斯\",\n        \"ore o suki nano wa omae dake kayo\": \"喜欢本大爷的竟然就你一个？\",\n        \"tricolour lovestory\": \"三色△绘恋\",\n        \"mahjong soul\": \"雀魂麻将\",\n        \"genshin impact\": \"原神\",\n        \"mobile suit gundam the 08th ms team\": \"机动战士高达 第08MS小队\",\n        \"hoshizora no memoria\": \"星空的记忆\",\n        \"bocchi kaibutsu to moumoku shoujo\": \"孤独怪物与盲少女\",\n        \"choujin koukousei-tachi wa isekai demo yoyuu de ikinuku you desu\": \"超人高中生们即便在异世界也能从容生存！\",\n        \"maou-sama retry\": \"重来吧，魔王大人！\",\n        \"maitetsu\": \"爱上火车\",\n        \"houkago teibou nisshi\": \"放学后海堤日记\",\n        \"ochikobore fruit tart\": \"满溢的水果挞\",\n        \"comic girls\": \"Comic Girls\",\n        \"endro\": \"Endro!\",\n        \"harukana receive\": \"遥的接球\",\n        \"majo no tabitabi\": \"魔女之旅\",\n        \"chainsaw man\": \"电锯人\",\n        \"josou sanmyaku\": \"女装山脉\",\n        \"penguin highway\": \"企鹅公路\",\n        \"irotoridori no sekai\": \"五彩斑斓的世界\",\n        \"tokyo xanadu\": \"东京迷城\",\n        \"terra battle\": \"地球战争\",\n        \"summer pockets\": \"Summer Pockets\",\n        \"the tatami galaxy\": \"四叠半神话大系\",\n        \"glitch techs\": \"电玩先锋\",\n        \"the owl house\": \"猫头鹰魔法社\",\n        \"maoujou de oyasumi\": \"在魔王城说晚安\",\n        \"dungeons and dragons\": \"龙与地下城\",\n        \"lilo and stitch\": \"星际宝贝\",\n        \"my life as a teenage robot\": \"我的青少年机器人时代\",\n        \"milo murphys law\": \"迈罗·墨菲定律\",\n        \"phineas and ferb\": \"飞哥与小佛\",\n        \"cthulhu mythos\": \"克苏鲁神话\",\n        \"kipo and the age of wonderbeasts\": \"奇波和神奇动物的时代\",\n        \"amphibia\": \"奇幻沼泽\",\n        \"american dragon jake long\": \"美国龙：杰克龙\",\n        \"hazbin hotel\": \"地狱客栈\",\n        \"hotel transylvania\": \"精灵旅社\",\n        \"hilda\": \"希尔达\",\n        \"the dragon prince\": \"龙太子\",\n        \"code lyoko\": \"虚幻勇士\",\n        \"the smurfs\": \"蓝精灵\",\n        \"young justice\": \"少年正义联盟\",\n        \"justice league\": \"正义联盟\",\n        \"avalon code\": \"创世法典\",\n        \"doctor who\": \"神秘博士\",\n        \"rune factory\": \"符文工房\",\n        \"coraline\": \"鬼妈妈\",\n        \"dororo\": \"多罗罗\",\n        \"sekiro shadows die twice\": \"只狼：影逝二度\",\n        \"kamihime project\": \"神姬Project\",\n        \"merc storia\": \"梅露可物语\",\n        \"twelve forever\": \"永远12岁\",\n        \"warriors orochi\": \"无双大蛇\",\n        \"little nightmares\": \"小小噩梦\",\n        \"healin good precure\": \"元气魔法♡光之美少女\",\n        \"uchi no maid ga uzasugiru\": \"我家的女仆有够烦！\",\n        \"flying witch\": \"飞翔的魔女\",\n        \"mushoku tensei\": \"无职转生\",\n        \"tanaka-kun wa itsumo kedaruge\": \"田中君总是如此慵懒\",\n        \"yakusoku no neverland\": \"约定的梦幻岛\",\n        \"iya na kao sare nagara opantsu misete moraitai\": \"很想被人用一脸嫌弃的眼神把胖次给我看\",\n        \"wrestle angels\": \"摔角天使\",\n        \"nijisanji\": \"彩虹社\",\n        \"blue archive\": \"蔚蓝档案\",\n        \"the legend of luo xiaohei\": \"罗小黑战记\",\n        \"sk8 the infinity\": \"SK8 无限滑板\",\n        \"beatmania\": \"狂热节拍\",\n        \"honzuki no gekokujou\": \"小书痴的下克上\",\n        \"oide yo mizuryuu kei land\": \"欢迎光临！水龙敬乐园\",\n        \"shuriken sentai ninninger\": \"手里剑战队忍忍者\",\n        \"hajimete no hitozuma\": \"第一次的人妻体验\",\n        \"sdorica\": \"Sdorica\",\n        \"kaifuku jutsushi no yarinaoshi\": \"回复术士的重启人生\",\n        \"sd gundam sangokuden\": \"SD高达三国传\",\n        \"promare\": \"普罗米亚\",\n        \"ssss.dynazenon\": \"SSSS.电光机王\",\n        \"yagate kimi ni naru\": \"终将成为你\",\n        \"maji de watashi ni koi shinasai\": \"请认真的和我恋爱\",\n        \"lodoss-tou senki\": \"罗德岛战记\",\n        \"tantei wa mou shindeiru.\": \"侦探已死\",\n        \"the secret of kells\": \"凯尔经的秘密\",\n        \"anarchy reigns\": \"极度混乱\",\n        \"tropical-rouge precure\": \"热情闪耀！光之美少女\",\n        \"jujutsu kaisen\": \"咒术回战\",\n        \"shugo chara\": \"守护甜心\",\n        \"manatsu no yo no inmu\": \"仲夏夜之淫梦 | Cookie☆\",\n        \"mujaki no rakuen\": \"无邪气乐园\",\n        \"hololive\": \"Hololive\",\n        \"hinamatsuri\": \"超能力女儿\",\n        \"citrus\": \"citrus～柑橘味香气～\",\n        \"tsubasa reservoir chronicle\": \"翼·年代记\",\n        \"yamada-kun to 7-nin no majo\": \"山田君与7人魔女\",\n        \"aki sora\": \"秋日天空\",\n        \"beelzebub\": \"魔王奶爸\",\n        \"kaichou wa maid-sama\": \"会长是女仆大人\",\n        \"el shaddai\": \"全能之神：梅塔特隆的升天\",\n        \"plants vs. zombies\": \"植物大战僵尸\",\n        \"madou king granzort\": \"魔动王\",\n        \"sono hanabira ni kuchizuke o\": \"亲吻那片花瓣🌸\",\n        \"jormungand\": \"军火女王\",\n        \"the wolf and the seven young kids\": \"狼和七只小山羊\",\n        \"the ugly duckling\": \"丑小鸭\",\n        \"the little match girl\": \"卖火柴的小女孩\",\n        \"hansel and gretel\": \"糖果屋\",\n        \"slime taoshite 300-nen shiranai uchi ni level max ni nattemashita\": \"打了300年的史莱姆，不知不觉就练到了满级\",\n        \"shinsekai yori\": \"来自新世界\",\n        \"tonikaku kawaii\": \"总之就是非常可爱\",\n        \"danshi koukousei no nichijou\": \"男子高中生的日常\",\n        \"seitokai yakuindomo\": \"妄想学生会\",\n        \"parasyte\": \"寄生兽\",\n        \"mairimashita iruma-kun\": \"入间同学入魔了\",\n        \"yubisaki milk tea\": \"指尖奶茶\",\n        \"kyoukai no rinne\": \"境界之轮回\",\n        \"shuumatsu no harem\": \"终末的后宫\",\n        \"bishoujo mangekyou\": \"美少女万华镜\",\n        \"koe de oshigoto\": \"声优初体验！\",\n        \"id invaded\": \"异度侵入 ID:INVADED\",\n        \"hataage kemono michi\": \"萌兽宠物店\",\n        \"valkyria chronicles 2\": \"战场女武神2\",\n        \"valkyria chronicles 3\": \"战场女武神3\",\n        \"kumo desu ga nani ka\": \"转生成蜘蛛又怎样！\",\n        \"kuma kuma kuma bear\": \"熊熊勇闯异世界\",\n        \"marco to ginga ryuu\": \"丸子与银河龙\",\n        \"moyashimon\": \"萌菌物语\",\n        \"wonder egg priority\": \"奇蛋物语\",\n        \"love live superstar\": \"Love Live! Superstar!!\",\n        \"tales of arise\": \"破晓传说\",\n        \"osananajimi ga zettai ni makenai love comedy\": \"青梅竹马绝对不会输的恋爱喜剧\",\n        \"buried stars\": \"深埋之星\",\n        \"gunbuster\": \"飞跃巅峰\",\n        \"13 sentinels aegis rim\": \"十三机兵防卫圈\",\n        \"infinite space\": \"无限航路\",\n        \"tonari no kyuuketsuki-san\": \"邻家索菲\",\n        \"rabi ribi\": \"Rabi-Ribi\",\n        \"little witch nobeta\": \"小魔女诺贝塔\",\n        \"mieruko-chan\": \"看得见的女孩\",\n        \"shigatsu wa kimi no uso\": \"四月是你的谎言\",\n        \"axis powers hetalia\": \"黑塔利亚 Axis Powers\",\n        \"disney twisted-wonderland\": \"迪士尼扭曲仙境\",\n        \"sono bisque doll wa koi o suru\": \"更衣人偶坠入爱河\",\n        \"hypnosis mic\": \"催眠麦克风\",\n        \"project sekai\": \"世界计划\",\n        \"needy streamer overload\": \"主播女孩重度依赖\",\n        \"elden ring\": \"艾尔登法环\",\n        \"otome game no hametsu flag shika nai akuyaku reijou ni tensei shiteshimatta...\": \"转生成为了只有乙女游戏破灭Flag的邪恶大小姐\",\n        \"osomatsu-san\": \"阿松\",\n        \"arena of valor\": \"王者荣耀\",\n        \"douluo continent\": \"斗罗大陆\",\n        \"grand blue\": \"碧蓝之海\",\n        \"blue submarine no. 6\": \"青之6号\",\n        \"jaku-chara tomozaki-kun\": \"弱势角色友崎君\",\n        \"aikatsu friends\": \"偶活学园Friends！\",\n        \"jahy-sama wa kujikenai\": \"贾希大人不气馁\",\n        \"ling long incarnation\": \"灵笼:INCARNATION\",\n        \"kouyoku senki exs-tia\": \"光翼战姬EXS-TIA\",\n        \"assault lily\": \"突击莉莉\",\n        \"harem tengoku da to omottara yandere jigoku datta.\": \"原本以为是后宫天国谁知道竟是病娇地狱\",\n        \"akebi-chan no sailor fuku\": \"明日同学的水手服\",\n        \"mahou shoujo celesphonia\": \"魔法少女天穹法妮雅\",\n        \"noel\": \"NOeL: NOT DiGITAL\",\n        \"tsumamigui\": \"妻中蜜\",\n        \"senpai ga uzai kouhai no hanashi\": \"关于前辈很烦人的事\",\n        \"neko no otera no chion-san\": \"猫之寺的知恩姐\",\n        \"spy x family\": \"间谍过家家\",\n        \"kawaikereba hentai demo suki ni natte kuremasu ka\": \"只要长得可爱，即使是变态你也喜欢吗?\",\n        \"dorohedoro\": \"异兽魔都\",\n        \"bokura wa minna kawaisou\": \"我们大家的河合庄\",\n        \"game of thrones\": \"权力的游戏\",\n        \"red pride of eden\": \"伊甸园的骄傲\",\n        \"nana to kaoru\": \"奈奈与薰的SM日记\",\n        \"kawaii dake ja nai shikimori-san\": \"式守同学不只可爱而已\",\n        \"toaru project\": \"魔法禁书系列\",\n        \"tenka hyakken\": \"天华百剑\",\n        \"oshiro project\": \"御城少女Project\",\n        \"amaama to inazuma\": \"天真与闪电\",\n        \"kin-iro loveriche\": \"金辉恋曲四重奏\",\n        \"ganbare douki-chan\": \"加油吧同期酱\",\n        \"drakengard\": \"龙背上的骑兵\",\n        \"bobobo-bo bo-bobo\": \"鼻毛真拳\",\n        \"majuu senshi luna varga\": \"魔兽战士\",\n        \"saijaku muhai no bahamut\": \"最弱无败神装机龙\",\n        \"trinity seven\": \"七人魔法使\",\n        \"venus eleven vivid\": \"Venus Eleven Vivid！\",\n        \"emil chronicle online\": \"艾米尔编年史\",\n        \"megido 72\": \"恶魔72\",\n        \"umihara kawase\": \"海腹川背\",\n        \"owari no seraph\": \"终结的炽天使\",\n        \"starless\": \"STARLESS\",\n        \"smite\": \"神之浩劫\",\n        \"takopii no genzai\": \"章鱼噼的原罪\",\n        \"super cub\": \"本田小狼与我\",\n        \"kekkaishi\": \"结界师\",\n        \"senyoku no sigrdrifa\": \"战翼的希格德莉法\",\n        \"densetsu no yuusha da garn\": \"勇者传说\",\n        \"video girl ai\": \"电影少女\",\n        \"last origin\": \"Last Origin\",\n        \"seven mortal sins\": \"sin 七大罪\",\n        \"jibaku shounen hanako-kun\": \"地缚少年花子君\",\n        \"shinkansen henkei robo shinkalion\": \"新干线战士\",\n        \"07-ghost\": \"07-GHOST\",\n        \"10 carat torte\": \"天降托蒂！\",\n        \"11eyes\": \"11eyes -罪与罚与赎的少女-\",\n        \"12-sai.\": \"12岁。\",\n        \"13 reasons why\": \"十三个理由\",\n        \"21 emon\": \"21卫门\",\n        \"nanabun no nijyuuni\": \"22/7\",\n        \"3-gatsu no lion\": \"3月的狮子\",\n        \"81diver\": \"81diver\",\n        \"91 days\": \"91Days\",\n        \"a dog of flanders\": \"弗兰德斯的狗\",\n        \"a little snow fairy sugar\": \"小小雪精灵\",\n        \"a nightmare on elm street\": \"猛鬼街\",\n        \"kimi no iru machi\": \"有你的小镇\",\n        \"a.d.police\": \"A.D.POLICE\",\n        \"abenobashi mahou shoutengai\": \"阿倍野桥魔法商店街\",\n        \"acca 13-ku kansatsu-ka\": \"ACCA13区监察课\",\n        \"acchi kocchi\": \"一起一起这里那里\",\n        \"adachi to shimamura\": \"安达与岛村\",\n        \"adventures of the gummi bears\": \"妙妙熊历险记\",\n        \"agarest senki\": \"亚迦雷斯特战记\",\n        \"ai no senshi rainbowman\": \"彩虹化身侠\",\n        \"ai shimai\": \"爱姐妹\",\n        \"ai yori aoshi\": \"青出于蓝\",\n        \"aim for the ace\": \"网球甜心\",\n        \"air master\": \"Air Master\",\n        \"akatsuki blitzkampf\": \"葬晓电光战记\",\n        \"akira\": \"阿基拉\",\n        \"aku no onna kanbu\": \"恶之女干部\",\n        \"akuyaku reijou nanode last boss o kattemimashita\": \"作为恶役大小姐就该养魔王\",\n        \"alice tantei kyoku\": \"爱丽丝侦探局\",\n        \"alien 9\": \"校园外星人\",\n        \"alien vs predator\": \"异形大战铁血战士\",\n        \"allison to lillia\": \"艾莉森与莉莉亚\",\n        \"a.i. ga tomaranai\": \"电脑情人梦\",\n        \"akihabara dennou gumi\": \"秋叶原电脑组\",\n        \"alpen rose\": \"阿尔卑斯杜鹃\",\n        \"alvin and the chipmunks\": \"鼠来宝\",\n        \"am driver\": \"滑板战士\",\n        \"amaenaideyo\": \"极乐天师\",\n        \"amazing nurse nanako\": \"菜菜子解体诊书\",\n        \"american dad\": \"特工老爹\",\n        \"american mcgees alice\": \"爱丽丝梦游魔境\",\n        \"amnesia\": \"失忆症\",\n        \"an american tail\": \"美国鼠谭\",\n        \"ane doki\": \"御姐百分百\",\n        \"ane haramix\": \"姐姐☆懷孕\",\n        \"angel blade\": \"Angel Blade\",\n        \"animal yokochou\": \"动物横町\",\n        \"animaniacs\": \"狂欢三宝\",\n        \"anna millers\": \"安娜·米勒\",\n        \"anne happy\": \"Anne Happy♪\",\n        \"anpanman\": \"面包超人\",\n        \"ao no flag\": \"青旗\",\n        \"aoharu x kikanjuu\": \"青春×机关枪\",\n        \"aoi shiro\": \"青城\",\n        \"aoi umi no tristia\": \"发明工坊\",\n        \"ape escape\": \"捉猴啦\",\n        \"ar nosurge\": \"Ar nosurge ～献给诞生之星的祈祷诗～\",\n        \"ciel nosurge\": \"静籁之空 ～献给失落之星的诗～\",\n        \"ar tonelico\": \"魔塔大陆\",\n        \"ar tonelico qoga\": \"魔塔大陆3\",\n        \"araiguma rascal\": \"小浣熊\",\n        \"arcana famiglia\": \"魔力家族\",\n        \"area no kishi\": \"足球骑士\",\n        \"ares no tsubasa\": \"传奇之翼\",\n        \"arete hime\": \"阿莱蒂公主\",\n        \"armored trooper votoms\": \"装甲骑兵波德姆兹\",\n        \"arrow emblem hawk of the grand prix\": \"神威赛车手\",\n        \"asa made jugyou chu\": \"授课到天亮Chu!\",\n        \"ashita e free kick\": \"踢向明天\",\n        \"ashita no joe\": \"明日之丈\",\n        \"ask dr. rin\": \"恋爱占卜师\",\n        \"asoko de hataraku musubu-san\": \"在那里工作的结小姐\",\n        \"astro fighter sunred\": \"天体战士桑雷德\",\n        \"astro plan\": \"太空历险记\",\n        \"asura cryin\": \"魔神相克者\",\n        \"atsumare fushigi kenkyuubu\": \"集合！不可思议研究社\",\n        \"aura battler dunbine\": \"圣战士丹拜因\",\n        \"ayashi no ceres\": \"梦幻妖子\",\n        \"azfareo no sobayounin\": \"苍龙的仆人\",\n        \"azuki-chan\": \"小红豆\",\n        \"b gata h kei\": \"B型H系\",\n        \"b-daman\": \"B传说！战斗弹珠人\",\n        \"back to the future\": \"回到未来\",\n        \"bagi the monster of mighty nature\": \"大自然的魔兽巴奇\",\n        \"bakuen campus guardress\": \"爆炎学院\",\n        \"bakugan\": \"爆丸\",\n        \"bakunyuu maid kari\": \"爆乳女仆狩猎\",\n        \"bakutou sengen daigunder\": \"爆斗宣言大钢弹\",\n        \"baldr force\": \"BALDR FORCE\",\n        \"ballroom e youkoso\": \"舞动青春\",\n        \"band yarouze\": \"来组乐队吧!\",\n        \"banished from the heros party i decided to live a quiet life in the countryside\": \"因为不是真正的伙伴而被逐出勇者队伍，流落到边境展开慢活人生\",\n        \"banjo-kazooie\": \"班卓熊大冒险\",\n        \"banner of the stars\": \"星界的战旗\",\n        \"baribari densetsu\": \"极速狂飙\",\n        \"battery\": \"野球少年\",\n        \"battle angel alita\": \"铳梦\",\n        \"battle arena toshinden\": \"斗神传\",\n        \"battle royal high school\": \"真魔神传\",\n        \"beck\": \"BECK\",\n        \"beelzebub-jou no okinimesu mama.\": \"只要贝尔哲布布大小姐喜欢就好\",\n        \"beet the vandel buster\": \"冒险王比特\",\n        \"beetlejuice\": \"阴间大法师\",\n        \"bemubemu hunter kotengu tenmaru\": \"伏魔小旋风\",\n        \"bernard-jou iwaku.\": \"伯纳德小姐说\",\n        \"beyond oasis\": \"托尔的传说\",\n        \"big wars\": \"Big Wars\",\n        \"binchou-tan\": \"备长炭\",\n        \"binzume yousei\": \"瓶诘妖精\",\n        \"birdy the mighty\": \"铁腕女警\",\n        \"bishounen tanteidan\": \"美少年侦探团\",\n        \"black butler\": \"黑执事\",\n        \"black desert online\": \"黑色沙漠\",\n        \"black jack\": \"怪医黑杰克\",\n        \"black magic m-66\": \"黑魔术玛丽奥M-66\",\n        \"blade runner\": \"银翼杀手\",\n        \"blast of tempest\": \"绝园的暴风雨\",\n        \"blood plus\": \"血战\",\n        \"blood royale\": \"BLOOD ROYAL\",\n        \"blood-c\": \"BLOOD-C\",\n        \"bloodstained\": \"血污\",\n        \"bloody roar\": \"血腥咆哮\",\n        \"blue dragon\": \"蓝龙\",\n        \"blue spring ride\": \"青春之旅\",\n        \"bna brand new animal\": \"动物新世代 BNA\",\n        \"boku dake ga inai machi\": \"只有我不存在的城市\",\n        \"boku no kanojo ga majimesugiru shobitch na ken\": \"关于我女友是个一本正经的碧池这件事\",\n        \"boku to misaki-sensei\": \"我和美咲老师\",\n        \"boku to roboko\": \"我与机器子\",\n        \"bokura no taiyou\": \"我们的太阳\",\n        \"bokutachi no remake\": \"我们的重制人生\",\n        \"bomberman jetters\": \"轰炸超人\",\n        \"boogiepop\": \"不吉波普\",\n        \"bounen no xamdou\": \"亡念之扎姆德\",\n        \"braceface\": \"Braceface\",\n        \"brandy and mr. whiskers\": \"小布与伟仔\",\n        \"bratz\": \"Bratz\",\n        \"brave 10\": \"BRAVE10\",\n        \"brave express might gaine\": \"勇者特急队\",\n        \"brave fencer musashi\": \"勇敢的剑士 武藏传\",\n        \"brave nine\": \"Brave Nine\",\n        \"brave story\": \"勇者物语\",\n        \"bravestarr\": \"布雷斯塔警长\",\n        \"breakers\": \"BREAKERS\",\n        \"breath of fire\": \"龙息之焰\",\n        \"breath of fire ii\": \"龙息之焰II\",\n        \"breath of fire iii\": \"龙息之焰III\",\n        \"breath of fire iv\": \"龙息之焰IV\",\n        \"breath of fire v\": \"龙息之焰V\",\n        \"breath of fire 6\": \"龙息之焰6\",\n        \"broken blade\": \"破刃之剑\",\n        \"bubuki buranki\": \"舞武器·舞乱伎\",\n        \"bucky ohare\": \"Bucky O'Hare\",\n        \"buffy the vampire slayer\": \"吸血鬼猎人巴菲\",\n        \"bully\": \"恶霸鲁尼\",\n        \"bungou to alchemist\": \"文豪与炼金术师\",\n        \"burn up\": \"杀人科\",\n        \"burn up w\": \"杀人科 W\",\n        \"burn up scramble\": \"杀人科 SCRAMBLE\",\n        \"busou shoujo machiavellianism\": \"武装少女Machiavellianism\",\n        \"buzz lightyear of star command\": \"巴斯光年的星际使命\",\n        \"c the money of soul and possibility control\": \"C钱‧未来式\",\n        \"cage of eden\": \"逃离伊甸园\",\n        \"caligula\": \"卡里古拉\",\n        \"call me by your name\": \"请以你的名字呼唤我\",\n        \"call of duty\": \"使命召唤\",\n        \"can can bunny\": \"Can Can Bunny\",\n        \"carole and tuesday\": \"卡罗尔与星期二\",\n        \"casshan\": \"再造人卡辛\",\n        \"casshern sins\": \"卡辛~罪~\",\n        \"fantasy bishoujo juniku ojisan to\": \"与变成了异世界美少女的大叔一起冒险\",\n        \"trauma center\": \"超执刀\",\n        \"alchemy stars\": \"白夜极光\",\n        \"genkai tokki monster monpiece\": \"限界凸骑 Monster Monpiece\",\n        \"castlevania\": \"恶魔城\",\n        \"casual romance club\": \"放学后恋爱俱乐部\",\n        \"chalkzone\": \"粉笔世界\",\n        \"chaos breaker\": \"混沌斩断\",\n        \"chaos child\": \"混沌之子\",\n        \"chaos head\": \"混沌之脑\",\n        \"cheer danshi\": \"男子啦啦队！！\",\n        \"chibi maruko-chan\": \"樱桃小丸子\",\n        \"chibi vampire\": \"增血鬼果林\",\n        \"chichi chichi\": \"乳乳乳乳\",\n        \"chikyu misaki\": \"地球美纱树\",\n        \"childs play\": \"鬼娃回魂\",\n        \"chio-chan no tsuugakuro\": \"千绪的通学路\",\n        \"chip n dale rescue rangers\": \"救援突击队\",\n        \"cho aniki\": \"超兄贵\",\n        \"chogattai majutsu robot ginguiser\": \"超合体魔术机器人\",\n        \"chokotto sister\": \"我的裘可妹妹\",\n        \"chou dokyuu shoujo 4946\": \"超弩级少女4946\",\n        \"chou kuse ni narisou\": \"城市小飞女\",\n        \"choudenshi bioman\": \"超电子生化人\",\n        \"chouja raideen\": \"超者雷登\",\n        \"choujikuu kidan southern cross\": \"超时空骑团\",\n        \"choujuu kishin dancougar\": \"超兽机神\",\n        \"choukou shinki ixseal\": \"超昂神骑爱克希尔\",\n        \"chrono cross\": \"穿越时空\",\n        \"chrono trigger\": \"时空之轮\",\n        \"chu-bra\": \"青春CUP\",\n        \"chuuka ichiban\": \"中华一番！\",\n        \"class of heroes\": \"剑与魔法与学园\",\n        \"clock tower\": \"钟楼惊魂\",\n        \"clover point\": \"Clover Point\",\n        \"cocoro restarter\": \"心灵重启！\",\n        \"code realize sousei no himegimi\": \"Code:Realize ～创世的姬君～\",\n        \"codename kids next door\": \"小孩大联盟\",\n        \"combat mecha xabungle\": \"战斗装甲Xabungle\",\n        \"combattler v\": \"超力电磁侠 孔巴特拉V\",\n        \"conan the barbarian\": \"蛮王柯南\",\n        \"concon-collector\": \"Concon-Collector\",\n        \"conker\": \"松鼠库克倒霉的一天\",\n        \"cooking idol ai mai main\": \"料理偶像\",\n        \"corruption of champions\": \"英雄的堕落\",\n        \"crash b-daman\": \"爆球Hit！轰烈弹珠人\",\n        \"crash bandicoot\": \"古惑狼\",\n        \"cross game\": \"幸运四叶草\",\n        \"crush gear nitro\": \"新超激力战斗车\",\n        \"crypt killer\": \"妖霸天下\",\n        \"cyberbots\": \"装甲战士\",\n        \"cyberpunk\": \"赛博朋克\",\n        \"d.gray-man\": \"驱魔少年\",\n        \"d.n.angel\": \"天使怪盗\",\n        \"d.p.s.\": \"D.P.S.\",\n        \"daa daa daa\": \"Da!Da!Da!\",\n        \"daiakuji\": \"大恶司\",\n        \"daibanchou -big bang age-\": \"大番长 -Big Bang Age-\",\n        \"daicon\": \"DAICON\",\n        \"daisenryaku\": \"大战略\",\n        \"daphne in the brilliant blue\": \"光与水的女神\",\n        \"dark chronicle\": \"暗云编年史\",\n        \"dark water\": \"Dark Water\",\n        \"darker than black\": \"DARKER THAN BLACK\",\n        \"darkwing duck\": \"狡猾飞天德\",\n        \"dave the barbarian\": \"野蛮人戴夫\",\n        \"day break illusion\": \"穿透幻影的太阳\",\n        \"dead end\": \"Dead End\",\n        \"dead rising\": \"丧尸围城\",\n        \"deadman wonderland\": \"死囚乐园\",\n        \"deception\": \"刻命馆\",\n        \"defense devil\": \"防御魔鬼\",\n        \"demento\": \"狂城丽影\",\n        \"demonbane\": \"斩魔大圣DEMONBANE\",\n        \"dennou boukenki webdiver\": \"电脑冒险记\",\n        \"makai tenshi jibril\": \"魔界天使吉普莉露\",\n        \"dennou tenshi djibril\": \"电脑天使吉普莉露\",\n        \"denpa teki na kanojo\": \"电波系彼女\",\n        \"detective school q\": \"侦探学园Q\",\n        \"the idolmaster sidem\": \"偶像大師SideM\",\n        \"ryuugajou nanana no maizoukin\": \"龙娘七七七埋藏的宝藏\",\n        \"grandia\": \"冒險奇譚\",\n        \"grappler baki\": \"刃牙\",\n        \"mayonaka no tantei nightwalker\": \"真夜中的侦探\",\n        \"boku no kokoro no yabai yatsu\": \"我内心的糟糕念头\",\n        \"inaka ni kaeru to yakeni natsuita kasshoku ponytail shota ga iru\": \"单马尾表弟 (暂译)\",\n        \"paripi koumei\": \"派对浪客诸葛孔明\",\n        \"sore ga seiyuu\": \"那就是声优！\",\n        \"advance of zeta\": \"ADVANCE OF Ζ 提坦斯的旗下\",\n        \"summertime render\": \"夏日重现\",\n        \"kiteretsu daihyakka\": \"奇天烈大百科\",\n        \"perman\": \"飞人\",\n        \"danshi koukousei de urekko light novel sakka o shiteiru keredo\": \"身为男高中生兼当红轻小说作家的我，正被年纪比我小且从事声优工作的女同学掐住脖子\",\n        \"destiny child\": \"命运之子\",\n        \"ousama ranking\": \"国王排名\",\n        \"regular show\": \"天兵公园\",\n        \"talespin\": \"航空小英雄\",\n        \"tiny toons\": \"迷你乐一通\",\n        \"recess\": \"下课后\",\n        \"garfield\": \"加菲猫\",\n        \"ok k.o. lets be heroes\": \"OK K.O.!英雄赞\",\n        \"ratchet and clank\": \"瑞奇与叮当\",\n        \"kangokutou mary skelter\": \"神狱塔：断罪玛丽\",\n        \"hourou musuko\": \"放浪男孩\",\n        \"moshidora\": \"如果杜拉\",\n        \"yumekui merry\": \"食梦者玛莉\",\n        \"ikoku meiro no croisee\": \"异国迷宫的十字路口\",\n        \"corpse party\": \"尸体派对\",\n        \"jewelpet tinkle\": \"宝石宠物Twinkle☆\",\n        \"dragon crisis\": \"龙之界点\",\n        \"who framed roger rabbit\": \"谁陷害了兔子罗杰\",\n        \"the bad guys\": \"坏蛋联盟\",\n        \"hige o soru. soshite joshikousei o hirou.\": \"剃须。然后捡到女高中生。\",\n        \"horimiya\": \"堀桑与宫村君\",\n        \"ef a tale of memories\": \"悠久之翼\",\n        \"gaikotsu kishi-sama tadaima isekai e odekakechuu\": \"骸骨骑士大人异世界冒险中\",\n        \"kou-1 desu ga isekai de joushu hajimemashita\": \"虽然才高一却在异世界当起城主\",\n        \"kansen x shoujo\": \"感染×少女\",\n        \"digimon story cyber sleuth\": \"数码宝贝物语 网络侦探\",\n        \"among us\": \"Among Us\",\n        \"landstalker\": \"秘境魔宝\",\n        \"wizardry\": \"巫术系列\",\n        \"cotton\": \"棉花小魔女系列\",\n        \"waccha primagi\": \"绫镜魔法\",\n        \"sonic soldier borgman\": \"超音战士\",\n        \"brave girl ravens\": \"Brave Girl Ravens\",\n        \"tsukuyomi moon phase\": \"月咏\",\n        \"punishing gray raven\": \"战双帕弥什\",\n        \"guardian tales\": \"坎公骑冠剑\",\n        \"otome game sekai wa mob ni kibishii sekai desu\": \"乙女游戏世界对路人角色很不友好\",\n        \"kenja no mago\": \"贤者之孙\",\n        \"lycoris recoil\": \"莉可丽丝\",\n        \"tachibana-san-chi no dansei jijou\": \"橘OO家O男性事情\",\n        \"dig delight direct drive dj\": \"D4DJ\",\n        \"seirei gensouki\": \"精灵幻想记\",\n        \"soredemo ayumu wa yosetekuru\": \"即使如此依旧步步进逼\",\n        \"nikujo no susume\": \"肉女的推荐\",\n        \"eiyuu senki\": \"英雄战姬\",\n        \"shoujo mahou gaku little witch romanesque\": \"少女魔法学\",\n        \"words worth\": \"光与影的传说\",\n        \"drifters\": \"漂流武士\",\n        \"counter side\": \"Counter:Side\",\n        \"kunoichi tsubaki no mune no uchi\": \"女忍者椿的心事\",\n        \"kanojo mo kanojo\": \"女友成双\",\n        \"ero trap dungeon\": \"色情迷宫\",\n        \"yofukashi no uta\": \"彻夜之歌\",\n        \"zannen onna kanbu black general-san\": \"遗憾女干部黑暗将军小姐\",\n        \"digimon ghost game\": \"数码宝贝幽灵游戏\",\n        \"yuusha to maou\": \"魔王勇者\",\n        \"onegai my melody\": \"我爱美乐蒂\",\n        \"bikkuriman\": \"仙魔大战\",\n        \"munou na nana\": \"无能力者娜娜\",\n        \"nurarihyon no mago\": \"滑头鬼之孙\",\n        \"bomber girl\": \"轰炸女孩\",\n        \"burn the witch\": \"龙与魔女（BURN THE WITCH）\",\n        \"hataraku onii-san\": \"打工小哥\",\n        \"tomica kizuna gattai earth granner\": \"极速牵绊 地球先锋队\",\n        \"netojuu no susume\": \"网络胜利组\",\n        \"camp buddy\": \"Camp Buddy\",\n        \"eto rangers\": \"十二生肖守护神\",\n        \"mob psycho 100\": \"灵能百分百\",\n        \"space pirate captain harlock\": \"宇宙海贼哈洛克船长\",\n        \"devil survivor 2\": \"恶魔幸存者2\",\n        \"henshin\": \"变身-emergence-\",\n        \"magika no kenshi to basileus\": \"魔技科的剑士与召唤魔王\",\n        \"aragami\": \"荒神\",\n        \"owari no chronicle\": \"终焉的年代记\",\n        \"les miserables\": \"悲惨世界\",\n        \"isekai ojisan\": \"异世界舅舅\",\n        \"star ocean\": \"星之海洋\",\n        \"kami no rhapsody\": \"神之狂想曲\",\n        \"nintama rantarou\": \"落第忍者乱太郎\",\n        \"mahoutsukai no yome\": \"魔法使的新娘\",\n        \"subarashiki hibi\": \"美好的每一天～不连续的存在～\",\n        \"tron\": \"创：战纪\",\n        \"tokyo revengers\": \"东京复仇者\",\n        \"mobile suit gundam the witch from mercury\": \"机动战士高达 水星的魔女\",\n        \"shijou saikyou no daimaou murabito a ni tensei suru\": \"史上最强大魔王转生为村民A\",\n        \"genjitsu shugi yuusha no oukoku saikenki\": \"现实主义勇者的王国重建记\",\n        \"zenless zone zero\": \"绝区零\",\n        \"mato seihei no slave\": \"魔都精兵的奴隶\",\n        \"bocchi the rock\": \"孤独摇滚！\",\n        \"scp foundation\": \"SCP基金会\",\n        \"kinnikuman\": \"金肉人\",\n        \"ever 17\": \"Ever17（时空轮回）\",\n        \"memories off\": \"告别回忆\",\n        \"shiei no sona-nyl -what a beautiful memories-\": \"紫影的索纳尼尔 ～何等美好的记忆～\",\n        \"katawa shoujo\": \"片轮少女\",\n        \"sound horizon\": \"泡沫の恋\",\n        \"honor of kings\": \"王者荣耀\",\n        \"naraka bladepoint\": \"永劫无间\",\n        \"teletubbies\": \"天线宝宝\",\n        \"goddess of victory nikke\": \"胜利女神：妮姬\",\n        \"identity v\": \"第五人格\",\n        \"morenatsu\": \"漏夏\",\n        \"mad rat dead\": \"疯老鼠之死\",\n        \"enjou genmu tan\": \"艳娘幻梦谭\",\n        \"from argonavis\": \"from ARGONAVIS\",\n        \"god of war\": \"战神\",\n        \"the world ends with you\": \"美妙世界\",\n        \"scarlet nexus\": \"绯红结系\",\n        \"dragalia lost\": \"Dragalia Lost ～失落的龙约～\",\n        \"kimi ga nozomu eien\": \"你所期望的永远\",\n        \"matantei loki ragnarok\": \"魔侦探洛基\",\n        \"washio sumi wa yuusha de aru\": \"鹫尾须美是勇者\",\n        \"kono healer mendokusai\": \"这个僧侣有够烦\",\n        \"super dimension century orguss\": \"超时空世纪\",\n        \"ouchi ni kaeru made ga mashimaro desu\": \"回家之前的棉花糖\",\n        \"karakuri circus\": \"傀儡马戏团\",\n        \"waka okami wa shougakusei\": \"温泉屋的小老板娘\",\n        \"kamen rider kuuga\": \"假面骑士空我\",\n        \"raramagi honyarara magic\": \"不确定魔法\",\n        \"space battleship yamato 2199\": \"宇宙战舰大和号2199\",\n        \"power pro kun pocket\": \"口袋力量棒球\",\n        \"anothereidos of dragon vein r\": \"龙脉·另一种姿态\",\n        \"the saga of darren shan\": \"向达伦大冒险\",\n        \"delicious party precure\": \"美味派对♡光之美少女\",\n        \"ai the somnium files\": \"AI：梦境档案\",\n        \"ku-neru maruta\": \"吃吃睡睡的玛璐塔\",\n        \"school shock\": \"雏蜂\",\n        \"shinigami bocchan to kuro maid\": \"死神少爷与黑女仆\",\n        \"2.43 seiin high school boys volleyball team\": \"2.43 清阴高中男子排球社\",\n        \"elf-san wa yaserarenai.\": \"精灵小姐瘦不下来\",\n        \"pretty face\": \"漂亮脸蛋\",\n        \"yi lian\": \"忆恋\",\n        \"meili xinshijie i\": \"美丽新世界i\",\n        \"kage no jitsuryokusha ni naritakute\": \"我想成为影之强者！\",\n        \"okane ga nai\": \"欠金情人\",\n        \"valvrave the liberator\": \"革命机\",\n        \"dodge danpei\": \"斗球儿弹平\",\n        \"sinbad legend of the seven seas\": \"辛巴达七海传奇\",\n        \"tenshin ranman\": \"天神乱漫\",\n        \"hajimete no orusuban\": \"第一次看家\",\n        \"nanami to konomi no oshiete a-b-c\": \"ななみとこのみのおしえてA・B・C\",\n        \"hajimete no oishasan\": \"はじめてのおいしゃさん\",\n        \"hajimete no otetsudai\": \"はじめてのおてつだい\",\n        \"otonari no tenshi-sama ni itsunomanika dame ningen ni sareteita ken\": \"关于我在无意间被隔壁的天使变成废柴这件事\",\n        \"onii-chan wa oshimai\": \"别当哥哥了！\",\n        \"shiki\": \"尸鬼\",\n        \"shikabane hime\": \"尸姬\",\n        \"ayakashi triangle\": \"妖幻三重奏\",\n        \"tensei oujo to tensai reijou no mahou kakumei\": \"转生公主与天才千金的魔法革命\",\n        \"summer camp island\": \"幽灵与莫莉·麦琪\",\n        \"luca\": \"夏日友晴天\",\n        \"spy kyoushitsu\": \"间谍教室\",\n        \"galaxy cyclone braiger\": \"银河旋风\",\n        \"mahou shoujo nante mouiidesukara.\": \"魔法少女什么的已经够了啦。\",\n        \"tom clancys rainbow six\": \"彩虹六号\",\n        \"sangoku rensenki\": \"三国恋战记~少女的兵法\",\n        \"epic seven\": \"第七史诗\",\n        \"godzilla\": \"哥斯拉\",\n        \"cloud meadow\": \"云端牧场\",\n        \"ookami kodomo no ame to yuki\": \"狼的孩子雨和雪\",\n        \"akiba maid sensou\": \"秋叶原冥途战争\",\n        \"kyuuketsuki sugu shinu\": \"吸血鬼马上死\",\n        \"devil summoner soul hackers\": \"恶魔召唤师\",\n        \"saikin yatotta maid ga ayashii\": \"最近雇的女仆有点怪\",\n        \"benriya saitou-san isekai ni iku\": \"万事屋斋藤先生转生异世界\",\n        \"mar\": \"MÄR魔兵传奇\",\n        \"kinsou no vermeil\": \"金装的维尔梅\",\n        \"ganbare goemon\": \"大盗五右卫门\",\n        \"jikkyou powerful pro yakyuu\": \"实况力量棒球系列\",\n        \"dolphin wave\": \"洶湧海豚\",\n        \"suzume no tojimari\": \"铃芽之旅\",\n        \"warframe\": \"星际战甲\",\n        \"brok the investigator\": \"鳄鱼侦探布罗格\",\n        \"horizon zero dawn\": \"地平线 零之曙光\",\n        \"un-go\": \"UN-GO\",\n        \"inma kourin devil carnival\": \"淫魔降臨デビル☆カーニバル\",\n        \"ryu ga gotoku\": \"如龙\",\n        \"atomic heart\": \"原子之心\",\n        \"yomawari\": \"夜廻\",\n        \"the addams family\": \"亚当斯一家\",\n        \"thundercats\": \"霹雳猫\",\n        \"gargoyles\": \"夜行神龙\",\n        \"dora the explorer\": \"爱探险的朵拉\",\n        \"gremlins\": \"小魔怪\",\n        \"lazytown\": \"懒人小镇\",\n        \"deltarune\": \"三角符文\",\n        \"vampire knight\": \"吸血鬼骑士\",\n        \"blue reflection\": \"蔚蓝反射（幻舞少女之剑）\",\n        \"fumikiri jikan\": \"平交道时间\",\n        \"all out\": \"ALL OUT!!\",\n        \"kuma miko\": \"熊巫女\",\n        \"tsuki ni yorisou otome no sahou\": \"近月少女的礼仪\",\n        \"witchs weapon\": \"魔女兵器\",\n        \"dead by daylight\": \"黎明杀机\",\n        \"sakuna of rice and ruin\": \"天穗之咲稻姬\",\n        \"oshi no ko\": \"我推的孩子\",\n        \"tensei shitara ken deshita\": \"转生就是剑\",\n        \"juuou mujin no fafnir\": \"铳皇无尽的法夫纳\",\n        \"soukyuu no fafner\": \"苍穹之法芙娜\",\n        \"heaven burns red\": \"炽焰天穹\",\n        \"fire emblem engage\": \"火焰之纹章 结合\",\n        \"watashi no yuri wa oshigoto desu\": \"我的百合乃工作是也！\",\n        \"sekai saikou no ansatsusha isekai kizoku ni tensei suru\": \"世界顶尖的暗杀者转生为异世界贵族\",\n        \"sengoku bushouki muramasa\": \"战国武将姬\",\n        \"idola phantasy star saga\": \"梦幻之星·伊多拉传说\",\n        \"golden time\": \"青春纪行\",\n        \"honkai star rail\": \"崩坏：星穹铁道\",\n        \"tongari boushi no atelier\": \"尖帽子的魔法工坊\",\n        \"sankarea\": \"散华礼弥\",\n        \"princess resurrection\": \"怪物王女\",\n        \"world flipper\": \"世界弹射物语\",\n        \"kikai sentai zenkaiger\": \"机界战队全开者\",\n        \"ng knight lamune and 40\": \"VS骑士\",\n        \"midnight girls\": \"Midnight Girls R\",\n        \"xenoblade chronicles 3\": \"异度神剑3\",\n        \"hollow knight\": \"空洞骑士\",\n        \"koutetsu no majo annerose\": \"钢铁魔女安妮罗杰\",\n        \"wuqi mitu\": \"无期迷途\",\n        \"jigokuraku\": \"地狱乐\",\n        \"tokyo mirage sessions fe\": \"幻影异闻录♯FE\",\n        \"odin sphere\": \"奥丁领域\",\n        \"ga geijutsuka art design class\": \"GA 艺术科美术设计班\",\n        \"tower of fantasy\": \"幻塔\",\n        \"ase to sekken\": \"汗皂交香\",\n        \"idoly pride\": \"偶像荣耀\",\n        \"nu carnival\": \"新世界狂欢\",\n        \"siren\": \"死魂曲\",\n        \"lapis relights\": \"宝石幻想 光芒重现\",\n        \"franken fran\": \"疯狂怪医芙兰\",\n        \"kaminaki sekai no kamisama katsudou\": \"无神世界中的神明活动\",\n        \"shoukan yuusha to f-kei kareshi\": \"召唤勇者与F系男友\",\n        \"megami device\": \"女神装置\",\n        \"skip to loafer\": \"跳跃和乐福鞋\",\n        \"astral chain\": \"异界锁链\",\n        \"taiyou no kiba dougram\": \"太阳之牙\",\n        \"natsuiro kiseki\": \"夏色奇迹\",\n        \"slam dunk\": \"灌篮高手\",\n        \"tenshi souzou re-boot\": \"天使☆嚣嚣 RE-BOOT!\",\n        \"2.5-jigen no yuuwaku\": \"2.5次元的诱惑\",\n        \"golden boy\": \"黄金小子\",\n        \"valorant\": \"无畏契约\",\n        \"zom 100 zombie ni naru made ni shitai 100 no koto\": \"僵尸百分百\",\n        \"hirogaru sky precure\": \"开阔天空！光之美少女\",\n        \"dororon enma-kun\": \"咚隆隆炎魔君\",\n        \"kekko kamen\": \"穴光假面\",\n        \"tamagotchi\": \"电子宠物蛋\",\n        \"sousou no frieren\": \"葬送的芙莉莲\",\n        \"maou gakuin no futekigousha\": \"魔王学院的不适任者\",\n        \"jewelpet\": \"宝石宠物\",\n        \"jewelpet sunshine\": \"宝石宠物 Sunshine\",\n        \"eve burst error\": \"EVE burst error\",\n        \"mahou shoujo tokushusen asuka\": \"魔法少女特殊战明日香\",\n        \"ponyo\": \"崖上的波妞\",\n        \"lv1 maou to one room yuusha\": \"LV1魔王与独居废勇者\",\n        \"love live hasunosora jogakuin school idol club\": \"莲之空女学院学园偶像俱乐部\",\n        \"little lord fauntleroy\": \"小公子西迪\",\n        \"tensai ouji no akaji kokka saisei jutsu\": \"天才王子的赤字国家振兴术\",\n        \"mardock scramble\": \"壳中少女\",\n        \"grimoire shiritsu grimoire mahou gakuen\": \"私立格里莫瓦魔法学园\",\n        \"futoku no guild\": \"不道德公会\",\n        \"kemono jihen\": \"怪物事变\",\n        \"oounabara to wadanohara\": \"大海原与大海原\",\n        \"zero escape\": \"极限脱出\",\n        \"araburu kisetsu no otome-domo yo\": \"骚动时节的少女们啊\",\n        \"yuusha party o tsuihou sareta beast tamer saikyoushu no nekomimi shoujo to deau\": \"被开除出勇者队伍的驯兽使，邂逅了最强种猫耳少女\",\n        \"doukyuusei\": \"同级生\",\n        \"dohna dohna issho ni warui koto o shiyou\": \"多娜多娜一起干坏事吧\",\n        \"chizuru-chan kaihatsu nikki\": \"千鹤酱的开发日志\",\n        \"arc the lad\": \"妖精战士\",\n        \"haiiro teien\": \"灰色庭园\",\n        \"shuumatsu nani shitemasu ka isogashii desu ka sukutte moratte ii desu ka\": \"末日时在做什么？有没有空？可以来拯救吗？\",\n        \"flint the time detective\": \"时空侦探\",\n        \"fumetsu no anata e\": \"致不灭的你\",\n        \"shiro seijo to kuro bokushi\": \"白圣女与黑牧师\",\n        \"slow loop\": \"SLOW LOOP\",\n        \"taimadou gakuen 35 shiken shoutai\": \"对魔导学园35试验小队\",\n        \"ongeki\": \"音击Ongeki\",\n        \"yamada-kun to lv999 no koi o suru\": \"和山田进行LV.999的恋爱\",\n        \"yu-gi-oh sevens\": \"游戏王SEVENS\",\n        \"ore no shikabane wo koeteyuke\": \"跨越我的尸体\",\n        \"puss in boots the last wish\": \"穿靴子的猫:最后的愿望\",\n        \"fatal frame\": \"零系列\",\n        \"arknights endfield\": \"明日方舟：终末地\",\n        \"calabiyau\": \"卡拉彼丘\",\n        \"soltyrei\": \"曙光少女\",\n        \"meikyuu black company\": \"异世界迷宫黑心企业\",\n        \"kimi no koto ga daidaidaidaidaisuki na 100-nin no kanojo\": \"超超超超超喜欢你的100个女朋友\",\n        \"kimagure orange road\": \"橙路\",\n        \"mahoutsukai no yakusoku\": \"魔法使的约定\",\n        \"genesis climber mospeada\": \"机甲创世记\",\n        \"tottemo luckyman\": \"幸运超人\",\n        \"super radical gag family\": \"浦安铁筋家族\",\n        \"edomae elf\": \"江户前精灵\",\n        \"eizouken ni wa te wo dasu na\": \"别对映像研出手！\",\n        \"rikei ga koi ni ochita no de shuomei shite mita.\": \"理科生坠入情网，故尝试证明。\",\n        \"yu-gi-oh go rush\": \"游戏王GO RUSH\",\n        \"tearmoon teikoku monogatari\": \"堤亚穆帝国物语～从断头台开始，公主重生后的逆转人生～\",\n        \"invincible\": \"无敌少侠\",\n        \"urotsukidoji\": \"超神传说\",\n        \"shutsudou minisuka police\": \"出动！迷你裙警察\",\n        \"engage kiss\": \"契约之吻\",\n        \"seitokai no ichizon\": \"学生会的一己之见\",\n        \"tsuritama\": \"钓球\",\n        \"mahou shoujo ni akogarete\": \"憧憬成为魔法少女\",\n        \"myo-chan sensei wa kaku katariki\": \"小美代老师如是说\",\n        \"kusuriya no hitorigoto\": \"药师少女的独语\",\n        \"equestria girls\": \"小马宝莉：魔法公主\",\n        \"palworld\": \"幻兽帕普\",\n        \"limbus company\": \"边狱公司\",\n        \"trigun\": \"枪神\",\n        \"saimin seishidou\": \"催眠性指导\",\n        \"tekkaman blade\": \"宇宙骑士BLADE\"\n    },\n    \"character\": {\n        \"alice\": \"爱丽丝\",\n        \"akane hino\": \"日野茜\",\n        \"ibuki\": \"伊吹\",\n        \"yui\": \"由依 | 结衣\",\n        \"hisui\": \"翡翠 | 飞彗\",\n        \"rider\": \"Rider | 龙女\",\n        \"maya\": \"摩耶\",\n        \"jeanne darc\": \"圣女贞德\",\n        \"katsuragi\": \"葛城\",\n        \"kasumi\": \"霞\",\n        \"leo\": \"丽王 | 利昂\",\n        \"haruna\": \"榛名 | 春奈\",\n        \"chitose\": \"千岁\",\n        \"murakumo\": \"丛 | 丛云\",\n        \"nachi\": \"那智\",\n        \"kagura\": \"神乐\",\n        \"ram\": \"拉姆\",\n        \"ink nijihara\": \"虹原茵可\",\n        \"pastel ink\": \"闪亮茵可\",\n        \"sumi kuroi\": \"黑威澄\",\n        \"alice shiratori\": \"白鸟爱丽丝\",\n        \"reimu hakurei\": \"博丽灵梦\",\n        \"marisa kirisame\": \"雾雨魔理沙\",\n        \"mima\": \"魅魔\",\n        \"sariel\": \"萨丽爱尔\",\n        \"chiyuri kitashirakawa\": \"北白河千百合\",\n        \"yumemi okazaki\": \"冈崎梦美\",\n        \"elly\": \"艾丽\",\n        \"gengetsu\": \"幻月\",\n        \"mugetsu\": \"梦月\",\n        \"kurumi\": \"胡桃\",\n        \"yumeko\": \"梦子\",\n        \"shinki\": \"神绮\",\n        \"rumia\": \"露米娅\",\n        \"daiyousei\": \"大妖精\",\n        \"cirno\": \"琪露诺\",\n        \"hong meiling\": \"红美铃\",\n        \"koakuma\": \"小恶魔\",\n        \"patchouli knowledge\": \"帕秋莉·诺蕾姬\",\n        \"sakuya izayoi\": \"十六夜咲夜\",\n        \"remilia scarlet\": \"蕾米莉亚·斯卡雷特\",\n        \"flandre scarlet\": \"芙兰朵露·斯卡雷特\",\n        \"letty whiterock\": \"蕾迪·霍瓦特罗克\",\n        \"chen\": \"橙\",\n        \"alice margatroid\": \"爱丽丝·玛格特洛依德\",\n        \"shanghai\": \"上海人偶\",\n        \"hourai\": \"蓬莱人偶\",\n        \"lily white\": \"莉莉霍瓦特\",\n        \"lily black\": \"莉莉黑\",\n        \"lunasa prismriver\": \"露娜萨·普莉兹姆利巴\",\n        \"merlin prismriver\": \"梅露兰·普莉兹姆利巴\",\n        \"lyrica prismriver\": \"莉莉卡·普莉兹姆利巴\",\n        \"youmu konpaku\": \"魂魄妖梦\",\n        \"yuyuko saigyouji\": \"西行寺幽幽子\",\n        \"ran yakumo\": \"八云蓝\",\n        \"yukari yakumo\": \"八云紫\",\n        \"suika ibuki\": \"伊吹萃香\",\n        \"wriggle nightbug\": \"莉格露·奈特巴格\",\n        \"mystia lorelei\": \"米斯蒂娅·萝蕾拉\",\n        \"keine kamishirasawa\": \"上白泽慧音\",\n        \"tewi inaba\": \"因幡帝\",\n        \"reisen udongein inaba\": \"铃仙·优昙华院·因幡\",\n        \"eirin yagokoro\": \"八意永琳\",\n        \"kaguya houraisan\": \"蓬莱山辉夜\",\n        \"fujiwara no mokou\": \"藤原妹红\",\n        \"aya shameimaru\": \"射命丸文\",\n        \"medicine melancholy\": \"梅蒂欣·梅兰可莉\",\n        \"yuuka kazami\": \"风见幽香\",\n        \"komachi onozuka\": \"小野塚小町\",\n        \"eiki shiki\": \"四季映姬·亚玛萨那度\",\n        \"shizuha aki\": \"秋静叶\",\n        \"minoriko aki\": \"秋穰子\",\n        \"hina kagiyama\": \"键山雏\",\n        \"nitori kawashiro\": \"河城荷取\",\n        \"momiji inubashiri\": \"犬走椛\",\n        \"sanae kochiya\": \"东风谷早苗\",\n        \"kanako yasaka\": \"八坂神奈子\",\n        \"suwako moriya\": \"洩矢诹访子\",\n        \"iku nagae\": \"永江衣玖\",\n        \"tenshi hinanai\": \"比那名居天子\",\n        \"kisume\": \"琪斯美\",\n        \"yamame kurodani\": \"黑谷山女\",\n        \"parsee mizuhashi\": \"水桥帕露西\",\n        \"yuugi hoshiguma\": \"星熊勇仪\",\n        \"satori komeiji\": \"古明地觉\",\n        \"rin kaenbyou\": \"火焰猫燐\",\n        \"utsuho reiuji\": \"灵乌路空\",\n        \"koishi komeiji\": \"古明地恋\",\n        \"nazrin\": \"纳兹琳\",\n        \"kogasa tatara\": \"多多良小伞\",\n        \"ichirin kumoi\": \"云居一轮\",\n        \"unzan\": \"云山\",\n        \"minamitsu murasa\": \"村纱水蜜\",\n        \"shou toramaru\": \"寅丸星\",\n        \"byakuren hijiri\": \"圣白莲\",\n        \"nue houjuu\": \"封兽鵺\",\n        \"hatate himekaidou\": \"姬海棠果\",\n        \"kyouko kasodani\": \"幽谷响子\",\n        \"yoshika miyako\": \"宫古芳香\",\n        \"seiga kaku\": \"霍青娥\",\n        \"soga no tojiko\": \"苏我屠自古\",\n        \"mononobe no futo\": \"物部布都\",\n        \"toyosatomimi no miko\": \"丰聪耳神子\",\n        \"mamizou futatsuiwa\": \"二岩猯藏\",\n        \"hata no kokoro\": \"秦心\",\n        \"wakasagihime\": \"若鹭姬\",\n        \"sekibanki\": \"赤蛮奇\",\n        \"kagerou imaizumi\": \"今泉影狼\",\n        \"benben tsukumo\": \"九十九弁弁\",\n        \"yatsuhashi tsukumo\": \"九十九八桥\",\n        \"seija kijin\": \"鬼人正邪\",\n        \"shinmyoumaru sukuna\": \"少名针妙丸\",\n        \"raiko horikawa\": \"堀川雷鼓\",\n        \"sumireko usami\": \"宇佐见堇子\",\n        \"seiran\": \"清兰\",\n        \"ringo\": \"铃瑚\",\n        \"doremy sweet\": \"哆来咪·苏伊特\",\n        \"sagume kishin\": \"稀神探女\",\n        \"clownpiece\": \"克劳恩皮丝\",\n        \"junko\": \"纯狐\",\n        \"hecatia lapislazuli\": \"赫卡提亚·拉碧斯拉祖利\",\n        \"joon yorigami\": \"依神女苑\",\n        \"shion yorigami\": \"依神紫苑\",\n        \"eternity larva\": \"爱塔妮缇拉尔瓦\",\n        \"nemuno sakata\": \"坂田合欢乃\",\n        \"aunn komano\": \"高丽野阿吽\",\n        \"narumi yatadera\": \"矢田寺成美\",\n        \"satono nishida\": \"尔子田里乃\",\n        \"mai teireida\": \"丁礼田舞\",\n        \"okina matara\": \"摩多罗隐岐奈\",\n        \"eika ebisu\": \"戎璎花\",\n        \"urumi ushizaki\": \"牛崎润美\",\n        \"kutaka niwatari\": \"庭渡久侘歌\",\n        \"yachie kicchou\": \"吉吊八千慧\",\n        \"mayumi joutouguu\": \"杖刀偶磨弓\",\n        \"keiki haniyasushin\": \"埴安神袿姬\",\n        \"saki kurokoma\": \"骊驹早鬼\",\n        \"mike goutokuji\": \"豪德寺三花\",\n        \"takane yamashiro\": \"山城高岭\",\n        \"sannyo komakusa\": \"驹草山如\",\n        \"misumaru tamatsukuri\": \"玉造魅须丸\",\n        \"tsukasa kudamaki\": \"菅牧典\",\n        \"megumu iizunamaru\": \"饭纲丸龙\",\n        \"chimata tenkyuu\": \"天弓千亦\",\n        \"momoyo himemushi\": \"姬虫百百世\",\n        \"tokiko\": \"朱鹭子\",\n        \"rinnosuke morichika\": \"森近霖之助\",\n        \"sunny milk\": \"桑尼米尔克\",\n        \"luna child\": \"露娜切露德\",\n        \"star sapphire\": \"斯塔萨菲雅\",\n        \"watatsuki no toyohime\": \"绵月丰姬\",\n        \"watatsuki no yorihime\": \"绵月依姬\",\n        \"hieda no akyuu\": \"稗田阿求\",\n        \"kasen ibara\": \"茨木华扇\",\n        \"kosuzu motoori\": \"本居小铃\",\n        \"miyoi okunoda\": \"奥野田美宵\",\n        \"renko usami\": \"宇佐见莲子\",\n        \"maribel han\": \"玛艾露贝莉·赫恩\",\n        \"hakurei miko\": \"先代巫女\",\n        \"honoka kosaka\": \"高坂穗乃果\",\n        \"yukiho kosaka\": \"高坂雪穗\",\n        \"eli ayase\": \"绚濑绘里\",\n        \"arisa ayase\": \"绚濑亚里沙\",\n        \"kotori minami\": \"南小鸟\",\n        \"umi sonoda\": \"园田海未\",\n        \"rin hoshizora\": \"星空凛\",\n        \"maki nishikino\": \"西木野真姬\",\n        \"nozomi tojo\": \"东条希\",\n        \"hanayo koizumi\": \"小泉花阳\",\n        \"nico yazawa\": \"矢泽妮可\",\n        \"tsubasa kira\": \"绮罗翼\",\n        \"erena toudou\": \"统堂英玲奈\",\n        \"anju yuuki\": \"优木杏树\",\n        \"chika takami\": \"高海千歌\",\n        \"riko sakurauchi\": \"樱内梨子\",\n        \"kanan matsuura\": \"松浦果南\",\n        \"dia kurosawa\": \"黑泽黛雅\",\n        \"you watanabe\": \"渡边曜\",\n        \"tsuki watanabe\": \"渡边月\",\n        \"yoshiko tsushima\": \"津岛善子\",\n        \"hanamaru kunikida\": \"国木田花丸\",\n        \"mari ohara\": \"小原鞠莉\",\n        \"ruby kurosawa\": \"黑泽露比\",\n        \"seira kazuno\": \"鹿角圣良\",\n        \"ria kazuno\": \"鹿角理亚\",\n        \"ayumu uehara\": \"上原步梦\",\n        \"kasumi nakasu\": \"中须霞\",\n        \"shizuku osaka\": \"樱坂雫\",\n        \"karin asaka\": \"朝香果林\",\n        \"ai miyashita\": \"宫下爱\",\n        \"kanata konoe\": \"近江彼方\",\n        \"haruka konoe\": \"近江遥\",\n        \"setsuna yuki\": \"优木雪菜\",\n        \"emma verde\": \"艾玛·维尔德\",\n        \"rina tennoji\": \"天王寺璃奈\",\n        \"rensouhou-chan\": \"连装炮酱\",\n        \"chiyoda\": \"千代田\",\n        \"akebono\": \"曙\",\n        \"ushio\": \"潮\",\n        \"ikazuchi\": \"雷\",\n        \"kamoi\": \"神威\",\n        \"maruyu\": \"丸输\",\n        \"z3\": \"Z3\",\n        \"italia\": \"意大利\",\n        \"luigi torelli\": \"路易吉·托雷利\",\n        \"iona\": \"伊欧娜\",\n        \"mamiya\": \"间宫\",\n        \"shikikan\": \"指挥官\",\n        \"ka-class\": \"潜艇KA级\",\n        \"so-class\": \"潜艇SO级\",\n        \"ri-class\": \"重巡RI级\",\n        \"re-class\": \"战舰RE级\",\n        \"ta-class\": \"战舰TA级\",\n        \"wo-class\": \"空母WO级\",\n        \"teitoku\": \"提督\",\n        \"nagato\": \"长门\",\n        \"mutsu\": \"陆奥\",\n        \"ise\": \"伊势\",\n        \"hyuuga\": \"日向\",\n        \"yukikaze\": \"雪风\",\n        \"akagi\": \"赤城\",\n        \"kaga\": \"加贺\",\n        \"souryuu\": \"苍龙\",\n        \"hiryuu\": \"飞龙\",\n        \"shimakaze\": \"岛风\",\n        \"fubuki\": \"吹雪\",\n        \"shirayuki\": \"白雪\",\n        \"hatsuyuki\": \"初雪\",\n        \"miyuki\": \"深雪\",\n        \"isonami\": \"矶波\",\n        \"ayanami\": \"绫波\",\n        \"shikinami\": \"敷波\",\n        \"ooi\": \"大井\",\n        \"kitakami\": \"北上\",\n        \"kongou\": \"金刚\",\n        \"hiei\": \"比睿\",\n        \"kirishima\": \"雾岛\",\n        \"houshou\": \"凤翔\",\n        \"fusou\": \"扶桑\",\n        \"yamashiro\": \"山城\",\n        \"tenryuu\": \"天龙\",\n        \"tatsuta\": \"龙田\",\n        \"ryuujou\": \"龙骧\",\n        \"mutsuki\": \"睦月\",\n        \"kisaragi\": \"如月\",\n        \"satsuki\": \"皋月\",\n        \"fumizuki\": \"文月\",\n        \"nagatsuki\": \"长月\",\n        \"kikuzuki\": \"菊月\",\n        \"mikazuki\": \"三日月\",\n        \"mochizuki\": \"望月\",\n        \"kuma\": \"球磨\",\n        \"tama\": \"多摩\",\n        \"kiso\": \"木曾\",\n        \"nagara\": \"长良\",\n        \"isuzu\": \"五十铃\",\n        \"natori\": \"名取\",\n        \"yura\": \"由良\",\n        \"sendai\": \"川内\",\n        \"jintsuu\": \"神通\",\n        \"naka\": \"那珂\",\n        \"mogami\": \"最上\",\n        \"furutaka\": \"古鹰\",\n        \"kako\": \"加古\",\n        \"aoba\": \"青叶\",\n        \"myoukou\": \"妙高\",\n        \"ashigara\": \"足柄\",\n        \"haguro\": \"羽黑\",\n        \"takao\": \"高雄\",\n        \"atago\": \"爱宕\",\n        \"choukai\": \"鸟海\",\n        \"tone\": \"利根\",\n        \"chikuma\": \"筑摩\",\n        \"hiyou\": \"飞鹰\",\n        \"junyou\": \"隼鹰\",\n        \"oboro\": \"胧\",\n        \"sazanami\": \"涟\",\n        \"akatsuki\": \"晓\",\n        \"hibiki\": \"响\",\n        \"inazuma\": \"电\",\n        \"hatsuharu\": \"初春\",\n        \"nenohi\": \"子日\",\n        \"wakaba\": \"若叶\",\n        \"hatsushimo\": \"初霜\",\n        \"shiratsuyu\": \"白露\",\n        \"shigure\": \"时雨\",\n        \"murasame\": \"村雨\",\n        \"yuudachi\": \"夕立\",\n        \"samidare\": \"五月雨\",\n        \"suzukaze\": \"凉风\",\n        \"asashio\": \"朝潮\",\n        \"ooshio\": \"大潮\",\n        \"michishio\": \"满潮\",\n        \"arashio\": \"荒潮\",\n        \"arare\": \"霰\",\n        \"kagerou\": \"阳炎\",\n        \"shiranui\": \"不知火\",\n        \"kuroshio\": \"黑潮\",\n        \"shouhou\": \"祥凤\",\n        \"shoukaku\": \"翔鹤\",\n        \"zuikaku\": \"瑞鹤\",\n        \"kinu\": \"鬼怒\",\n        \"abukuma\": \"阿武隈\",\n        \"yuubari\": \"夕张\",\n        \"zuihou\": \"瑞凤\",\n        \"mikuma\": \"三隈\",\n        \"hatsukaze\": \"初风\",\n        \"maikaze\": \"舞风\",\n        \"kinugasa\": \"衣笠\",\n        \"i-19\": \"伊19\",\n        \"suzuya\": \"铃谷\",\n        \"kumano\": \"熊野\",\n        \"i-168\": \"伊168\",\n        \"i-58\": \"伊58\",\n        \"i-8\": \"伊8\",\n        \"yamato\": \"大和\",\n        \"akigumo\": \"秋云\",\n        \"yuugumo\": \"夕云\",\n        \"makigumo\": \"卷云\",\n        \"naganami\": \"长波\",\n        \"agano\": \"阿贺野\",\n        \"noshiro\": \"能代\",\n        \"yahagi\": \"矢矧\",\n        \"sakawa\": \"酒匂\",\n        \"musashi\": \"武藏\",\n        \"taihou\": \"大凤\",\n        \"katori\": \"香取\",\n        \"i-401\": \"伊401\",\n        \"akitsu maru\": \"秋津丸\",\n        \"yayoi\": \"弥生\",\n        \"uzuki\": \"卯月\",\n        \"isokaze\": \"矶风\",\n        \"urakaze\": \"浦风\",\n        \"tanikaze\": \"谷风\",\n        \"hamakaze\": \"滨风\",\n        \"bismarck\": \"俾斯麦\",\n        \"z1\": \"Z1\",\n        \"prinz eugen\": \"欧根亲王\",\n        \"amatsukaze\": \"天津风\",\n        \"akashi\": \"明石\",\n        \"ooyodo\": \"大淀\",\n        \"taigei\": \"大鲸\",\n        \"ryuuhou\": \"龙凤\",\n        \"tokitsukaze\": \"时津风\",\n        \"unryuu\": \"云龙\",\n        \"amagi\": \"天城\",\n        \"harusame\": \"春雨\",\n        \"hayashimo\": \"早霜\",\n        \"kiyoshimo\": \"清霜\",\n        \"asagumo\": \"朝云\",\n        \"yamagumo\": \"山云\",\n        \"nowaki\": \"野分\",\n        \"akizuki\": \"秋月\",\n        \"teruzuki\": \"照月\",\n        \"hatsuzuki\": \"初月\",\n        \"takanami\": \"高波\",\n        \"asashimo\": \"朝霜\",\n        \"u-511\": \"U-511\",\n        \"graf zeppelin\": \"齐柏林伯爵\",\n        \"saratoga\": \"萨拉托加\",\n        \"ro-500\": \"吕500\",\n        \"warspite\": \"厌战\",\n        \"iowa\": \"衣阿华\",\n        \"littorio\": \"利托里奥\",\n        \"roma\": \"罗马\",\n        \"libeccio\": \"西南风\",\n        \"aquila\": \"天鹰\",\n        \"akitsushima\": \"秋津洲\",\n        \"zara\": \"扎拉\",\n        \"pola\": \"波拉\",\n        \"mizuho\": \"瑞穗\",\n        \"okinami\": \"冲波\",\n        \"kazagumo\": \"风云\",\n        \"arashi\": \"岚\",\n        \"hagikaze\": \"萩风\",\n        \"oyashio\": \"亲潮\",\n        \"yamakaze\": \"山风\",\n        \"umikaze\": \"海风\",\n        \"kawakaze\": \"江风\",\n        \"hayasui\": \"速吸\",\n        \"kashima\": \"鹿岛\",\n        \"kamikaze\": \"神风\",\n        \"asakaze\": \"朝风\",\n        \"harukaze\": \"春风\",\n        \"matsukaze\": \"松风\",\n        \"hatakaze\": \"旗风\",\n        \"amagiri\": \"天雾\",\n        \"sagiri\": \"狭雾\",\n        \"minazuki\": \"水无月\",\n        \"i-26\": \"伊26\",\n        \"hamanami\": \"滨波\",\n        \"fujinami\": \"藤波\",\n        \"uranami\": \"浦波\",\n        \"commandant teste\": \"特斯特长官\",\n        \"richelieu\": \"黎塞留\",\n        \"i-400\": \"伊400\",\n        \"i-13\": \"伊13\",\n        \"i-14\": \"伊14\",\n        \"gangut\": \"甘古特\",\n        \"tashkent\": \"塔什干\",\n        \"ark royal\": \"皇家方舟\",\n        \"shimushu\": \"占守\",\n        \"kunashiri\": \"国后\",\n        \"jervis\": \"贾维斯 | 杰维斯\",\n        \"suzutsuki\": \"凉月\",\n        \"etorofu\": \"择捉\",\n        \"matsuwa\": \"松轮\",\n        \"sado\": \"佐渡\",\n        \"tsushima\": \"对马\",\n        \"gambier bay\": \"甘比尔湾\",\n        \"intrepid\": \"无畏\",\n        \"johnston\": \"约翰斯顿\",\n        \"maestrale\": \"西北风\",\n        \"fletcher\": \"弗莱彻\",\n        \"unicorn\": \"独角兽\",\n        \"belfast\": \"贝尔法斯特\",\n        \"illustrious\": \"光辉\",\n        \"terror\": \"恐怖\",\n        \"vampire\": \"吸血鬼\",\n        \"laffey\": \"拉菲\",\n        \"eldridge\": \"埃尔德里奇\",\n        \"prince of wales\": \"威尔士亲王\",\n        \"sheffield\": \"谢菲尔德\",\n        \"ping hai\": \"平海\",\n        \"ning hai\": \"宁海\",\n        \"formidable\": \"可畏\",\n        \"admiral hipper\": \"希佩尔海军上将\",\n        \"portland\": \"波特兰\",\n        \"cygnet\": \"小天鹅\",\n        \"kent\": \"肯特\",\n        \"hammann\": \"哈曼\",\n        \"mikasa\": \"三笠\",\n        \"st. louis\": \"圣路易斯\",\n        \"san diego\": \"圣地亚哥\",\n        \"long island\": \"长岛\",\n        \"javelin\": \"标枪\",\n        \"nelson\": \"纳尔逊\",\n        \"rodney\": \"罗德尼\",\n        \"enterprise\": \"企业\",\n        \"queen elizabeth\": \"伊丽莎白女王\",\n        \"victorious\": \"胜利\",\n        \"ajax\": \"阿贾克斯\",\n        \"cleveland\": \"克利夫兰\",\n        \"honolulu\": \"火奴鲁鲁\",\n        \"z46\": \"Z46\",\n        \"z23\": \"Z23\",\n        \"tirpitz\": \"提尔比茨\",\n        \"duke of york\": \"约克公爵\",\n        \"bache\": \"贝奇\",\n        \"sirius\": \"天狼星\",\n        \"sims\": \"西姆斯\",\n        \"colorado\": \"科罗拉多\",\n        \"kuubo seiki\": \"空母栖姬\",\n        \"kuubo suiki\": \"空母水鬼\",\n        \"soukou kuuboki\": \"装甲空母姬\",\n        \"senkan seiki\": \"战舰栖姬\",\n        \"hoppou seiki\": \"北方栖姬\",\n        \"nanpou seiki\": \"南方栖鬼\",\n        \"shuusekichi seiki\": \"集积地栖姬\",\n        \"ritou seiki\": \"离岛栖姬\",\n        \"kouwan seiki\": \"港湾栖姬\",\n        \"chuukan seiki\": \"中间栖姬\",\n        \"hikoujouki\": \"飞行场姬\",\n        \"lion\": \"狮\",\n        \"kagero\": \"阳炎\",\n        \"el condor pasa\": \"神鹰\",\n        \"perth\": \"珀斯\",\n        \"renown\": \"声望\",\n        \"chang chun\": \"长春\",\n        \"gotland\": \"哥特兰\",\n        \"grecale\": \"东北风\",\n        \"bremerton\": \"布莱默顿\",\n        \"roon\": \"罗恩\",\n        \"dido\": \"黛朵\",\n        \"baltimore\": \"巴尔的摩\",\n        \"producer\": \"制作人\",\n        \"haruka amami\": \"天海春香\",\n        \"chihaya kisaragi\": \"如月千早\",\n        \"yukiho hagiwara\": \"萩原雪步\",\n        \"yayoi takatsuki\": \"高槻弥生\",\n        \"kasumi takatsuki\": \"高槻霞\",\n        \"ritsuko akizuki\": \"秋月律子\",\n        \"azusa miura\": \"三浦梓\",\n        \"iori minase\": \"水濑伊织\",\n        \"makoto kikuchi\": \"菊地真\",\n        \"ami futami\": \"双海亚美\",\n        \"mami futami\": \"双海真美\",\n        \"miki hoshii\": \"星井美希\",\n        \"hibiki ganaha\": \"我那霸响\",\n        \"takane shijou\": \"四条贵音\",\n        \"kotori otonashi\": \"音无小鸟\",\n        \"ai hidaka\": \"日高爱\",\n        \"mai hidaka\": \"日高舞\",\n        \"eri mizutani\": \"水谷绘理\",\n        \"ryo akizuki\": \"秋月凉\",\n        \"uzuki shimamura\": \"岛村卯月\",\n        \"yukari mizumoto\": \"水本紫\",\n        \"mai fukuyama\": \"福山舞\",\n        \"kanako mimura\": \"三村加奈子\",\n        \"miho kohinata\": \"小日向美穗\",\n        \"chieri ogata\": \"绪方智绘里\",\n        \"kyoko igarashi\": \"五十岚响子\",\n        \"momoka sakurai\": \"樱井桃华\",\n        \"yumeko sakurai\": \"樱井梦子\",\n        \"hasumi nagatomi\": \"长富莲实\",\n        \"chika yokoyama\": \"横山千佳\",\n        \"miku maekawa\": \"前川未来\",\n        \"saya matsubara\": \"松原早耶\",\n        \"yukino aihara\": \"相原雪乃\",\n        \"frederica miyamoto\": \"宫本芙蕾德莉卡\",\n        \"sae kobayakawa\": \"小早川纱枝\",\n        \"kotoka saionji\": \"西园寺琴歌\",\n        \"anzu futaba\": \"双叶杏\",\n        \"satomi sakakibara\": \"榊原里美\",\n        \"sachiko koshimizu\": \"舆水幸子\",\n        \"yuriko ohnishi\": \"大西由里子\",\n        \"nana abe\": \"安部菜菜\",\n        \"nene kurihara\": \"栗原宁宁\",\n        \"koharu koga\": \"古贺小春\",\n        \"akiha ikebukuro\": \"池袋晶叶\",\n        \"yuu ohta\": \"太田优\",\n        \"mayu sakuma\": \"佐久间麻由\",\n        \"mirei hayasaka\": \"早坂美玲\",\n        \"rina fujimoto\": \"藤本里奈\",\n        \"michiru ohara\": \"大原满\",\n        \"hotaru shiragiku\": \"白菊萤\",\n        \"kozue yusa\": \"游佐梢\",\n        \"kurumi ohnuma\": \"大沼胡桃\",\n        \"shiki ichinose\": \"一之濑志希\",\n        \"yuuki otokura\": \"乙仓悠贵\",\n        \"rin shibuya\": \"涩谷凛\",\n        \"sarina matsumoto\": \"松本沙理奈\",\n        \"mizuki kawashima\": \"川岛瑞树\",\n        \"nao kamiya\": \"神谷奈绪\",\n        \"haruna kamijou\": \"上条春菜\",\n        \"hina araki\": \"荒木比奈\",\n        \"ai togo\": \"东乡爱\",\n        \"riina tada\": \"多田李衣菜\",\n        \"seira mizuki\": \"水木圣来\",\n        \"chie sasaki\": \"佐佐木千枝\",\n        \"miyu mifune\": \"三船美优\",\n        \"manami kiba\": \"木场真奈美\",\n        \"hajime fujiwara\": \"藤原肇\",\n        \"helen\": \"海伦\",\n        \"noa takamine\": \"高峰诺亚\",\n        \"kaede takagaki\": \"高垣枫\",\n        \"ranko kanzaki\": \"神崎兰子\",\n        \"karen hojo\": \"北条加莲\",\n        \"honoka ayase\": \"绫濑穗乃香\",\n        \"yukimi sajo\": \"佐城雪美\",\n        \"rumi wakui\": \"和久井留美\",\n        \"kako takafuji\": \"鹰富士茄子\",\n        \"koume shirasaka\": \"白坂小梅\",\n        \"mutsumi ujiie\": \"氏家睦\",\n        \"yume narumiya\": \"成宫由爱\",\n        \"syuko shiomi\": \"盐见周子\",\n        \"minami nitta\": \"新田美波\",\n        \"kanade hayami\": \"速水奏\",\n        \"izumi ohishi\": \"大石泉\",\n        \"chizuru matsuo\": \"松尾千鹤\",\n        \"arisu tachibana\": \"橘爱丽丝\",\n        \"nono morikubo\": \"森久保乃乃\",\n        \"anastasia\": \"安娜斯塔西娅\",\n        \"aki yamato\": \"大和亚季\",\n        \"haru yuuki\": \"结城晴\",\n        \"fumika sagisawa\": \"鹭泽文香\",\n        \"layla\": \"莱拉 | 莱依拉\",\n        \"asuka ninomiya\": \"二宫飞鸟\",\n        \"nanami asari\": \"浅利七海\",\n        \"mio honda\": \"本田未央\",\n        \"aiko takamori\": \"高森蓝子\",\n        \"kaoru ryuzaki\": \"龙崎薰\",\n        \"natsuki kimura\": \"木村夏树\",\n        \"miria akagi\": \"赤城米莉亚\",\n        \"yui ohtsuki\": \"大槻唯\",\n        \"yuki himekawa\": \"姬川友纪\",\n        \"yuzu kitami\": \"喜多见柚\",\n        \"naho ebihara\": \"海老原菜帆\",\n        \"shizuku oikawa\": \"及川雫\",\n        \"reina koseki\": \"小关丽奈\",\n        \"yumi aiba\": \"相叶夕美\",\n        \"tomoka wakabayashi\": \"若林智香\",\n        \"mika jougasaki\": \"城崎美嘉\",\n        \"rika jougasaki\": \"城崎莉嘉\",\n        \"kirari moroboshi\": \"诸星琪拉莉\",\n        \"airi totoki\": \"十时爱梨\",\n        \"natalia\": \"娜塔莉亚\",\n        \"takumi mukai\": \"向井拓海\",\n        \"eve santaclaus\": \"伊芙·珊德克罗丝\",\n        \"nina ichihara\": \"市原仁奈\",\n        \"hinako kita\": \"喜多日菜子\",\n        \"mary cochran\": \"玛丽·柯克兰\",\n        \"ayame hamaguchi\": \"滨口菖蒲\",\n        \"syoko hoshi\": \"星辉子\",\n        \"ako tsuchiya\": \"土屋亚子\",\n        \"sanae katagiri\": \"片桐早苗\",\n        \"yuko hori\": \"堀裕子\",\n        \"kai nishijima\": \"西岛櫂\",\n        \"risa matoba\": \"的场梨沙\",\n        \"tokiko zaizen\": \"财前时子\",\n        \"shin sato\": \"佐藤心\",\n        \"yoshino yorita\": \"依田芳乃\",\n        \"chihiro senkawa\": \"千川千寻\",\n        \"mirai kasuga\": \"春日未来\",\n        \"hinata kinoshita\": \"木下日向\",\n        \"julia\": \"茱莉亚\",\n        \"sayoko takayama\": \"高山纱代子\",\n        \"kotoha tanaka\": \"田中琴叶\",\n        \"tomoka tenkubashi\": \"天空桥朋花\",\n        \"serika hakozaki\": \"箱崎星梨花\",\n        \"arisa matsuda\": \"松田亚利沙\",\n        \"shizuka mogami\": \"最上静香\",\n        \"anna mochizuki\": \"望月杏奈\",\n        \"emily stewart\": \"艾米莉·司徒亚特\",\n        \"tamaki ogami\": \"大神环\",\n        \"reika kitakami\": \"北上丽花\",\n        \"umi kousaka\": \"高坂海美\",\n        \"minako satake\": \"佐竹美奈子\",\n        \"elena shimabara\": \"岛原埃琳娜\",\n        \"subaru nagayoshi\": \"永吉昴\",\n        \"konomi baba\": \"马场木实\",\n        \"noriko fukuda\": \"福田法子\",\n        \"mizuki makabe\": \"真壁瑞希\",\n        \"rio momose\": \"百濑莉绪\",\n        \"nao yokoyama\": \"横山奈绪\",\n        \"tsubasa ibuki\": \"伊吹翼\",\n        \"shiho kitazawa\": \"北泽志保\",\n        \"karen shinomiya\": \"篠宫可怜\",\n        \"momoko suou\": \"周防桃子\",\n        \"matsuri tokugawa\": \"德川茉莉\",\n        \"megumi tokoro\": \"所惠美\",\n        \"fuuka toyokawa\": \"丰川风花\",\n        \"iku nakatani\": \"中谷育\",\n        \"yuriko nanao\": \"七尾百合子\",\n        \"chizuru nikaido\": \"二阶堂千鹤\",\n        \"miya miyao\": \"宫尾美也\",\n        \"roco handa\": \"伴田路子\",\n        \"kaori sakuramori\": \"樱守歌织\",\n        \"tsumugi shiraishi\": \"白石䌷\",\n        \"mishiro\": \"美城常务\",\n        \"touma amagase\": \"天濑冬马\",\n        \"teru tendo\": \"天道辉\",\n        \"minori watanabe\": \"渡边实\",\n        \"shiki iseya\": \"伊濑谷四季\",\n        \"hayato akiyama\": \"秋山隼人\",\n        \"saki mizushima\": \"水岛咲\",\n        \"shiro tachibana\": \"橘志狼\",\n        \"hokuto ijuuin\": \"伊集院北斗\",\n        \"kaoru sakuraba\": \"樱庭薫\",\n        \"rei kagura\": \"神乐丽\",\n        \"kyoji takajo\": \"鹰城恭二\",\n        \"kyosuke aoi\": \"苍井享介\",\n        \"jun fuyumi\": \"冬美旬\",\n        \"natsuki sakaki\": \"榊夏来\",\n        \"nao okamura\": \"冈村直央\",\n        \"shouta mitarai\": \"御手洗翔太\",\n        \"tsubasa kashiwagi\": \"柏木翼\",\n        \"kei tsuzuki\": \"都筑圭\",\n        \"pierre\": \"皮埃尔\",\n        \"yusuke aoi\": \"苍井悠介\",\n        \"haruna wakazato\": \"若里春名\",\n        \"makio uzuki\": \"卯月卷绪\",\n        \"kanon himeno\": \"姬野花音\",\n        \"mano sakuragi\": \"樱木真乃\",\n        \"hiori kazano\": \"风野灯织\",\n        \"meguru hachimiya\": \"八宫缭\",\n        \"mamimi tanaka\": \"田中摩美美\",\n        \"kiriko yukoku\": \"幽谷雾子\",\n        \"kogane tsukioka\": \"月冈恋钟\",\n        \"yuika mitsumine\": \"三峰结华\",\n        \"sakuya shirase\": \"白濑咲耶\",\n        \"amana osaki\": \"大崎甘奈\",\n        \"chiyuki kuwayama\": \"桑山千雪\",\n        \"tenka osaki\": \"大崎甜花\",\n        \"kaho komiya\": \"小宫果穂\",\n        \"chiyoko sonoda\": \"园田智代子\",\n        \"juri saijo\": \"西城树里\",\n        \"rinze morino\": \"杜野凛世\",\n        \"natsuha arisugawa\": \"有栖川夏叶\",\n        \"hazuki nanakusa\": \"七草叶月\",\n        \"nichika nanakusa\": \"七草日花\",\n        \"arisa mochida\": \"持田亚里沙\",\n        \"fuyuko mayuzumi\": \"黛冬优子\",\n        \"mei izumi\": \"和泉爱依\",\n        \"asahi serizawa\": \"芹泽朝阳\",\n        \"akira sunazuka\": \"砂冢明\",\n        \"riamu yumemi\": \"梦见璃亚梦\",\n        \"madoka higuchi\": \"樋口圆香\",\n        \"koito fukumaru\": \"福丸小糸\",\n        \"toru asakura\": \"浅仓透\",\n        \"hinana ichikawa\": \"市川雏菜\",\n        \"rookie trainer\": \"新手训练员\",\n        \"veteran trainer\": \"高手训练员\",\n        \"mario\": \"马里奥\",\n        \"luigi\": \"路易吉\",\n        \"yoshi\": \"耀西\",\n        \"wario\": \"瓦里奥\",\n        \"waluigi\": \"瓦路易吉\",\n        \"bowser\": \"库巴\",\n        \"wendy o. koopa\": \"温蒂库巴\",\n        \"super crown bowser\": \"库巴姬\",\n        \"princess peach\": \"碧奇公主\",\n        \"princess daisy\": \"黛西公主\",\n        \"rosalina\": \"罗塞塔\",\n        \"pauline\": \"波琳\",\n        \"boo\": \"布布\",\n        \"super crown boo\": \"幽灵姬\",\n        \"toad\": \"奇诺比奥\",\n        \"toadette\": \"奇诺比珂\",\n        \"donkey kong\": \"森喜刚\",\n        \"diddy kong\": \"狄狄刚\",\n        \"dixie kong\": \"狄可西刚\",\n        \"applejack\": \"苹果杰克\",\n        \"fluttershy\": \"小蝶\",\n        \"pinkie pie\": \"萍琪·派\",\n        \"rainbow dash\": \"云宝黛茜\",\n        \"rarity\": \"瑞瑞\",\n        \"twilight sparkle\": \"暮光闪闪\",\n        \"princess celestia\": \"塞拉斯蒂娅公主\",\n        \"princess luna\": \"露娜公主\",\n        \"princess cadance\": \"韵律公主\",\n        \"shining armor\": \"银甲闪闪\",\n        \"starlight glimmer\": \"星光熠熠\",\n        \"sunset shimmer\": \"余晖烁烁\",\n        \"apple bloom\": \"小萍花\",\n        \"scootaloo\": \"飞板璐\",\n        \"sweetie belle\": \"甜贝儿\",\n        \"big macintosh\": \"大麦哥\",\n        \"marble pie\": \"玉琪派\",\n        \"trixie\": \"崔克西\",\n        \"spitfire\": \"飞火\",\n        \"octavia\": \"奥塔维雅\",\n        \"vinyl scratch\": \"DJ3号\",\n        \"derpy hooves\": \"小呆\",\n        \"discord\": \"无序\",\n        \"diamond tiara\": \"珠玉冠冠\",\n        \"silver spoon\": \"白银勺勺\",\n        \"princess ember\": \"余焰公主\",\n        \"queen chrysalis\": \"邪茧女王\",\n        \"sonata dusk\": \"索娜塔\",\n        \"aqua\": \"阿库娅\",\n        \"megumin\": \"惠惠\",\n        \"kazuma satou\": \"佐藤和真\",\n        \"darkness\": \"达克妮丝\",\n        \"yunyun\": \"悠悠\",\n        \"wiz\": \"维兹\",\n        \"chris\": \"克莉丝\",\n        \"kokoa hoto\": \"保登心爱\",\n        \"chino kafuu\": \"香风智乃\",\n        \"rize tedeza\": \"天天座理世\",\n        \"chiya ujimatsu\": \"宇治松千夜\",\n        \"sharo kirima\": \"桐间纱路\",\n        \"maya jouga\": \"条河麻耶\",\n        \"megumi natsu\": \"奈津惠\",\n        \"mocha hoto\": \"保登摩卡\",\n        \"midori aoyama\": \"青山翠\",\n        \"kanade amakusa\": \"甘草奏\",\n        \"chocolat\": \"裘可拉\",\n        \"ayame reikadou\": \"丽华堂绚女\",\n        \"oka yuoji\": \"游王子讴歌\",\n        \"furano yukihira\": \"雪平富良野\",\n        \"chiwa harusaki\": \"春咲千和\",\n        \"eita kidou\": \"季堂锐太\",\n        \"masuzu natsukawa\": \"夏川真凉\",\n        \"himeka akishino\": \"秋篠姬香\",\n        \"ai fuyuumi\": \"冬海爱衣\",\n        \"kyousuke kousaka\": \"高坂京介\",\n        \"kirino kousaka\": \"高坂桐乃\",\n        \"ruri gokou\": \"五更琉璃（黑猫）\",\n        \"ayase aragaki\": \"新垣绫濑\",\n        \"saori makishima\": \"槙岛沙织（沙织·巴吉纳）\",\n        \"kanako kurusu\": \"来栖加奈子\",\n        \"bridget evans\": \"布莉姬·伊凡斯\",\n        \"sena akagi\": \"赤城濑菜\",\n        \"kouhei akagi\": \"赤城浩平\",\n        \"manami tamura\": \"田村麻奈实\",\n        \"daisuke kousaka\": \"高坂大介\",\n        \"tamaki gokou\": \"五更珠希\",\n        \"hinata gokou\": \"五更日向\",\n        \"ria hagry\": \"莉亚·哈格丽\",\n        \"azusa nakano\": \"中野梓\",\n        \"jun suzuki\": \"铃木纯\",\n        \"mio akiyama\": \"秋山澪\",\n        \"ritsu tainaka\": \"田井中律\",\n        \"sawako yamanaka\": \"山中佐和子\",\n        \"tsumugi kotobuki\": \"琴吹䌷\",\n        \"ui hirasawa\": \"平泽忧\",\n        \"yui hirasawa\": \"平泽唯\",\n        \"nodoka manabe\": \"真锅和\",\n        \"satoshi tainaka\": \"田井中聪\",\n        \"sumire saitou\": \"齐藤堇\",\n        \"megumi sokabe\": \"曾我部惠\",\n        \"luste teuber\": \"露斯特·特依巴\",\n        \"spiritia rosenberg\": \"斯匹莉缇娅·罗森伯格\",\n        \"yui yuigahama\": \"由比滨结衣\",\n        \"hachiman hikigaya\": \"比企谷八幡\",\n        \"komachi hikigaya\": \"比企谷小町\",\n        \"saki kawasaki\": \"川崎沙希\",\n        \"keika kawasaki\": \"川崎桂花\",\n        \"yoshiteru zaimokuza\": \"材木座义辉\",\n        \"yukino yukinoshita\": \"雪之下雪乃\",\n        \"iroha isshiki\": \"一色彩羽\",\n        \"hayato hayama\": \"叶山隼人\",\n        \"saika totsuka\": \"户冢彩加\",\n        \"haruno yukinoshita\": \"雪之下阳乃\",\n        \"shizuka hiratsuka\": \"平冢静\",\n        \"yuuta togashi\": \"富㭴勇太\",\n        \"yumeha togashi\": \"富㭴梦叶\",\n        \"rikka takanashi\": \"小鸟游六花\",\n        \"kumin tsuyuri\": \"五月七日茴香\",\n        \"shinka nibutani\": \"丹生谷森夏\",\n        \"sanae dekomori\": \"凸守早苗\",\n        \"satone shichimiya\": \"七宫智音\",\n        \"touka takanashi\": \"小鸟游十花\",\n        \"mercy\": \"天使\",\n        \"tracer\": \"猎空\",\n        \"widowmaker\": \"黑百合\",\n        \"mei\": \"美\",\n        \"d.va\": \"D.VA\",\n        \"zarya\": \"查莉娅\",\n        \"genjii\": \"源氏\",\n        \"junkrat\": \"狂鼠\",\n        \"roadhog\": \"路霸\",\n        \"pharah\": \"法老之鹰\",\n        \"soldier 76\": \"士兵：76\",\n        \"symmetra\": \"秩序之光\",\n        \"winston\": \"温斯顿\",\n        \"sombra\": \"黑影\",\n        \"ana\": \"安娜\",\n        \"ashe\": \"艾什\",\n        \"cortana\": \"科塔娜\",\n        \"gordon freeman\": \"戈登·弗里曼\",\n        \"alyx vance\": \"爱丽克斯·凡斯\",\n        \"chell\": \"雪儿\",\n        \"emilia\": \"爱蜜莉雅\",\n        \"rem\": \"雷姆\",\n        \"subaru natsuki\": \"菜月昴\",\n        \"beatrice\": \"碧翠丝\",\n        \"felix argyle\": \"菲利克斯·阿盖尔\",\n        \"felt\": \"菲鲁特\",\n        \"roswaal l. mathers\": \"罗兹瓦尔·L·梅札斯\",\n        \"otto suewen\": \"奥托·苏文\",\n        \"julius euclius\": \"由里乌斯·尤克历乌斯\",\n        \"elsa granhiert\": \"艾尔莎·葛兰西尔特\",\n        \"tomoya aki\": \"安艺伦也\",\n        \"megumi kato\": \"加藤惠\",\n        \"utaha kasumigaoka\": \"霞之丘诗羽\",\n        \"michiru hyodo\": \"冰堂美智留\",\n        \"eriri spencer sawamura\": \"泽村·斯宾塞·英梨梨\",\n        \"izumi hashima\": \"波岛出海\",\n        \"kobato hasegawa\": \"羽濑川小鸠\",\n        \"kodaka hasegawa\": \"羽濑川小鹰\",\n        \"rika shiguma\": \"志熊理科\",\n        \"sena kashiwazaki\": \"柏崎星奈\",\n        \"yozora mikazuki\": \"三日月夜空\",\n        \"yukimura kusunoki\": \"楠幸村\",\n        \"maria takayama\": \"高山玛利亚\",\n        \"ageha\": \"扬羽\",\n        \"aimu\": \"蓝梦\",\n        \"aria\": \"亚璃亚\",\n        \"ashiya\": \"芦屋\",\n        \"asuka\": \"飞鸟\",\n        \"ayame\": \"菖蒲\",\n        \"bashou\": \"芭蕉\",\n        \"chihaya\": \"千早\",\n        \"chiyo\": \"千代\",\n        \"daidouji\": \"大道寺前辈\",\n        \"fuga\": \"风雅\",\n        \"fuma\": \"风魔\",\n        \"ginrei\": \"银岭\",\n        \"haruka\": \"春花\",\n        \"hibari\": \"云雀\",\n        \"hijikata\": \"土方\",\n        \"hikage\": \"日影\",\n        \"homura\": \"焰\",\n        \"ikaruga\": \"斑鸠\",\n        \"imu\": \"忌梦\",\n        \"josui\": \"如水\",\n        \"kaede\": \"枫\",\n        \"kagari\": \"篝\",\n        \"kanon\": \"花音\",\n        \"kanzaki\": \"神咲\",\n        \"kochou\": \"胡蝶\",\n        \"kumi\": \"九魅\",\n        \"kuroudo\": \"藏人\",\n        \"mai\": \"舞\",\n        \"meimei\": \"美莓\",\n        \"minori\": \"美野里\",\n        \"mirai\": \"未来\",\n        \"misato\": \"深里\",\n        \"miyabi\": \"雅绯\",\n        \"motochika\": \"元亲\",\n        \"muramasa\": \"村正\",\n        \"murasaki\": \"紫\",\n        \"naraku\": \"奈乐\",\n        \"ryoubi\": \"两备\",\n        \"ryouna\": \"两奈\",\n        \"sakyou\": \"左京\",\n        \"seimei\": \"清明\",\n        \"siki\": \"四季\",\n        \"shiki\": \"四季\",\n        \"souji\": \"总司\",\n        \"suzune\": \"铃音（凛）\",\n        \"syuri\": \"朱璃\",\n        \"ukyou\": \"右京\",\n        \"ushimaru\": \"牛丸\",\n        \"yagyuu\": \"柳生\",\n        \"yomi\": \"咏\",\n        \"yoshimitsu\": \"吉光\",\n        \"yozakura\": \"夜樱\",\n        \"yugiri\": \"夕雾\",\n        \"yumi\": \"雪泉\",\n        \"yuyaki\": \"夕烧\",\n        \"tohru\": \"托尔\",\n        \"kanna kamui\": \"康娜卡姆依\",\n        \"quetzalcoatl\": \"魁札尔科亚特尔\",\n        \"kobayashi-san\": \"小林\",\n        \"shouta magatsuchi\": \"真土翔太\",\n        \"riko saikawa\": \"才川莉子\",\n        \"elma\": \"艾尔玛\",\n        \"ai-chan\": \"小爱\",\n        \"kouhai-chan\": \"后辈\",\n        \"azusa azuki\": \"小豆梓\",\n        \"youto yokodera\": \"横寺阳人\",\n        \"tsukiko tsutsukakushi\": \"筒隐月子\",\n        \"tsukushi tsutsukakushi\": \"筒隐筑紫\",\n        \"mai maimaki\": \"舞牧麻衣\",\n        \"emanuella porlallora\": \"艾米（艾玛努艾勒·波鲁勒劳拉）\",\n        \"tomoya okazaki\": \"冈崎朋也\",\n        \"fuko ibuki\": \"伊吹风子\",\n        \"kotomi ichinose\": \"一之濑琴美\",\n        \"ryou fujibayashi\": \"藤林椋\",\n        \"kyou fujibayashi\": \"藤林杏\",\n        \"nagisa furukawa\": \"古河渚\",\n        \"tomoyo sakagami\": \"坂上智代\",\n        \"yukine miyazawa\": \"宫泽有纪宁\",\n        \"mei sunohara\": \"春原芽衣\",\n        \"youhei sunohara\": \"春原阳平\",\n        \"misae sagara\": \"相乐美佐枝\",\n        \"sanae furukawa\": \"古河早苗\",\n        \"meiko honma\": \"本间芽衣子\",\n        \"naruko anjou\": \"安城鸣子\",\n        \"chiriko tsurumi\": \"鹤见知利子\",\n        \"jinta yadomi\": \"宿海仁太\",\n        \"atsumu matsuyuki\": \"松雪集\",\n        \"hotaru shidare\": \"枝垂萤\",\n        \"kokonotsu shikada\": \"鹿田九\",\n        \"saya endou\": \"远藤彩\",\n        \"hajime owari\": \"尾张一\",\n        \"aoba suzukaze\": \"凉风青叶\",\n        \"hifumi takimoto\": \"泷本日富美\",\n        \"kou yagami\": \"八神光\",\n        \"rin tooyama\": \"远山伦\",\n        \"hajime shinoda\": \"篠田初\",\n        \"yun iijima\": \"饭岛结音\",\n        \"shizuku hazuki\": \"叶月雫\",\n        \"momiji mochizuki\": \"望月红叶\",\n        \"nene sakura\": \"樱宁宁\",\n        \"umiko ahagon\": \"阿波根海子\",\n        \"yamato christina wako\": \"大和·克莉丝汀·和子\",\n        \"aoi miyamori\": \"宫森葵\",\n        \"ema yasuhara\": \"安原绘麻\",\n        \"midori imai\": \"今井绿\",\n        \"shizuka sakaki\": \"坂木静香\",\n        \"misa toudou\": \"藤堂美沙\",\n        \"misato segawa\": \"濑川美里\",\n        \"erika yano\": \"矢野艾莉卡\",\n        \"rinko ogasawara\": \"小笠原纶子\",\n        \"yuka okitsu\": \"兴津由佳\",\n        \"shun watanabe\": \"渡边隼\",\n        \"ai kunogi\": \"久乃木爱\",\n        \"yumi iguchi\": \"井口祐未\",\n        \"chitose karasuma\": \"乌丸千岁\",\n        \"momoka sono\": \"苑生百花\",\n        \"yae kugayama\": \"久我山八重\",\n        \"alice cartelet\": \"爱丽丝·卡塔雷特\",\n        \"aya komichi\": \"小路绫\",\n        \"karen kujou\": \"九条可怜\",\n        \"shinobu omiya\": \"大宫忍\",\n        \"youko inokuma\": \"猪熊阳子\",\n        \"sakura karasuma\": \"乌丸樱\",\n        \"akari kuzehashi\": \"久世桥朱里\",\n        \"honoka matsubara\": \"松原穗乃花\",\n        \"gabriel tenma white\": \"天真·珈百璃·怀特\",\n        \"vignette tsukinose april\": \"月乃濑·薇奈特·艾普利尔\",\n        \"satanichia kurumizawa mcdowell\": \"胡桃泽·萨塔妮娅·麦克道威尔\",\n        \"raphiel shiraha ainsworth\": \"白羽·菈菲尔·恩兹沃斯\",\n        \"chii\": \"小叽（爱露达）\",\n        \"yumi omura\": \"大村裕美\",\n        \"sumomo\": \"丝茉茉\",\n        \"chitose hibiya\": \"日比谷千岁\",\n        \"hideki motosuwa\": \"本须和秀树\",\n        \"yuzuki\": \"柚姬\",\n        \"minoru kokubunji\": \"国分寺稔\",\n        \"takako shimizu\": \"清水多香子\",\n        \"sylvie\": \"希尔薇\",\n        \"rito yuuki\": \"结城梨斗\",\n        \"ryouko mikado\": \"御门凉子\",\n        \"lala satalin deviluke\": \"菈菈·萨塔琳·戴比路克\",\n        \"haruna sairenji\": \"西连寺春菜\",\n        \"golden darkness\": \"金色暗影\",\n        \"yui kotegawa\": \"古手川唯\",\n        \"mikan yuuki\": \"结城美柑\",\n        \"nemesis\": \"涅墨西斯\",\n        \"saki tenjouin\": \"天条院沙姬\",\n        \"aya fujisaki\": \"藤崎绫\",\n        \"rin kujou\": \"九条凛\",\n        \"mea kurosaki\": \"黑咲芽亚\",\n        \"nana asta deviluke\": \"娜娜·阿斯塔·戴比路克\",\n        \"momo velia deviluke\": \"梦梦·贝莉雅·戴比路克\",\n        \"riko yuusaki\": \"夕崎梨子\",\n        \"sephie michaela deviluke\": \"赛菲·米卡埃拉·戴比路克\",\n        \"tearju lunatique\": \"提亚悠·鲁娜提克\",\n        \"run elsie jewelria\": \"伦·艾尔西·裘利亚\",\n        \"risa momioka\": \"籾冈里纱\",\n        \"mio sawada\": \"泽田未央\",\n        \"oshizu murasame\": \"村雨静\",\n        \"kyouko kirisaki\": \"雾崎恭子\",\n        \"kenichi saruyama\": \"猿山健一\",\n        \"shizu murasame\": \"村雨静\",\n        \"erina nakiri\": \"薙切绘理奈\",\n        \"alice nakiri\": \"薙切爱丽丝\",\n        \"azami nakiri\": \"薙切蓟\",\n        \"ikumi mito\": \"水户郁魅\",\n        \"megumi tadokoro\": \"田所惠\",\n        \"fuyumi mizuhara\": \"水原冬美\",\n        \"souma yukihira\": \"幸平创真\",\n        \"takumi aldini\": \"巧·阿尔迪尼\",\n        \"isami aldini\": \"勇·阿尔迪尼\",\n        \"hisako arato\": \"新户绯沙子\",\n        \"ryou kurokiba\": \"黑木场凉\",\n        \"satoshi isshiki\": \"一色慧\",\n        \"ryouko sakaki\": \"榊凉子\",\n        \"rindou kobayashi\": \"小林龙胆\",\n        \"sagiri izumi\": \"和泉纱雾\",\n        \"elf yamada\": \"山田妖精（艾蜜莉·格兰杰）\",\n        \"masamune izumi\": \"和泉正宗\",\n        \"megumi jinno\": \"神野惠\",\n        \"muramasa senju\": \"千寿村征（梅园花）\",\n        \"tomoe takasago\": \"高砂智惠\",\n        \"super sonico\": \"超级索尼子\",\n        \"super pochaco\": \"超级帕恰子\",\n        \"super taruco\": \"超级桶桶子\",\n        \"ako suminoe\": \"住之江亚香\",\n        \"riko suminoe\": \"住之江理香\",\n        \"keita suminoe\": \"住之江圭太\",\n        \"miharu mikuni\": \"三国美春\",\n        \"agiri goshiki\": \"吴织亚切\",\n        \"sonya\": \"索妮娅\",\n        \"yasuna oribe\": \"折部安奈\",\n        \"kyara botsu\": \"无名子\",\n        \"ika musume\": \"乌贼娘\",\n        \"ayumi tokita\": \"常田鲇美\",\n        \"chizuru aizawa\": \"相泽千鹤\",\n        \"cindy campbell\": \"辛迪·坎贝尔\",\n        \"eiko aizawa\": \"相泽荣子\",\n        \"sanae nagatsuki\": \"长月早苗\",\n        \"takeru aizawa\": \"相泽武\",\n        \"kiyomi sakura\": \"纱仓清美\",\n        \"nagisa saitou\": \"齐藤渚\",\n        \"miku hatsune\": \"初音未来\",\n        \"luka megurine\": \"巡音流歌\",\n        \"len kagamine\": \"镜音连\",\n        \"rin kagamine\": \"镜音铃\",\n        \"haku yowane\": \"弱音白\",\n        \"gumi\": \"GUMI\",\n        \"akari kizuna\": \"绁星灯\",\n        \"yukari yuzuki\": \"结月缘\",\n        \"maki tsurumaki\": \"弦卷真纪\",\n        \"akane kotonoha\": \"琴叶茜\",\n        \"aoi kotonoha\": \"琴叶葵\",\n        \"zunko tohoku\": \"东北俊子\",\n        \"tsudumi suzuki\": \"铃木梓梓弥\",\n        \"sorata kanda\": \"神田空太\",\n        \"mashiro shiina\": \"椎名真白\",\n        \"nanami aoyama\": \"青山七海\",\n        \"misaki kamiigusa\": \"上井草美咲\",\n        \"chihiro sengoku\": \"千石千寻\",\n        \"ryuuji takasu\": \"高须龙儿\",\n        \"taiga aisaka\": \"逢坂大河\",\n        \"minori kushieda\": \"栉枝实乃梨\",\n        \"ami kawashima\": \"川岛亚美\",\n        \"yasuko takasu\": \"高须泰子\",\n        \"maya kihara\": \"木原麻耶\",\n        \"nanako kashii\": \"香椎奈奈子\",\n        \"yuri koigakubo\": \"恋洼百合\",\n        \"yuusaku kitamura\": \"北村佑作\",\n        \"sakura kanou\": \"狩野樱\",\n        \"sumire kanou\": \"狩野堇\",\n        \"akito himenokouji\": \"姬小路秋人\",\n        \"akiko himenokouji\": \"姬小路秋子\",\n        \"anastasia nasuhara\": \"那须原安娜史塔希亚\",\n        \"ginbei haruomi sawatari\": \"猿渡银兵卫春臣\",\n        \"arashi nikaidou\": \"二阶堂岚\",\n        \"arisa takanomiya\": \"鹰乃宫亚里沙\",\n        \"origami tobiichi\": \"鸢一折纸\",\n        \"kurumi tokisaki\": \"时崎狂三\",\n        \"yoshino himekawa\": \"冰芽川四糸乃\",\n        \"kotori itsuka\": \"五河琴里\",\n        \"kaguya yamai\": \"八舞耶俱矢\",\n        \"yuzuru yamai\": \"八舞夕弦\",\n        \"miku izayoi\": \"诱宵美九\",\n        \"tohka yatogami\": \"夜刀神十香\",\n        \"shido itsuka\": \"五河士道\",\n        \"reine murasame\": \"村雨令音\",\n        \"mayuka kondou\": \"近藤茧佳\",\n        \"nao takanashi\": \"高梨奈绪\",\n        \"iroha tsuchiura\": \"土浦彩叶\",\n        \"nyaruko\": \"奈亚子\",\n        \"cthugha\": \"克图格亚\",\n        \"mahiro yasaka\": \"八坂真寻\",\n        \"hastur\": \"哈斯太\",\n        \"konoe tsuruma\": \"鹤真心乃枝\",\n        \"miyabi kannagi\": \"神凪雅\",\n        \"himeko inaba\": \"稻叶姬子\",\n        \"iori nagase\": \"永濑伊织\",\n        \"taichi yaegashi\": \"八重㭴太一\",\n        \"yui kiriyama\": \"桐山唯\",\n        \"yoshifumi aoki\": \"青木义文\",\n        \"raku ichijou\": \"一条乐\",\n        \"kosaki onodera\": \"小野寺小咲\",\n        \"haru onodera\": \"小野寺春\",\n        \"yui kanakura\": \"奏仓羽\",\n        \"marika tachibana\": \"橘万里花\",\n        \"chitoge kirisaki\": \"桐崎千棘\",\n        \"seishirou tsugumi\": \"鸫诚士郎\",\n        \"ruri miyamoto\": \"宫本琉璃\",\n        \"fumino serizawa\": \"芹泽文乃\",\n        \"nozomi kiriya\": \"雾谷希\",\n        \"chise umenomori\": \"梅之森千世\",\n        \"otome tsuzuki\": \"都筑乙女\",\n        \"touma kamijou\": \"上条当麻\",\n        \"mikoto misaka\": \"御坂美琴\",\n        \"misuzu misaka\": \"御坂美铃\",\n        \"aisa himegami\": \"姬神秋沙\",\n        \"mii konori\": \"固法美伟\",\n        \"seiri fukiyose\": \"吹寄制理\",\n        \"kaori kanzaki\": \"神裂火织\",\n        \"komoe tsukuyomi\": \"月咏小萌\",\n        \"misaka-imouto\": \"御坂妹妹\",\n        \"last order\": \"最后之作\",\n        \"index librorum prohibitorum\": \"茵蒂克丝\",\n        \"kuroko shirai\": \"白井黑子\",\n        \"misaki shokuhou\": \"食蜂操祈\",\n        \"mitsuko kongou\": \"婚后光子\",\n        \"kinuho wannai\": \"湾内绢保\",\n        \"maaya awatsuki\": \"泡浮万彬\",\n        \"aiho yomikawa\": \"黄泉川爱穗\",\n        \"tsuzuri tessou\": \"铁装缀里\",\n        \"maika tsuchimikado\": \"土御门舞夏\",\n        \"erii haruue\": \"春上衿衣\",\n        \"ruiko saten\": \"佐天泪子\",\n        \"kazari uiharu\": \"初春饰利\",\n        \"accelerator\": \"一方通行\",\n        \"oriana thomson\": \"欧莉安娜·汤姆森\",\n        \"shizuri mugino\": \"麦野沉利\",\n        \"rikou takitsubo\": \"泷壶理后\",\n        \"saiai kinuhata\": \"绢旗最爱\",\n        \"frenda seivelun\": \"芙兰达·塞维伦\",\n        \"shiage hamazura\": \"滨面仕上\",\n        \"hyouka kazakiri\": \"风斩冰华\",\n        \"harumi kiyama\": \"木山春生\",\n        \"motoharu tsuchimikado\": \"土御门元春\",\n        \"itsuwa\": \"五和\",\n        \"lucia\": \"露琪亚\",\n        \"agnese sanctis\": \"雅妮丝·桑提斯\",\n        \"angelene\": \"安洁莉娜\",\n        \"eiga kanmi\": \"甘味荣华\",\n        \"febrie\": \"菲布理\",\n        \"janie\": \"珍妮\",\n        \"shinobu nunotaba\": \"布束砥信\",\n        \"yumi kusakabe\": \"草壁优美\",\n        \"eru chitanda\": \"千反田爱瑠\",\n        \"houtarou oreki\": \"折木奉太郎\",\n        \"mayaka ibara\": \"伊原摩耶花\",\n        \"fuyumi irisu\": \"入须冬实\",\n        \"satoshi fukube\": \"福部里志\",\n        \"ayako kouchi\": \"河内亚也子\",\n        \"mitsuha miyamizu\": \"宫水三叶\",\n        \"yotsuha miyamizu\": \"宫水四叶\",\n        \"miki okudera\": \"奥寺美纪\",\n        \"taki tachibana\": \"立花泷\",\n        \"akihisa yoshii\": \"吉井明久\",\n        \"akira yoshii\": \"吉井玲\",\n        \"hideyoshi kinoshita\": \"木下秀吉\",\n        \"yuuko kinoshita\": \"木下优子\",\n        \"mizuki himeji\": \"姬路瑞希\",\n        \"minami shimada\": \"岛田美波\",\n        \"hazuki shimada\": \"岛田叶月\",\n        \"yuuji sakamoto\": \"坂本雄二\",\n        \"shouko kirishima\": \"雾岛翔子\",\n        \"aiko kudou\": \"工藤爱子\",\n        \"miharu shimizu\": \"清水美春\",\n        \"judy hopps\": \"兔朱迪\",\n        \"nick wilde\": \"狐尼克\",\n        \"jack savage\": \"野蛮杰克\",\n        \"chief bogo\": \"蛮牛局长\",\n        \"bonnie hopps\": \"兔邦妮\",\n        \"nagi\": \"薙\",\n        \"zange\": \"忏悔\",\n        \"jin mikuriya\": \"御厨仁\",\n        \"tsugumi aoba\": \"青叶鸫\",\n        \"shino ookouchi\": \"大河内紫乃\",\n        \"takako kimura\": \"木村贵子\",\n        \"kochou yoshida\": \"良田胡蝶\",\n        \"minori nakazawa\": \"中泽农\",\n        \"ringo kinoshita\": \"木下林檎\",\n        \"natsumi bekki\": \"户次菜摘\",\n        \"sora takanashi\": \"小鸟游空\",\n        \"miu takanashi\": \"小鸟游美羽\",\n        \"hina takanashi\": \"小鸟游雏\",\n        \"yuuta segawa\": \"濑川佑太\",\n        \"raika oda\": \"织田莱香\",\n        \"miia\": \"米亚\",\n        \"centorea shianus\": \"珊卓蕾亚·夏努斯\",\n        \"papi\": \"帕皮\",\n        \"suu\": \"丝\",\n        \"lala\": \"拉拉\",\n        \"rachnera arachnera\": \"拉克涅拉·阿拉克涅拉\",\n        \"manako\": \"真奈子\",\n        \"meroune lorelei\": \"美洛努·罗雷莱\",\n        \"tionishia\": \"提欧尼西亚\",\n        \"cathyl\": \"卡特尔\",\n        \"kimihito kurusu\": \"来留主公人\",\n        \"yuuki oojima\": \"大岛裕树\",\n        \"satsuki shinonome\": \"东云皋月\",\n        \"miho nishizumi\": \"西住美穗\",\n        \"saori takebe\": \"武部沙织\",\n        \"hana isuzu\": \"五十铃华\",\n        \"yukari akiyama\": \"秋山优花里\",\n        \"mako reizei\": \"冷泉麻子\",\n        \"anzu kadotani\": \"角谷杏\",\n        \"yuzu koyama\": \"小山柚子\",\n        \"momo kawashima\": \"河岛桃\",\n        \"noriko isobe\": \"矶边典子\",\n        \"taeko kondou\": \"近藤妙子\",\n        \"shinobu kawanishi\": \"河西忍\",\n        \"akebi sasaki\": \"佐佐木明日\",\n        \"azusa sawa\": \"泽梓\",\n        \"yuuki utsugi\": \"宇津木优季\",\n        \"saki maruyama\": \"丸山纱希\",\n        \"midoriko sono\": \"园绿子\",\n        \"darjeeling\": \"大吉岭\",\n        \"assam\": \"阿萨姆\",\n        \"orange pekoe\": \"橙黄白毫\",\n        \"rosehip\": \"蔷薇果\",\n        \"rukuriri\": \"鲁克莉莉\",\n        \"kay\": \"凯伊\",\n        \"chiyomi anzai\": \"安斋千代美\",\n        \"carpaccio\": \"卡尔帕乔\",\n        \"pepperoni\": \"佩帕罗妮\",\n        \"katyusha\": \"喀秋莎\",\n        \"nonna\": \"农娜\",\n        \"maho nishizumi\": \"西住真穗\",\n        \"erika itsumi\": \"逸见艾丽卡\",\n        \"mika\": \"米卡\",\n        \"aki\": \"阿基\",\n        \"mikko\": \"米科\",\n        \"kinuyo nishi\": \"西绢代\",\n        \"arisu shimada\": \"岛田爱里寿\",\n        \"azumi\": \"杏美\",\n        \"ami chouno\": \"蝶野亚美\",\n        \"rena andou\": \"安藤丽奈\",\n        \"ruka oshida\": \"押田流歌\",\n        \"murakami\": \"村上\",\n        \"yuri isuzu\": \"五十铃百合\",\n        \"shiho nishizumi\": \"西住志穗\",\n        \"yoshiko akiyama\": \"秋山好子\",\n        \"chiyo shimada\": \"岛田千代\",\n        \"a2\": \"A型二号\",\n        \"2b\": \"二号B型\",\n        \"9s\": \"九号S型\",\n        \"megumi noda\": \"野田惠\",\n        \"shinichi chiaki\": \"千秋真一\",\n        \"saki miyanaga\": \"宫永咲\",\n        \"nodoka haramura\": \"原村和\",\n        \"yuuki kataoka\": \"片冈优希\",\n        \"mako someya\": \"染谷真子\",\n        \"hisa takei\": \"竹井久\",\n        \"kyoutarou suga\": \"须贺京太郎\",\n        \"touka ryuumonbuchi\": \"龙门渊透华\",\n        \"hajime kunihiro\": \"国广一\",\n        \"koromo amae\": \"天江衣\",\n        \"mihoko fukuji\": \"福路美穗子\",\n        \"kana ikeda\": \"池田华菜\",\n        \"miharu yoshitome\": \"吉留未春\",\n        \"sumiyo fukabori\": \"深堀纯代\",\n        \"yumi kajiki\": \"加治木由美\",\n        \"momoko touyoko\": \"东横桃子\",\n        \"satomi kanbara\": \"蒲原智美\",\n        \"shizuno takakamo\": \"高鸭稳乃\",\n        \"ako atarashi\": \"新子憧\",\n        \"kuro matsumi\": \"松实玄\",\n        \"yuu matsumi\": \"松实宥\",\n        \"arata sagimori\": \"鹭森灼\",\n        \"harue akado\": \"赤土晴绘\",\n        \"teru miyanaga\": \"宫永照\",\n        \"sumire hirose\": \"弘世堇\",\n        \"awai oohoshi\": \"大星淡\",\n        \"yuuko mase\": \"真濑由子\",\n        \"hiroe atago\": \"爱宕洋榎\",\n        \"kinue atago\": \"爱宕绢惠\",\n        \"kyouko suehara\": \"末原恭子\",\n        \"toki onjouji\": \"园城寺怜\",\n        \"ryuuka shimizudani\": \"清水谷龙华\",\n        \"sera eguchi\": \"江口夕\",\n        \"hiroko funakubo\": \"船久保浩子\",\n        \"izumi nijou\": \"二条泉\",\n        \"komaki jindai\": \"神代小莳\",\n        \"tomoe karijuku\": \"狩宿巴\",\n        \"haru takimi\": \"泷见春\",\n        \"hatsumi usuzumi\": \"薄墨初美\",\n        \"kasumi iwato\": \"石户霞\",\n        \"shiromi kosegawa\": \"小濑川白望\",\n        \"aislinn wishart\": \"爱丝琳·威夏尔特\",\n        \"sae usuzawa\": \"臼泽塞\",\n        \"mairu shirouzu\": \"白水哩\",\n        \"himeko tsuruta\": \"鹤田姬子\",\n        \"yukiko maya\": \"真屋由晖子\",\n        \"yoshiko kainou\": \"戒能良子\",\n        \"kaban\": \"背包\",\n        \"serval\": \"薮猫\",\n        \"common raccoon\": \"浣熊\",\n        \"fennec\": \"耳廓狐\",\n        \"ezo red fox\": \"北狐\",\n        \"silver fox\": \"银狐\",\n        \"moose\": \"驼鹿\",\n        \"shoebill\": \"鲸头鹳\",\n        \"alpaca suri\": \"苏利羊驼\",\n        \"humboldt penguin\": \"汉波德企鹅\",\n        \"emperor penguin\": \"帝企鹅\",\n        \"royal penguin\": \"皇家企鹅\",\n        \"margay\": \"长尾虎猫\",\n        \"black leopard\": \"黑豹\",\n        \"leopard\": \"豹\",\n        \"south african giraffe\": \"南非长颈鹿\",\n        \"sabre tiger\": \"剑齿虎\",\n        \"japanese crested ibis\": \"朱鹮\",\n        \"sora kasugano\": \"春日野穹\",\n        \"haruka kasugano\": \"春日野悠\",\n        \"juliet starling\": \"朱丽叶·斯塔林\",\n        \"shinichi kudo\": \"工藤新一\",\n        \"ran mouri\": \"毛利兰\",\n        \"conan edogawa\": \"江户川柯南\",\n        \"ai haibara\": \"灰原哀\",\n        \"ayumi yoshida\": \"吉田步美\",\n        \"kazuha toyama\": \"远山和叶\",\n        \"heiji hattori\": \"服部平次\",\n        \"kaito kuroba\": \"黑羽快斗\",\n        \"kogoro mouri\": \"毛利小五郎\",\n        \"rei furuya\": \"降谷零\",\n        \"shuuichi akai\": \"赤井秀一\",\n        \"sonoko suzuki\": \"铃木园子\",\n        \"eri kisaki\": \"妃英理\",\n        \"jodie starling\": \"茱蒂·斯泰琳\",\n        \"miwako sato\": \"佐藤美和子\",\n        \"masumi sera\": \"世良真纯\",\n        \"yamcha\": \"雅木茶\",\n        \"bulma briefs\": \"布尔玛\",\n        \"chi chi\": \"琪琪\",\n        \"son gohan\": \"孙悟饭\",\n        \"son goten\": \"孙悟天\",\n        \"android 16\": \"人造人16号\",\n        \"android 18\": \"人造人18号\",\n        \"android 21\": \"人造人21号\",\n        \"videl\": \"比迪丽\",\n        \"son goku\": \"孙悟空\",\n        \"spopovich\": \"斯波比奇\",\n        \"vegeta\": \"贝吉塔\",\n        \"trunks briefs\": \"特兰克斯\",\n        \"piccolo\": \"比克\",\n        \"goku black\": \"黑悟空\",\n        \"broly\": \"布罗利\",\n        \"erasa\": \"伊蕾莎\",\n        \"majin buu\": \"魔人布欧\",\n        \"master roshi\": \"武天老师\",\n        \"oolong\": \"乌龙\",\n        \"ranfan\": \"兰芳\",\n        \"lunch\": \"兰琪\",\n        \"panchy brief\": \"布里夫太太\",\n        \"kuro kagami\": \"镜黑\",\n        \"mimi usa\": \"宇佐美美\",\n        \"rin kokonoe\": \"九重凛\",\n        \"daisuke aoki\": \"青木大介\",\n        \"hestia\": \"赫斯缇雅\",\n        \"bell cranel\": \"贝尔·克朗尼\",\n        \"tiona hiryute\": \"蒂奥娜·席吕特\",\n        \"tione hiryute\": \"蒂奥涅·席吕特\",\n        \"aiz wallenstein\": \"艾丝·华伦斯坦\",\n        \"eina tulle\": \"埃伊娜·祖尔\",\n        \"freya\": \"芙蕾雅\",\n        \"hephaistos\": \"赫菲斯托丝\",\n        \"liliruca arde\": \"莉莉露卡·厄德\",\n        \"ryuu lion\": \"琉·璃昂\",\n        \"loki\": \"洛基\",\n        \"syr flova\": \"希儿·福罗瓦\",\n        \"homura akemi\": \"晓美焰\",\n        \"madoka kaname\": \"鹿目圆\",\n        \"mami tomoe\": \"巴麻美\",\n        \"sayaka miki\": \"美树沙耶香\",\n        \"kyouko sakura\": \"佐仓杏子\",\n        \"nagisa momoe\": \"百江渚\",\n        \"kaede akino\": \"秋野枫\",\n        \"rena minami\": \"水波玲奈\",\n        \"yachiyo nanami\": \"七海八千代\",\n        \"iroha tamaki\": \"环彩羽\",\n        \"kyubey\": \"丘比\",\n        \"kyousuke kamijou\": \"上条恭介\",\n        \"danua\": \"达奴娅\",\n        \"djeeta\": \"姬塔\",\n        \"eugen\": \"欧根\",\n        \"gran\": \"格兰\",\n        \"io\": \"伊欧\",\n        \"lyria\": \"露莉亚\",\n        \"katalina\": \"卡塔莉娜\",\n        \"narmaya\": \"娜尔梅亚\",\n        \"rosetta\": \"萝赛塔\",\n        \"sturm\": \"斯特姆\",\n        \"vira\": \"维拉\",\n        \"vampy\": \"斑比\",\n        \"sakura kinomoto\": \"木之本樱\",\n        \"touya kinomoto\": \"木之本桃矢\",\n        \"yukito tsukishiro\": \"月城雪兔\",\n        \"tomoyo daidouji\": \"大道寺知世\",\n        \"sonomi daidouji\": \"大道寺园美\",\n        \"syaoran li\": \"李小狼\",\n        \"meiling li\": \"李苺铃\",\n        \"rika sasaki\": \"佐佐木利佳\",\n        \"chiharu mihara\": \"三原千春\",\n        \"naoko yanagisawa\": \"柳泽奈绪子\",\n        \"ruby rose\": \"露比·罗丝\",\n        \"weiss schnee\": \"魏丝·雪倪\",\n        \"blake belladonna\": \"布蕾克·贝拉多娜\",\n        \"yang xiao long\": \"阳小龙\",\n        \"erika chiba\": \"千叶艾莉卡\",\n        \"haruka ono\": \"小野遥\",\n        \"honoka mitsui\": \"光井穗香\",\n        \"mari watanabe\": \"渡边摩利\",\n        \"mayumi saegusa\": \"七草真由美\",\n        \"miyuki shiba\": \"司波深雪\",\n        \"mizuki shibata\": \"柴田美月\",\n        \"sayaka mibu\": \"壬生纱耶香\",\n        \"shizuku kitayama\": \"北山雫\",\n        \"suzune ichihara\": \"市原铃音\",\n        \"tatsuya shiba\": \"司波达也\",\n        \"saber\": \"Saber\",\n        \"archer\": \"Archer\",\n        \"lancer\": \"Lancer\",\n        \"caster\": \"Caster\",\n        \"berserker\": \"Berserker\",\n        \"assassin\": \"Assassin\",\n        \"shirou emiya\": \"卫宫士郎\",\n        \"rin tosaka\": \"远坂凛\",\n        \"kirei kotomine\": \"言峰绮礼\",\n        \"sakura matou\": \"间桐樱\",\n        \"shinji matou\": \"间桐慎二\",\n        \"illyasviel von einzbern\": \"伊莉雅丝菲尔·冯·爱因兹贝伦\",\n        \"saber alter\": \"Saber Alter\",\n        \"taiga fujimura\": \"藤村大河\",\n        \"gilgamesh\": \"吉尔伽美什\",\n        \"diarmuid ua duibhne\": \"迪尔姆德·奥迪那\",\n        \"iskandar\": \"伊斯坎达尔\",\n        \"gilles de rais\": \"吉尔·德·莱斯\",\n        \"lancelot\": \"兰斯洛特\",\n        \"kiritsugu emiya\": \"卫宫切嗣\",\n        \"tokiomi tohsaka\": \"远坂时臣\",\n        \"waver velvet\": \"韦伯·维尔维特\",\n        \"ryuunosuke uryuu\": \"雨生龙之介\",\n        \"kariya matou\": \"间桐雁夜\",\n        \"irisviel von einzbern\": \"爱丽丝菲尔·冯·爱因兹贝伦\",\n        \"caren ortensia\": \"卡莲·奥尔黛西亚\",\n        \"bazett fraga mcremitz\": \"巴洁特·法迦·克米兹\",\n        \"sitonai\": \"志度内\",\n        \"ishtar\": \"伊什塔尔\",\n        \"tamamo no mae\": \"玉藻前\",\n        \"shielder\": \"玛修·基列莱特\",\n        \"saber lily\": \"Saber Lily\",\n        \"artoria pendragon\": \"阿尔托莉雅·潘德拉贡\",\n        \"artoria pendragon alter\": \"阿尔托莉雅·潘德拉贡Alter\",\n        \"souji okita\": \"冲田总司\",\n        \"red saber\": \"尼禄·克劳狄乌斯\",\n        \"ayako mitsuzuri\": \"美缀绫子\",\n        \"kane himuro\": \"冰室钟\",\n        \"kaede makidera\": \"莳寺枫\",\n        \"gudao\": \"咕哒男\",\n        \"gudako\": \"咕哒子\",\n        \"kiyohime\": \"清姬\",\n        \"alexander\": \"亚历山大\",\n        \"scathach\": \"斯卡哈\",\n        \"asterios\": \"阿斯忒里俄斯\",\n        \"orion\": \"俄里翁\",\n        \"artemis\": \"阿耳忒弥斯\",\n        \"altera\": \"阿蒂拉\",\n        \"boudica\": \"布狄卡\",\n        \"mysterious heroine x\": \"谜之女主角X\",\n        \"mysterious heroine x alter\": \"谜之女主角X Alter\",\n        \"olga marie animusphere\": \"奥尔加玛丽·阿尼姆斯菲亚\",\n        \"paul bunyan\": \"保罗·班扬\",\n        \"kiara sessyoin\": \"杀生院祈荒\",\n        \"astolfo\": \"阿斯托尔福（阿福）\",\n        \"protagonist\": \"主人公\",\n        \"minamoto no raikou\": \"源赖光\",\n        \"meltryllis\": \"溶解莉莉丝\",\n        \"passionlip\": \"帕森莉普（热情迷唇）\",\n        \"ushiwakamaru\": \"牛若丸\",\n        \"jack the ripper\": \"开膛手杰克\",\n        \"jeanne alter\": \"贞德Alter\",\n        \"nitocris\": \"尼托克丽丝\",\n        \"alice kuonji\": \"久远寺有珠\",\n        \"aoko aozaki\": \"苍崎青子\",\n        \"touko aozaki\": \"苍崎橙子\",\n        \"leysritt\": \"莉洁莉特\",\n        \"chevalier deon\": \"迪昂·德·鲍蒙\",\n        \"nightingale\": \"南丁格尔 | 夜莺\",\n        \"cornelius alba\": \"科尼利厄斯·阿鲁巴\",\n        \"arcueid brunestud\": \"爱尔奎特·布伦史塔德\",\n        \"ciel\": \"希耶尔\",\n        \"circe\": \"喀耳刻\",\n        \"satsuki yumizuka\": \"弓冢五月\",\n        \"shiki tohno\": \"远野志贵\",\n        \"akiha tohno\": \"远野秋叶\",\n        \"kohaku\": \"琥珀\",\n        \"sion eltnam atlasia\": \"紫苑·艾尔特纳姆·阿特拉西亚\",\n        \"dracula\": \"德古拉\",\n        \"francis drake\": \"弗朗西斯·德雷克\",\n        \"elizabeth bathory\": \"伊丽莎白·巴托里\",\n        \"hakuno kishinami\": \"岸波白野（扎比）\",\n        \"hassan of serenity\": \"静谧之哈桑\",\n        \"medb\": \"梅芙\",\n        \"len\": \"莲\",\n        \"celenike icecolle yggdmillennia\": \"赛蕾妮可·艾斯科·千界树\",\n        \"fiore forvedge yggdmillennia\": \"菲奥蕾·弗尔维吉·千界树\",\n        \"chiron\": \"喀戎\",\n        \"achilles\": \"阿喀琉斯\",\n        \"atalanta\": \"阿塔兰忒\",\n        \"kairi sisigou\": \"狮子劫界离\",\n        \"miyako arima\": \"有间都古\",\n        \"chloe von einzbern\": \"克洛伊·冯·爱因兹贝伦（小黑）\",\n        \"luviagelita edelfelt\": \"露维亚瑟琳塔·艾德费尔特\",\n        \"miyu edelfelt\": \"美游·艾德费尔特\",\n        \"sella\": \"塞拉\",\n        \"euryale\": \"尤瑞艾莉（二姐）\",\n        \"shiki ryougi\": \"两仪式\",\n        \"stheno\": \"斯忒诺\",\n        \"mordred pendragon\": \"莫德雷德·潘德拉贡\",\n        \"queen of sheba\": \"示巴女王\",\n        \"wu zetian\": \"武则天\",\n        \"abigail williams\": \"阿比盖尔·威廉姆斯\",\n        \"hans christian andersen\": \"汉斯·克里斯蒂安·安徒生\",\n        \"hector\": \"赫克特\",\n        \"mochizuki chiyome\": \"望月千代女\",\n        \"osakabehime\": \"刑部姬\",\n        \"sakata kintoki\": \"坂田金时\",\n        \"scheherazade\": \"山鲁佐德\",\n        \"suzuka gozen\": \"铃鹿御前\",\n        \"tomoe gozen\": \"巴御前\",\n        \"xuanzang\": \"玄奘\",\n        \"fujino asagami\": \"浅上藤乃\",\n        \"mikiya kokutou\": \"黑桐干也\",\n        \"azaka kokutou\": \"黑桐鲜花\",\n        \"ibaraki douji\": \"茨木童子\",\n        \"anne bonny\": \"安妮·伯妮\",\n        \"mary read\": \"玛莉·瑞德\",\n        \"brynhildr\": \"布伦希尔德\",\n        \"cleopatra\": \"克里奥帕特拉（艳后）\",\n        \"ereshkigal\": \"埃列什基伽勒（艾蕾）\",\n        \"helena blavatsky\": \"海伦娜·布拉瓦茨基\",\n        \"leonardo da vinci\": \"莱昂纳多·达·芬奇\",\n        \"marie antoinette\": \"玛丽·安托瓦内特（蛋糕）\",\n        \"mata hari\": \"玛塔哈丽（舞娘）\",\n        \"medusa\": \"美杜莎\",\n        \"musashi miyamoto\": \"宫本武藏\",\n        \"nobunaga oda\": \"织田信长\",\n        \"penthesilea\": \"彭忒西勒亚\",\n        \"semiramis\": \"赛米拉米斯\",\n        \"shuten douji\": \"酒吞童子\",\n        \"tiamat\": \"提亚马特\",\n        \"bb\": \"BB\",\n        \"bradamante\": \"布拉达曼特\",\n        \"nero claudius bride\": \"尼禄·克劳狄乌斯〔新娘〕\",\n        \"chacha\": \"恰恰 | 茶茶\",\n        \"lavinia whateley\": \"拉薇妮亚·沃特雷\",\n        \"artoria pendragon rider alter\": \"阿尔托莉雅·潘德拉贡〔Alter〕\",\n        \"katsushika hokusai\": \"葛饰北斋（阿荣）\",\n        \"saint martha\": \"玛尔达\",\n        \"murasaki shikibu\": \"紫式部\",\n        \"kazuto kirigaya\": \"桐谷和人（桐人）\",\n        \"asuna yuuki\": \"结城明日奈（亚丝娜）\",\n        \"sachi\": \"幸\",\n        \"keiko ayano\": \"绫野珪子（西莉卡）\",\n        \"rika shinozaki\": \"筱崎里香（莉兹贝特）\",\n        \"rosalia\": \"罗莎莉雅\",\n        \"sasha\": \"纱夏\",\n        \"yolko\": \"夜子\",\n        \"suguha kirigaya\": \"桐谷直叶\",\n        \"lyfa\": \"莉法\",\n        \"shino asada\": \"朝田诗乃（诗乃）\",\n        \"yuuki konno\": \"绀野木棉季（有纪）\",\n        \"nagata shinichi\": \"长田伸一（雷根）\",\n        \"alicia rue\": \"亚丽莎·露\",\n        \"sakuya\": \"朔夜\",\n        \"kuroyukihime\": \"黑雪姬\",\n        \"haruyuki arita\": \"有田春雪\",\n        \"yuniko kouzuki\": \"上月由仁子\",\n        \"chiyuri kurashima\": \"仓岛千百合\",\n        \"akira himi\": \"冰见晶\",\n        \"fuuko kurasaki\": \"仓崎枫子\",\n        \"takumu mayuzumi\": \"黛拓武\",\n        \"nanoha takamachi\": \"高町奈叶\",\n        \"fate testarossa\": \"菲特·泰斯特罗莎\",\n        \"einhart stratos\": \"艾茵哈特·斯崔特斯\",\n        \"rinne berlinetta\": \"凛音·贝利内塔\",\n        \"vivio takamachi\": \"高町薇薇欧\",\n        \"yuuno scrya\": \"尤诺·斯克莱亚\",\n        \"amy limietta\": \"艾蜜·莉米艾特\",\n        \"erio mondial\": \"艾力奥·曼迪尔\",\n        \"hayate yagami\": \"八神疾风\",\n        \"shamal\": \"莎玛尔\",\n        \"signum\": \"希格纳姆\",\n        \"vita\": \"维塔\",\n        \"reinforce\": \"琳芙斯\",\n        \"fuka reventon\": \"风香·雷文顿\",\n        \"corona timil\": \"珂罗娜·缇米尔\",\n        \"aruf\": \"艾尔芙\",\n        \"zafira\": \"扎斐拉\",\n        \"alisa bannings\": \"爱丽莎·巴尼斯\",\n        \"kyrie florian\": \"琦莉耶·弗洛利安\",\n        \"amitie florian\": \"阿米蒂埃·弗洛利安\",\n        \"precia testarossa\": \"普蕾茜亚·泰斯特罗莎\",\n        \"alicia testarossa\": \"阿丽西亚·泰斯塔罗莎\",\n        \"lindy harlaown\": \"琳蒂·哈拉温\",\n        \"chrono harlaown\": \"克洛诺·哈洛温\",\n        \"caro ru lushe\": \"凯珞·露·露茜\",\n        \"ginga nakajima\": \"银河·中岛\",\n        \"subaru nakajima\": \"昴·中岛\",\n        \"suzuka tsukimura\": \"月村铃鹿\",\n        \"teana lanster\": \"蒂安娜·兰斯达\",\n        \"lutecia alpine\": \"璐缇希雅·阿尔菲诺\",\n        \"uno\": \"乌诺\",\n        \"due\": \"都艾\",\n        \"cinque\": \"琴柯\",\n        \"sein\": \"萨依\",\n        \"sette\": \"塞缇\",\n        \"nove\": \"诺威\",\n        \"dieci\": \"迪艾琦\",\n        \"wendi\": \"温蒂\",\n        \"deed\": \"蒂多\",\n        \"kazuma asougi\": \"亚双义一真\",\n        \"ryuunosuke naruhodou\": \"成步堂龙之介\",\n        \"phoenix wright\": \"成步堂龙一\",\n        \"trucy wright\": \"成步堂美贯\",\n        \"apollo justice\": \"王泥喜法介\",\n        \"maya fey\": \"绫里真宵\",\n        \"mia fey\": \"绫里千寻\",\n        \"pearl fey\": \"绫里春美\",\n        \"athena cykes\": \"希月心音\",\n        \"dick gumshoe\": \"糸锯圭介\",\n        \"ema skye\": \"宝月茜\",\n        \"franziska von karma\": \"狩魔冥\",\n        \"miles edgeworth\": \"御剑怜侍\",\n        \"kristoph gavin\": \"牙琉雾人\",\n        \"klavier gavin\": \"牙琉响也\",\n        \"adrian andrews\": \"华宫雾绪\",\n        \"kay faraday\": \"一条美云\",\n        \"sherlock holmes\": \"夏洛克·福尔摩斯\",\n        \"haruhi suzumiya\": \"凉宫春日\",\n        \"kyon\": \"阿虚\",\n        \"kyon no imouto\": \"虚妹\",\n        \"emiri kimidori\": \"喜绿江美里\",\n        \"mikuru asahina\": \"朝比奈实玖瑠\",\n        \"ryoko asakura\": \"朝仓凉子\",\n        \"tsuruya\": \"鹤屋\",\n        \"yuki nagato\": \"长门有希\",\n        \"itsuki koizumi\": \"古泉一树\",\n        \"kunikida\": \"国木田\",\n        \"taniguchi\": \"谷口\",\n        \"akira yukino\": \"雪乃玲\",\n        \"manaka takane\": \"高岭爱花\",\n        \"nene anegasaki\": \"姐崎宁宁\",\n        \"rinko kobayakawa\": \"小早川凛子\",\n        \"mariana prinsilla\": \"玛莉安娜·普林希拉\",\n        \"miu sagara\": \"相良美宇\",\n        \"kanade tachibana\": \"立华奏\",\n        \"yuri nakamura\": \"仲村由理\",\n        \"yuzuru otonashi\": \"音无结弦\",\n        \"hideki hinata\": \"日向秀树\",\n        \"shiina\": \"椎名\",\n        \"hisako\": \"久子\",\n        \"masami iwasawa\": \"岩泽雅美\",\n        \"miyuki irie\": \"入江美雪\",\n        \"shiori sekine\": \"关根诗织\",\n        \"umaru doma\": \"土间埋\",\n        \"taihei doma\": \"土间大平\",\n        \"kirie motoba\": \"本场切绘\",\n        \"nana ebina\": \"海老名菜菜\",\n        \"sylphynford tachibana\": \"橘·希尔芬福特\",\n        \"takeshi motoba\": \"本场猛（崩巴）\",\n        \"asagi igawa\": \"井河阿莎姬\",\n        \"sakura igawa\": \"井河樱\",\n        \"rinko akiyama\": \"秋山凜子\",\n        \"yukikaze mizuki\": \"水城雪风\",\n        \"shiranui mizuki\": \"水城不知火\",\n        \"lucy ... yamagami\": \"山神露西【以下略】\",\n        \"yutaka hasebe\": \"长谷部丰\",\n        \"tomoki sakurai\": \"樱井智树\",\n        \"ikaros\": \"伊卡洛斯\",\n        \"nymph\": \"妮姆芙\",\n        \"astraea\": \"阿斯特蕾亚\",\n        \"chaos\": \"卡奥斯\",\n        \"sohara mitsuki\": \"见月楚原\",\n        \"hiyori kazane\": \"风音日和\",\n        \"mikako satsukitane\": \"五月田根美香子\",\n        \"blossom\": \"花花\",\n        \"bubbles\": \"泡泡\",\n        \"buttercup\": \"毛毛\",\n        \"cure black\": \"黑天使\",\n        \"cure white\": \"白天使\",\n        \"shiny luminous\": \"夏妮露米纳丝\",\n        \"cure bloom\": \"花天使\",\n        \"cure egret\": \"舞天使\",\n        \"michiru kiryuu\": \"雾生满\",\n        \"kaoru kiryuu\": \"雾生薰\",\n        \"cure dream\": \"梦天使\",\n        \"cure rouge\": \"火天使\",\n        \"cure lemonade\": \"柠檬天使\",\n        \"cure mint\": \"薄荷天使\",\n        \"cure aqua\": \"水天使\",\n        \"milky rose\": \"妙奇露丝\",\n        \"cure peach\": \"桃天使\",\n        \"cure berry\": \"莓天使\",\n        \"cure pine\": \"凤梨天使\",\n        \"eas\": \"伊丝\",\n        \"cure passion\": \"百香果天使\",\n        \"cure blossom\": \"花蕾天使\",\n        \"cure marine\": \"海洋天使\",\n        \"cure sunshine\": \"阳光天使\",\n        \"cure moonlight\": \"月光天使\",\n        \"cure flower\": \"花朵天使\",\n        \"cure ange\": \"圣洁天使\",\n        \"cure amour\": \"爱神天使\",\n        \"cure etoile\": \"星辰天使\",\n        \"cure macherie\": \"挚爱天使\",\n        \"kotori nono\": \"野乃小鸟\",\n        \"cure yell\": \"喝采天使\",\n        \"dark precure\": \"暗之美少女\",\n        \"mizuki hanasaki\": \"花咲美月\",\n        \"momoka kurumi\": \"来海桃香\",\n        \"sakura kurumi\": \"来海樱\",\n        \"tsubaki myoudouin\": \"明堂院椿\",\n        \"cure melody\": \"旋律天使\",\n        \"cure rhythm\": \"节奏天使\",\n        \"siren\": \"赛莲\",\n        \"cure beat\": \"节拍天使\",\n        \"cure muse\": \"缪斯天使\",\n        \"maria houjou\": \"北条真理亚\",\n        \"misora minamino\": \"南野美空\",\n        \"cure happy\": \"快乐天使\",\n        \"cure sunny\": \"晴朗天使\",\n        \"cure peace\": \"和平天使\",\n        \"cure march\": \"旋风天使\",\n        \"cure beauty\": \"美丽天使\",\n        \"ikuyo hoshizora\": \"星空育代\",\n        \"masako hino\": \"日野正子\",\n        \"chiharu kise\": \"黄濑千春\",\n        \"tomoko midorikawa\": \"绿川伦子\",\n        \"shizuko aoki\": \"青木静子\",\n        \"wolfrun\": \"狼伦\",\n        \"akaooni\": \"赤鬼\",\n        \"bad end happy\": \"悲剧快乐天使\",\n        \"bad end sunny\": \"悲剧晴朗天使\",\n        \"bad end peace\": \"悲剧和平天使\",\n        \"bad end march\": \"悲剧旋风天使\",\n        \"bad end beauty\": \"悲剧美丽天使\",\n        \"cure heart\": \"爱心天使\",\n        \"cure diamond\": \"钻石天使\",\n        \"cure rosetta\": \"幸运草天使\",\n        \"cure sword\": \"圣剑天使\",\n        \"cure ace\": \"王牌天使\",\n        \"regina\": \"蕾吉娜\",\n        \"ryoko hishikawa\": \"菱川亮子\",\n        \"cure lovely\": \"可爱天使\",\n        \"cure princess\": \"公主天使\",\n        \"cure honey\": \"蜂蜜天使\",\n        \"cure fortune\": \"命运天使\",\n        \"maria hikawa\": \"冰川麻理亚\",\n        \"cure flora\": \"花神天使\",\n        \"cure mermaid\": \"人鱼天使\",\n        \"cure twinkle\": \"闪亮天使\",\n        \"towa akagi\": \"红城永久\",\n        \"cure scarlet\": \"赤红天使\",\n        \"cure miracle\": \"奇迹天使\",\n        \"cure magical\": \"魔法天使\",\n        \"cure felice\": \"幸福天使\",\n        \"cure whip\": \"奶油天使\",\n        \"cure custard\": \"奶黄天使\",\n        \"cure gelato\": \"冰淇淋天使\",\n        \"cure macaron\": \"马卡龙天使\",\n        \"cure chocolat\": \"巧克力天使\",\n        \"cure parfait\": \"芭菲天使\",\n        \"nobue itou\": \"伊藤伸惠\",\n        \"chika itou\": \"伊藤千佳\",\n        \"miu matsuoka\": \"松冈美羽\",\n        \"matsuri sakuragi\": \"樱木茉莉\",\n        \"ana coppola\": \"安娜·柯普拉\",\n        \"izetta\": \"伊泽塔\",\n        \"ortfine fredericka von eylstadt\": \"奥特菲涅·弗雷德里克·冯·埃尔施塔特\",\n        \"bianca\": \"毕安卡\",\n        \"lotte\": \"萝特\",\n        \"koyomi araragi\": \"阿良良木历\",\n        \"karen araragi\": \"阿良良木火怜\",\n        \"tsukihi araragi\": \"阿良良木月火\",\n        \"kiss-shot acerola-orion heart-under-blade\": \"姬丝秀忒·雅赛劳拉莉昂·刃下心\",\n        \"shinobu oshino\": \"忍野忍\",\n        \"ougi oshino\": \"忍野扇\",\n        \"meme oshino\": \"忍野咩咩\",\n        \"nadeko sengoku\": \"千石抚子\",\n        \"hitagi senjougahara\": \"战场原黑仪\",\n        \"tsubasa hanekawa\": \"羽川翼\",\n        \"suruga kanbaru\": \"神原骏河\",\n        \"mayoi hachikuji\": \"八九寺真宵\",\n        \"deishuu kaiki\": \"贝木泥舟\",\n        \"yotsugi ononoki\": \"斧乃木余接\",\n        \"seiya kanie\": \"可儿江西也\",\n        \"isuzu sento\": \"千斗五十铃\",\n        \"latifa fleuranza\": \"拉媞珐·芙尔兰札\",\n        \"salama\": \"萨拉玛\",\n        \"sylphy\": \"西尔菲\",\n        \"muse\": \"缪斯\",\n        \"kobory\": \"柯波莉\",\n        \"eiko adachi\": \"安达映子\",\n        \"soujirou izumi\": \"泉宗次郎\",\n        \"kanata izumi\": \"泉彼方\",\n        \"konata izumi\": \"泉此方\",\n        \"miki hiiragi\": \"柊美纪\",\n        \"kagami hiiragi\": \"柊镜\",\n        \"tsukasa hiiragi\": \"柊司\",\n        \"miyuki takara\": \"高良美幸\",\n        \"misao kusakabe\": \"日下部美纱绪\",\n        \"ayano minegishi\": \"峰岸绫乃\",\n        \"yutaka kobayakawa\": \"小早川优\",\n        \"minami iwasaki\": \"岩崎南\",\n        \"hiyori tamura\": \"田村日和\",\n        \"patricia martin\": \"帕特莉西亚‧马汀\",\n        \"izumi wakase\": \"若濑和泉\",\n        \"hikaru sakuraba\": \"樱庭光\",\n        \"fuyuki amahara\": \"天原冬纪\",\n        \"yukari takara\": \"高良由香里\",\n        \"subaru hasegawa\": \"长谷川昴\",\n        \"tomoka minato\": \"凑智花\",\n        \"maho misawa\": \"三泽真帆\",\n        \"saki nagatsuka\": \"永冢纱季\",\n        \"hinata hakamada\": \"袴田日向\",\n        \"airi kashii\": \"香椎爱莉\",\n        \"mimi balguerie\": \"米米·巴尔格里\",\n        \"kagetsu hakamada\": \"袴田花月\",\n        \"tsubaki takenaka\": \"竹中椿\",\n        \"hiiragi takenaka\": \"竹中柊\",\n        \"aoi ogiyama\": \"荻山葵\",\n        \"masami fujii\": \"藤井雅美\",\n        \"natsuhi takenaka\": \"竹中夏阳\",\n        \"mihoshi takamura\": \"篁美星\",\n        \"hijiri kuina\": \"久井奈圣\",\n        \"kaori minato\": \"凑花织\",\n        \"nayu hasegawa\": \"长谷川七夕\",\n        \"kamui\": \"卡姆依\",\n        \"takumi\": \"拓海\",\n        \"charlotte\": \"夏洛特 | 夏洛蒂\",\n        \"ryoma\": \"龙马\",\n        \"orochi\": \"远吕智\",\n        \"elise\": \"爱丽丝\",\n        \"flannel\": \"弗拉内尔\",\n        \"camilla\": \"卡米拉\",\n        \"felicia\": \"菲莉西亚\",\n        \"effie\": \"艾尔菲\",\n        \"flora\": \"芙洛拉\",\n        \"hinoka\": \"日乃香\",\n        \"tharja\": \"萨利娅\",\n        \"sakura\": \"樱\",\n        \"joker\": \"小丑\",\n        \"rinkah\": \"燐火\",\n        \"tiki\": \"芝琪\",\n        \"caeda\": \"希妲\",\n        \"catria\": \"卡秋娅\",\n        \"cordelia\": \"缇亚莫\",\n        \"lyndis\": \"琳蒂斯\",\n        \"nowi\": \"诺诺\",\n        \"tuxedo mask\": \"大礼服假面\",\n        \"sailor moon\": \"水手月亮\",\n        \"sailor chibi moon\": \"水手小月亮\",\n        \"sailor mercury\": \"水手水星\",\n        \"sailor mars\": \"水手火星\",\n        \"sailor jupiter\": \"水手木星\",\n        \"sailor venus\": \"水手金星\",\n        \"sailor saturn\": \"水手土星\",\n        \"sailor neptune\": \"水手海王星\",\n        \"sailor uranus\": \"水手天王星\",\n        \"sailor pluto\": \"水手冥王星\",\n        \"kenji tsukino\": \"月野谦之\",\n        \"ikuko tsukino\": \"月野育子\",\n        \"shingo tsukino\": \"月野进悟\",\n        \"naru osaka\": \"大阪奈留\",\n        \"gurio umino\": \"海野栗雄\",\n        \"motoki furuhata\": \"古幡元基\",\n        \"yuuichirou kumada\": \"熊田雄一郎\",\n        \"cammy white\": \"嘉米·怀特\",\n        \"chun-li\": \"春丽\",\n        \"rainbow mika\": \"七川美华\",\n        \"juri han\": \"韩蛛俐\",\n        \"karin kanzuki\": \"神月卡琳\",\n        \"menat\": \"米纳特\",\n        \"kolin\": \"科琳\",\n        \"sakura kasugano\": \"春日野樱\",\n        \"nanase mizugami\": \"水神七濑\",\n        \"zangief\": \"桑吉尔夫\",\n        \"balrog\": \"巴洛克\",\n        \"akuma\": \"豪鬼\",\n        \"blanka\": \"布兰卡\",\n        \"edmond honda\": \"埃德蒙·本田\",\n        \"guile\": \"古烈\",\n        \"ken masters\": \"肯·马斯达斯\",\n        \"ryu\": \"隆\",\n        \"sagat\": \"沙盖特\",\n        \"urien\": \"尤里安\",\n        \"vega\": \"维加\",\n        \"m. bison\": \"拜森\",\n        \"ingrid\": \"英格丽德\",\n        \"laura matsuda\": \"萝拉·松田\",\n        \"sean matsuda\": \"肖恩·松田\",\n        \"popuko\": \"POP子\",\n        \"pipimi\": \"PIPI美\",\n        \"haruka takayama\": \"高山春香\",\n        \"yuu sonoda\": \"园田优\",\n        \"mitsuki sonoda\": \"园田美月\",\n        \"kotone noda\": \"野田琴音\",\n        \"kasumi toyama\": \"户山香澄\",\n        \"tae hanazono\": \"花园多惠\",\n        \"rimi ushigome\": \"牛込里美\",\n        \"saaya yamabuki\": \"山吹沙绫\",\n        \"arisa ichigaya\": \"市谷有咲\",\n        \"yukina minato\": \"凑友希那\",\n        \"sayo hikawa\": \"冰川纱夜\",\n        \"lisa imai\": \"今井莉莎\",\n        \"ako udagawa\": \"宇田川亚子\",\n        \"rinko shirokane\": \"白金燐子\",\n        \"ran mitake\": \"美竹兰\",\n        \"moca aoba\": \"青叶摩卡\",\n        \"himari uehara\": \"上原绯玛丽\",\n        \"tomoe udagawa\": \"宇田川巴\",\n        \"tsugumi hazawa\": \"羽泽鸫\",\n        \"aya maruyama\": \"丸山彩\",\n        \"hina hikawa\": \"冰川日菜\",\n        \"chisato shirasagi\": \"白鹭千圣\",\n        \"maya yamato\": \"大和麻弥\",\n        \"eve wakamiya\": \"若宫伊芙\",\n        \"kokoro tsurumaki\": \"弦卷心\",\n        \"kaoru seta\": \"濑田薰\",\n        \"kanon matsubara\": \"松原花音\",\n        \"misaki okusawa\": \"奥泽美咲\",\n        \"rei wakana\": \"和奏瑞依（LAYER）\",\n        \"rokka asahi\": \"朝日六花（LOCK）\",\n        \"masuki satou\": \"佐藤益木（MASKING）\",\n        \"reona nyubara\": \"鳰原令王那（PAREO）\",\n        \"chiyu tamade\": \"珠手知由（CHU²）\",\n        \"mashiro kurata\": \"仓田真白\",\n        \"nanami hiromachi\": \"广町七深\",\n        \"tsukushi futaba\": \"二叶筑紫\",\n        \"marina tsukishima\": \"月岛麻里奈\",\n        \"kokomi shiina\": \"椎名心实\",\n        \"akane sakurai\": \"樱井明音\",\n        \"fumio murakami\": \"村上文绪\",\n        \"chloe lemaire\": \"克洛伊·勒梅尔\",\n        \"momoko asahina\": \"朝比奈桃子\",\n        \"haruka kazemachi\": \"风町阳歌\",\n        \"mutsumi shigino\": \"鴫野睦\",\n        \"erena mochizuki\": \"望月艾蕾娜\",\n        \"aika tenkuubashi\": \"天空桥爱佳\",\n        \"hakua shiodome\": \"汐留白亚\",\n        \"reiko arisugawa\": \"有栖川丽子\",\n        \"akane segawa\": \"濑川茜\",\n        \"ako tamaki\": \"玉置亚子\",\n        \"hideki nishimura\": \"西村英骑\",\n        \"nanako akiyama\": \"秋山奈奈子\",\n        \"yui saitou\": \"齐藤结衣\",\n        \"nozomi kaminashi\": \"神无希\",\n        \"sayaka miyata\": \"宫田纱耶香\",\n        \"non toyoguchi\": \"丰口浓\",\n        \"fourth raikage\": \"四代目雷影\",\n        \"sakura haruno\": \"春野樱\",\n        \"sasuke uchiha\": \"宇智波佐助\",\n        \"tsunade\": \"纲手\",\n        \"anko mitarashi\": \"御手洗红豆\",\n        \"ino yamanaka\": \"山中井野\",\n        \"kurotsuchi\": \"黑土\",\n        \"sarada uchiha\": \"宇智波佐良娜\",\n        \"tayuya\": \"多由也\",\n        \"temari\": \"手鞠\",\n        \"naruto uzumaki\": \"漩涡鸣人\",\n        \"minato namikaze\": \"波风水门\",\n        \"hinata hyuga\": \"日向雏田\",\n        \"kushina uzumaki\": \"漩涡奇奈\",\n        \"kakashi hatake\": \"旗木卡卡西\",\n        \"shikamaru nara\": \"奈良鹿丸\",\n        \"hashirama senju\": \"千手柱间\",\n        \"madara uchiha\": \"宇智波斑\",\n        \"itachi uchiha\": \"宇智波鼬\",\n        \"boruto uzumaki\": \"漩涡博人\",\n        \"himawari uzumaki\": \"漩涡向日葵\",\n        \"cinque izumi\": \"真红·和泉\",\n        \"millhiore firianno biscotti\": \"米希奥蕾·菲利安诺·比斯科迪\",\n        \"leonmitchelli galette des rois\": \"蕾昂米修莉·加雷特·德·罗瓦\",\n        \"gaul galette des rois\": \"高尔·迦雷特·德·罗瓦\",\n        \"yukikaze panettone\": \"雪风·帕尼托尼\",\n        \"rebecca anderson\": \"蕾蓓卡·安德森\",\n        \"noir vinocacao\": \"诺瓦鲁·可可酒\",\n        \"eclair martinozzi\": \"艾克蕾尔·马尔迪诺基\",\n        \"ricotta elmar\": \"利歌塔·埃玛\",\n        \"nanami takatsuki\": \"高槻七海\",\n        \"brioche darquien\": \"布丽奥修·达尔基昂\",\n        \"couvert eschenbach pastillage\": \"库贝尔·艾申巴赫·帕斯提亚修\",\n        \"percy gaudi\": \"帕西·高迪\",\n        \"vert farbreton\": \"贝尔·法布林塔\",\n        \"violle amaretto\": \"毕欧蕾·亚玛雷特\",\n        \"jaune clafouti\": \"乔奴·克拉芙缇\",\n        \"adelaide grand marnier\": \"阿德莱德·格兰玛尼亚\",\n        \"sharu\": \"夏露\",\n        \"kanata\": \"彼方\",\n        \"eika\": \"艾卡\",\n        \"kizuna ai\": \"绊爱\",\n        \"kaguya luna\": \"辉夜月\",\n        \"mirai akari\": \"Mirai Akari\",\n        \"nojaoji\": \"Mikoko\",\n        \"kira yamato\": \"基拉·大和\",\n        \"miriallia haw\": \"米丽雅莉亚·哈乌\",\n        \"natarle badgiruel\": \"娜塔尔·巴基露露\",\n        \"murrue ramius\": \"玛琉·拉米亚斯\",\n        \"stella loussier\": \"史黛拉·露西耶\",\n        \"meer campbell\": \"米娅·坎贝尔\",\n        \"meyrin hawke\": \"美玲·霍克\",\n        \"lunamaria hawke\": \"露娜玛丽亚·霍克\",\n        \"flay allster\": \"芙蕾·阿尔斯塔\",\n        \"cagalli yula athha\": \"卡嘉莉·尤拉·阿斯哈\",\n        \"lacus clyne\": \"拉克丝·克莱茵\",\n        \"haruhiko ichijou\": \"一条晴彦\",\n        \"mai kawakami\": \"川神舞\",\n        \"reina izumi\": \"和泉玲奈\",\n        \"koito minase\": \"水无濑小糸\",\n        \"doraemon\": \"哆啦A梦\",\n        \"nobita nobi\": \"野比大雄\",\n        \"shizuka minamoto\": \"源静香\",\n        \"suneo honekawa\": \"骨川小夫\",\n        \"takeshi gouda\": \"刚田武（胖虎）\",\n        \"tamako nobi\": \"野比玉子\",\n        \"dorami\": \"哆啦美\",\n        \"hidetoshi dekisugi\": \"出木杉英才\",\n        \"daiwa scarlet\": \"大和赤骥\",\n        \"gold ship\": \"黄金船\",\n        \"hishi amazon\": \"菱亚马逊\",\n        \"mejiro mcqueen\": \"目白麦昆\",\n        \"silence suzuka\": \"无声铃鹿\",\n        \"special week\": \"特别周\",\n        \"tokai teio\": \"东海帝王\",\n        \"taiki shuttle\": \"大树快车\",\n        \"neptune\": \"涅普迪努\",\n        \"noire\": \"诺瓦尔\",\n        \"blanc\": \"布兰\",\n        \"vert\": \"贝露\",\n        \"peashy\": \"皮榭\",\n        \"plutia\": \"普露露特\",\n        \"uzume\": \"天王星涡芽\",\n        \"nepgear\": \"涅普姬雅\",\n        \"uni\": \"优尼\",\n        \"rom\": \"萝姆\",\n        \"purple heart\": \"绀紫之心\",\n        \"black heart\": \"圣黑之心\",\n        \"white heart\": \"纯白之心\",\n        \"green heart\": \"翠绿之心\",\n        \"compa\": \"康帕\",\n        \"cave\": \"Cave\",\n        \"histoire\": \"伊丝特瓦尔\",\n        \"yuu otosaka\": \"乙坂有宇\",\n        \"nao tomori\": \"友利奈绪\",\n        \"misa kurobane\": \"西森柚咲\",\n        \"ayumi otosaka\": \"乙坂步未\",\n        \"ichika nakano\": \"中野一花\",\n        \"nino nakano\": \"中野二乃\",\n        \"miku nakano\": \"中野三玖\",\n        \"yotsuba nakano\": \"中野四叶\",\n        \"itsuki nakano\": \"中野五月\",\n        \"tokino sora\": \"时乃空\",\n        \"roboco\": \"萝卜子\",\n        \"sakura miko\": \"樱巫女\",\n        \"hoshimachi suisei\": \"星街彗星\",\n        \"yozora mel\": \"夜空梅露\",\n        \"aki rosenthal\": \"亚绮·罗森塔尔\",\n        \"akai haato\": \"赤井心\",\n        \"shirakami fubuki\": \"白上吹雪\",\n        \"natsuiro matsuri\": \"夏色祭\",\n        \"minato aqua\": \"凑阿库娅\",\n        \"murasaki shion\": \"紫咲诗音\",\n        \"nakiri ayame\": \"百鬼绫目\",\n        \"yuzuki choco\": \"癒月巧可\",\n        \"oozora subaru\": \"大空昴\",\n        \"ookami mio\": \"大神澪\",\n        \"inugami korone\": \"戌神沁音\",\n        \"nekomata okayu\": \"猫又小粥\",\n        \"usada pekora\": \"兔田佩克拉\",\n        \"uruha rushia\": \"润羽露西娅\",\n        \"shiranui flare\": \"不知火芙蕾雅\",\n        \"shirogane noel\": \"白银诺艾尔\",\n        \"houshou marine\": \"宝钟玛琳\",\n        \"amane kanata\": \"天音彼方\",\n        \"kiryu coco\": \"桐生可可\",\n        \"tsunomaki watame\": \"角卷绵芽\",\n        \"tokoyami towa\": \"常暗永远\",\n        \"himemori luna\": \"姬森璐娜\",\n        \"mumei\": \"无名\",\n        \"ayane\": \"绫音\",\n        \"mai shiranui\": \"不知火舞\",\n        \"naotora ii\": \"井伊直虎\",\n        \"lu lingqi\": \"吕玲绮\",\n        \"zhurong\": \"祝融\",\n        \"sun shang xiang\": \"孙尚香\",\n        \"nene\": \"宁宁\",\n        \"inahime\": \"稻姬\",\n        \"sima yi\": \"司马懿\",\n        \"wang yuanji\": \"王元姬\",\n        \"yue ying\": \"黄月英\",\n        \"zhang chunhua\": \"张春华\",\n        \"zhuge liang\": \"诸葛亮\",\n        \"ranma saotome\": \"早乙女乱马\",\n        \"angela\": \"安吉拉\",\n        \"riesz\": \"莉斯\",\n        \"eucliwood hellscythe\": \"优克莉伍德·海尔赛兹\",\n        \"hinako shijou\": \"四条雏子\",\n        \"yuri sakazaki\": \"坂崎百合\",\n        \"michelle k. davis\": \"米歇尔·K·戴维斯\",\n        \"chihiro ogino\": \"荻野千寻\",\n        \"tessie\": \"泰茜\",\n        \"leia rolando\": \"蕾娅·罗兰德\",\n        \"nami\": \"娜美\",\n        \"tashigi\": \"达斯琪\",\n        \"wang liu mei\": \"王留美\",\n        \"sage\": \"贤者\",\n        \"merchant\": \"商人\",\n        \"hero\": \"勇者\",\n        \"wizard\": \"魔法师\",\n        \"cleric\": \"僧侣\",\n        \"warrior\": \"战士\",\n        \"asuka langley soryu\": \"惣流·明日香·兰格雷\",\n        \"lucina\": \"露琪娜\",\n        \"cynthia\": \"竹兰 | 辛西娅\",\n        \"hikari horaki\": \"洞木光\",\n        \"rei ayanami\": \"绫波丽\",\n        \"milly\": \"米蕾尤\",\n        \"kusuha mizuha\": \"水羽楠叶\",\n        \"seolla schweizer\": \"塞奥拉·修拜亚\",\n        \"fujiko mine\": \"峰不二子\",\n        \"mirai andou\": \"安藤美雷\",\n        \"himea saito\": \"赛托希梅亚\",\n        \"fuu hououji\": \"凤凰寺风\",\n        \"hikaru shindo\": \"进藤光 | 狮堂光\",\n        \"umi ryuuzaki\": \"龙崎海\",\n        \"ai asato\": \"麻里爱\",\n        \"reiko katherine akimoto\": \"秋本丽子\",\n        \"hina\": \"日奈 | 雏\",\n        \"matoi giboshi\": \"拟宝珠缠\",\n        \"lemon giboshi\": \"拟宝珠柠檬\",\n        \"iroha\": \"伊吕波\",\n        \"arle nadja\": \"阿露露\",\n        \"tifa lockhart\": \"蒂法·洛克哈特\",\n        \"aerith gainsborough\": \"艾瑞丝·盖恩斯巴勒\",\n        \"yuffie kisaragi\": \"尤菲·如月\",\n        \"fumie hashimoto\": \"桥本文惠\",\n        \"yuuko amasawa\": \"天泽勇子\",\n        \"yuuko okonogi\": \"小此木京子\",\n        \"elphelt valentine\": \"艾露菲鲁特·华伦泰\",\n        \"jam kuradoberi\": \"藏土缘纱梦\",\n        \"ramlethal valentine\": \"拉姆蕾萨尔·华伦泰\",\n        \"alisa ilinichina amiella\": \"亚莉莎·伊莉妮提娜·阿米耶拉\",\n        \"lara croft\": \"劳拉·克罗夫特\",\n        \"naoto shirogane\": \"白钟直斗\",\n        \"hajime ichinose\": \"一之濑初\",\n        \"rabi en rose\": \"拉比安露斯\",\n        \"lei fang\": \"雷芳\",\n        \"menace\": \"美纳斯\",\n        \"tina armstrong\": \"蒂娜·阿姆斯特朗\",\n        \"anri misugi\": \"美杉杏莉\",\n        \"makoto hozumi\": \"穗积真琴\",\n        \"misao shinohara\": \"筱原美纱绪\",\n        \"sasami iwakura\": \"岩仓砂沙美\",\n        \"maam\": \"玛姆\",\n        \"momo yaoyorozu\": \"八百万百\",\n        \"ochako uraraka\": \"丽日御茶子\",\n        \"tsuyu asui\": \"蛙吹梅雨\",\n        \"izana shinatose\": \"科户濑伊札那\",\n        \"nagate tanikaze\": \"谷风长道\",\n        \"elpeo ple\": \"艾露比·普露\",\n        \"haman karn\": \"哈曼·卡恩\",\n        \"leina ashta\": \"莉娜·亚西塔\",\n        \"ple two\": \"普露兹\",\n        \"kurisu makise\": \"牧濑红莉栖\",\n        \"maribel\": \"玛丽贝尔\",\n        \"precia zan zenosakis\": \"普蕾茜娅·泽诺萨奇斯\",\n        \"ruka urushibara\": \"漆原琉华\",\n        \"yui takamura\": \"篁唯依\",\n        \"nico robin\": \"妮可·罗宾\",\n        \"saint shalulia\": \"夏露莉雅宫\",\n        \"snow white\": \"白雪公主\",\n        \"little red riding hood\": \"小红帽\",\n        \"saaya agata\": \"安形纱绫\",\n        \"mamori anezaki\": \"姊崎真守\",\n        \"sena kobayakawa\": \"小早川濑那\",\n        \"latooni suvota\": \"拉托妮·苏波塔\",\n        \"shine hausen\": \"夏茵·豪森\",\n        \"stella bremer\": \"史黛拉·布瑞梅尔\",\n        \"bianca whitaker\": \"碧安卡·惠特克\",\n        \"crea dolosera\": \"克蕾雅·多萝赛娅\",\n        \"mikono suzushiro\": \"御子乃·铃白\",\n        \"suomi konepi\": \"须绪美·科妮皮\",\n        \"shinji ikari\": \"碇真嗣\",\n        \"reika shimohira\": \"下平玲花\",\n        \"katina tarask\": \"卡琪娜·塔拉斯克\",\n        \"leona garstein\": \"雷欧娜·嘉施泰因\",\n        \"poison\": \"毒药\",\n        \"jessica albert\": \"杰西卡·阿尔芭\",\n        \"jigoku no fubuki\": \"地狱的吹雪\",\n        \"senritsu no tatsumaki\": \"战栗的龙卷\",\n        \"tights brief\": \"塔依丝\",\n        \"hugo\": \"雨果\",\n        \"nel zelpher\": \"奈露\",\n        \"sadi-chan\": \"小萨蒂\",\n        \"mina ashido\": \"芦户三奈\",\n        \"rebecca\": \"蕾贝卡\",\n        \"amazon\": \"亚马逊\",\n        \"sorceress\": \"女巫\",\n        \"serena\": \"莎莉娜 | 瑟妮娅 | 塞瑞娜\",\n        \"shauna\": \"莎娜\",\n        \"kiruko otonashi\": \"音无斩子\",\n        \"boa hancock\": \"波雅·汉库克\",\n        \"monkey d. luffy\": \"蒙奇·D·路飞\",\n        \"elf\": \"精灵\",\n        \"neko musume\": \"猫娘\",\n        \"kaoru matsubara\": \"松原薰\",\n        \"miyako gotokuji\": \"豪得寺美弥子\",\n        \"momoko akatsutsumi\": \"赤提和美子\",\n        \"kougyoku ren\": \"练红玉\",\n        \"masrur\": \"马斯鲁尔\",\n        \"morgiana\": \"摩尔迦娜\",\n        \"sharrkan\": \"迦尔鲁卡\",\n        \"sinbad\": \"辛巴德\",\n        \"yamuraiha\": \"雅姆莱哈\",\n        \"kurumi kumamakura\": \"熊枕久瑠美\",\n        \"priscilla barielle\": \"普莉希拉·跋利耶尔\",\n        \"roomi\": \"萝米\",\n        \"martial artist\": \"武斗家\",\n        \"thief\": \"盗贼\",\n        \"nera briscoletti\": \"芙萝菈\",\n        \"crimson viper\": \"深红毒蛇\",\n        \"blue mary\": \"布鲁玛丽\",\n        \"king\": \"琼\",\n        \"dark magician girl\": \"黑魔术少女\",\n        \"silent magician\": \"沉默魔术师\",\n        \"marcille donato\": \"玛露西露\",\n        \"fumina hoshino\": \"星野文奈\",\n        \"angela balzac\": \"安吉拉·巴尔扎克\",\n        \"yanagi takayama\": \"高山柳\",\n        \"nako oshimizu\": \"押水菜子\",\n        \"sawa okita\": \"冲田纱羽\",\n        \"bloodberry\": \"红莓\",\n        \"cherry\": \"樱桃\",\n        \"sakuya tachibana\": \"橘咲夜\",\n        \"kimi aoi\": \"葵·喜美\",\n        \"tori aoi\": \"葵·托利\",\n        \"akira yamamoto\": \"山本玲\",\n        \"kaoru niimi\": \"新见熏\",\n        \"makoto harada\": \"原田真琴\",\n        \"mikage kiryuu\": \"桐生美影\",\n        \"melda deitz\": \"梅尔达·狄兹\",\n        \"yuki mori\": \"森雪\",\n        \"ainz ooal gown\": \"安兹·乌尔·恭\",\n        \"albedo\": \"雅儿贝德 | 阿贝多\",\n        \"aura bella fiora\": \"亚乌菈·贝拉·菲欧拉\",\n        \"clementine\": \"克莱门汀\",\n        \"mare bello fiore\": \"马雷·贝罗·菲欧雷\",\n        \"shalltear bloodfallen\": \"夏提雅·布拉德弗伦\",\n        \"ai\": \"爱\",\n        \"ai kagano\": \"加贺野爱\",\n        \"mayu\": \"美格\",\n        \"rin\": \"凛\",\n        \"farrah\": \"法拉\",\n        \"zooey\": \"佐伊\",\n        \"natsu dragneel\": \"纳兹·多拉格尼尔\",\n        \"kirara\": \"绮良良\",\n        \"tamaki kousaka\": \"向坂环\",\n        \"sellma\": \"罗克珊努\",\n        \"ruida\": \"莉卡\",\n        \"mar\": \"梅亚\",\n        \"vice\": \"薇思\",\n        \"misato katsuragi\": \"葛城美里\",\n        \"mari illustrious makinami\": \"真希波·真理·伊拉丝多莉亚斯\",\n        \"angewomon\": \"天女兽\",\n        \"kazemon\": \"彩虹兽\",\n        \"ladydevimon\": \"妖女兽\",\n        \"lilamon\": \"丁香兽\",\n        \"lilymon\": \"百合兽\",\n        \"renamon\": \"妖狐兽\",\n        \"sakuyamon\": \"沙古牙兽\",\n        \"zephyrmon\": \"风神兽\",\n        \"martina\": \"玛尔缇娜\",\n        \"sancho\": \"桑丘\",\n        \"barron trump\": \"巴伦·特朗普\",\n        \"donald trump\": \"唐纳德·特朗普\",\n        \"bill clinton\": \"比尔·克林顿\",\n        \"hillary clinton\": \"希拉里·克林顿\",\n        \"vladimir putin\": \"弗拉基米尔·普京\",\n        \"barack obama\": \"巴拉克·奥巴马\",\n        \"taro aso\": \"麻生太郎\",\n        \"abraham lincoln\": \"亚伯拉罕·林肯\",\n        \"george w. bush\": \"乔治·沃克·布什\",\n        \"osama bin laden\": \"奥萨马·本·拉登\",\n        \"adolf hitler\": \"阿道夫·希特勒\",\n        \"anne frank\": \"安妮·弗兰克\",\n        \"lusamine\": \"露莎米奈\",\n        \"angelise ikaruga misurugi\": \"安琪丽莎·斑鸠·米斯尔奇\",\n        \"lelouch vi britannia\": \"鲁路修·vi·布里塔尼亚\",\n        \"c.c.\": \"C.C.\",\n        \"charlotte dunois\": \"夏洛特·德诺阿\",\n        \"nena trinity\": \"妮娜·崔尼帝\",\n        \"louise francoise le blanc de la valliere\": \"露易丝\",\n        \"saito hiraga\": \"平贺才人\",\n        \"shana\": \"夏娜\",\n        \"zero two\": \"02\",\n        \"ichigo\": \"莓\",\n        \"strelizia\": \"鹤望兰号\",\n        \"hiro\": \"广\",\n        \"alice liddell\": \"爱丽丝·李道尔\",\n        \"cinderella\": \"辛德瑞拉\",\n        \"noa himesaka\": \"姬坂乃爱\",\n        \"miyako hoshino\": \"星野宫子\",\n        \"hana shirosaki\": \"白咲花\",\n        \"hinata hoshino\": \"星野日向\",\n        \"may\": \"小遥\",\n        \"dawn\": \"小光\",\n        \"kyaru\": \"凯露\",\n        \"mai sakurajima\": \"樱岛麻衣\",\n        \"ai mizuno\": \"水野爱\",\n        \"yuuma kuga\": \"空闲游真\",\n        \"kokkoro\": \"可可萝\",\n        \"holo\": \"赫萝\",\n        \"marie rose\": \"玛丽·萝丝\",\n        \"helena douglas\": \"海莲娜\",\n        \"sylvanas windrunner\": \"希尔瓦娜斯·风行者\",\n        \"nessa\": \"露璃娜\",\n        \"sonia\": \"索妮亚\",\n        \"mallow\": \"玛奥\",\n        \"melony\": \"美蓉\",\n        \"kama\": \"迦摩\",\n        \"yu mei-ren\": \"虞美人\",\n        \"beni-enma\": \"红阎魔\",\n        \"carmilla\": \"卡米拉\",\n        \"valkyrie\": \"瓦尔基里\",\n        \"chiyo shirayuki\": \"白雪千夜\",\n        \"chitose kurosaki\": \"黑埼千岁\",\n        \"kiyomi saejima\": \"冴岛清美\",\n        \"cure milky\": \"羽衣拉拉\",\n        \"rinko iori\": \"伊织凛子\",\n        \"sei iori\": \"伊织诚\",\n        \"bea\": \"彩豆\",\n        \"kudryavka noumi\": \"能美·库特莉亚芙卡\",\n        \"yuuko shionji\": \"紫苑寺有子\",\n        \"narumi fujishima\": \"藤岛鸣海\",\n        \"sister cleaire\": \"修女克蕾雅\",\n        \"momo chiyoda\": \"千代田桃\",\n        \"yuko yoshida\": \"吉田优子\",\n        \"reines el-melloi archisorte\": \"莱妮丝·埃尔梅罗·阿奇佐尔缇\",\n        \"rindou mikoto\": \"龙胆尊\",\n        \"hotaru ichijou\": \"一条萤\",\n        \"komari koshigaya\": \"越谷小鞠\",\n        \"maria balthasar\": \"玛利亚·巴尔塔札尔\",\n        \"emeralda kasim\": \"艾美拉达·卡西姆\",\n        \"ai hinatsuru\": \"雏鹤爱\",\n        \"ginko sora\": \"空银子\",\n        \"chariot\": \"战轮妖精\",\n        \"strength\": \"力量\",\n        \"kirika akatsuki\": \"晓切歌\",\n        \"asuha chigusa\": \"千种明日叶\",\n        \"kasumi chigusa\": \"千种霞\",\n        \"ange katrina\": \"安洁·卡特莉娜\",\n        \"cagliostro\": \"卡莉奥斯特萝\",\n        \"kyouka hikawa\": \"冰川镜华\",\n        \"retoree\": \"莱托莉\",\n        \"cyan hijirikawa\": \"希安（圣川诗杏）\",\n        \"saren sasaki\": \"佐佐木咲恋\",\n        \"niyon\": \"妮欧\",\n        \"yuel\": \"尤艾尔\",\n        \"societte\": \"苏丝雅\",\n        \"kanau kongou\": \"金刚叶\",\n        \"yuuko aioi\": \"相生祐子\",\n        \"mio naganohara\": \"长野原美绪\",\n        \"mai minakami\": \"水上麻衣\",\n        \"nano shinonome\": \"东云名乃\",\n        \"hakase shinonome\": \"东云博士\",\n        \"kobayashi\": \"小林\",\n        \"ririchiyo shirakiin\": \"白鬼院凛凛蝶\",\n        \"sana inui\": \"乾纱凪\",\n        \"nanachi\": \"娜娜奇\",\n        \"nursery rhyme\": \"童谣\",\n        \"hasuki komai\": \"狛井莲季\",\n        \"juliet persia\": \"朱丽叶·佩尔西亚\",\n        \"romio inuzuka\": \"犬冢露壬雄\",\n        \"himawari furutani\": \"古谷向日葵\",\n        \"sakurako ohmuro\": \"大室樱子\",\n        \"raphtalia\": \"拉芙塔莉雅\",\n        \"filo\": \"菲洛\",\n        \"altina orion\": \"亚尔缇娜·奥莱恩\",\n        \"amiya\": \"阿米娅\",\n        \"regu\": \"雷古\",\n        \"riko\": \"莉可\",\n        \"six\": \"希斯\",\n        \"maple\": \"梅普露 | 枫\",\n        \"nezuko kamado\": \"灶门祢豆子\",\n        \"reina kousaka\": \"高坂丽奈\",\n        \"kumiko oumae\": \"黄前久美子\",\n        \"ririka kenzaki\": \"剑崎梨梨花\",\n        \"kanade hisaishi\": \"久石奏\",\n        \"mizore yoroizuka\": \"铠冢霙\",\n        \"nozomi kasaki\": \"伞木希美\",\n        \"yuuko yoshikawa\": \"吉川优子\",\n        \"natsuki nakagawa\": \"中川夏纪\",\n        \"sapphire kawashima\": \"川岛绿辉\",\n        \"kaori nakaseko\": \"中世古香织\",\n        \"hazuki katou\": \"加藤叶月\",\n        \"haruka ogasawara\": \"小笠原晴香\",\n        \"asuka tanaka\": \"田中明日香\",\n        \"raina kitamura\": \"喜多村来南\",\n        \"mikino oka\": \"冈美贵乃\",\n        \"izumi akazawa\": \"赤泽泉美\",\n        \"noboru taki\": \"泷升\",\n        \"masahiro hashimoto\": \"桥本真博\",\n        \"riko nagase\": \"长濑梨子\",\n        \"takuya gotou\": \"后藤卓也\",\n        \"shuuichi tsukamoto\": \"塚本秀一\",\n        \"akiko yoshizawa\": \"吉泽明子\",\n        \"satomi niiyama\": \"新山聪美\",\n        \"fuutarou uesugi\": \"上杉风太郎\",\n        \"kanao tsuyuri\": \"栗花落香奈乎\",\n        \"shinobu kochou\": \"蝴蝶忍\",\n        \"giyuu tomioka\": \"富冈义勇\",\n        \"mitsuri kanroji\": \"甘露寺蜜璃\",\n        \"zenitsu agatsuma\": \"我妻善逸\",\n        \"tanjirou kamado\": \"灶门炭治郎\",\n        \"kyojuro rengoku\": \"炼狱杏寿郎\",\n        \"obanai iguro\": \"伊黑小芭内\",\n        \"aoi kanzaki\": \"神崎葵\",\n        \"sabito\": \"锖兔\",\n        \"tengen uzui\": \"宇髄天元\",\n        \"hodaka morishima\": \"森岛帆高\",\n        \"chiaki minami\": \"南千秋\",\n        \"haruka minami\": \"南夏奈\",\n        \"kana minami\": \"南春香\",\n        \"mako\": \"真\",\n        \"yuka uchida\": \"内田由加\",\n        \"kaede azusagawa\": \"梓川枫\",\n        \"rio futaba\": \"双叶理央\",\n        \"sakuta azusagawa\": \"梓川咲太\",\n        \"tomoe koga\": \"古贺朋绘\",\n        \"coquelicot\": \"蔻库莉可\",\n        \"erica fontaine\": \"艾莉卡·芳汀\",\n        \"glycine bleumer\": \"库莉西奴·布鲁马\",\n        \"hanabi kitaoji\": \"北大路花火\",\n        \"ichiro ogami\": \"大神一郎\",\n        \"lobelia carlini\": \"罗贝莉娅·卡尔里尼\",\n        \"nodoka toyohama\": \"丰滨和香\",\n        \"shouko makinohara\": \"牧之原翔子\",\n        \"iris chateaubriand\": \"伊莉斯·夏特布里安\",\n        \"sakura shinguji\": \"真宫寺樱\",\n        \"kohran li\": \"李红兰\",\n        \"sumire kanzaki\": \"神崎堇\",\n        \"ci caprice\": \"茜·卡普利斯\",\n        \"mell raison\": \"梅尔·雷森\",\n        \"orihime soletta\": \"索蕾塔·织姬\",\n        \"reni milchstrasse\": \"雷尼·米尔西修特拉瑟\",\n        \"maria tachibana\": \"玛丽亚·橘\",\n        \"kanna kirishima\": \"桐岛神奈\",\n        \"tsubaki takamura\": \"高村椿\",\n        \"ayame fujieda\": \"藤枝菖蒲\",\n        \"cloud strife\": \"克劳德·史特莱夫\",\n        \"kaede fujieda\": \"藤枝枫\",\n        \"diana caprice\": \"黛安娜·卡普利斯\",\n        \"ratchet altair\": \"拉琪特·奥泰尔\",\n        \"shinjiro taiga\": \"大河新次郎\",\n        \"subaru kujou\": \"九条昴\",\n        \"wakana shinguji\": \"真宫寺若菜\",\n        \"carino soletta\": \"卡莉诺·素蕾塔\",\n        \"margueritte chateaubriand\": \"玛格丽特·夏特布里安\",\n        \"yuri sakakibara\": \"榊原由里\",\n        \"gemini sunrise\": \"洁蜜妮·桑莱兹\",\n        \"anthy himemiya\": \"姬宫安茜\",\n        \"utena tenjou\": \"天上欧蒂娜\",\n        \"ai hayasaka\": \"早坂爱\",\n        \"kaguya shinomiya\": \"四宫辉夜\",\n        \"miyuki shirogane\": \"白银御行\",\n        \"chika fujiwara\": \"藤原千花\",\n        \"soushi miketsukami\": \"御狐神双炽\",\n        \"maya tendo\": \"天堂真矢\",\n        \"seto miyako\": \"濑户美夜子\",\n        \"pecorine\": \"佩可莉姆\",\n        \"harumi fujiyoshi\": \"藤吉晴美\",\n        \"chiri kitsu\": \"木津千里\",\n        \"kaere kimura\": \"木村卡愛拉\",\n        \"nozomu itoshiki\": \"糸色望\",\n        \"veight\": \"斑特\",\n        \"wicke\": \"碧珂\",\n        \"astarotte ygvar\": \"亚斯塔萝黛·尤各瓦尔\",\n        \"asuha touhara\": \"塔原明日叶\",\n        \"isadora finnsdottir\": \"伊莎朵拉·方斯德托\",\n        \"ingrid sorveig sorgrims\": \"伊格丽德·索维克·索尔格利吾斯\",\n        \"yumiko miura\": \"三浦优美子\",\n        \"chiyo sakura\": \"佐仓千代\",\n        \"umetarou nozaki\": \"野崎梅太郎\",\n        \"akari kazemiya\": \"风宫茜里\",\n        \"ilya ornstein\": \"伊莉雅·奥恩斯坦\",\n        \"miyako izumo\": \"出云宫子\",\n        \"shinobu kamiki\": \"上喜忍\",\n        \"vikala\": \"碧卡拉\",\n        \"hayate hisakawa\": \"久川飒\",\n        \"nagi hisakawa\": \"久川凪\",\n        \"shika kuroi\": \"黑井诗花\",\n        \"nadeshiko kagamihara\": \"各务原抚子\",\n        \"rin shima\": \"志摩凛\",\n        \"chiaki oogaki\": \"大垣千明\",\n        \"aoi inuyama\": \"犬山葵\",\n        \"ena saitou\": \"齐藤惠那\",\n        \"sugumi kanagata\": \"金潟すぐみ\",\n        \"yasuri araime\": \"新居目安里\",\n        \"raiya kaeruzaka\": \"蛙坂来弥\",\n        \"rita henschel\": \"リタ・ヘンシェル\",\n        \"serina niiya\": \"新谷芹菜\",\n        \"shirley oakley\": \"シャーリー・オークレイ\",\n        \"shitara kaneshiya\": \"兼志谷シタラ\",\n        \"rin himukai\": \"日向リン\",\n        \"giorno giovanna\": \"乔鲁诺·乔巴拿\",\n        \"belzerg stylish sword iris\": \"贝尔泽古·斯黛莉休·索德·爱丽丝\",\n        \"hibiki tsukahara\": \"冢原响\",\n        \"junichi tachibana\": \"橘纯一\",\n        \"mafuyu kirisu\": \"桐须真冬\",\n        \"nariyuki yuiga\": \"唯我成幸\",\n        \"alice zuberg\": \"爱丽丝·滋贝鲁库\",\n        \"selka zuberg\": \"赛鲁卡·滋贝鲁库\",\n        \"haruhiro\": \"哈尔希洛\",\n        \"yume\": \"梦儿\",\n        \"shihoru\": \"席赫露\",\n        \"ranta\": \"蓝德\",\n        \"moguzo\": \"莫古索\",\n        \"merry\": \"梅莉\",\n        \"tamamo cat\": \"玉藻猫\",\n        \"kiritan tohoku\": \"东北切蒲英\",\n        \"rikka takarada\": \"宝多六花\",\n        \"anastasia nikolaevna romanova\": \"阿纳斯塔西娅·尼古拉耶芙娜·罗曼诺娃\",\n        \"miko iino\": \"伊井野弥子\",\n        \"yuu ishigami\": \"石上优\",\n        \"sasaki saku\": \"笹木咲\",\n        \"arulumaya\": \"阿露露梅娅\",\n        \"cain\": \"该隐\",\n        \"mahira\": \"玛琪拉\",\n        \"melissabelle\": \"梅丽莎贝尔\",\n        \"pholia\": \"芙莉亚\",\n        \"sandalphon\": \"圣德芬\",\n        \"akari tsujino\": \"辻野朱里\",\n        \"aru honshou\": \"本庄阿鲁\",\n        \"junko konno\": \"绀野纯子\",\n        \"saki nikaidou\": \"二阶堂咲\",\n        \"yuugiri\": \"夕雾\",\n        \"lily hoshikawa\": \"星川莉莉\",\n        \"koutarou tatsumi\": \"巽幸太郎\",\n        \"sakura minamoto\": \"源樱\",\n        \"tae yamada\": \"山田多惠\",\n        \"ayano sugiura\": \"杉浦绫乃\",\n        \"akari akaza\": \"赤座灯里\",\n        \"kyouko toshinou\": \"岁纳京子\",\n        \"reisalin stout\": \"莱莎琳·斯托特\",\n        \"kudou chitose\": \"久远千岁\",\n        \"higuchi kaede\": \"樋口枫\",\n        \"tsukino mito\": \"月之美兔\",\n        \"yui kusano\": \"草野优衣\",\n        \"kanon daiba\": \"台场夏音\",\n        \"marnie\": \"玛俐\",\n        \"taokaka\": \"桃卡卡\",\n        \"medusa lily\": \"美杜莎(Lancer)\",\n        \"salome\": \"莎乐美\",\n        \"zeta\": \"泽塔\",\n        \"beatrix\": \"贝阿朵丽丝\",\n        \"hoshikawa sara\": \"星川莎拉\",\n        \"honma himawari\": \"本间向日葵🌻\",\n        \"kakyoin chieri\": \"花京院樱桃\",\n        \"lize helesta\": \"莉泽·赫露艾斯塔\",\n        \"saionji mary\": \"西园寺メアリ\",\n        \"suou patra\": \"周防帕特拉\",\n        \"shiina yuika\": \"椎名唯华\",\n        \"shizuka rin\": \"静凛\",\n        \"natori sana\": \"名取纱那\",\n        \"yuzuki roa\": \"梦月萝娅\",\n        \"warabeda meiji\": \"童田明治\",\n        \"souya ichika\": \"宗谷Ichika\",\n        \"raihan\": \"奇巴纳\",\n        \"victor\": \"小胜\",\n        \"hop\": \"赫普\",\n        \"gloria\": \"小优\",\n        \"allister\": \"欧尼奥\",\n        \"klara\": \"克拉拉\",\n        \"dola\": \"多拉\",\n        \"moon\": \"美月\",\n        \"rosa\": \"鸣依\",\n        \"ars almal\": \"阿露丝·阿尔玛\",\n        \"elesa\": \"小菊儿\",\n        \"selene\": \"美月\",\n        \"lillie\": \"莉莉艾\",\n        \"honoka\": \"穗香\",\n        \"hex maniac\": \"灵异迷\",\n        \"hypno\": \"引梦貘人\",\n        \"lana\": \"水莲\",\n        \"lanas mom\": \"水莲的妈妈\",\n        \"kiawe\": \"卡奇\",\n        \"elio\": \"朗日\",\n        \"pikachu\": \"皮卡丘\",\n        \"slowpoke\": \"呆呆兽\",\n        \"izuna hatsuse\": \"初濑伊纲\",\n        \"shiro\": \"白\",\n        \"stephanie\": \"史蒂芬妮\",\n        \"stephanie dola\": \"史蒂芬妮·多拉\",\n        \"jibril\": \"吉普莉尔\",\n        \"sora\": \"空\",\n        \"chizuru ichinose\": \"一之濑千鹤\",\n        \"kazuya kinoshita\": \"木之下和也\",\n        \"sukoya kana\": \"健屋花那\",\n        \"makaino ririmu\": \"魔界之莉莉姆\",\n        \"emma august\": \"艾玛★奥加斯特\",\n        \"hakase fuyuki\": \"叶加濑冬雪\",\n        \"izumo kasumi\": \"出云霞\",\n        \"ushimi ichigo\": \"宇志海莓\",\n        \"yuhi riri\": \"夕阳莉莉\",\n        \"suzuka utako\": \"铃鹿诗子\",\n        \"mononobe alice\": \"物述有栖\",\n        \"moira\": \"摩伊拉\",\n        \"ienaga mugi\": \"家长麦\",\n        \"aki suzuya\": \"铃谷秋\",\n        \"yashiro kizuku\": \"社筑\",\n        \"uduki kou\": \"卯月光\",\n        \"todoroki kyoko\": \"轰京子\",\n        \"suzuki masaru\": \"铃木胜\",\n        \"ryushen\": \"绿仙\",\n        \"morinaka kazaki\": \"森中花咲\",\n        \"kuzuha\": \"葛叶\",\n        \"kenmochi toya\": \"剑持刀也\",\n        \"hanabatake chaika\": \"花畑嘉依卡\",\n        \"fumino tamaki\": \"文野环\",\n        \"elu\": \"艾露\",\n        \"akabane youko\": \"赤羽叶子\",\n        \"aduchi momo\": \"安土桃\",\n        \"yamiyono moruru\": \"暗夜乃莫露露\",\n        \"fuyuki hinata\": \"日向冬树\",\n        \"natsumi hinata\": \"日向夏美\",\n        \"aki hinata\": \"日向秋\",\n        \"cheshire\": \"柴郡\",\n        \"savage\": \"暴行\",\n        \"type 95\": \"95式\",\n        \"aki shiina\": \"椎名亚树\",\n        \"nana sunohara\": \"春原菜菜\",\n        \"ayaka sunohara\": \"春原彩花\",\n        \"yang guifei\": \"杨贵妃\",\n        \"akane shinjou\": \"新条茜\",\n        \"mirai kuriyama\": \"栗山未来\",\n        \"akihito kanbara\": \"神原秋人\",\n        \"ichika orimura\": \"织斑一夏\",\n        \"chifuyu orimura\": \"织斑千冬\",\n        \"gray\": \"格蕾\",\n        \"koyanskaya\": \"高扬斯卡娅\",\n        \"mineva lao zabi\": \"密涅瓦·劳·扎比（汤小美）\",\n        \"marida cruz\": \"玛莉妲·库鲁斯\",\n        \"jeanne alter lily\": \"贞德·Alter·Santa·Lily\",\n        \"mizuki usami\": \"宇佐美瑞希\",\n        \"subaru uchimaki\": \"内卷昴\",\n        \"sayla mass\": \"塞拉·玛斯\",\n        \"daisy mo\": \"墨小菊\",\n        \"violet wen\": \"文芷\",\n        \"sunny chih\": \"迟菓\",\n        \"sarah kerrigan\": \"莎拉·凯瑞甘\",\n        \"ozymandias\": \"奥斯曼狄斯\",\n        \"paimon\": \"派蒙\",\n        \"hilbert\": \"斗也\",\n        \"hilda\": \"希尔达 | 斗子\",\n        \"skyla\": \"风露\",\n        \"elisa\": \"秋子\",\n        \"misty\": \"小霞\",\n        \"alena\": \"安莉娜\",\n        \"reimi saionji\": \"蕾米\",\n        \"maika sakuranomiya\": \"樱之宫莓香\",\n        \"kaho hinata\": \"日向夏帆\",\n        \"mafuyu hoshikawa\": \"星川麻冬\",\n        \"miu amano\": \"天野美雨\",\n        \"hideri kanzaki\": \"神崎日照\",\n        \"claudine saijo\": \"西条克洛迪娜\",\n        \"deutschland\": \"德意志\",\n        \"admiral graf spee\": \"斯佩伯爵海军上将\",\n        \"dunkerque\": \"敦刻尔克\",\n        \"shirayuki tomoe\": \"白雪巴\",\n        \"yui akamatsu\": \"赤松结衣\",\n        \"sat-chan\": \"小幸\",\n        \"kotoha\": \"青山琴叶\",\n        \"ringo oohoshi\": \"大星林檎\",\n        \"shinobu sarutobi\": \"猿飞忍\",\n        \"keine kanzaki\": \"神崎桂音\",\n        \"aoi ichijou\": \"一条葵\",\n        \"lyrule\": \"莉露露\",\n        \"naofumi iwatani\": \"岩谷尚文（盾之勇者）\",\n        \"melty q melromarc\": \"梅蒂·Q·梅洛马格\",\n        \"mirellia q melromarc\": \"米蕾莉亚·Q·梅洛马格\",\n        \"malty melromarc\": \"麦蒂·S·梅洛玛格\",\n        \"motoyasu kitamura\": \"北村元康（枪之勇者）\",\n        \"hana uzaki\": \"宇崎花\",\n        \"tsuki uzaki\": \"宇崎月\",\n        \"shinichi sakurai\": \"樱井真一\",\n        \"ryoko yoshida\": \"吉田良子\",\n        \"sieg\": \"齐格\",\n        \"hajime nagumo\": \"南云始\",\n        \"yue\": \"月\",\n        \"shea haulia\": \"希娅·哈乌利亚\",\n        \"kaori shirasaki\": \"白崎香织\",\n        \"hanako honda\": \"本田华子\",\n        \"olivia\": \"奥莉薇\",\n        \"kasumi nomura\": \"野村香纯\",\n        \"merribit stapleton\": \"梅莉毕德･斯泰普尔顿\",\n        \"tanya von degurechaff\": \"谭雅·提古雷查夫\",\n        \"viktoriya ivanovna serebryakov\": \"维夏\",\n        \"takamiya rion\": \"鹰宫莉音\",\n        \"ruka sarashina\": \"更科瑠夏\",\n        \"sumi sakurasawa\": \"樱泽墨\",\n        \"mami nanami\": \"七海麻美\",\n        \"frankenstein\": \"弗兰肯斯坦（肯娘）\",\n        \"nina maehara\": \"前原仁菜\",\n        \"uruka takemoto\": \"武元润香\",\n        \"fumino furuhashi\": \"古桥文乃\",\n        \"rizu ogata\": \"绪方理珠\",\n        \"asumi kominami\": \"小美浪爱澄\",\n        \"echidna\": \"艾姬多娜\",\n        \"haruka oozora\": \"大空遥\",\n        \"kanata higa\": \"比嘉彼方\",\n        \"narumi tooi\": \"远井成美\",\n        \"ayasa tachibana\": \"立花彩纱\",\n        \"leaf\": \"叶子\",\n        \"diablo\": \"迪亚布罗（坂本拓真）\",\n        \"rem galleu\": \"蕾姆·嘉蕾邬\",\n        \"shera l. greenwood\": \"雪拉·L·古林伍德\",\n        \"alicia crystella\": \"艾莉西亚·库里斯特拉\",\n        \"edelgard\": \"艾德尔卡特\",\n        \"krebskulm\": \"库尔姆\",\n        \"chocola\": \"巧克力\",\n        \"cinnamon\": \"桂\",\n        \"coconut\": \"椰子\",\n        \"vanilla\": \"香草\",\n        \"shinku nikaidou\": \"二阶堂真红\",\n        \"shiori kashiwazaki\": \"柏崎栞\",\n        \"link\": \"林克\",\n        \"wonder woman\": \"神奇女侠\",\n        \"she-ra\": \"希瑞\",\n        \"rapunzel\": \"长发公主\",\n        \"hulk\": \"浩克\",\n        \"star girl\": \"逐星女\",\n        \"harley quinn\": \"哈莉·奎茵\",\n        \"zatanna zatara\": \"扎塔娜·扎塔拉\",\n        \"starfire\": \"星火\",\n        \"supergirl\": \"超级少女\",\n        \"superwoman\": \"超级女侠\",\n        \"batwoman\": \"蝙蝠女侠\",\n        \"batgirl\": \"蝙蝠少女\",\n        \"barbara gordon\": \"芭芭拉·戈登\",\n        \"blackfire\": \"黑火\",\n        \"bruce wayne\": \"布鲁斯·韦恩\",\n        \"jinx\": \"金克斯\",\n        \"lex luthor\": \"莱克斯·卢瑟\",\n        \"poison ivy\": \"毒藤女\",\n        \"raven\": \"渡鸦\",\n        \"terra\": \"泰拉\",\n        \"black canary\": \"黑金丝雀\",\n        \"cheetah\": \"豹女\",\n        \"giganta\": \"巨化女\",\n        \"lois lane\": \"露易丝·莱恩\",\n        \"miss martian\": \"火星少女\",\n        \"power girl\": \"神力女孩\",\n        \"talia al ghul\": \"塔利亚·艾尔·古尔\",\n        \"vixen\": \"雌狐\",\n        \"le malin\": \"恶毒\",\n        \"suzuki hina\": \"铃木雏\",\n        \"tanaka hime\": \"田中姬\",\n        \"nobukatsu oda\": \"织田信胜\",\n        \"okita souji alter\": \"冲田总司Alter\",\n        \"frostnova\": \"霜星\",\n        \"achikita chinami\": \"うさぎ工房\",\n        \"athena asamiya\": \"麻宫雅典娜\",\n        \"da ji\": \"妲己\",\n        \"da qiao\": \"大乔\",\n        \"dong zhuo\": \"董卓\",\n        \"sun ce\": \"孙策\",\n        \"xiao qiao\": \"小乔\",\n        \"zhao yun\": \"赵云\",\n        \"dakki\": \"妲己\",\n        \"oichi\": \"阿市\",\n        \"itou life\": \"伊东life\",\n        \"rangiku matsumoto\": \"松本乱菊\",\n        \"shining\": \"闪灵\",\n        \"jill valentine\": \"吉尔·瓦伦蒂安\",\n        \"exusiai\": \"能天使\",\n        \"kaworu nagisa\": \"渚薰\",\n        \"hatsune kashiwazaki\": \"柏崎初音\",\n        \"mdr\": \"MDR\",\n        \"keqing\": \"刻晴\",\n        \"atsuko kagari\": \"篝敦子\",\n        \"diana cavendish\": \"戴安娜·卡文迪什\",\n        \"eriko kuraishi\": \"仓石惠理子\",\n        \"monkshood\": \"乌头\",\n        \"makoto kowata\": \"木幡真琴\",\n        \"elaina\": \"伊蕾娜\",\n        \"ganyu\": \"甘雨\",\n        \"jean gunnhildr\": \"琴·古恩希尔德\",\n        \"jean\": \"琴\",\n        \"midori fuse\": \"布施翠\",\n        \"roxy migurdia\": \"洛琪希·米格路迪亚\",\n        \"ghislaine dedoldia\": \"基列奴·泰德路迪亚\",\n        \"eris boreas greyrat\": \"艾莉丝·伯雷亚斯·格雷拉特\",\n        \"aya fujisawa\": \"菖蒲（藤泽彩）\",\n        \"musse egret\": \"妙婕·伊格瑞特\",\n        \"alisa reinford\": \"亚莉莎·莱恩福尔特\",\n        \"fie claussell\": \"菲·克劳赛尔\",\n        \"alfin reise arnor\": \"艾尔芬·莱泽·亚诺尔\",\n        \"chen hui-chieh\": \"陈晖洁\",\n        \"hermione granger\": \"赫敏·格兰杰\",\n        \"shizuru hoshino\": \"星野静流\",\n        \"mifuyu ogami\": \"大神美冬\",\n        \"tamaki miyasaka\": \"宫坂珠希\",\n        \"yuuki\": \"佑树\",\n        \"yaya\": \"夜夜\",\n        \"parvati\": \"帕尔瓦蒂\",\n        \"okada izou\": \"冈田以藏\",\n        \"scathach skadi\": \"斯卡哈·斯卡蒂\",\n        \"caenis\": \"凯妮斯\",\n        \"artoria caster\": \"阿尔托莉雅·卡斯特\",\n        \"atlanta\": \"亚特兰大\",\n        \"kadoc zemlupus\": \"卡多克·泽姆露普斯\",\n        \"qin liangyu\": \"秦良玉\",\n        \"swire\": \"诗怀雅\",\n        \"hayase nagatoro\": \"长瀞早濑\",\n        \"texas\": \"德克萨斯\",\n        \"yuuta hibiki\": \"响裕太\",\n        \"emma\": \"艾玛\",\n        \"norman\": \"诺曼\",\n        \"ray\": \"雷\",\n        \"gilda\": \"吉尔达\",\n        \"nat\": \"奈特\",\n        \"anna\": \"安娜\",\n        \"thoma\": \"托马\",\n        \"phil\": \"菲尔\",\n        \"isabella\": \"伊莎贝拉\",\n        \"mujika\": \"穆希卡\",\n        \"sonju\": \"宋杰\",\n        \"lucas\": \"卢卡斯\",\n        \"yugo\": \"尤格\",\n        \"cecily cambell\": \"瑟希莉·坎贝尔\",\n        \"skadi\": \"斯卡蒂\",\n        \"suzuhara lulu\": \"铃原露露\",\n        \"otogibara era\": \"御伽原江良\",\n        \"yorumi rena\": \"夜见蕾娜\",\n        \"yamagami karuta\": \"山神歌流多\",\n        \"asuka hina\": \"飞鸟雏\",\n        \"hina sorasaki\": \"空崎日奈\",\n        \"rimuru tempest\": \"利姆鲁·特恩佩斯特\",\n        \"milim nava\": \"米莉姆·纳瓦\",\n        \"kotoko iwanaga\": \"岩永琴子\",\n        \"meme touwa\": \"藤和女女\",\n        \"makoto niwa\": \"丹羽真\",\n        \"erio touwa\": \"藤和艾莉欧\",\n        \"langa hasegawa\": \"驰河兰加\",\n        \"reki kyan\": \"喜屋武历\",\n        \"myne\": \"梅茵\",\n        \"ferdinand\": \"斐迪南\",\n        \"misato aikawa\": \"爱川美里\",\n        \"mitama yakumo\": \"八云御魂\",\n        \"momoko togame\": \"十咎桃子\",\n        \"aurelia le guin\": \"奥蕾莉亚·勒瑰恩\",\n        \"celine millstein\": \"瑟蕾奴·米尔斯汀\",\n        \"elie macdowell\": \"艾莉·麦克道尔\",\n        \"kea bannings\": \"琪雅·班宁斯\",\n        \"lapis rosenberg\": \"拉碧丝·罗赞贝尔克\",\n        \"nadia rayne\": \"娜狄雅·莱恩\",\n        \"noel seeker\": \"诺艾尔·希卡\",\n        \"rixia mao\": \"莉夏·毛\",\n        \"tio plato\": \"缇欧·普拉托\",\n        \"vita clotilde\": \"薇塔·克洛提德\",\n        \"duvalie\": \"杜巴莉\",\n        \"elise schwarzer\": \"爱丽榭·舒华泽\",\n        \"juna crawford\": \"悠娜·克劳弗德\",\n        \"renne bright\": \"玲·布莱特\",\n        \"emma millstein\": \"艾玛·米尔斯汀\",\n        \"laura s. arseid\": \"劳拉·S·亚尔赛德\",\n        \"shirley orlando\": \"谢莉·奥兰多\",\n        \"tita russel\": \"提妲·拉赛尔\",\n        \"towa herschel\": \"托娃·赫歇尔\",\n        \"claire rieveldt\": \"克蕾雅·利维特\",\n        \"sara valestein\": \"莎拉·巴雷斯坦\",\n        \"estelle bright\": \"艾丝蒂尔·布莱特\",\n        \"klose rinz\": \"科洛丝·琳希\",\n        \"chika misumi\": \"三角千歌\",\n        \"tsumugi mayumiya\": \"茧宫纺希\",\n        \"nozomi sakurai\": \"樱井望\",\n        \"zhongli\": \"钟离\",\n        \"ningguang\": \"凝光\",\n        \"lappland\": \"拉普兰德\",\n        \"amber\": \"安柏\",\n        \"beidou\": \"北斗\",\n        \"hilichurl\": \"丘丘人\",\n        \"lumine\": \"荧\",\n        \"hu tao\": \"胡桃\",\n        \"kallen stadtfeld\": \"卡莲·休坦菲尔特\",\n        \"suzaku kururugi\": \"枢木朱雀\",\n        \"nunnally vi britannia\": \"娜娜莉·vi·布里塔尼亚\",\n        \"kou\": \"蔻\",\n        \"yu takasaki\": \"高咲侑\",\n        \"shioriko mifune\": \"三船栞子\",\n        \"olga discordia\": \"奥利卡·迪斯克伦蒂亚\",\n        \"mamako oosuki\": \"大好真真子\",\n        \"masato oosuki\": \"大好真人\",\n        \"flare arlgrande jioral\": \"芙列雅·艾尔格兰帝·吉欧拉尔\",\n        \"andira\": \"安琪拉\",\n        \"hacka doll no.3\": \"骇客娃娃3号\",\n        \"hacka doll no.1\": \"骇客娃娃1号\",\n        \"hacka doll no.2\": \"骇客娃娃2号\",\n        \"hacka doll no.4\": \"骇客娃娃4号\",\n        \"shinshuu maru\": \"神州丸\",\n        \"akira amatsume\": \"天女目瑛\",\n        \"nao yorihime\": \"依媛奈绪\",\n        \"batman\": \"蝙蝠侠\",\n        \"galo thymos\": \"加洛·提莫斯\",\n        \"lio fotia\": \"里奥·福蒂亚\",\n        \"qiqi\": \"七七\",\n        \"mujina\": \"貉\",\n        \"yume minami\": \"南梦芽\",\n        \"yomogi asanaka\": \"麻中蓬\",\n        \"anne takamaki\": \"高卷杏\",\n        \"hathaway noa\": \"哈撒韦·诺亚\",\n        \"amuro ray\": \"阿姆罗·雷\",\n        \"char aznable\": \"夏亚·阿兹纳布\",\n        \"quess paraya\": \"葵司\",\n        \"alcina dimitrescu\": \"阿契娜·蒂米特雷斯库\",\n        \"akali\": \"阿卡丽\",\n        \"misae nohara\": \"野原美伢\",\n        \"shinnosuke nohara\": \"野原新之助\",\n        \"hiroshi nohara\": \"野原广志\",\n        \"musae koyama\": \"小山梦冴\",\n        \"mineko kazama\": \"风间峰子\",\n        \"south dakota\": \"南达科他\",\n        \"mona megistus\": \"莫娜·梅姬斯图斯\",\n        \"aether\": \"空\",\n        \"fischl\": \"菲谢尔\",\n        \"eula lawrence\": \"优菈·劳伦斯\",\n        \"barbara pegg\": \"芭芭拉\",\n        \"chongyun\": \"重云\",\n        \"xingqiu\": \"行秋\",\n        \"lisa minci\": \"丽莎·敏兹\",\n        \"noelle\": \"诺艾尔\",\n        \"sucrose\": \"砂糖\",\n        \"diona\": \"迪奥娜\",\n        \"rosaria\": \"罗莎莉亚\",\n        \"klee\": \"可莉\",\n        \"xinyan\": \"辛焱\",\n        \"venti\": \"温迪\",\n        \"xiao\": \"魈\",\n        \"razor\": \"雷泽\",\n        \"suzuran\": \"铃兰\",\n        \"hana midorikawa\": \"绿川花\",\n        \"meiko shiraki\": \"白木芽衣子\",\n        \"luz noceda\": \"露丝·诺西达\",\n        \"toph bei fong\": \"北方·托芙\",\n        \"robin\": \"罗宾\",\n        \"eugeo\": \"尤吉欧\",\n        \"quinella\": \"葵妮拉\",\n        \"makima\": \"玛奇玛\",\n        \"denji\": \"电次\",\n        \"angel devil\": \"天使恶魔\",\n        \"yanfei\": \"烟绯\",\n        \"gawr gura\": \"噶呜·古拉\",\n        \"enoch\": \"伊诺库\",\n        \"veronica\": \"维罗妮卡\",\n        \"murasaki yatsu\": \"八津紫\",\n        \"lucifer\": \"路西法\",\n        \"miyu yamano\": \"共月庭\",\n        \"watashi\": \"我\",\n        \"hina amano\": \"天野阳菜\",\n        \"enderman\": \"末影人\",\n        \"creeper\": \"苦力怕\",\n        \"piglin\": \"猪灵\",\n        \"misa amane\": \"弥海砂\",\n        \"l lawliet\": \"艾尔·罗莱特（L）\",\n        \"light yagami\": \"夜神月\",\n        \"akira toya\": \"塔矢亮\",\n        \"akari fujisaki\": \"藤崎明\",\n        \"tetsuo kaga\": \"加贺铁男\",\n        \"asumi nase\": \"奈濑明日美\",\n        \"mitsuko shindo\": \"进藤美津子\",\n        \"yuki mitani\": \"三谷祐辉\",\n        \"kimihiro tsutsui\": \"筒井公宏\",\n        \"yoko ritona\": \"优子\",\n        \"nia teppelin\": \"尼娅\",\n        \"simon\": \"西蒙\",\n        \"kamina\": \"卡米那\",\n        \"merlin\": \"梅林\",\n        \"akira kogami\": \"小神晶\",\n        \"minoru shiraishi\": \"白石稔\",\n        \"ilulu\": \"伊露露\",\n        \"perseus\": \"英仙座\",\n        \"kitasan black\": \"北部玄驹\",\n        \"haru urara\": \"春丽（春乌拉拉）\",\n        \"mayano top gun\": \"摩耶重炮\",\n        \"rice shower\": \"米浴\",\n        \"satono diamond\": \"里见光钻\",\n        \"fuji kiseki\": \"富士奇迹\",\n        \"maruzensky\": \"丸善斯基\",\n        \"mihono bourbon\": \"美浦波旁\",\n        \"mejiro ardan\": \"目白阿尔丹\",\n        \"gold city\": \"黄金城市\",\n        \"meisho doto\": \"名将怒涛\",\n        \"king halo\": \"圣王光环\",\n        \"nice nature\": \"优秀素质\",\n        \"narita taishin\": \"成田大进\",\n        \"tazuna hayakawa\": \"骏川手纲\",\n        \"agnes tachyon\": \"爱丽速子\",\n        \"manhattan cafe\": \"曼城茶座\",\n        \"grass wonder\": \"草上飞\",\n        \"himiko toga\": \"渡我被身子\",\n        \"black rock shooter\": \"黑岩射手\",\n        \"mio kisaki\": \"希咲美樱\",\n        \"lisa eostre\": \"丽莎·埃奥斯托雷\",\n        \"bertille althusser\": \"贝尔缇优·阿鲁奇赛尔\",\n        \"takahiro mizuno\": \"水野贵弘\",\n        \"shinonome\": \"东云\",\n        \"noel marres ascot\": \"诺埃尔·穆利斯·阿斯科特\",\n        \"celia cumani aintree\": \"苏利亚·库玛尼·安特里\",\n        \"ayako hiiragi\": \"柊木绫子\",\n        \"kayneth archibald el-melloi\": \"肯尼斯·埃尔梅罗·阿奇博尔德\",\n        \"romani archaman\": \"罗玛尼·阿其曼\",\n        \"sadako yamamura\": \"山村贞子\",\n        \"ryuuko matoi\": \"缠流子\",\n        \"satsuki kiryuuin\": \"鬼龙院皋月\",\n        \"mako mankanshoku\": \"满舰饰真子\",\n        \"nonon jakuzure\": \"蛇崩乃音\",\n        \"uzu sanageyama\": \"猿投山涡\",\n        \"ragyo kiryuuin\": \"鬼龙院罗晓\",\n        \"nui harime\": \"针目缝\",\n        \"ira gamagoori\": \"蟆郡苛\",\n        \"houka inumuta\": \"犬牟田宝火\",\n        \"aikuro mikisugi\": \"美木杉爱九郎\",\n        \"tsumugu kinagase\": \"黄长濑䌷\",\n        \"kiki\": \"琪琪\",\n        \"saki watanabe\": \"渡边早季\",\n        \"yui funami\": \"船见结衣\",\n        \"chitose ikeda\": \"池田千岁\",\n        \"chinatsu yoshikawa\": \"吉川千夏\",\n        \"nasa yuzaki\": \"由崎星空\",\n        \"tsukasa yuzaki\": \"由崎司（月读司）\",\n        \"ringo-chan\": \"小苹果\",\n        \"yassan\": \"文学少女\",\n        \"yuno gasai\": \"我妻由乃\",\n        \"reisuke houjou\": \"丰穰礼佑\",\n        \"tsubaki kasugano\": \"春日野椿\",\n        \"minene uryuu\": \"雨流美弥弥\",\n        \"yukiteru amano\": \"天野雪辉\",\n        \"motoko kusanagi\": \"草薙素子\",\n        \"mayuri shiina\": \"椎名真由理\",\n        \"rintarou okabe\": \"冈部伦太郎\",\n        \"suzuha amane\": \"阿万音铃羽\",\n        \"moeka kiryuu\": \"桐生萌郁\",\n        \"faris nyannyan\": \"菲利斯·喵喵\",\n        \"anzu\": \"杏子\",\n        \"hitomi mishima\": \"三岛瞳\",\n        \"komekko\": \"米米\",\n        \"airi akizuki\": \"秋月爱莉\",\n        \"kouzou akizuki\": \"秋月孝三\",\n        \"marina akizuki\": \"秋月真理奈\",\n        \"sana kuranaka\": \"仓中纱奈\",\n        \"airi akitsuki\": \"秋月爱莉\",\n        \"amu hinamori\": \"日奈森亚梦\",\n        \"utau hoshina\": \"月咏歌呗\",\n        \"rima mashiro\": \"真城璃茉\",\n        \"ikuto tsukiyomi\": \"月咏几斗\",\n        \"nadeshiko fujisaki\": \"藤咲抚子\",\n        \"akane tsunemori\": \"常守朱\",\n        \"shino amakusa\": \"天草篠\",\n        \"aria shichijou\": \"七条天空\",\n        \"suzu hagimura\": \"萩村铃\",\n        \"uomi\": \"鱼见千寻\",\n        \"takatoshi tsuda\": \"津田隆利\",\n        \"renge miyauchi\": \"宫内莲华\",\n        \"natsumi koshigaya\": \"越谷夏海\",\n        \"yaichi kuzuryuu\": \"九头龙八一\",\n        \"ai yashajin\": \"夜叉神天衣\",\n        \"inuyama tamaki\": \"犬山玉姬\",\n        \"aliza\": \"阿莉莎\",\n        \"sarasa\": \"萨拉萨\",\n        \"hallessena\": \"哈蕾泽娜\",\n        \"izmir\": \"伊休米尔\",\n        \"razia\": \"拉丝缇娜\",\n        \"magisa\": \"玛姬莎\",\n        \"anna hiiragi\": \"柊杏奈\",\n        \"shirley fenette\": \"夏莉·菲内特\",\n        \"milly ashford\": \"米蕾·阿什弗德\",\n        \"anya alstreim\": \"阿妮亚·阿鲁斯特莱依姆\",\n        \"kaguya sumeragi\": \"皇神乐耶\",\n        \"krillin\": \"克林\",\n        \"rudeus greyrat\": \"鲁迪乌斯·格雷拉特\",\n        \"sylphiette\": \"希露菲叶特\",\n        \"zamasu\": \"扎马斯\",\n        \"kokoro\": \"心\",\n        \"christie\": \"克丽丝蒂\",\n        \"mila\": \"米拉\",\n        \"hitomi\": \"瞳\",\n        \"raiden shogun\": \"雷电将军\",\n        \"musubi\": \"结\",\n        \"shut\": \"夏特\",\n        \"princess jasmine\": \"茉莉公主\",\n        \"aladdin\": \"阿拉丁\",\n        \"ariel\": \"爱丽儿\",\n        \"platelet\": \"血小板\",\n        \"ayaka kamisato\": \"神里绫华\",\n        \"shounagon sei\": \"清少纳言\",\n        \"ritsuko akagi\": \"赤木律子\",\n        \"yui ikari\": \"碇唯\",\n        \"gendo ikari\": \"碇源堂\",\n        \"kensou sie\": \"椎拳崇\",\n        \"andy bogard\": \"安迪·博加德\",\n        \"azuma\": \"吾妻\",\n        \"gorgon\": \"戈尔贡\",\n        \"repulse\": \"反击\",\n        \"north carolina\": \"北卡罗来纳\",\n        \"washington\": \"华盛顿\",\n        \"essex\": \"埃塞克斯\",\n        \"indianapolis\": \"印第安纳波利斯\",\n        \"albacore\": \"大青花鱼\",\n        \"new jersey\": \"新泽西\",\n        \"jean bart\": \"让·巴尔\",\n        \"kokomi sangonomiya\": \"珊瑚宫心海\",\n        \"kashino\": \"樫野\",\n        \"chapayev\": \"恰巴耶夫\",\n        \"saint louis\": \"路易九世\",\n        \"yume nijino\": \"虹野梦\",\n        \"laura sakuraba\": \"樱庭劳拉\",\n        \"mahiru kasumi\": \"香澄真昼\",\n        \"koharu nanakura\": \"七仓小春\",\n        \"ako saotome\": \"早乙女亚子\",\n        \"misogi hodaka\": \"穗高未奏希\",\n        \"yuni shingyouji\": \"真行寺由仁\",\n        \"takagi\": \"高木同学\",\n        \"stella unibell\": \"史黛拉·尤尼贝尔\",\n        \"hotaru futaba\": \"双叶萤\",\n        \"keke tang\": \"唐可可\",\n        \"kasumi yoshizawa\": \"芳泽霞\",\n        \"sae niijima\": \"新岛冴\",\n        \"akira kurusu\": \"来栖晓\",\n        \"futaba sakura\": \"佐仓双叶\",\n        \"haru okumura\": \"奥村春\",\n        \"makoto niijima\": \"新岛真\",\n        \"sadayo kawakami\": \"川上贞代\",\n        \"tae takemi\": \"武见妙\",\n        \"chihaya mifune\": \"御船千早\",\n        \"hifumi togo\": \"东乡一二三\",\n        \"yae miko\": \"八重神子\",\n        \"yoimiya naganohara\": \"宵宫\",\n        \"kei yuuki\": \"结城萤\",\n        \"tadayasu sawaki\": \"泽木直保\",\n        \"sortiliena serlut\": \"索尔狄丽娜·赛路尔特\",\n        \"ronye arabel\": \"罗妮耶·亚拉贝尔\",\n        \"tamami wakiyama\": \"胁山珠美\",\n        \"mimi akane\": \"茜美美\",\n        \"ashley graham\": \"阿什莉·格拉汉姆\",\n        \"mutsuki asagi\": \"浅黄睦月\",\n        \"ryo matsunaga\": \"松永凉\",\n        \"xiangling\": \"香菱\",\n        \"tomimi\": \"特米米\",\n        \"eunectes\": \"森蚺\",\n        \"shouko komi\": \"古见硝子\",\n        \"hitohito tadano\": \"只野仁人\",\n        \"itto arataki\": \"荒泷一斗\",\n        \"princess zelda\": \"塞尔达公主\",\n        \"ren hazuki\": \"叶月恋\",\n        \"sumire heanna\": \"平安名堇\",\n        \"lanzhu zhong\": \"钟岚珠\",\n        \"kanon shibuya\": \"涩谷香音\",\n        \"chisato arashi\": \"岚千砂都\",\n        \"mia taylor\": \"米娅·泰勒\",\n        \"kiana kaslana\": \"琪亚娜·卡斯兰娜\",\n        \"sakura yae\": \"八重樱\",\n        \"hornet\": \"大黄蜂\",\n        \"sara kujou\": \"九条裟罗\",\n        \"smart falcon\": \"醒目飞鹰\",\n        \"asuna ichinose\": \"一之濑明日奈\",\n        \"akane murokasa\": \"室笠茜\",\n        \"karin kakudate\": \"角楯花凛\",\n        \"gray wolf\": \"灰狼\",\n        \"brown bear\": \"棕熊\",\n        \"golden snub-nosed monkey\": \"金丝猴\",\n        \"african wild dog\": \"非洲野犬\",\n        \"kusunoki sio\": \"楠栞桜\",\n        \"sara\": \"莎拉\",\n        \"metera\": \"美黛拉\",\n        \"sutera\": \"斯黛拉\",\n        \"chieru kazama\": \"风间千爱瑠\",\n        \"hanako kuroe\": \"黑江花子\",\n        \"kasumi kirihara\": \"雾原霞\",\n        \"makoto aki\": \"安艺真琴\",\n        \"christina morgan\": \"克莉丝提娜·摩根\",\n        \"mythra\": \"光\",\n        \"pyra\": \"焰\",\n        \"cucouroux\": \"库库鲁\",\n        \"jessica\": \"杰西卡\",\n        \"jasmine\": \"茉莉\",\n        \"karva\": \"卡鲁巴\",\n        \"korwa\": \"可露瓦\",\n        \"noriko takaya\": \"高屋法子\",\n        \"kazumi amano\": \"天野和美\",\n        \"jung freud\": \"荣格·佛洛依德\",\n        \"aru rikuhachima\": \"陆八魔亚瑠\",\n        \"hifumi ajitani\": \"阿慈谷日富美\",\n        \"azusa shirasu\": \"白洲梓\",\n        \"hanako urawa\": \"浦和花子\",\n        \"koharu shimoe\": \"下江小春\",\n        \"sheffy\": \"雪菲\",\n        \"miko yotsuya\": \"四谷见子\",\n        \"hana yurikawa\": \"百合川华\",\n        \"yuria niguredou\": \"二暮堂尤利娅\",\n        \"shenhe\": \"申鹤\",\n        \"futaba marui\": \"丸井双叶\",\n        \"mitsuba marui\": \"丸井三叶\",\n        \"hitoha marui\": \"丸井一叶\",\n        \"kanna akizuki\": \"明月栞那\",\n        \"natsume shiki\": \"四季夏目\",\n        \"nozomi sumizome\": \"墨染希\",\n        \"mei hiuchidani\": \"火打谷爱衣\",\n        \"suzune shioyama\": \"汐山凉音\",\n        \"wakana gojou\": \"五条新菜\",\n        \"marin kitagawa\": \"喜多川海梦\",\n        \"akeno himejima\": \"姬岛朱乃\",\n        \"asia argento\": \"爱莎·阿尔杰特\",\n        \"koneko toujou\": \"塔城小猫\",\n        \"rias gremory\": \"莉雅丝·吉蒙里\",\n        \"amamiya kokoro\": \"天宫心\",\n        \"signora\": \"「女士」罗莎琳\",\n        \"trish una\": \"特里休·乌纳\",\n        \"kei shirogane\": \"白银圭\",\n        \"suigintou\": \"水银灯\",\n        \"kirakishou\": \"雪华绮晶\",\n        \"kanaria\": \"金丝雀\",\n        \"suiseiseki\": \"翠星石\",\n        \"shinku\": \"真红\",\n        \"hina ichigo\": \"雏莓\",\n        \"souseiseki\": \"苍星石\",\n        \"hood\": \"胡德\",\n        \"mrs. yuigahama\": \"由比滨妈妈\",\n        \"mudrock\": \"泥岩\",\n        \"nian\": \"年\",\n        \"soraka\": \"索拉卡\",\n        \"doctor\": \"博士\",\n        \"dusk\": \"夕\",\n        \"sabrina\": \"娜姿\",\n        \"nagao kagetora\": \"长尾景虎\",\n        \"shirabe tsukuyomi\": \"月读调\",\n        \"chris yukine\": \"雪音克莉丝\",\n        \"hibiki tachibana\": \"立花响\",\n        \"miku kohinata\": \"小日向未来\",\n        \"gardevoir\": \"沙奈朵\",\n        \"celestine lucullus\": \"塞蕾斯汀·卢库勒斯\",\n        \"lucario\": \"路卡利欧\",\n        \"eren jaeger\": \"艾伦·耶格尔\",\n        \"mikasa ackerman\": \"三笠·阿克曼\",\n        \"armin arlert\": \"阿明·阿诺德\",\n        \"clarisse\": \"克拉莉丝\",\n        \"hilda boreas greyrat\": \"希尔达·伯雷亚斯·格雷拉特\",\n        \"zenith greyrat\": \"塞妮丝·格雷拉特\",\n        \"lilia greyrat\": \"莉莉雅·格雷拉特\",\n        \"hakunon\": \"白野（扎比子）\",\n        \"yoshikage kira\": \"吉良吉影\",\n        \"fuka toyokawa\": \"丰川风花\",\n        \"kana yabuki\": \"矢吹可奈\",\n        \"ayumu maihama\": \"舞浜歩\",\n        \"sekai kamiki\": \"神木世海\",\n        \"kaoruko sazaki\": \"佐崎薰子\",\n        \"izuku midoriya\": \"绿谷出久\",\n        \"mitsuki bakugou\": \"爆豪光己\",\n        \"prushka\": \"普鲁修卡\",\n        \"hakui koyori\": \"博衣小夜璃\",\n        \"satoko houjou\": \"北条沙都子\",\n        \"siesta\": \"谢丝塔\",\n        \"rebecca bluegarden\": \"蕾贝卡·布鲁加甸\",\n        \"aria von reiji asuna\": \"岭司\",\n        \"kokawa asuka\": \"甲河明日香\",\n        \"mutio\": \"妙迪奥\",\n        \"yotsuba koiwai\": \"小岩井四叶\",\n        \"torako\": \"虎子\",\n        \"naruko yokoshima\": \"横岛鸣子\",\n        \"aoi hinami\": \"日南葵\",\n        \"feena fam earthlight\": \"菲娜·法姆·阿修莱特\",\n        \"akiko minase\": \"水濑秋子\",\n        \"yuuichi aizawa\": \"水濑名雪\",\n        \"itako tohoku\": \"东北伊达子\",\n        \"una otomachi\": \"音街鳗\",\n        \"kokona aoba\": \"青羽心夏\",\n        \"sayu\": \"早柚\",\n        \"takanashi kiara\": \"小鸟游琪亚拉\",\n        \"yumeko jabami\": \"蛇喰梦子\",\n        \"reed\": \"苇草\",\n        \"ui kozeki\": \"古关忧\",\n        \"battler ushiromiya\": \"右代宫战人\",\n        \"sideroca\": \"铸铁\",\n        \"utage\": \"宴\",\n        \"siege\": \"推进之王\",\n        \"barghest\": \"巴格斯特（犬魔）\",\n        \"yellow heart\": \"黄色之心\",\n        \"orange heart\": \"橙色之心\",\n        \"kotonoha katsura\": \"桂言叶\",\n        \"kokoro katsura\": \"桂心\",\n        \"sekai saionji\": \"西园寺世界\",\n        \"makoto itou\": \"伊藤诚\",\n        \"violet evergarden\": \"薇尔莉特·伊芙加登\",\n        \"lelei la lelena\": \"蕾莱·拉·列娜\",\n        \"youji itami\": \"伊丹耀司\",\n        \"pina co lada\": \"平娜·戈·兰达\",\n        \"rory mercury\": \"萝莉·麦丘利\",\n        \"yao haa dushi\": \"姚·汉·蒂修\",\n        \"tuka luna marceau\": \"杜嘉·露娜·马尔席\",\n        \"jeanne\": \"贞德\",\n        \"bayonetta\": \"贝优妮塔\",\n        \"elinalise dragonroad\": \"艾莉娜丽洁·杜拉冈罗德\",\n        \"neneko\": \"鈴樹ねね\",\n        \"mona\": \"莫娜\",\n        \"komichi akebi\": \"明日小路\",\n        \"alisa southerncross\": \"爱莉莎·南十字星\",\n        \"shishiro botan\": \"狮白牡丹\",\n        \"bennett\": \"班尼特\",\n        \"ruri hoshino\": \"星野·琉璃\",\n        \"lanling wang\": \"兰陵王\",\n        \"andrew gilbert mills\": \"安德鲁·基尔巴特·米尔斯\",\n        \"shizuku kuroe\": \"黑江雫\",\n        \"ellen baker\": \"艾伦·贝可\",\n        \"shizune\": \"静音\",\n        \"kurenai yuhi\": \"夕日红\",\n        \"mei terumi\": \"照美冥\",\n        \"ai ohto\": \"大户爱\",\n        \"kurumi ebisuzawa\": \"惠飞须泽胡桃\",\n        \"rita rossweisse\": \"丽塔·洛丝薇瑟\",\n        \"yor forger\": \"约尔·福杰\",\n        \"misaki tobisawa\": \"鸢泽美咲\",\n        \"morgan le fay\": \"摩根勒菲\",\n        \"nishizono chigusa\": \"西园千草\",\n        \"sherry birkin\": \"雪莉·柏金\",\n        \"ratna petit\": \"拉特娜·葡蒂\",\n        \"shigure ui\": \"时雨羽衣\",\n        \"suo sango\": \"周央珊瑚\",\n        \"lakshmibai\": \"拉克什米·芭伊\",\n        \"inui toko\": \"戌亥とこ\",\n        \"krul tepes\": \"克鲁鲁·采佩西\",\n        \"mutsumi otohime\": \"乙姬睦美\",\n        \"shinobu maehara\": \"前原忍\",\n        \"naru narusegawa\": \"成濑川奈留\",\n        \"meidri\": \"梅朵莉\",\n        \"crimvael\": \"克莉姆\",\n        \"samus aran\": \"萨姆斯·亚兰\",\n        \"otome saotome\": \"早乙女乙女\",\n        \"melusine\": \"美露莘\",\n        \"baobhan sith\": \"芭万·希\",\n        \"suomi\": \"索米\",\n        \"guilmon\": \"基尔兽\",\n        \"impmon\": \"小妖兽\",\n        \"nonomi izayoi\": \"十六夜野宫\",\n        \"yuuma toutetsu\": \"饕餮尤魔\",\n        \"miyuki kobayakawa\": \"小早川美幸\",\n        \"natsumi tsujimoto\": \"辻本夏实\",\n        \"yoriko nikaido\": \"二阶堂赖子\",\n        \"kyousuke natsume\": \"枣恭介\",\n        \"rin natsume\": \"枣铃\",\n        \"kobeni yonomori\": \"夜之森小红\",\n        \"sheryl nome\": \"雪露·诺姆\",\n        \"iori shiromi\": \"银镜伊织\",\n        \"barbara\": \"芭芭菈\",\n        \"enji todoroki\": \"轰炎司\",\n        \"nagisa minase\": \"水濑渚\",\n        \"lum\": \"拉姆\",\n        \"raiden\": \"雷电\",\n        \"tien shinhan\": \"天津饭\",\n        \"theresa apocalypse\": \"德丽莎·阿波卡利斯\",\n        \"rozaliya olenyeva\": \"萝莎莉娅·阿琳\",\n        \"liliya olenyeva\": \"莉莉娅·阿琳\",\n        \"torte\": \"托蒂\",\n        \"nausicaa\": \"娜乌西卡\",\n        \"belle\": \"贝儿\",\n        \"shun sunohara\": \"春原瞬\",\n        \"surtr\": \"史尔特尔\",\n        \"mostima\": \"莫斯提马\",\n        \"tensai ikkyuu\": \"一级天灾\",\n        \"daruku hoshino\": \"星野达鲁克\",\n        \"nanana ryuugajou\": \"龙娘七七七\",\n        \"nanami arihara\": \"在原七海\",\n        \"mai kawasumi\": \"川澄舞\",\n        \"yelan\": \"夜兰\",\n        \"baki hanma\": \"范马刃牙\",\n        \"mana inuyama\": \"犬山真名\",\n        \"megumi\": \"惠美\",\n        \"rumi\": \"留美\",\n        \"mare s. ephemeral\": \"梅娅·S·艾菲梅拉尔\",\n        \"loid forger\": \"劳埃德·福杰\",\n        \"anna yamada\": \"山田杏奈\",\n        \"kyoutarou ichikawa\": \"市川京太郎\",\n        \"pramanix\": \"初雪\",\n        \"medaka kurokami\": \"黑神目泷\",\n        \"miss crane\": \"鹤小姐\",\n        \"mordred\": \"莫德雷德\",\n        \"mikaela hyakuya\": \"百夜米迦尔\",\n        \"laplus darknesss\": \"拉普拉斯·达克尼斯\",\n        \"mori calliope\": \"森美声\",\n        \"ninomae inanis\": \"一伊那尔栖\",\n        \"sakamata chloe\": \"沙花叉库洛艾\",\n        \"kazama iroha\": \"风真伊吕波\",\n        \"weedy\": \"温蒂\",\n        \"makino yagami\": \"八神牧野\",\n        \"lu bu\": \"吕布\",\n        \"namiko\": \"奈美子\",\n        \"hass\": \"莲\",\n        \"kazuha kaedehara\": \"枫原万叶\",\n        \"scaramouche\": \"「散兵」（国崩）\",\n        \"himiko\": \"卑弥呼\",\n        \"zenobia\": \"芝诺比娅\",\n        \"paris\": \"帕里斯\",\n        \"captain nemo\": \"尼莫船长\",\n        \"sukuna\": \"两面宿傩\",\n        \"yuuji itadori\": \"虎杖悠仁\",\n        \"megumi fushiguro\": \"伏黑惠\",\n        \"caitlyn\": \"凯特琳\",\n        \"nikaido\": \"二阶堂\",\n        \"reno\": \"里诺\",\n        \"aegir\": \"埃吉尔\",\n        \"shinano\": \"信浓\",\n        \"foxhound\": \"狐提\",\n        \"pamiat merkuria\": \"水星纪念\",\n        \"nurnberg\": \"纽伦堡\",\n        \"nicholas\": \"尼古拉斯\",\n        \"icarus\": \"伊卡洛斯\",\n        \"palutena\": \"帕露蒂娜\",\n        \"pit\": \"皮特\",\n        \"bozes co palesti\": \"波赛斯·戈·芭蕾丝蒂\",\n        \"noi\": \"能井\",\n        \"scirocco\": \"东南风\",\n        \"miyuki kujou\": \"九条美雪\",\n        \"specter\": \"幽灵鲨\",\n        \"aether foundation employee\": \"以太基金会员工\",\n        \"hiling\": \"希琳\",\n        \"yoshino kousaka\": \"高坂佳乃\",\n        \"kuzuha togashi\": \"富㭴樟叶\",\n        \"ichigo hoshimiya\": \"星宫莓\",\n        \"aoi kiriya\": \"雾矢葵\",\n        \"yurika toudou\": \"藤堂百合香\",\n        \"kirara hanazono\": \"花园绮罗\",\n        \"orihime mitsuishi\": \"光石织姬\",\n        \"noeru otoshiro\": \"音城诺艾儿\",\n        \"raki kiseki\": \"姬石来希\",\n        \"ringo hoshimiya\": \"星宫苹果\",\n        \"tsubasa kisaragi\": \"如月翼\",\n        \"seira otoshiro\": \"音城塞拉\",\n        \"alicia charlotte\": \"艾丽西亚·夏洛特\",\n        \"aine yuuki\": \"友希爱音\",\n        \"asahi kasumi\": \"香澄朝阳\",\n        \"yozora kasumi\": \"香澄夜空\",\n        \"sumire hikami\": \"冰上堇\",\n        \"akari oozora\": \"大空明\",\n        \"risa shirakaba\": \"白桦丽莎\",\n        \"nono daichi\": \"大地乃野\",\n        \"sora kazesawa\": \"风泽空\",\n        \"kii saegusa\": \"冴草纪伊\",\n        \"mio minato\": \"凑美绪\",\n        \"rin kurosawa\": \"黑泽凛\",\n        \"ran shibuki\": \"紫吹兰\",\n        \"juri kurebayashi\": \"红林珠璃\",\n        \"hinaki shinjou\": \"新条雏姬\",\n        \"madoka amahane\": \"天羽圆香\",\n        \"hime shiratori\": \"白鸟姬\",\n        \"sussurro\": \"苏苏洛\",\n        \"alice tendou\": \"天童爱丽丝\",\n        \"hanabi hyuga\": \"日向花火\",\n        \"chisato hasegawa\": \"长谷川千里\",\n        \"anko kitashirakawa\": \"北白川馅子\",\n        \"seraphine\": \"萨勒芬妮\",\n        \"erich von rerugen\": \"埃里希·冯·雷鲁根\",\n        \"luciela r. sourcream\": \"露西艾拉·R·索克莉姆\",\n        \"eris\": \"厄里斯\",\n        \"luna\": \"露娜\",\n        \"yamato no kami yasusada\": \"大和守安定\",\n        \"takane lui\": \"鹰岭露依\",\n        \"charlotte e. yeager\": \"夏洛特·E·叶格\",\n        \"erica hartmann\": \"艾莉卡·哈特曼\",\n        \"gertrud barkhorn\": \"歌尔特露特·巴克霍隆\",\n        \"lynette bishop\": \"莉涅特·毕晓普\",\n        \"minna-dietlinde wilcke\": \"明娜·迪特林德·威尔克\",\n        \"sanya v. litvyak\": \"萨妮娅·V·利特维亚克\",\n        \"yoshika miyafuji\": \"宫藤芳佳\",\n        \"yoruichi shihoin\": \"四枫院夜一\",\n        \"tia halibel\": \"蒂雅·赫丽贝尔\",\n        \"muzan kibutsuji\": \"鬼舞辻无惨\",\n        \"karna\": \"迦尔纳\",\n        \"victorique de blois\": \"维多利加\",\n        \"kazuya kujou\": \"久城一弥\",\n        \"matsurika shinouji\": \"汐王寺茉莉花\",\n        \"sayu ogiwara\": \"荻原沙优\",\n        \"airi gotou\": \"后藤爱依梨\",\n        \"dark elven forest ranger\": \"dark elven forest ranger\",\n        \"kie kamado\": \"灶门葵枝\",\n        \"watson amelia\": \"阿米莉亚·华生\",\n        \"edmond dantes\": \"爱德蒙·唐泰斯（岩窟王）\",\n        \"ariane glenys maple\": \"阿里安\",\n        \"yukihana lamy\": \"雪花菈米\",\n        \"scarlet witch\": \"绯红女巫\",\n        \"wanda maximoff\": \"旺达\",\n        \"camie utsushimi\": \"现见凯米\",\n        \"tsubame koyasu\": \"子安燕\",\n        \"akari acura\": \"阿卡莉·亚裘拉\",\n        \"chaika trabant\": \"嘉依卡·托勒庞特\",\n        \"david\": \"大卫\",\n        \"toru acura\": \"托鲁·亚裘拉\",\n        \"chaika bogdan\": \"嘉依卡·布芙丹\",\n        \"hyakumantenbara salome\": \"壹百满天原莎乐美\",\n        \"miruki amauri\": \"甘瓜牛奶\",\n        \"ouro kronii\": \"奥罗·克洛尼\",\n        \"katsuki bakugou\": \"爆豪胜己\",\n        \"kyouko takizawa\": \"泷泽京子\",\n        \"black prince\": \"黑太子\",\n        \"tomoko kuroki\": \"黑木智子\",\n        \"yukari miyako\": \"都由香里\",\n        \"clare\": \"克蕾雅\",\n        \"raki\": \"拉基\",\n        \"teresa\": \"泰蕾莎\",\n        \"samira\": \"莎弥拉\",\n        \"katarina du couteau\": \"卡特琳娜·杜·克卡奥\",\n        \"kaltsit\": \"凯尔希\",\n        \"maho hiyajo\": \"比屋定真帆\",\n        \"venom\": \"毒液\",\n        \"katarina claes\": \"卡塔莉娜·库莱耶思\",\n        \"maria campbell\": \"玛丽亚·坎贝尔\",\n        \"diluc ragnvindr\": \"迪卢克·莱艮芬德\",\n        \"kaeya alberich\": \"凯亚·亚尔伯里奇\",\n        \"anya forger\": \"阿尼亚·福杰\",\n        \"morrigan aensland\": \"莫莉卡·安斯兰特\",\n        \"becky blackbell\": \"贝琪·布莱克贝尔\",\n        \"warfarin\": \"华法琳\",\n        \"platinum\": \"白金\",\n        \"rise kujikawa\": \"久慈川理世\",\n        \"yuu narukami\": \"鸣上悠\",\n        \"itaru hashida\": \"桥田至\",\n        \"tenten\": \"天天\",\n        \"hoshiguma\": \"星熊\",\n        \"flamebringer\": \"炎客\",\n        \"matterhorn\": \"角峰\",\n        \"silverash\": \"银灰\",\n        \"ptilopsis\": \"白面鸮\",\n        \"blemishine\": \"瑕光\",\n        \"whislash\": \"鞭刃\",\n        \"dobermann\": \"杜宾\",\n        \"nearl\": \"临光\",\n        \"blue poison\": \"蓝毒\",\n        \"skyfire\": \"天火\",\n        \"bison\": \"拜松\",\n        \"croissant\": \"可颂\",\n        \"arcanine\": \"风速狗\",\n        \"akari\": \"小照\",\n        \"irida\": \"珠贝\",\n        \"palina\": \"瓜娜\",\n        \"ambriel\": \"安比尔\",\n        \"feater\": \"食铁兽\",\n        \"closure\": \"可露希尔\",\n        \"melantha\": \"玫兰莎\",\n        \"perfumer\": \"调香师\",\n        \"grani\": \"格拉尼\",\n        \"angelina ajimu\": \"安心院安洁莉娜\",\n        \"ceobe\": \"刻俄柏\",\n        \"franka\": \"芙兰卡\",\n        \"liskarm\": \"雷蛇\",\n        \"blaze\": \"煌\",\n        \"shamare\": \"巫恋\",\n        \"popukar\": \"泡普卡\",\n        \"schwarz\": \"黑\",\n        \"rosmontis\": \"迷迭香\",\n        \"eyjafjalla\": \"艾雅法拉\",\n        \"deepcolor\": \"深海色\",\n        \"ayerscarpe\": \"断崖\",\n        \"leonhardt\": \"莱恩哈特\",\n        \"asbestos\": \"石棉\",\n        \"magallan\": \"麦哲伦\",\n        \"podenco\": \"波登可\",\n        \"kroos\": \"克洛丝\",\n        \"gavial\": \"嘉维尔\",\n        \"vigna\": \"红豆\",\n        \"glaucus\": \"格劳克斯\",\n        \"vermeil\": \"红云 | 维尔梅\",\n        \"ansel\": \"安赛尔\",\n        \"ceylon\": \"锡兰\",\n        \"sicily von claude\": \"西希莉·冯·克洛德\",\n        \"beeswax\": \"蜜蜡\",\n        \"youtouhime\": \"妖刀姬\",\n        \"ivy valentine\": \"艾薇\",\n        \"taki\": \"多喜\",\n        \"yuzu hanaoka\": \"花冈柚子\",\n        \"iroha natsume\": \"枣伊吕波\",\n        \"sasara kusugawa\": \"久寿川莎莎菈\",\n        \"maako asagiri\": \"朝雾麻亚子\",\n        \"amane\": \"亚麻音\",\n        \"setsu\": \"雪\",\n        \"mian\": \"魅杏\",\n        \"yuuka hayase\": \"早濑优香\",\n        \"azusa hanai\": \"花井梓\",\n        \"maria momoe\": \"百枝麻里亚\",\n        \"kraft lawrence\": \"克拉福·罗伦斯\",\n        \"orihime inoue\": \"井上织姬\",\n        \"elysia\": \"爱莉希雅\",\n        \"kayoko onikata\": \"鬼方佳世子\",\n        \"aoi tosaka\": \"远坂葵\",\n        \"sothis\": \"苏谛斯\",\n        \"shamir nevrand\": \"萨米亚·涅芙兰特\",\n        \"edelgard von hresvelg\": \"艾黛尔贾特·冯·弗雷斯贝尔古\",\n        \"rhea\": \"蕾雅\",\n        \"byleth eisner\": \"贝雷丝·艾斯纳\",\n        \"hoshino takanashi\": \"小鸟游星野\",\n        \"miyu kasumizawa\": \"霞泽美游\",\n        \"midori saiba\": \"才羽绿\",\n        \"momoi saiba\": \"才羽桃井\",\n        \"kaede isami\": \"勇美枫\",\n        \"mari iochi\": \"伊落玛丽\",\n        \"izuna kuda\": \"久田泉奈\",\n        \"fuuka aikiyo\": \"爱清枫香\",\n        \"haruna kurodate\": \"黑馆羽留奈\",\n        \"chinatsu hinomiya\": \"火宫千夏\",\n        \"shiroko sunaookami\": \"砂狼白子\",\n        \"neru mikamo\": \"美甘宁瑠\",\n        \"tsubaki kasuga\": \"春日椿\",\n        \"mika misono\": \"圣园未花\",\n        \"ako amau\": \"天雨亚子\",\n        \"natsu yutori\": \"柚鸟夏\",\n        \"kagome higurashi\": \"日暮戈薇\",\n        \"inuyasha\": \"犬夜叉\",\n        \"hitomi shizuki\": \"志筑仁美\",\n        \"nakoruru\": \"娜可露露\",\n        \"tomo yamanobe\": \"山边灯\",\n        \"calamity jane\": \"灾星简\",\n        \"charlotte corday\": \"夏洛特·科黛\",\n        \"ibuki douji\": \"伊吹童子\",\n        \"ranpha\": \"兰法\",\n        \"geo stelar\": \"星河昴\",\n        \"luna platz\": \"白金露娜\",\n        \"yugito nii\": \"二位柚木门\",\n        \"kanade yoisaki\": \"宵崎奏\",\n        \"mafuyu asahina\": \"朝比奈真冬\",\n        \"kanu unchou\": \"关羽云长\",\n        \"housen ryofu\": \"吕布奉先\",\n        \"shimei ryomou\": \"吕蒙子明\",\n        \"hakufu sonsaku\": \"孙策伯符\",\n        \"gentoku ryuubi\": \"刘备玄德\",\n        \"ekitoku chouhi\": \"张飞益德\",\n        \"myousai kakouen\": \"夏侯渊妙才\",\n        \"yojo bashoku\": \"马谡幼常\",\n        \"shiryuu chouun\": \"赵云子龙\",\n        \"chuukou kyocho\": \"许诸仲康\",\n        \"hakugen rikuson\": \"陆逊伯言\",\n        \"chuutatsu shibai\": \"司马懿仲达\",\n        \"shikou soujin\": \"曹仁子孝\",\n        \"mouyuu\": \"孟优\",\n        \"takezou shinmen\": \"新免武藏\",\n        \"chousen\": \"貂蝉\",\n        \"benkei musashibo\": \"武藏坊弁庆\",\n        \"genpou saji\": \"左慈元放\",\n        \"bunwa kaku\": \"贾诩文和\",\n        \"ukitsu\": \"于吉\",\n        \"shifu choushou\": \"张昭子布\",\n        \"koshaji\": \"胡车儿\",\n        \"moukaku\": \"孟获\",\n        \"kotetsu\": \"虎彻\",\n        \"arezu\": \"火夏\",\n        \"phineas flynn\": \"飞哥·福林\",\n        \"ferb fletcher\": \"小佛‧富雷察\",\n        \"miko kurokawa\": \"黒川みこ\",\n        \"rimururu\": \"莉姆露露\",\n        \"yoichi nasu no suketaka\": \"那须与一\",\n        \"bridget\": \"布里奇特\",\n        \"princess marie ange\": \"マリー・アンジュ 王女\",\n        \"sakura kagamihara\": \"各务原樱\",\n        \"frederica irving\": \"フレドリカ・アーヴィング\",\n        \"junko enoshima\": \"江之岛盾子\",\n        \"chisato nishikigi\": \"锦木千束\",\n        \"takina inoue\": \"井之上泷奈\",\n        \"rihoko amaha\": \"天羽梨穂子\",\n        \"masane amaha\": \"天羽雅音\",\n        \"ayaka tachikawa\": \"立川绚香\",\n        \"aomi yanagisako\": \"柳迫碧美\",\n        \"airi\": \"爱莉\",\n        \"melona\": \"美萝娜\",\n        \"merlin prototype\": \"梅林prototype\",\n        \"shuna\": \"朱菜\",\n        \"lenalee lee\": \"利娜莉·李\",\n        \"natsuru senou\": \"濑能名津流\",\n        \"shizuku sangou\": \"三乡雫\",\n        \"akane mishima\": \"美岛红音\",\n        \"minoru mineta\": \"峰田实\",\n        \"natalia luzu kimlasca-lanvaldear\": \"娜塔莉亚·卢慈·基姆拉斯卡·兰帕尔迪亚\",\n        \"eleonora viltaria\": \"艾蕾欧诺拉·维尔塔利亚\",\n        \"limalisha\": \"莉姆亚莉夏\",\n        \"ludmila lourie\": \"琉德米拉·露利叶\",\n        \"sofya obertas\": \"苏菲亚·欧贝达斯\",\n        \"tigrevurmud vorn\": \"堤格尔维尔穆德·冯伦\",\n        \"kobeni higashiyama\": \"东山小红\",\n        \"hildegarde\": \"希尔迪嘉露塔\",\n        \"aoi kunieda\": \"邦枝葵\",\n        \"sajuna inui\": \"乾纱寿叶\",\n        \"toushirou hitsugaya\": \"日番谷冬狮郎\",\n        \"soi fon\": \"碎蜂\",\n        \"guan yinping\": \"关银屏\",\n        \"xing cai\": \"张星彩\",\n        \"zhen ji\": \"甄姬\",\n        \"moriko morioka\": \"盛冈森子\",\n        \"yuuta sakurai\": \"樱井优太\",\n        \"lily\": \"莉莉\",\n        \"hinata kuraue\": \"仓上日向\",\n        \"aoi yukimura\": \"雪村葵\",\n        \"furen e lustario\": \"芙莲·E·露丝塔莉欧\",\n        \"nui sociere\": \"纽伊·索西艾瑞\",\n        \"yachiru kusajishi\": \"草鹿八千流\",\n        \"kagura nana\": \"神乐七奈\",\n        \"arlecchino\": \"「仆人」阿蕾奇诺\",\n        \"platinum the trinity\": \"白金·崔妮蒂\",\n        \"marta lualdi\": \"玛尔塔·路亚蒂\",\n        \"asuka katou\": \"加藤明日香\",\n        \"august von parseval\": \"奥古斯特·冯·帕塞瓦尔\",\n        \"shinn asuka\": \"真·飞鸟\",\n        \"yuzuki seo\": \"濑尾结月\",\n        \"saki yoshida\": \"吉田咲\",\n        \"nahida\": \"纳西妲\",\n        \"mitsuru kirijo\": \"桐条美鹤\",\n        \"kaguya otonashi\": \"音无辉夜\",\n        \"kaoru tanamachi\": \"棚町薰\",\n        \"nilou\": \"妮露\",\n        \"princess elsa\": \"艾莎公主\",\n        \"kristoff bjorgman\": \"克斯托夫\",\n        \"athrun zala\": \"阿斯兰·萨拉\",\n        \"rey za burrel\": \"雷·札·巴雷尔\",\n        \"mako hitachi\": \"常陆茉子\",\n        \"yoshino tomotake\": \"朝武芳乃\",\n        \"lena liechtenauer\": \"蕾娜·列支敦瑙尔\",\n        \"tamaki tamada\": \"玉田环\",\n        \"shizuko hosomi\": \"细见静子\",\n        \"yagen toushirou\": \"药研藤四郎\",\n        \"shinano toushirou\": \"信浓藤四郎\",\n        \"gotou toushirou\": \"后藤藤四郎\",\n        \"atsushi toushirou\": \"厚藤四郎\",\n        \"saniwa\": \"审神者\",\n        \"houchou toushirou\": \"包丁藤四郎\",\n        \"shokudaikiri mitsutada\": \"烛台切光忠\",\n        \"horikawa kunihiro\": \"堀川国广\",\n        \"vajra\": \"瓦姬拉\",\n        \"tighnari\": \"提纳里\",\n        \"hinata wakaba\": \"若葉日向\",\n        \"chihiro kagami\": \"各务千寻\",\n        \"perrine h. clostermann\": \"佩琳·H·克洛斯特曼\",\n        \"bronya zaychik\": \"布洛妮娅·扎伊切克\",\n        \"danzou katou\": \"加藤段藏\",\n        \"fubuki nemugaki\": \"合欢垣吹雪\",\n        \"serika kuromi\": \"黑见芹香\",\n        \"ayane okusora\": \"奥空绫音\",\n        \"mikan hinatsuki\": \"阳夏木蜜柑\",\n        \"sword maiden\": \"剑之圣女\",\n        \"chigusa kisaragi\": \"如月千种\",\n        \"dobrynya nikitich\": \"多布雷尼亚·尼基季奇\",\n        \"aratsuka ogami\": \"荒塚オガミ\",\n        \"nishikata\": \"西片\",\n        \"nezha\": \"哪吒\",\n        \"carol malus dienheim\": \"卡萝·马尔斯·狄恩海姆\",\n        \"dori\": \"多莉\",\n        \"rikka morizono\": \"森园立夏\",\n        \"aponia\": \"阿波尼亚\",\n        \"carole pepper\": \"卡萝尔·佩珀\",\n        \"rean schwarzer\": \"黎恩·舒华泽\",\n        \"millium orion\": \"米莉亚姆·奥莱恩\",\n        \"candace\": \"坎蒂丝\",\n        \"mei raiden\": \"雷电芽衣\",\n        \"durandal\": \"幽兰黛尔\",\n        \"himeko murata\": \"无量塔姬子\",\n        \"seele vollerei\": \"希儿·芙乐艾\",\n        \"cecilia schariac\": \"塞西莉亚·沙尼亚特\",\n        \"shinobu kuki\": \"久岐忍\",\n        \"springfield\": \"春田\",\n        \"natasha cioara\": \"娜塔莎·希奥拉（渡鸦）\",\n        \"fu hua\": \"符华\",\n        \"timido cute\": \"缇米朵·丘忒\",\n        \"mobius\": \"梅比乌斯\",\n        \"heizou shikanoin\": \"鹿野院平藏\",\n        \"columbina\": \"「少女」哥伦比娅\",\n        \"tartaglia\": \"「公子」达达利亚\",\n        \"gorou\": \"五郎\",\n        \"kallen kaslana\": \"卡莲·卡斯兰娜\",\n        \"yun jin\": \"云堇\",\n        \"kloe rinz\": \"科洛丝·琳希\",\n        \"anelace elfead\": \"亚妮拉丝·艾尔菲德\",\n        \"scherazard harvey\": \"雪拉扎德·哈维\",\n        \"shizuna rem misurugi\": \"静名·雷姆·御折木\",\n        \"ragna the bloodedge\": \"拉格纳·布莱德艾奇\",\n        \"noel vermillion\": \"诺爱儿·梵蜜莉欧\",\n        \"es\": \"Es\",\n        \"kajun faycott\": \"花隼·法伊科特\",\n        \"mai natsume\": \"麻衣·枣\",\n        \"makoto nanaya\": \"诚·七夜\",\n        \"ayato kamisato\": \"神里绫人\",\n        \"tsubaki yayoi\": \"椿·弥生\",\n        \"lambda-11\": \"Λ-No.11-\",\n        \"mu-12\": \"μ-No.12-\",\n        \"nu-13\": \"ν-No.13-\",\n        \"jin kisaragi\": \"琴恩·如月\",\n        \"erice utsumi\": \"宇津见绘里濑\",\n        \"emiya alter\": \"卫宫Alter\",\n        \"shinoa hiiragi\": \"柊筱娅\",\n        \"fatui electro cicin mage\": \"雷萤术士\",\n        \"fatui cryo cicin mage\": \"冰萤术士\",\n        \"mirror maiden\": \"藏镜仕女\",\n        \"sirin\": \"西琳\",\n        \"dehya\": \"迪希雅\",\n        \"noa ushio\": \"生盐诺亚\",\n        \"kokona sunohara\": \"春原心奈\",\n        \"hasumi hanekawa\": \"羽川莲见\",\n        \"hibiki nekozuka\": \"猫冢响\",\n        \"arona\": \"阿罗娜\",\n        \"saki sorai\": \"空井咲\",\n        \"collei\": \"柯莱\",\n        \"lavenza\": \"拉雯妲\",\n        \"von lycaon\": \"冯·莱卡恩\",\n        \"cyborg\": \"赛博格\",\n        \"april\": \"四月\",\n        \"eevee\": \"伊布\",\n        \"sylveon\": \"仙子伊布\",\n        \"vaporeon\": \"水伊布\",\n        \"jolteon\": \"雷伊布\",\n        \"flareon\": \"火伊布\",\n        \"espeon\": \"太阳伊布\",\n        \"umbreon\": \"月亮伊布\",\n        \"leafeon\": \"叶伊布\",\n        \"glaceon\": \"冰伊布\",\n        \"piplup\": \"波加曼\",\n        \"turtwig\": \"草苗龟\",\n        \"meowth\": \"喵喵\",\n        \"cinderace\": \"闪焰王牌\",\n        \"lopunny\": \"长耳兔\",\n        \"absol\": \"阿勃梭鲁\",\n        \"banette\": \"诅咒娃娃\",\n        \"braixen\": \"长尾火狐\",\n        \"bulbasaur\": \"妙蛙种子\",\n        \"delphox\": \"妖火红狐\",\n        \"ditto\": \"百变怪\",\n        \"greninja\": \"甲贺忍蛙\",\n        \"kirlia\": \"奇鲁莉安\",\n        \"lugia\": \"洛奇亚\",\n        \"mawile\": \"大嘴娃\",\n        \"nidoqueen\": \"尼多后\",\n        \"primarina\": \"西狮海壬\",\n        \"reshiram\": \"莱希拉姆\",\n        \"salazzle\": \"焰后蜥\",\n        \"samurott\": \"大剑鬼\",\n        \"scorbunny\": \"炎兔儿\",\n        \"zekrom\": \"捷克罗姆\",\n        \"zeraora\": \"捷拉奥拉\",\n        \"iono\": \"奇树\",\n        \"maho himemiya\": \"姬宫真步\",\n        \"ahri\": \"阿狸\",\n        \"lillia\": \"莉莉娅\",\n        \"thresh\": \"锤石\",\n        \"sophia nishikinomiya\": \"苏菲亚·锦之宫\",\n        \"anna nishikinomiya\": \"安娜·锦之宫\",\n        \"moona hoshinova\": \"Moona Hoshinova\",\n        \"miya chinen\": \"知念实也\",\n        \"koushi sugawara\": \"菅原孝支\",\n        \"shoyo hinata\": \"日向翔阳\",\n        \"taiga kagami\": \"火神大我\",\n        \"tetsuya kuroko\": \"黑子哲也\",\n        \"daiki aomine\": \"青峰大辉\",\n        \"haruka nanase\": \"七濑遥\",\n        \"rin matsuoka\": \"松冈凛\",\n        \"yuki\": \"雪\",\n        \"louise\": \"露易兹\",\n        \"ellen\": \"爱莲\",\n        \"kana anaberal\": \"卡娜·安娜贝拉尔\",\n        \"misaki kagome\": \"笼目深沙希\",\n        \"momo hinamori\": \"雏森桃\",\n        \"chen hai\": \"镇海\",\n        \"leeloo minai lekatariba-lamina-tchai ekbat de sebat\": \"Leeloo\",\n        \"hasshaku-sama\": \"八尺大人\",\n        \"ushio kofune\": \"小舟潮\",\n        \"moe kazekura\": \"风仓萌绘\",\n        \"eiko tsukimi\": \"月见英子\",\n        \"hitori gotou\": \"后藤一里\",\n        \"tsukuyo oono\": \"大野筑夜\",\n        \"mikoto aketa\": \"緋田美琴\",\n        \"nazuna nanakusa\": \"七草荠\",\n        \"revy\": \"莱薇\",\n        \"natsumi kurobe\": \"黑部夏美\",\n        \"assaultron\": \"突袭者机器人\",\n        \"satoru gojo\": \"五条悟\",\n        \"aki hayakawa\": \"早川秋\",\n        \"annie leonhart\": \"阿尼·利昂纳德\",\n        \"nekomiya hinata\": \"猫宫日向\",\n        \"himeno ayanokoji\": \"绫小路姫乃\",\n        \"seia yurizono\": \"百合园圣娅\",\n        \"hanae asagao\": \"朝颜花绘\",\n        \"saori joumae\": \"锭前纱织\",\n        \"nijika ijichi\": \"伊地知虹夏\",\n        \"ryou yamada\": \"山田凉\",\n        \"ikuyo kita\": \"喜多郁代\",\n        \"mewtwo\": \"超梦\",\n        \"shion\": \"紫苑\",\n        \"nemu manaka\": \"真中合欢\",\n        \"rinne byakuya\": \"白夜凛音\",\n        \"hanabi yasuraoka\": \"安乐冈花火\",\n        \"nayuta kani\": \"可儿那由多\",\n        \"maou\": \"魔王（红玉之瞳）\",\n        \"tabitha helene orleans de gallia\": \"塔巴萨\",\n        \"suguru geto\": \"夏油杰\",\n        \"selvaria bles\": \"塞贝莉雅·布雷斯\",\n        \"arisa eloise beau-regard\": \"亚里砂·艾洛伊丝·博勒加德\",\n        \"wakamo kosaka\": \"狐坂若藻\",\n        \"high elf archer\": \"妖精弓手\",\n        \"big bad wolf\": \"大灰狼\",\n        \"nemona\": \"妮莫\",\n        \"little red riding hoods grandmother\": \"小红帽的外婆\",\n        \"alhaitham\": \"艾尔海森\",\n        \"layla prismriver\": \"蕾拉·普莉兹姆利巴\",\n        \"chise waraku\": \"和乐千世\",\n        \"kaho kuwakami\": \"桑上果穗\",\n        \"ume\": \"梅\",\n        \"chisaki mibu\": \"壬生千咲\",\n        \"mayu shikibe\": \"式部茉优\",\n        \"maria marta cunhel guloso\": \"玛璐塔小姐\",\n        \"jenny wakeman\": \"XJ9\",\n        \"aria holmes kanzaki\": \"神崎·H·亚里亚\",\n        \"akari mamiya\": \"间宫明里\",\n        \"kaname tohyama\": \"远山金女\",\n        \"kinji tohyama\": \"远山金次\",\n        \"riko mine\": \"峰理子\",\n        \"shirayuki hotogi\": \"星伽白雪\",\n        \"the woodsman\": \"小红帽中的猎人\",\n        \"henrietta de tristain\": \"安丽埃塔\",\n        \"princess devilotte de deathsatan ix\": \"戴比萝特·德·迪斯撒旦九世\",\n        \"fianna ray ordesia\": \"菲雅娜·雷·奥地西亚\",\n        \"lady labrynth of the silver castle\": \"白银城的迷宫主·拉比丽斯\",\n        \"suletta mercury\": \"斯莱塔·墨丘利\",\n        \"miorine rembran\": \"米奥莉奈·伦布兰\",\n        \"nana daiba\": \"大场奈奈\",\n        \"minegumo\": \"峰云\",\n        \"princess star butterfly\": \"星蝶公主\",\n        \"kazusa kyouyama\": \"杏山和纱\",\n        \"mahiru shiina\": \"椎名真昼\",\n        \"margot knight\": \"玛戈特·奈特\",\n        \"malga naruze\": \"玛伽·成濑\",\n        \"evangeline a.k. mcdowell\": \"依文洁琳·安塔娜西亚·凯蒂·麦道威尔\",\n        \"momosuzu nene\": \"桃铃音音\",\n        \"omaru polka\": \"尾丸波尔卡\",\n        \"karnatia seri anabald\": \"大岛叶多\",\n        \"wang yi\": \"王异\",\n        \"hachiroku\": \"八六\",\n        \"yggdrasil\": \"尤格多拉希尔\",\n        \"otome arisugawa\": \"有栖川乙女\",\n        \"luo tianyi\": \"洛天依\",\n        \"sensei\": \"老师\",\n        \"azuma seren\": \"东雪莲\",\n        \"yaoyao\": \"瑶瑶\",\n        \"monika\": \"莫妮卡\",\n        \"tania\": \"塔妮雅\",\n        \"barret wallace\": \"巴雷特·华莱士\",\n        \"ameth\": \"爱梅斯\",\n        \"aoi futaba\": \"双叶碧\",\n        \"roselia\": \"绯之罗赛莉亚\",\n        \"goldenglow\": \"澄闪\",\n        \"sara valestin\": \"莎拉·巴雷斯坦\",\n        \"cure cosmo\": \"尤妮（宇宙天使）\",\n        \"cure selene\": \"香久矢圆香（月神天使）\",\n        \"demeter\": \"狄蜜特\",\n        \"haruka yuzuhara\": \"柚原春夏\",\n        \"matsuri kazamaki\": \"风卷祭里\",\n        \"suzu kanade\": \"花奏铃\",\n        \"mahiro oyama\": \"绪山真寻\",\n        \"seiun sky\": \"青云天空\",\n        \"curren chan\": \"真机伶\",\n        \"symboli rudolf\": \"鲁道夫象征\",\n        \"admire vega\": \"爱慕织姬\",\n        \"yorha commander\": \"寄葉指揮官\",\n        \"cidala\": \"辛妲拉\",\n        \"super creek\": \"超级溪流\",\n        \"cecilia alcott\": \"塞西莉娅·奥尔卡特\",\n        \"ling yin huang\": \"凰铃音\",\n        \"laura bodewig\": \"拉芙拉·布迪威伊\",\n        \"yuu koito\": \"小糸侑\",\n        \"touko nanami\": \"七海灯子\",\n        \"houki shinonono\": \"篠之之帚\",\n        \"mizuki nakahara\": \"中原瑞希\",\n        \"senji muramasa\": \"千子村正\",\n        \"hinagiku katsura\": \"桂雏菊\",\n        \"isumi saginomiya\": \"鹭之宫伊澄\",\n        \"nagi sanzenin\": \"三千院凪\",\n        \"marie\": \"玛丽\",\n        \"fuyutsuki\": \"冬月\",\n        \"tsukasa ayatsuji\": \"绚辻词\",\n        \"ai nanasaki\": \"七咲逢\",\n        \"haruka morishima\": \"森岛遥\",\n        \"miya tachibana\": \"橘美也\",\n        \"sae nakata\": \"中多纱江\",\n        \"rihoko sakurai\": \"樱井梨穗子\",\n        \"yukiko amagi\": \"天城雪子\",\n        \"hatsumi sega\": \"濑贺初美\",\n        \"fujisaki yua\": \"藤崎由爱\",\n        \"dante\": \"但丁\",\n        \"vergil\": \"维吉尔\",\n        \"hanbei takenaka\": \"竹中半兵卫\",\n        \"kanae kochou\": \"胡蝶香奈惠\",\n        \"sanemi shinazugawa\": \"不死川实弥\",\n        \"ryuuge kisaki\": \"龙华妃咲\",\n        \"mashiro shizuyama\": \"静山真白\",\n        \"tsurugi kensaki\": \"剑先鹤城\",\n        \"acerola\": \"阿塞萝拉\",\n        \"kou minamoto\": \"源光\",\n        \"damian desmond\": \"达米安·德斯蒙\",\n        \"cat noir\": \"黑猫诺儿\",\n        \"killua zoldyck\": \"奇犽·揍敌客\",\n        \"mirai kamiki\": \"神木未来\",\n        \"megumi amatsuka\": \"天使惠\",\n        \"mao amatsuka\": \"天使真央\",\n        \"akane isshiki\": \"一色茜\",\n        \"lyza\": \"莱萨\",\n        \"ozen\": \"奥森\",\n        \"marulk\": \"马璐璐库\",\n        \"mother spider demon\": \"蜘蛛鬼·母亲\",\n        \"kanako urashima\": \"浦岛可奈子\",\n        \"mihari oyama\": \"绪山美波里\",\n        \"white len\": \"白莲\",\n        \"momiji hozuki\": \"穗月椛\",\n        \"kaede hozuki\": \"穗月枫\",\n        \"kafka\": \"卡芙卡 | 卡夫卡\",\n        \"ookanehira\": \"大包平\",\n        \"uguisumaru\": \"莺丸\",\n        \"sovetskaya rossiya\": \"苏维埃罗西亚\",\n        \"faruzan\": \"珐露珊\",\n        \"plana\": \"普拉娜\",\n        \"rio tsukatsuki\": \"调月莉音\",\n        \"kikuri hiroi\": \"广井菊里\",\n        \"gintoki sakata\": \"坂田银时\",\n        \"toshiro hijikata\": \"土方十四郎\",\n        \"kazamori sasa\": \"佐佐风守\",\n        \"kozuki momonosuke\": \"光月桃之助\",\n        \"kanna ogata\": \"尾刃康娜\",\n        \"nero\": \"尼禄\",\n        \"deadpool\": \"死侍\",\n        \"lady\": \"蕾蒂\",\n        \"trish\": \"翠西\",\n        \"alexis rhodes\": \"天上院明日香\",\n        \"cyno\": \"赛诺\",\n        \"alexia midgar\": \"阿莱克西亚·米德嘉尔\",\n        \"wednesday addams\": \"星期三·亚当斯\",\n        \"miyako shikimori\": \"式守都\",\n        \"fuuka yamagishi\": \"山岸风花\",\n        \"yukari takeba\": \"岳羽由加莉\",\n        \"aigis\": \"埃癸斯\",\n        \"celia claire\": \"瑟莉亚·库列尔\",\n        \"hinata tachibana\": \"橘日向\",\n        \"conte di cavour\": \"加富尔伯爵\",\n        \"dhole\": \"豺\",\n        \"senjuro rengoku\": \"炼狱千寿郎\",\n        \"female protagonist\": \"汐见琴音\",\n        \"makoto yuuki\": \"结城理\",\n        \"asuka kurashina\": \"仓科明日香\",\n        \"ulrich von hutten\": \"乌尔里希·冯·胡滕\",\n        \"joey\": \"乔伊\",\n        \"feng min\": \"凤敏\",\n        \"friedrich der grosse\": \"腓特烈大帝\",\n        \"mio naruse\": \"成濑澪\",\n        \"maria naruse\": \"成濑万理亚\",\n        \"frederica baumann\": \"法兰黛莉卡·鲍曼\",\n        \"ai hoshino\": \"星野爱\",\n        \"toki asuma\": \"飞鸟马时\",\n        \"carol olston\": \"卡洛儿·奥尔斯顿\",\n        \"shiroko terror\": \"白子*恐怖\",\n        \"dia viekone\": \"蒂雅·维科尼\",\n        \"ezio auditore\": \"艾吉奥·奥迪托雷\",\n        \"sofia sartor\": \"索菲亚·萨尔托\",\n        \"tang wutong\": \"唐舞桐\",\n        \"maryland\": \"马里兰\",\n        \"shinyou\": \"神鹰\",\n        \"yawata maru\": \"八幡丸 | 云鹰\",\n        \"kishinami\": \"岸波\",\n        \"jingei\": \"迅鲸\",\n        \"chougei\": \"长鲸\",\n        \"cyllene\": \"星月\",\n        \"queen draco\": \"妖妃德拉科\",\n        \"march 7th\": \"三月七\",\n        \"himari akeboshi\": \"明星日鞠\",\n        \"asta\": \"艾丝妲 | 亚斯塔\",\n        \"garou\": \"饿狼\",\n        \"himeko\": \"姬子\",\n        \"herta\": \"黑塔\",\n        \"stelle\": \"星\",\n        \"clara\": \"克拉拉\",\n        \"nene ayachi\": \"绫地宁宁\",\n        \"neeko\": \"妮蔻\",\n        \"nidalee\": \"奈德丽\",\n        \"vex\": \"薇古丝\",\n        \"yuu nishinoya\": \"西谷夕\",\n        \"asahi azumane\": \"东峰旭\",\n        \"zoe\": \"佐伊\",\n        \"annie\": \"安妮\",\n        \"yanagi uzaki\": \"宇崎柳\",\n        \"baiken\": \"梅喧\",\n        \"asuka kazama\": \"风间飞鸟\",\n        \"lili rochefort\": \"莉莉·罗舍福尔\",\n        \"shizuko kawawa\": \"河和静子\",\n        \"akira kiyosumi\": \"清澄晶\",\n        \"kanji sasahara\": \"笹原完士\",\n        \"chika ogiue\": \"荻上千佳\",\n        \"saki kasukabe\": \"春日部咲\",\n        \"kanako ohno\": \"大野加奈子\",\n        \"makoto kousaka\": \"高坂真琴\",\n        \"kenjirou hato\": \"波户贤二郎\",\n        \"rika yoshitake\": \"吉武莉华\",\n        \"harunobu madarame\": \"斑目晴信\",\n        \"rea sanka\": \"散华礼弥\",\n        \"mero furuya\": \"降谷萌路\",\n        \"judge\": \"法官\",\n        \"himawari shinomiya\": \"四宫向日葵\",\n        \"wakaba saegusa\": \"三枝若叶\",\n        \"rei kuroki\": \"黑骑蕾\",\n        \"tomoko hoshina\": \"保科智子\",\n        \"lemmy miyauchi\": \"宫内蕾咪\",\n        \"serika kurusugawa\": \"来栖川芹香\",\n        \"akari kamigishi\": \"神岸明\",\n        \"ayaka kurusugawa\": \"来栖川绫香\",\n        \"shiho nagaoka\": \"长冈志保\",\n        \"hiroyuki fujita\": \"藤田浩之\",\n        \"aoi matsubara\": \"松原葵\",\n        \"koyomi mizuhara\": \"水原历\",\n        \"osaka\": \"大阪\",\n        \"sakaki\": \"榊\",\n        \"tomo takino\": \"泷野智\",\n        \"chiyo mihama\": \"美滨千代\",\n        \"riza wildman\": \"丽莎·瓦德曼\",\n        \"hiro hiyorimi\": \"日和见日郎\",\n        \"lillianne von phoenix\": \"莉莉安奴·冯·菲尼克斯\",\n        \"sylvia von phoenix\": \"茜维亚·冯·菲尼克斯\",\n        \"reiri kamura\": \"嘉村令里\",\n        \"taeko minazuki\": \"水无月妙子\",\n        \"amemiya nazuna\": \"飴宮なずな\",\n        \"winter schnee\": \"温特·雪倪\",\n        \"ruby hoshino\": \"露比（星野瑠美衣）\",\n        \"roka maniwa\": \"马庭芦花\",\n        \"lysithea von cordelia\": \"莉丝缇亚·冯·科迪利亚\",\n        \"tamako kitashirakawa\": \"北白川玉子\",\n        \"ui tamaki\": \"环羽衣\",\n        \"shigure mayoi\": \"间宵时雨\",\n        \"inori ichinose\": \"一之濑祈梨\",\n        \"natsumi hodaka\": \"帆高夏海\",\n        \"hina tsurugi\": \"鹤木阳渚\",\n        \"gwen stacy\": \"格温·斯黛西\",\n        \"reisa uzawa\": \"宇泽玲纱\",\n        \"power\": \"帕瓦\",\n        \"hirofumi yoshida\": \"吉田宽文\",\n        \"silver wolf\": \"银狼\",\n        \"moka akashiya\": \"赤夜萌香\",\n        \"kurumu kurono\": \"黑乃胡梦\",\n        \"mizore shirayuki\": \"白雪霙\",\n        \"nagisa kirifuji\": \"桐藤渚\",\n        \"fu xuan\": \"符玄\",\n        \"qingque\": \"青雀\",\n        \"sin mal\": \"杏·玛尔\",\n        \"bailu\": \"白露\",\n        \"tingyun\": \"停云\",\n        \"bronya rand\": \"布洛妮娅·兰德\",\n        \"shuuko komi\": \"古见秀子\",\n        \"kana arima\": \"有马加奈\",\n        \"mina majikina\": \"真镜名美奈\",\n        \"nyotengu\": \"女天狗\",\n        \"yuzuriha\": \"杠\",\n        \"velvet\": \"薇尔贝特\",\n        \"lucyna kushinada\": \"露西\",\n        \"w\": \"W\",\n        \"senko\": \"仙狐\",\n        \"johnny silverhand\": \"强尼·银手\",\n        \"david martinez\": \"大卫·马丁内斯\",\n        \"gwendolyn\": \"关德琳\",\n        \"oswald\": \"奥兹华德\",\n        \"mabel rayveil\": \"梅贝露·蕾贝露\",\n        \"akane kurokawa\": \"黑川茜\",\n        \"perona\": \"佩罗娜\",\n        \"suzume iwato\": \"岩户铃芽\",\n        \"souta munakata\": \"宗像草太\",\n        \"tsundere elf\": \"翠\",\n        \"sumika fujimiya\": \"藤宫澄夏\",\n        \"yousuke shibazaki\": \"岛㟢阳介\",\n        \"alicia edelsia\": \"艾丽西亚·伊德露西亚\",\n        \"purah\": \"普尔亚\",\n        \"touko fukawa\": \"腐川冬子\",\n        \"haru\": \"春\",\n        \"rio kastle\": \"神代璃绪\",\n        \"elizabeth liones\": \"伊丽莎白·里昂妮丝\",\n        \"yanqing\": \"彦卿\",\n        \"seika ijichi\": \"伊地知星歌\",\n        \"rika furude\": \"古手梨花\",\n        \"junko akashi\": \"赤司淳子\",\n        \"black widow\": \"黑寡妇\",\n        \"midna\": \"米多娜\",\n        \"arisu sakayanagi\": \"坂柳有栖\",\n        \"griseo\": \"格蕾修\",\n        \"melina\": \"梅琳娜\",\n        \"hinoa\": \"火芽\",\n        \"implacable\": \"怨仇\",\n        \"asuma sarutobi\": \"猿飞阿斯玛\",\n        \"mizuki akiyama\": \"晓山瑞希\",\n        \"ena shinonome\": \"东云绘名\",\n        \"airi momoi\": \"桃井爱莉\",\n        \"akito shinonome\": \"东云彰人\",\n        \"an shiraishi\": \"白石杏\",\n        \"emu otori\": \"凤笑梦\",\n        \"haruka kiritani\": \"桐谷遥\",\n        \"honami mochizuki\": \"望月穗波\",\n        \"ichika hoshino\": \"星乃一歌\",\n        \"kohane azusawa\": \"小豆泽心羽\",\n        \"minori hanasato\": \"花里实乃理\",\n        \"nene kusanagi\": \"草薙宁宁\",\n        \"rui kamishiro\": \"神代类\",\n        \"saki tenma\": \"天马咲希\",\n        \"shiho hinomori\": \"日野森志步\",\n        \"shizuku hinomori\": \"日野森雫\",\n        \"toya aoyagi\": \"青柳冬弥\",\n        \"tsukasa tenma\": \"天马司\",\n        \"kouta oyamada\": \"小山田耕太\",\n        \"chizuru minamoto\": \"源千鹤\",\n        \"nozomu ezomori\": \"犹守望\",\n        \"anisphia wynn palettia\": \"艾妮丝菲亚·温·帕雷提亚\",\n        \"euphyllia magenta\": \"尤菲莉亚·玛赞塔\",\n        \"gobuta\": \"哥布塔\",\n        \"hakos baelz\": \"哈珂斯·贝尔丝\",\n        \"saitama\": \"琦玉\",\n        \"rukia kuchiki\": \"朽木露琪亚\",\n        \"dori sangemah bay\": \"多莉·桑歌玛哈巴依\",\n        \"baizhu\": \"白术\",\n        \"lewis\": \"刘易斯\",\n        \"kagura mea\": \"神乐Mea\",\n        \"gabriel\": \"加百列\",\n        \"europa\": \"欧罗巴\",\n        \"neneka utsushimi\": \"现士实似似花\",\n        \"penny\": \"牡丹\",\n        \"arslan\": \"亚尔斯兰\",\n        \"tobio kageyama\": \"影山飞雄\",\n        \"kirari momobami\": \"桃喰绮罗莉\",\n        \"twin turbo\": \"双涡轮\",\n        \"kishirika kishirisu\": \"奇希莉卡·奇希里斯\",\n        \"urushi yaotome\": \"八乙女漆\",\n        \"anne\": \"安\",\n        \"grea\": \"古蕾雅\",\n        \"sakurako utazumi\": \"歌住樱子\",\n        \"miyako tsukiyuki\": \"月雪宫子\",\n        \"koyuki kurosaki\": \"黑崎小雪\",\n        \"atsuko hakari\": \"秤亚津子\",\n        \"saya yakushi\": \"药子纱绫\",\n        \"kaya shiranui\": \"不知火花耶\",\n        \"mine aomori\": \"苍森美弥\",\n        \"mina konoe\": \"近卫弥奈\",\n        \"marina ikekura\": \"池仓玛丽娜\",\n        \"eimi izumimoto\": \"和泉元艾米\",\n        \"megu shimokura\": \"下仓惠\",\n        \"serina sumi\": \"鹫见芹娜\",\n        \"ayumu iwabitsu\": \"岩柜步梦\",\n        \"rin nanagami\": \"七神凛\",\n        \"aoi oki\": \"扇喜葵\",\n        \"rumi akeshiro\": \"朱城瑠美\",\n        \"michiru chidori\": \"千鸟满\",\n        \"reijo kayama\": \"鹿山丽情\",\n        \"maki konuri\": \"小涂真纪\",\n        \"misaki imashino\": \"戒野美咲\",\n        \"mimori mizuha\": \"水羽三森\",\n        \"haruka igusa\": \"伊草遥香\",\n        \"kirino nakatsukasa\": \"中务桐乃\",\n        \"yoshimi ibaragi\": \"伊原木好美\",\n        \"hiyori tsuchinaga\": \"槌永日和\",\n        \"cherino renkawa\": \"连河切里诺\",\n        \"kei tsukishima\": \"月岛萤\",\n        \"izzy izumi\": \"泉光子郎\",\n        \"tai kamiya\": \"八神太一\",\n        \"agumon\": \"亚古兽\",\n        \"hatoba tsugu\": \"鸠羽伦\",\n        \"autumn blaze\": \"秋烨\",\n        \"lyra heartstrings\": \"天琴心弦\",\n        \"lopiniatre\": \"倔强\",\n        \"luca ikaruga\": \"斑鸠路加\",\n        \"hare omagari\": \"小钩晴\",\n        \"karen aijo\": \"爱城华恋\",\n        \"sawako kuronuma\": \"黑沼爽子\",\n        \"izumi shishidou\": \"狮子堂泉\",\n        \"lynette\": \"琳妮特\",\n        \"focalors\": \"芙宁娜\",\n        \"mizuki\": \"水月\",\n        \"ayame kajou\": \"华城绫女\",\n        \"kirche augusta frederica von anhalt zerbst\": \"丘鲁克·奥古斯都·菲列特利加·封·安哈尔特·泽鲁普斯特\",\n        \"london\": \"伦敦\",\n        \"enlilta reesehyde bertrand\": \"贝尔托兰\",\n        \"momiji akiizumi\": \"秋泉红叶\",\n        \"howe\": \"豪\",\n        \"aki shino\": \"志野亚贵\",\n        \"kotama otose\": \"音濑小玉\",\n        \"minoto\": \"水芸\",\n        \"matikanefukukitaru\": \"待兼福来\",\n        \"hiyori harusaki\": \"春咲日和莉\",\n        \"rei shijo\": \"士条怜\",\n        \"tomo aizawa\": \"相泽智\",\n        \"junichirou kubota\": \"久保田淳一郎\",\n        \"misuzu gundou\": \"群堂美铃\",\n        \"minato senkawa\": \"千川凑\",\n        \"yuuta sakurada\": \"樱田悠太\",\n        \"saria\": \"塞雷娅\",\n        \"saga\": \"嵯峨\",\n        \"bagpipe\": \"风笛\",\n        \"hoolheyak\": \"霍尔海雅\",\n        \"dorothy\": \"多萝西\",\n        \"daki\": \"堕姬\",\n        \"professor juniper\": \"红豆杉博士\",\n        \"hirato\": \"平户\",\n        \"dancer of the boreal valley\": \"冷冽谷的舞娘\",\n        \"ayumi momozono\": \"桃园步美\",\n        \"shirayuki mishiro\": \"白雪深白\",\n        \"killer bee\": \"奇拉比\",\n        \"jiraiya\": \"自来也\",\n        \"ares\": \"阿瑞斯\",\n        \"hippolyta\": \"希波吕忒\",\n        \"ms. marvel\": \"惊奇女士\",\n        \"io hasekura\": \"支仓伊绪\",\n        \"tuscaloosa\": \"塔斯卡卢萨\",\n        \"heywood l.e.\": \"海伍德·L·E\",\n        \"ranger\": \"突击者\",\n        \"janus\": \"雅努斯\",\n        \"ornn\": \"奥恩\",\n        \"chong yue\": \"重岳\",\n        \"ethan\": \"伊桑\",\n        \"ren yamashiro\": \"山城恋\",\n        \"sena himuro\": \"冰室濑名\",\n        \"amane tanikaze\": \"谷风天音\",\n        \"sairi mikuni\": \"三国彩里\",\n        \"kaede kinoshita\": \"木下枫\",\n        \"chika shiraishi\": \"白石千花\",\n        \"tomoya mashiro\": \"真白友也\",\n        \"constanze amalie von braunschbank-albrechtsberger\": \"康斯坦策·阿玛莉·冯·布朗施班克·阿尔布雷希茨贝格\",\n        \"kaori kyan\": \"喜屋武香织\",\n        \"janna\": \"迦娜\",\n        \"fuyu fuiba\": \"风衣叶冬优\",\n        \"jia ran\": \"嘉然\",\n        \"navia\": \"娜维娅\",\n        \"clorinde\": \"克洛琳德\",\n        \"neuvillette\": \"那维莱特\",\n        \"lyney\": \"林尼\",\n        \"yukiko kudo\": \"工藤有希子\",\n        \"myrtle\": \"桃金娘\",\n        \"ganondorf\": \"加侬多夫\",\n        \"maidena ange\": \"梅蒂娜·安洁\",\n        \"noma rune\": \"诺玛·卢恩\",\n        \"toxico dannar\": \"毒毒子·达纳\",\n        \"enome north\": \"艾诺梅·诺斯\",\n        \"marina katsuragi\": \"葛城真理奈\",\n        \"executioner\": \"行裁者\",\n        \"scarecrow\": \"稻草人\",\n        \"hk416\": \"HK416\",\n        \"dsr-50\": \"DSR-50\",\n        \"ots-14\": \"OTs-14\",\n        \"p90\": \"P90\",\n        \"wa2000\": \"WA2000\",\n        \"pa-15\": \"PA-15\",\n        \"agent\": \"代理人\",\n        \"welrod mkii\": \"维尔德MkⅡ\",\n        \"ak-12\": \"AK-12\",\n        \"an-94\": \"AN-94\",\n        \"kalina\": \"格琳娜\",\n        \"ump45\": \"UMP45\",\n        \"vsk-94\": \"VSK-94\",\n        \"g11\": \"G11\",\n        \"desert eagle\": \"沙漠之鹰\",\n        \"ump9\": \"UMP9\",\n        \"tar-21\": \"TAR-21\",\n        \"aa-12\": \"AA-12\",\n        \"mk23\": \"Mk23\",\n        \"ouroboros\": \"衔尾蛇\",\n        \"intruder\": \"干扰者\",\n        \"gager\": \"计量官\",\n        \"architect\": \"建筑师\",\n        \"alchemist\": \"炼金术士\",\n        \"hunter\": \"猎手\",\n        \"dreamer\": \"梦想家\",\n        \"destroyer\": \"破坏者\",\n        \"beak\": \"喙\",\n        \"k2\": \"K2\",\n        \"g3\": \"G3\",\n        \"g36\": \"G36\",\n        \"g36c\": \"G36C\",\n        \"eliza\": \"伊莱莎\",\n        \"m1911\": \"M1911\",\n        \"m99\": \"M99\",\n        \"m950a\": \"M950A\",\n        \"p38\": \"P38\",\n        \"ppk\": \"PPK\",\n        \"p08\": \"P08\",\n        \"mauser c96\": \"C96\",\n        \"m37\": \"M37\",\n        \"mac-10\": \"MAC-10\",\n        \"ppsh-41\": \"PPSh-41\",\n        \"pps-43\": \"PPS-43\",\n        \"pp-90\": \"PP-90\",\n        \"thunder\": \"雷电\",\n        \"negev\": \"内格夫\",\n        \"st ar-15\": \"ST AR-15\",\n        \"m4a1\": \"M4A1\",\n        \"m4 sopmod ii\": \"M4 SOPMODII\",\n        \"m16a1\": \"M16A1\",\n        \"ak-15\": \"AK-15\",\n        \"rpk-16\": \"RPK-16\",\n        \"nagant revolver\": \"纳甘左轮\",\n        \"colt revolver\": \"柯尔特左轮\",\n        \"super-shorty\": \"超级肖蒂\",\n        \"python\": \"蟒蛇\",\n        \"m9\": \"M9\",\n        \"tokarev\": \"托卡列夫\",\n        \"stechkin\": \"斯捷奇金\",\n        \"makarov\": \"马卡洛夫\",\n        \"type 92\": \"92式\",\n        \"glock 17\": \"格洛克17\",\n        \"thompson\": \"汤姆森\",\n        \"m3\": \"M3\",\n        \"kriss vector\": \"维克托\",\n        \"vector\": \"维克托\",\n        \"mp40\": \"MP40\",\n        \"mp5\": \"MP5\",\n        \"ro635\": \"RO635\",\n        \"skorpion\": \"蝎式\",\n        \"mp7\": \"MP7\",\n        \"sten mkii\": \"司登MkⅡ\",\n        \"beretta model 38\": \"伯莱塔38型\",\n        \"micro uzi\": \"微型乌兹\",\n        \"m45\": \"m45\",\n        \"m1 garand\": \"M1加兰德\",\n        \"9a-91\": \"9A-91\",\n        \"ameli\": \"阿梅利\",\n        \"m200\": \"M200\",\n        \"kar98k\": \"Kar98k\",\n        \"ots-12\": \"OTs-12\",\n        \"tmp\": \"TMP\",\n        \"fn five-seven\": \"FN-57\",\n        \"sr-3mp\": \"SR-3MP\",\n        \"k5\": \"K5\",\n        \"rfb\": \"RFB\",\n        \"art556\": \"ART556\",\n        \"florence\": \"芙洛伦 | 芙罗伦斯\",\n        \"webley\": \"韦伯利\",\n        \"ifrit\": \"伊芙利特\",\n        \"kabane kusaka\": \"日下夏羽\",\n        \"sigewinne\": \"希格雯\",\n        \"mitsuki nase\": \"名瀬美月\",\n        \"izumi nase\": \"名濑泉\",\n        \"kaito kirishima\": \"雾岛海人\",\n        \"ichika takatsuki\": \"贵月一花\",\n        \"magdeburg\": \"马格德堡\",\n        \"kaveh\": \"卡维\",\n        \"tea gardner\": \"真崎杏子\",\n        \"laphicet\": \"莱菲瑟特\",\n        \"eleanor hume\": \"艾蕾诺亚·修姆\",\n        \"magillanica lou mayvin\": \"玛琪露\",\n        \"topaz\": \"托帕\",\n        \"jingliu\": \"镜流\",\n        \"dan heng\": \"丹恒\",\n        \"caelus\": \"穹\",\n        \"pozemka\": \"鸿雪\",\n        \"kotori toyomi\": \"丰见亚都梨\",\n        \"frieren\": \"芙莉莲\",\n        \"joshua bright\": \"约修亚·布莱特\",\n        \"courier\": \"讯使\",\n        \"thorns\": \"棘刺\",\n        \"issei hyoudou\": \"兵藤一诚\",\n        \"chizuru shiina\": \"椎名千鹤\",\n        \"miss fortune\": \"厄运小姐\",\n        \"riven\": \"锐雯\",\n        \"zac\": \"扎克\",\n        \"xenovia quarta\": \"洁诺薇亚·夸塔\",\n        \"crow armbrust\": \"克洛·安布斯特\",\n        \"yshtola rhul\": \"雅·修特拉·路尔\",\n        \"fine motion\": \"美妙姿势\",\n        \"air groove\": \"气槽\",\n        \"matikane tannhauser\": \"待兼诗歌剧\",\n        \"ash ketchum\": \"小智\",\n        \"jirachi\": \"基拉祈\",\n        \"mew\": \"梦幻\",\n        \"billy the kid\": \"比利·奇德\",\n        \"lloyd bannings\": \"罗伊德·班宁斯\",\n        \"agnes claudel\": \"亚妮艾丝·克劳蒂尔\",\n        \"lorelei\": \"科拿\",\n        \"fern\": \"菲伦\",\n        \"cure sky\": \"索拉・哈雷瓦塔尔\",\n        \"chiyari tenkajin\": \"天火人血枪\",\n        \"ai sugimoto\": \"杉本爱\",\n        \"nobara kugisaki\": \"钉崎野蔷薇\",\n        \"maki zenin\": \"禅院真希\",\n        \"usagi saionji\": \"西园寺兔\",\n        \"principal minami\": \"南日和子\",\n        \"sumi takane\": \"高岭珠深\",\n        \"illumi zoldyck\": \"伊路米·揍敌客\",\n        \"charybdis\": \"卡律布狄斯\",\n        \"elbe\": \"易北\",\n        \"anchorage\": \"安克雷奇\",\n        \"jade\": \"亚德\",\n        \"scylla\": \"斯库拉\",\n        \"algerie\": \"阿尔及利亚\",\n        \"erika\": \"莉佳\",\n        \"juliana\": \"小青\",\n        \"ishizu ishtar\": \"伊西丝·伊修达尔\",\n        \"mai valentine\": \"孔雀舞\",\n        \"serenity wheeler\": \"川井静香\",\n        \"aki izayoi\": \"十六夜秋\",\n        \"aoi zaizen\": \"财前葵\",\n        \"emma bessho\": \"别所惠麻\",\n        \"kotori mizuki\": \"观月小鸟\",\n        \"anna kouzuki\": \"神月安奈\",\n        \"sherry leblanc\": \"雪莉·卢布朗\",\n        \"mina simington\": \"狭雾深影\",\n        \"romin kirishima\": \"雾岛露明\",\n        \"yuzu hiiragi\": \"柊柚子\",\n        \"sera\": \"塞拉\",\n        \"chloe\": \"小春\",\n        \"stella vermillion\": \"史黛菈·法米利昂\",\n        \"ikki kurogane\": \"黑铁一辉\",\n        \"bort\": \"圆粒金刚石\",\n        \"cinnabar\": \"辰砂\",\n        \"phosphophyllite\": \"磷叶石\",\n        \"euclase\": \"蓝柱石\",\n        \"asana mutsuba\": \"六叶麻奈\",\n        \"yuuka gouha\": \"哥哈游佳\",\n        \"haruka kamijo\": \"上城大华／泰格\",\n        \"tatsuhisa kamijo\": \"上城龙久\",\n        \"yuga ohdo\": \"王道游我\",\n        \"rossweisse\": \"罗丝薇瑟\",\n        \"villetta nu\": \"维蕾塔·努\",\n        \"kaname ohgi\": \"扇要\",\n        \"ruri\": \"黑咲琉璃\",\n        \"cornelia li britannia\": \"柯内莉亚·li·布里塔尼亚\",\n        \"monica kruszewski\": \"莫妮卡·库鲁席夫斯基\",\n        \"jessie rasberry\": \"杰西\",\n        \"tamaki\": \"环\",\n        \"nagisa\": \"凪咲\",\n        \"nanami\": \"娜娜米\",\n        \"misaki\": \"海咲\",\n        \"sayuri\": \"小百合\",\n        \"helena\": \"海伦娜\",\n        \"momiji\": \"红叶\",\n        \"nico\": \"NiCO\",\n        \"monica\": \"莫妮卡\",\n        \"fiona\": \"菲欧娜\",\n        \"cai wenji\": \"蔡文姬\",\n        \"diao chan\": \"貂蝉\",\n        \"lian shi\": \"步练师\",\n        \"aciddrop\": \"酸糖\",\n        \"claudia\": \"Claudia\",\n        \"kozue otomune\": \"乙宗梢\",\n        \"tsuzuri yugiri\": \"夕雾缀理\",\n        \"futari gotou\": \"后藤二里\",\n        \"frostleaf\": \"霜叶\",\n        \"highmore\": \"海沫\",\n        \"mei misaki\": \"见崎鸣\",\n        \"kenma kozume\": \"孤爪研磨\",\n        \"tadashi yamaguchi\": \"山口忠\",\n        \"leon s. kennedy\": \"里昂·斯科特·肯尼迪\",\n        \"sayaka igarashi\": \"五十岚清华\",\n        \"kiba inuzuka\": \"犬冢牙\",\n        \"aang\": \"安昂\",\n        \"kyouko kirigiri\": \"雾切响子\",\n        \"astral\": \"星光体\",\n        \"yuma tsukumo\": \"九十九游马\",\n        \"kite tenjo\": \"天城快斗\",\n        \"droite\": \"德鲁瓦（右臂）\",\n        \"mizar\": \"米扎艾尔\",\n        \"dumon\": \"德鲁贝\",\n        \"ariados\": \"阿利多斯\",\n        \"latias\": \"拉帝亚斯\",\n        \"endministrator\": \"管理员\",\n        \"perlica\": \"佩丽卡\",\n        \"absinthe\": \"苦艾\",\n        \"misha necron\": \"米夏·涅库罗\",\n        \"sentouki - roze\": \"闪刀姬-露世\",\n        \"kooh\": \"酷儿\",\n        \"aaya saitou\": \"齐藤亚绫\",\n        \"kiiko kawakami\": \"川上纪衣子\",\n        \"princess gradriel de valendia\": \"海拉加德的公主\",\n        \"olivier mira armstrong\": \"奥利维亚·米拉·阿姆斯特朗\",\n        \"aqua hoshino\": \"阿库亚（星野爱久爱海）\",\n        \"miyako saitou\": \"齐藤京子\",\n        \"airi kurimura\": \"栗村爱莉\",\n        \"rentarou aijou\": \"爱城恋太郎\",\n        \"karane inda\": \"院田唐音\",\n        \"hakari hanazono\": \"花园羽香里\",\n        \"mayling shen\": \"沈美玲\",\n        \"akari wanibuchi\": \"鳄渊亚伽里\",\n        \"kikyou kiryuu\": \"桐生桔梗\",\n        \"fuwawa abyssgard\": \"软软·阿比斯加德\",\n        \"mococo abyssgard\": \"茸茸·阿比斯加德\",\n        \"hijiri mochizuki\": \"望月圣\",\n        \"eila ilmatar juutilainen\": \"艾拉·伊尔玛塔尔·尤蒂莱南\",\n        \"yuuhi oudou\": \"王道游飞\",\n        \"tell kawai\": \"合羽井英\",\n        \"kouko kaga\": \"加贺香子\",\n        \"lisanna strauss\": \"丽莎娜·斯特劳斯\",\n        \"mia luna tearmoon\": \"米雅·卢娜·堤亚穆\",\n        \"ruan mei\": \"阮·梅\",\n        \"li sushang\": \"李素裳 | 素裳\",\n        \"prometheus\": \"普罗米修斯\",\n        \"lisesharte atismata\": \"莉姿夏尔蒂·亚提司玛特\",\n        \"dantoudai no aura\": \"阿乌拉\",\n        \"ayano yuugiri\": \"夕桐绫乃\",\n        \"rose oriana\": \"萝丝·奥里亚纳\",\n        \"vladilena milize\": \"芙拉蒂蕾娜·米利杰\",\n        \"sharon\": \"莎郎 | 莎朗·荷莉格蕾尔\",\n        \"warlock\": \"术士\",\n        \"tamaki kotatsu\": \"環古達\",\n        \"brigitte lindholm\": \"布丽吉塔\",\n        \"tatsuya kaname\": \"鹿目达也\",\n        \"kamille bidan\": \"卡缪·比丹\",\n        \"delta\": \"德尔塔\",\n        \"kyouko yuuki\": \"结城京子\",\n        \"maomao\": \"猫猫\",\n        \"chris redfield\": \"克里斯·雷德菲尔德\",\n        \"kazuma ikezawa\": \"池泽佳主马\",\n        \"kenji koiso\": \"小矶健二\",\n        \"yuki sanada\": \"真田雪\",\n        \"natsuki usami\": \"宇佐美夏树\",\n        \"galleon\": \"伽莱翁\",\n        \"asa mitaka\": \"三鹰朝\",\n        \"sayaka murano\": \"村野沙耶香\",\n        \"kaho hinoshita\": \"日野下花帆\",\n        \"gravel\": \"砾\",\n        \"ant-man\": \"蚁人\",\n        \"utena hiiragi\": \"柊舞缇娜\",\n        \"chevreuse\": \"夏沃蕾\",\n        \"huohuo\": \"藿藿\",\n        \"lynx landau\": \"玲可\",\n        \"pelageya sergeyevna\": \"佩拉格娅·谢尔盖耶夫娜\",\n        \"hook\": \"虎克\",\n        \"yukong\": \"驭空\",\n        \"guinaifen\": \"桂乃芬\",\n        \"rumi usagiyama\": \"兔山留美\",\n        \"ryuko tatsuma\": \"龙间龙子\",\n        \"itsuka kendou\": \"拳藤一佳\",\n        \"nejire hado\": \"波动螺卷\",\n        \"setsuna tokage\": \"取荫切奈\",\n        \"lady nagant\": \"筒美火伊那\",\n        \"kyoka jiro\": \"耳郎响香\",\n        \"tooru hagakure\": \"叶隐透\",\n        \"ibara shiozaki\": \"塩崎茨\",\n        \"kinoko komori\": \"小森希乃子\",\n        \"pony tsunotori\": \"角取波尼\",\n        \"reiko yanagi\": \"柳玲子\",\n        \"yui kodai\": \"小大唯\",\n        \"mount lady\": \"岳山优\",\n        \"moe kamiji\": \"上路萌\",\n        \"mei hatsume\": \"发目明\",\n        \"mashirao ojiro\": \"尾白猿夫\",\n        \"nemuri kayama\": \"香山睡\",\n        \"chiori\": \"千织\",\n        \"shuro yabuki\": \"箭吹棕榈\",\n        \"blade\": \"刃\",\n        \"astesia\": \"星极\",\n        \"ichika nakamasa\": \"仲正一花\",\n        \"nodoka amami\": \"天见和香\",\n        \"shadow the hedgehog\": \"夏特\",\n        \"iris\": \"艾莉丝\",\n        \"momoka yuragi\": \"由良木桃香\",\n        \"yukari kadenokouji\": \"勘解由小路紫\",\n        \"yakumo aramaki\": \"荒牧八云\",\n        \"kasumi kinugawa\": \"鬼怒川霞\",\n        \"niya amachi\": \"天地妮娅\",\n        \"fiammetta\": \"菲亚梅塔\",\n        \"shu\": \"黍\",\n        \"hahari hanazono\": \"花园羽羽里\",\n        \"naoto hachiouji\": \"八王子直人\",\n        \"xianyun\": \"闲云（留云借风真君）\",\n        \"aizawa ema\": \"蓝泽艾玛\",\n        \"kurumi noah\": \"胡桃诺娅\",\n        \"atsushi murasakibara\": \"紫原敦\",\n        \"junna hoshimi\": \"星见纯那\",\n        \"hikari kagura\": \"神乐光\",\n        \"futaba isurugi\": \"石动双叶\",\n        \"kaoruko hanayagi\": \"花柳香子\",\n        \"mahiru tsuyuzaki\": \"露崎真昼\",\n        \"shizuka yoshimoto\": \"好本静\",\n        \"anastasia hoshin\": \"安娜塔西亚·合辛\",\n        \"stark\": \"休塔尔克\",\n        \"aiba uiha\": \"相羽初叶\",\n        \"sherlock shellingford\": \"夏洛克·雪莉福德\",\n        \"sodachi oikura\": \"老仓育\",\n        \"smolder\": \"斯莫得\",\n        \"touka satomi\": \"里见灯花\",\n        \"firefly\": \"流萤\",\n        \"black swan\": \"黑天鹅\",\n        \"gaming yip\": \"嘉明\",\n        \"dunyarzad homayani\": \"迪娜泽黛\",\n        \"sparkle\": \"花火\",\n        \"senadina\": \"希娜狄雅\",\n        \"satoshi mizukami\": \"水上敏志\",\n        \"secelia dote\": \"塞西莉亚·多特\",\n        \"gon freecss\": \"杰·富力士\",\n        \"meteion\": \"梅蒂恩\",\n        \"emil sinclair\": \"辛克莱\",\n        \"yi sang\": \"李箱\",\n        \"gary oak\": \"小茂\",\n        \"red\": \"赤红\",\n        \"coralie 6626 planck\": \"科拉莉·6626·普朗克\",\n        \"ami nonomura\": \"野野村亚美\",\n        \"indomitable\": \"不挠\",\n        \"kurumi tsuchimikado\": \"土御门胡桃\",\n        \"ada wong\": \"艾达·王\",\n        \"yamato takeru\": \"日本武尊(Fate)\",\n        \"wriothesley\": \"莱欧斯利\",\n        \"rin uehara\": \"上原燐\",\n        \"himeno\": \"姬野\",\n        \"tomori takamatsu\": \"高松灯\"\n    },\n    \"group\": {\n        \"1\": \"1\",\n        \"13\": \"13\",\n        \"27\": \"27\",\n        \"38\": \"38\",\n        \"86\": \"86\",\n        \"110\": \"110\",\n        \"183\": \"183\",\n        \"203\": \"ニイマルサン\",\n        \"333\": \"333\",\n        \"471\": \"四七一\",\n        \"530\": \"530\",\n        \"560\": \"560\",\n        \"1122\": \"1122\",\n        \"1787\": \"1787\",\n        \"2961\": \"2961\",\n        \"2990\": \"2990\",\n        \"4040\": \"4040\",\n        \"8716\": \"8716\",\n        \"1000000000\": \"1000000000\",\n        \"clockup\": \"CLOCKUP\",\n        \"guilty\": \"Guilty\",\n        \"guilty plus\": \"Guilty+\",\n        \"guilty ex\": \"Guilty eX\",\n        \"nanawind\": \"NanaWind\",\n        \"orc soft\": \"ORCSOFT\",\n        \"praline\": \"Praline\",\n        \"sakuragame\": \"SakuraGame\",\n        \"frill\": \"Frill\",\n        \"triangle\": \"Triangle\",\n        \"mana\": \"mana\",\n        \"sprite\": \"sprite\",\n        \"fairys\": \"fairys\",\n        \"escude\": \"エスクード\",\n        \"campus\": \"Campus\",\n        \"interheart\": \"INTERHEART\",\n        \"darknesspot\": \"DarknessPot\",\n        \"nihon bussan\": \"日本物产\",\n        \"sphinx\": \"SPHINX\",\n        \"bishop\": \"BISHOP\",\n        \"tanuki soft\": \"たぬきそふと\",\n        \"baseson\": \"BaseSon\",\n        \"miel\": \"Miel\",\n        \"may-be soft\": \"May-Be SOFT\",\n        \"squeez\": \"SQUEEZ\",\n        \"milk factory\": \"みるふぁく\",\n        \"alicesoft\": \"ALICESOFT\",\n        \"omega star\": \"ωstar\",\n        \"norn\": \"Norn\",\n        \"aries\": \"Aries\",\n        \"ensemble\": \"ensemble\",\n        \"ensemble sweet\": \"ensemble SWEET\",\n        \"caramel box\": \"CARAMEL-BOX\",\n        \"rootnuko\": \"√nuko\",\n        \"c drive\": \"C:drive.\",\n        \"d drive\": \"D:drive.\",\n        \"grand cross\": \"GRAND†CROSS\",\n        \"skyfish\": \"SkyFish\",\n        \"skyfish poco\": \"SkyFish poco\",\n        \"chelseasoft\": \"Chelseasoft\",\n        \"sphere\": \"Sphere\",\n        \"hook\": \"HOOKSOFT\",\n        \"smee\": \"SMEE\",\n        \"asa project\": \"ASa Project\",\n        \"rosebleu\": \"Rosebleu\",\n        \"clochette\": \"Clochette\",\n        \"honey soft\": \"HONEY SOFT\",\n        \"appetite\": \"アパタイト\",\n        \"pakopako soft\": \"ぱこぱこそふと\",\n        \"neko neko soft\": \"猫猫软件\",\n        \"abhar\": \"ABHAR\",\n        \"abhar tronc\": \"ABHAR Tronc\",\n        \"incarose\": \"インカローズ\",\n        \"nutaku\": \"Nutaku\",\n        \"etude\": \"etude\",\n        \"eufonie\": \"eufonie\",\n        \"eushully\": \"Eushully\",\n        \"waffle\": \"Waffle\",\n        \"navel\": \"Navel\",\n        \"tryset\": \"TRYSET\",\n        \"seal-tutu\": \"seal-tutu\",\n        \"softhouse chara\": \"Softhouse Chara\",\n        \"softhouse-seal\": \"softhouse-seal\",\n        \"devil-seal\": \"Devil-seal\",\n        \"softhouse-seal grandee\": \"softhouse-seal GRANDEE\",\n        \"reverse\": \"Re:verse\",\n        \"samoyed smile\": \"SAMOYED SMILE\",\n        \"moonstone\": \"MOONSTONE\",\n        \"moonstone cherry\": \"MOONSTONE Cherry\",\n        \"moonstone honey\": \"MOONSTONE Honey\",\n        \"yuzu soft\": \"柚子社\",\n        \"lump of sugar\": \"Lump of Sugar\",\n        \"quince soft\": \"QUINCE SOFT\",\n        \"aquaplus\": \"AQUAPLUS\",\n        \"leaf\": \"Leaf🍃\",\n        \"key\": \"🔑Key\",\n        \"alcot\": \"ALcot\",\n        \"alcot honey comb\": \"ALcot Honey Comb\",\n        \"august\": \"AUGUST\",\n        \"feng\": \"feng\",\n        \"frontwing\": \"FrontWing\",\n        \"atelier d\": \"Atelier D\",\n        \"atelier kaguya\": \"Atelier KAGUYA\",\n        \"atelier kaguya honky-tonk pumpkin\": \"Atelier KAGUYA Honky-Tonk Pumpkin\",\n        \"atelier kaguya team gassa-q\": \"Atelier KAGUYA TEAM Gassa-Q\",\n        \"atelier kaguya team heartbeat\": \"Atelier KAGUYA TEAM HEARTBEAT\",\n        \"atelier kaguya berkshire yorkshire\": \"Atelier KAGUYA Berkshire Yorkshire\",\n        \"atelier sakura roshutsu yuugi\": \"樱花工作室 露出＊游戏\",\n        \"atelier sakura konmai studio\": \"樱花工作室 こんまいすたじお\",\n        \"atelier sakura darkness\": \"樱花工作室 DARKNESS\",\n        \"atelier sakura team.ntr\": \"樱花工作室 Team.NTR\",\n        \"atelier sakura mount position\": \"樱花工作室 Mount Position\",\n        \"atelier sakura extra\": \"樱花工作室 eXtra\",\n        \"abel software\": \"AbelSoftware\",\n        \"type-moon\": \"🌙TYPE-MOON\",\n        \"nitroplus\": \"Nitro+\",\n        \"5pb\": \"5pb.\",\n        \"aniseed\": \"AniSeed\",\n        \"candysoft\": \"Candy Soft\",\n        \"ricotta\": \"Ricotta\",\n        \"whirlpool\": \"Whirlpool\",\n        \"giga\": \"戏画\",\n        \"milksoft\": \"牛奶软件\",\n        \"cygames\": \"Cygames\",\n        \"keroq\": \"ケロQ\",\n        \"akatsuki works hibiki\": \"hibiki works\",\n        \"fairytale\": \"fairytale\",\n        \"falcom\": \"Falcom\",\n        \"softstar\": \"大宇资讯\",\n        \"dmm.com\": \"DMM.com\",\n        \"kadokawa\": \"KADOKAWA\",\n        \"winged cloud\": \"Winged Cloud\",\n        \"tech gian\": \"TECH GIAN\",\n        \"electromagneticwave\": \"ElectromagneticWave\",\n        \"usotsukiya\": \"嘘つき屋\",\n        \"archetype\": \"ARCHETYPE\",\n        \"afterschool of the 5th year\": \"5年目の放课后\",\n        \"tsf no f\": \"TSF的F\",\n        \"number2\": \"Number2\",\n        \"plant\": \"PLANT\",\n        \"opaque\": \"Opaque\",\n        \"shiroganeya\": \"しろがね屋\",\n        \"horizontal world\": \"Horizontal World\",\n        \"mousou deguchi\": \"妄想出口\",\n        \"venom\": \"VENOM\",\n        \"tsuchinoko kyoukai\": \"ツシノコ協会\",\n        \"sekine\": \"咳寝\",\n        \"ippongui\": \"一本杭\",\n        \"aomidoro\": \"アオミドロ\",\n        \"otukimi koubo\": \"おつきみ工房\",\n        \"monsieur\": \"MonsieuR\",\n        \"orange peels\": \"オレンジピールズ\",\n        \"wata 120 percent\": \"120%棉\",\n        \"watsukiya\": \"わつき屋\",\n        \"sotikoti\": \"ソチコチ\",\n        \"320bpm\": \"320BPM\",\n        \"intoku.info\": \"いんとくいんふぉ\",\n        \"47sp\": \"47sp.\",\n        \"shibayukiya\": \"芝雪屋\",\n        \"news\": \"NEWS\",\n        \"shimajiya\": \"しまじや\",\n        \"canvas garden\": \"CANVAS+GARDEN\",\n        \"mc\": \"MC\",\n        \"animachine\": \"アニマルマシーン\",\n        \"ailail\": \"あいるあいる\",\n        \"moe hime rengou\": \"萌姬连合\",\n        \"digital lover\": \"Digital Lover\",\n        \"mone keshi gum\": \"MONEけしごむ\",\n        \"nama cream biyori\": \"生クリームびより\",\n        \"clesta\": \"クレスタ\",\n        \"onasuga 99-yen\": \"おナスが99円\",\n        \"karomix\": \"KAROMIX\",\n        \"shoot the moon\": \"シュート・ザ・ムーン\",\n        \"kansai gyogyou kyoudou kumiai\": \"关西渔业协同组合\",\n        \"rainwaterserver\": \"RainWaterServer\",\n        \"lily lily rose\": \"Lily Lily Rose\",\n        \"himura nyuugyou\": \"比村乳业\",\n        \"raijinkai\": \"雷神会\",\n        \"miyamaya\": \"深山屋\",\n        \"onna kishi no shiro\": \"女騎士の城\",\n        \"yonsai books\": \"四才ブックス\",\n        \"pastel wing\": \"PASTEL WING\",\n        \"ajisaidenden\": \"アジサイデンデン\",\n        \"attendance number 26\": \"出席番号26\",\n        \"yu-yu-tei\": \"悠々亭\",\n        \"circle ohigetan\": \"サークル尾髭丹\",\n        \"mahou rikigaku\": \"魔法力学\",\n        \"minimum game koubou\": \"ミニマムゲーム工房\",\n        \"santa star festa\": \"Santa☆Festa!\",\n        \"byousatsu tanukidan\": \"秒杀狸团\",\n        \"seven days holiday\": \"セブンデイズホリディ\",\n        \"uchuu bunko\": \"宇宙文库\",\n        \"nakayohi mogudan\": \"なかよひモグダン\",\n        \"suteuka no koya\": \"すてうかの小屋\",\n        \"at ism\": \"@ism\",\n        \"twinbox\": \"TwinBox\",\n        \"ame nochi yuki\": \"あめ のち ゆき\",\n        \"mataro\": \"魔太郎\",\n        \"otonano do-wa\": \"大人の寓話\",\n        \"tsukuru no mori kabushikigaisha\": \"ツクルノモリ株式会社\",\n        \"asanoya\": \"浅野屋\",\n        \"neko works\": \"NEKO WORKs\",\n        \"goshujinsama no omochabako\": \"御主人様の玩具箱\",\n        \"rairaku jinja\": \"磊落神社\",\n        \"mani mania\": \"マニまにあ\",\n        \"kongari tokei\": \"こんがり時計\",\n        \"circle kame\": \"さーくる亀\",\n        \"sugiura-ke\": \"杉浦家\",\n        \"atelier-g\": \"Atelier-G\",\n        \"atelier tiv\": \"Atelier Tiv\",\n        \"atelier lunette\": \"Atelier Lunette\",\n        \"atelier gh\": \"Atelier G/H\",\n        \"atelier botan\": \"あとりえ牡丹\",\n        \"atelier kinta\": \"あとりえKINTA\",\n        \"atelier miyabi\": \"あとりえ雅\",\n        \"atelier knee stroke\": \"あとりえ にーすとろーく\",\n        \"atelier pachira\": \"アトリエパキラ\",\n        \"atelier pinpoint\": \"アトリエ ピン・ポイント\",\n        \"atelier hachifukuan\": \"アトリエ八福庵\",\n        \"atelier gons\": \"アトリエ GONS\",\n        \"atelier maruwa\": \"アトリエ丸和\",\n        \"atelier ms\": \"Atelier Ms\",\n        \"kinokonabe-hinanjo\": \"きのこなべ避難所\",\n        \"s-size\": \"Sサイズ\",\n        \"mugen at works\": \"むげん@WORKS\",\n        \"hyogetsu\": \"冰月\",\n        \"garakuta shoujo\": \"がらくた少女\",\n        \"mosquito man\": \"モスキートマン\",\n        \"metal\": \"METAL\",\n        \"watanabe tou\": \"渡边党\",\n        \"suzuna jct\": \"SUZUNA JCT\",\n        \"amagami dou\": \"あまがみ堂\",\n        \"bitch bokujou\": \"Bitch牧场\",\n        \"antyuumosaku\": \"暗中模索\",\n        \"kurumaya\": \"車ヤ\",\n        \"shiitake en\": \"しいたけ園\",\n        \"makutsutei\": \"魔窟亭\",\n        \"studio pal\": \"STUDIO PAL\",\n        \"frac\": \"FRAC\",\n        \"karaageyasan\": \"からあげ屋さん\",\n        \"meltdown comet\": \"MeltdoWN COmet\",\n        \"karakishi youhei-dan\": \"からきし傭兵団 真雅\",\n        \"blusterlight\": \"BlusterLight\",\n        \"24 page\": \"24ぺーじ\",\n        \"holy water club\": \"ほーりーうぉーたー倶楽部\",\n        \"black currant\": \"ブラックカラント\",\n        \"ankoku soshiki\": \"暗黑组织\",\n        \"sweet heart\": \"Sweet HEART\",\n        \"zenmai kourogi\": \"ぜんまいこうろぎ\",\n        \"tsuki no hikari keikaku\": \"月ノヒカリ計画\",\n        \"aozora\": \"青尾空\",\n        \"shoujo kishidan\": \"少女骑士团\",\n        \"shimoyakedou\": \"しもやけ堂\",\n        \"jun and yuri\": \"Jun&Yuri\",\n        \"haiiro koubou\": \"灰色工房\",\n        \"chocolate latte\": \"ショコラテ\",\n        \"chi-ra-rhyzhm\": \"ちらりずむ\",\n        \"osamuya\": \"オサム屋\",\n        \"sleeve\": \"SLeeVe\",\n        \"paranoia cat\": \"PARANOIA CAT\",\n        \"kobuta no yakata\": \"子豚の館\",\n        \"crazy9\": \"Crazy9\",\n        \"essentia\": \"ESSENTIA\",\n        \"redrop\": \"ReDrop\",\n        \"shirando\": \"炽鸾堂\",\n        \"special star week\": \"Special☆Week\",\n        \"n and r\": \"N&R\",\n        \"8chomeno-ohanayasan\": \"8丁目のお花屋さん\",\n        \"kabu fujisawa minato shinsenkan\": \"㈱藤沢みなと新鮮館\",\n        \"uran-factory\": \"URAN-FACTORY\",\n        \"hiyoko no gekijoh\": \"ひよこの劇場\",\n        \"yakiyama line\": \"YAKIYAMA LINE\",\n        \"gallop dyna\": \"ぎゃろっぷだいな\",\n        \"trick and treat\": \"TRICK&TREAT\",\n        \"shirokumaya\": \"しろくま屋\",\n        \"nanairo no neribukuro\": \"七色のねりぶくろ\",\n        \"ucyunekogundan\": \"宇宙猫军团\",\n        \"mokoke\": \"もこ家\",\n        \"p-kan\": \"p-馆\",\n        \"inst\": \"Inst\",\n        \"plum\": \"PLUM\",\n        \"kaze no gotoku\": \"風のごとく!\",\n        \"haitoku sensei\": \"はいとく先生\",\n        \"angyadow\": \"行脚堂\",\n        \"noraneko-no-tama\": \"ノラネコノタマ\",\n        \"hizadati zekkouchou\": \"ひざだち絶好調\",\n        \"sakananekobeya\": \"鱼猫部屋\",\n        \"white drop\": \"ホワイトドロップ\",\n        \"dieselmine\": \"ディーゼルマイン\",\n        \"ojou no yokushitsu\": \"お嬢の浴室\",\n        \"nagiyamasugi\": \"ナギヤマスギ\",\n        \"awatake\": \"あわたけ\",\n        \"gasobook\": \"GASOBooK!!\",\n        \"shiohama workshop\": \"SHIOHAMA WORKSHOP\",\n        \"irotenya\": \"色点屋\",\n        \"watakubi\": \"わたくび\",\n        \"kirikiri\": \"きりきり\",\n        \"kohagura.\": \"こはぐら。\",\n        \"gambler club\": \"ギャンブラー倶楽部\",\n        \"usagi no oyatsu\": \"ぅさぎのぉゃっ\",\n        \"hakke deneijyo\": \"八卦电影城\",\n        \"kuma aji tounyuu.\": \"くま味豆乳。\",\n        \"tamaranchi\": \"たまらんち\",\n        \"lucky chance\": \"Lucky Chance!\",\n        \"chicken chicken machine\": \"チキチキ☆マシーン\",\n        \"ice coffin\": \"ICE COFFIN\",\n        \"teriyaki nikuman\": \"てりやきにくまん\",\n        \"chijoku an\": \"耻辱庵\",\n        \"otajai\": \"オタじゃい\",\n        \"hades\": \"ハーデス\",\n        \"kurawanya\": \"くろわん屋\",\n        \"54burger\": \"54BURGER\",\n        \"yadokugaeru\": \"ヤドクガエル\",\n        \"butagoya\": \"ぶた小屋\",\n        \"momo ego\": \"ももエゴ\",\n        \"wada mountain\": \"和田マウンテン\",\n        \"area14\": \"エリア14\",\n        \"komorikiri.\": \"こもりきり。\",\n        \"circle eden\": \"Circle Eden\",\n        \"fukutsuu okosu\": \"腹痛起こす\",\n        \"aodouhu\": \"青豆腐\",\n        \"team lucky\": \"チーム☆ラッキー\",\n        \"deep rising\": \"DEEP RISING\",\n        \"past gadget\": \"Past Gadget\",\n        \"gekidoku shoujo\": \"剧毒少女\",\n        \"chinjao girl.\": \"チンジャオ娘。\",\n        \"kawaraya honpo\": \"瓦屋本舗\",\n        \"float shippu\": \"フロート湿布\",\n        \"yusaritsukata\": \"ゆうさりつかた\",\n        \"tamago no kara\": \"タマゴノカラ\",\n        \"drow4\": \"Drow4\",\n        \"deastim\": \"であすちーむ\",\n        \"optworks\": \"OPTWORKS\",\n        \"nikujirushi\": \"にくじるし\",\n        \"great canyon\": \"グレートキャニオン\",\n        \"amp\": \"AMP\",\n        \"peanutsland\": \"ピーナッツランド\",\n        \"black fly\": \"BLACK FLY\",\n        \"acid club\": \"ACID CLUB\",\n        \"syunkan saidaihusoku\": \"瞬间最大风速\",\n        \"sakurairo\": \"さくらいろ\",\n        \"yan-yam\": \"Yan-Yam\",\n        \"zuzuzu\": \"ズズズ\",\n        \"pictokun\": \"Pictokun\",\n        \"yo-metdo\": \"妖灭堂\",\n        \"red crown\": \"RED CROWN\",\n        \"f.a\": \"F・A\",\n        \"reverse noise\": \"Reverse Noise\",\n        \"pink\": \"PINK\",\n        \"lemonmaiden\": \"LemonMaiden\",\n        \"manjudou\": \"曼珠堂\",\n        \"asshuku koubou\": \"压缩工房\",\n        \"moreriikusu\": \"モレリークス\",\n        \"magono-tei\": \"まごの亭\",\n        \"pumpernickel\": \"PUMPERNICKEL\",\n        \"rosetta stone\": \"ろぜったすとーん\",\n        \"pigafetta\": \"ぴがふぇった\",\n        \"f taku\": \"F宅\",\n        \"ezokuroten\": \"エゾクロテン\",\n        \"itou life\": \"伊東ライフ\",\n        \"spiral brain\": \"スパイラルブレーン\",\n        \"tuzi laoda\": \"兔子老大\",\n        \"iriomote\": \"IRIOMOTE\",\n        \"kamogawaya\": \"鸭川屋\",\n        \"23.4do\": \"23.4ド\",\n        \"doza village\": \"DOZA Village\",\n        \"p.d.creations\": \"P.D.creations\",\n        \"tear drop\": \"Tear Drop\",\n        \"434notfound\": \"434 Not Found\",\n        \"hikiwari nattou\": \"ひきわり納豆\",\n        \"hirahira\": \"ひらひら\",\n        \"yasakaninomagatama\": \"八坂琼曲玉\",\n        \"kansen shoujo\": \"甘泉少女\",\n        \"yuzuponz\": \"ゆずぽん酢\",\n        \"hamurabi-dou\": \"いちお屋\",\n        \"wasabi\": \"WASABI\",\n        \"abura batake bokujyo.\": \"あぶら畑牧場。\",\n        \"poetto\": \"POETTO\",\n        \"infinity drive\": \"INFINITY DRIVE\",\n        \"warabimochi\": \"ワラビモチー\",\n        \"fusionz\": \"Fusionz\",\n        \"munchengraph\": \"MünchenGraph\",\n        \"okashi tai\": \"おかし隊\",\n        \"morigotatsu\": \"モリゴタツ\",\n        \"funi funi lab\": \"フニフニラボ\",\n        \"nantara kantara\": \"ナンタラカンタラ\",\n        \"juuryoku shiki youheki\": \"重力式拥壁\",\n        \"cannabis\": \"カンナビス\",\n        \"archives\": \"アーカイブ\",\n        \"notone\": \"NOTONE\",\n        \"small marron\": \"Small Marron\",\n        \"palepink\": \"PalePink!\",\n        \"kokatsubatake\": \"こかつ畑\",\n        \"nise-jyuusyofutei\": \"伪住所不定\",\n        \"rpg company 2\": \"RPGカンパニー2\",\n        \"royal bitch\": \"ろいやるびっち\",\n        \"einsatz\": \"Einsatz\",\n        \"majimeya\": \"真面目屋\",\n        \"almarosso\": \"アルマロッソ\",\n        \"jitaku vacation\": \"自宅vacation\",\n        \"avalanche\": \"あばらんち\",\n        \"suzu no oka\": \"鈴の丘\",\n        \"gegera standard\": \"GEGERA STANDARD\",\n        \"studio mizuyokan\": \"スタジオみずよーかん\",\n        \"a ashgrey mix\": \"A AshGrey Mix\",\n        \"m.o seisakujo\": \"M.O制作所\",\n        \"orange bullet\": \"ORANGE BULLET\",\n        \"circle taihei-tengoku\": \"サーカル太平天国\",\n        \"kankituteien\": \"柑橘庭园\",\n        \"orukaniumu haigou a-jou\": \"おるかにうむ配合A錠\",\n        \"star-dreamer tei\": \"星梦亭\",\n        \"hexivision\": \"HEXIVISION\",\n        \"naruho-dou\": \"NARUHO堂\",\n        \"index410\": \"INDEX:410\",\n        \"mzfist\": \"MZの拳\",\n        \"twilight dusk\": \"TWILIGHT DUSK\",\n        \"kamikadou\": \"かみか堂\",\n        \"oboro and tempo gensui dou\": \"胧&天蓬元帅堂\",\n        \"kanden shoujo chuuihou\": \"感电少女注意报\",\n        \"niku ringo\": \"肉りんご\",\n        \"wareme\": \"割れ目\",\n        \"hakuginmokusei\": \"白銀木犀\",\n        \"meshikutteneru.\": \"飯食って寝る。\",\n        \"little hamlet\": \"りとる☆はむれっと\",\n        \"tarehamu\": \"たれハム\",\n        \"black dog\": \"BLACK DOG\",\n        \"shimesaba\": \"しめさば\",\n        \"forestrest\": \"ForestRest\",\n        \"norioikeru\": \"のりおいける!\",\n        \"himawari no tane\": \"ひまわりのたね\",\n        \"jieitai\": \"JIEITAI\",\n        \"honey qp\": \"Honey QP\",\n        \"ayuest\": \"AYUEST\",\n        \"inbou no teikoku\": \"阴谋的帝国\",\n        \"gate of xiii\": \"Gate of XIII\",\n        \"neko masshigura\": \"ねこまっしぐら\",\n        \"rorie-do\": \"ろり絵堂\",\n        \"inumiso\": \"イヌミソ\",\n        \"natsutama\": \"なつたま\",\n        \"wakuwaku doubutsuen\": \"わくわく動物園\",\n        \"shikishima guntool\": \"敷岛赝具\",\n        \"kaname\": \"要\",\n        \"studio vanguard\": \"STUDIO VANGUARD\",\n        \"gerupin\": \"ゲルピン\",\n        \"knockout\": \"KNOCKOUT\",\n        \"atamanurui mix-er\": \"アタマヌルイMIX-eR\",\n        \"mecchori\": \"めっちょり\",\n        \"titokara 2nd branch\": \"千岁乌山第2出张所\",\n        \"fakestar\": \"FAKESTAR\",\n        \"nikomi omurice\": \"煮込みオムライス\",\n        \"inaka no yasaiya\": \"田舎の野菜屋\",\n        \"nacchuushou\": \"夏中症\",\n        \"applesauce\": \"Applesauce\",\n        \"aquadrop\": \"アクアドロップ\",\n        \"ttt\": \"TTT\",\n        \"abyukyo koubou\": \"あびゅうきょ工房\",\n        \"asatsuki dou\": \"朝月堂\",\n        \"serizawa-room\": \"芹泽室\",\n        \"suzuya\": \"凉屋\",\n        \"cradle\": \"Cradle\",\n        \"puffsleeve\": \"Puffsleeve\",\n        \"nitro\": \"NITRO\",\n        \"girls empire\": \"娘。帝國\",\n        \"ameshoo\": \"あめしょー\",\n        \"yumesaki annai kairanban\": \"夢先案内回覧版\",\n        \"aihara hanten\": \"相原饭店\",\n        \"full high kick\": \"ふるはいきっく\",\n        \"punipuni doumei\": \"ぷにぷに同盟\",\n        \"sokomono suisou\": \"底物水槽\",\n        \"shiratamaco\": \"しらたまこ\",\n        \"oreteki18kin\": \"俺的十八禁\",\n        \"dl mate\": \"DLメイト\",\n        \"kaminagi-tei\": \"神凪邸\",\n        \"execio\": \"エクセシオ\",\n        \"seza team\": \"せざちーむ\",\n        \"shihachirou\": \"四八楼\",\n        \"maccha aji\": \"抹茶味\",\n        \"wireframe\": \"WIREFRAME\",\n        \"maho-shinsengumi\": \"魔法新撰组\",\n        \"caramel crunch\": \"CARAMEL CRUNCH!\",\n        \"ncp\": \"NCP\",\n        \"choujikuu yousai kachuusha\": \"超時空要塞カチューシャ\",\n        \"nanmin festival\": \"難民ふぇすてぃばる\",\n        \"ririo gatto\": \"りーりおがーと\",\n        \"activemover\": \"ActiveMover\",\n        \"mizuchirimen\": \"ミズチリメン\",\n        \"happy water\": \"HAPPY WATER\",\n        \"naragyogyo kumiai\": \"なら漁業組合\",\n        \"shichiten battou\": \"七天罚讨\",\n        \"drop dead\": \"DROP DEAD!!\",\n        \"erect touch\": \"ERECT TOUCH\",\n        \"melanchol\": \"メランコル\",\n        \"meisho hanten\": \"めーしょー飯店\",\n        \"rushe museum\": \"Rushe Museum\",\n        \"ame usagi\": \"あめうさぎ\",\n        \"sottilo nero\": \"ソッティーロネーロ\",\n        \"hollowplus\": \"HOLLOWPLUS\",\n        \"iminic\": \"IMINIC\",\n        \"oshaban\": \"オシャバン\",\n        \"diogenes club\": \"ディオゲネスクラブ\",\n        \"puchi village\": \"ぷち★びれっじ\",\n        \"mirrorworld\": \"MirrorWorld\",\n        \"kenkokotsu\": \"KENKOKOTSU\",\n        \"hakujira uminekodan\": \"はくじら海猫団\",\n        \"missing paradise\": \"ミッシングパラダイス\",\n        \"try and hougen futari shakai\": \"TRY&方言二人社会\",\n        \"mute cafe\": \"MUTE Cafe\",\n        \"taishou romanesque\": \"大正ロマネスク\",\n        \"gangontou\": \"巌魂薹\",\n        \"kaokuba\": \"家屋場\",\n        \"yukikagerou\": \"雪陽炎\",\n        \"akumenari\": \"アクメナリ!\",\n        \"hot mikan\": \"ほっとみかん\",\n        \"g-panda\": \"Gぱんだ\",\n        \"high tech pen case\": \"ハイテクペンケース\",\n        \"strawberry milk studio\": \"Strawberry Milk Studio\",\n        \"lolita crusaders\": \"ロリータクルセイダーズ\",\n        \"buaifamu\": \"ぶあいふぁむ\",\n        \"takenoko gohan\": \"筍御饭\",\n        \"shinenkan\": \"新炎馆\",\n        \"studio himawari\": \"スタジオ☆ひまわり\",\n        \"tohgoo\": \"冬宫\",\n        \"makino jimusho\": \"マキノ事務所\",\n        \"turtle.fish.paint\": \"龟鱼派\",\n        \"bear hand\": \"熊掌社\",\n        \"star f\": \"★F\",\n        \"service heaven\": \"サービスヘブン\",\n        \"spiritoso\": \"Spiritoso\",\n        \"kurobinega\": \"クロビネガ\",\n        \"nokishita no nekoya\": \"軒下の猫屋\",\n        \"denmoe\": \"电萌\",\n        \"mocomocodo\": \"もこモコ堂\",\n        \"werk\": \"Werk\",\n        \"nicutoka tabete mitanainaa\": \"肉とか食べてみたいなぁ・・・\",\n        \"gamushara\": \"我武者ら!\",\n        \"sandan\": \"SANDAN\",\n        \"newton no ringo\": \"ニュートンの林檎\",\n        \"kinako no yama\": \"きなこの山\",\n        \"hanamo oukoku\": \"はなも王国\",\n        \"gokiburi teishoku\": \"ゴキブリ定食\",\n        \"yumeyoubi\": \"ゆめようび\",\n        \"studio ren\": \"STUDIO REN\",\n        \"koterabyte\": \"コテラバイト\",\n        \"shiroi kuroi\": \"シロイクロイ\",\n        \"maidoll\": \"MAIDOLL\",\n        \"chromatic room\": \"CHROMATIC ROOM\",\n        \"piyokorota\": \"ぴよころた\",\n        \"d-raw 2\": \"Draw Two\",\n        \"konnyaku nabe\": \"蒟蒻锅\",\n        \"onkin yuugi\": \"音筋游戏\",\n        \"radiostar\": \"RADIOSTAR\",\n        \"jackpot 64\": \"ジャックポット64\",\n        \"panzers\": \"パンツァーズ\",\n        \"kanten jigenryuu\": \"寒天示現流\",\n        \"nazunaya honpo\": \"荠屋本铺\",\n        \"usubeniya\": \"うすべに屋\",\n        \"akusei-shinseibutsu\": \"恶性真性物\",\n        \"night fuckers\": \"夜★FUCKERS\",\n        \"puppukupu\": \"ぷっぷくぷー\",\n        \"sago-jou\": \"沙悟荘\",\n        \"hi-per pinch\": \"ハイパーピンチ\",\n        \"reis room\": \"REI's ROOM\",\n        \"hasemi box\": \"Hasemi box\",\n        \"kaki no tane\": \"夏季のタネ\",\n        \"aruku denpatou no kai\": \"歩く電波塔の会\",\n        \"lolitachannel\": \"LolitaChannel\",\n        \"asakaze no shizuku\": \"朝風の雫\",\n        \"youki m.k.c.\": \"优希M.K.C.\",\n        \"poco natsu\": \"ぽこなつ\",\n        \"hoppe shokudou\": \"ほっぺ食堂\",\n        \"hinemosuan\": \"终日庵\",\n        \"moon ruler\": \"むうんるうらあ\",\n        \"shin hijiridou honpo\": \"真・圣堂☆本铺\",\n        \"toyatei\": \"とやてい\",\n        \"otona shuppan\": \"おとな出版\",\n        \"atsuya kougyou\": \"笃屋工业\",\n        \"bonjin\": \"梵人\",\n        \"mimipull\": \"MIMIPULL\",\n        \"rojiura manhole\": \"ロジウラマンホール\",\n        \"uribatakebokujou\": \"うり畑牧場\",\n        \"zenra yashiki\": \"全裸屋敷\",\n        \"beniiro kaitenkikou\": \"红色回转机构\",\n        \"gff\": \"GFF\",\n        \"waffle doumeiken\": \"ワッフル同盟犬\",\n        \"raid slash\": \"RAID SLASH\",\n        \"colomonyu\": \"ころもにゅ\",\n        \"umidori\": \"うみどり\",\n        \"l-gauge sha\": \"Lゲージ社\",\n        \"kodomo ginkou\": \"こどもぎんこう\",\n        \"kowareta radio\": \"コワレ田ラジ男\",\n        \"hatakewotagayasudake\": \"畑を耕すだけ\",\n        \"kuro no omikuji\": \"黒ノ御神籤\",\n        \"hakuchou no ouji\": \"白鳥の王子\",\n        \"kinokotei\": \"きのこ亭\",\n        \"kinokodomo\": \"きのこども\",\n        \"kohakutei\": \"琥珀亭\",\n        \"izanagi\": \"いざなぎ\",\n        \"inuteikoku\": \"犬帝国\",\n        \"yamamoto\": \"山本同人\",\n        \"private garden\": \"Private Garden\",\n        \"gs studio\": \"G's studio\",\n        \"axz\": \"AXZ\",\n        \"chagashi saiban\": \"茶菓子裁判\",\n        \"chesha neko no yakata\": \"チェシャ猫の館\",\n        \"shokuan\": \"触安\",\n        \"aomizuan\": \"青水庵\",\n        \"royal mountain\": \"ロイヤルマウンテン\",\n        \"radical dream\": \"Radical Dream\",\n        \"hellabunna\": \"へらぶな\",\n        \"zakkin kougyou\": \"杂菌工业\",\n        \"metaneko\": \"メタネコ\",\n        \"midsummer madness\": \"MIDSUMMER MADNESS\",\n        \"ebibinbintei\": \"えびびんびん亭\",\n        \"katamari-ya\": \"かたまり屋\",\n        \"amenosorashido\": \"あめのそらしど\",\n        \"o-mars\": \"O-Mars\",\n        \"moonphase\": \"MoonPhase\",\n        \"open book\": \"OPEN BOOK\",\n        \"kodomo beer\": \"こどもびーる\",\n        \"dramatic sharp\": \"Dramatic#\",\n        \"rtd\": \"RTD\",\n        \"hacchake yarou a team\": \"はっちゃけ野郎Aチーム\",\n        \"dieppe factory darkside\": \"DIEPPE FACTORY Darkside\",\n        \"booblian\": \"Booblian\",\n        \"korokoro udon\": \"コロコロうどん\",\n        \"ende der welt\": \"Ende der Welt\",\n        \"aeba no mori\": \"喘葉の森\",\n        \"hakka ame\": \"薄荷饴\",\n        \"kinengusa\": \"禁烟草\",\n        \"shinkai kissa\": \"深海喫茶\",\n        \"megane shoujo\": \"メガネ少女\",\n        \"extended part\": \"拡張パーツ\",\n        \"you you you\": \"YOU!YOU!YOU!\",\n        \"yuubin basha\": \"邮便马车\",\n        \"m.macabre\": \"M.MACABRE\",\n        \"ohkura bekkan\": \"大藏别馆\",\n        \"the dungeon in yarn\": \"The Dungeon In Yarn\",\n        \"white datura\": \"White Datura\",\n        \"hanekaze\": \"HANEKAZE\",\n        \"stardust cradle\": \"すたーだすとくれいどる\",\n        \"unagiyasan\": \"うなぎやさん\",\n        \"hana zakuro\": \"花柘榴\",\n        \"smith koumuten\": \"スミス工務店\",\n        \"tiny feather\": \"Tiny Feather\",\n        \"low thrust\": \"ロウスラスト\",\n        \"yashiya\": \"やし屋\",\n        \"enhance heart\": \"EnHANCE HEART\",\n        \"slice slime\": \"slice slime\",\n        \"fountains square\": \"Fountain's Square\",\n        \"kodoku intelligence\": \"孤独intelligence\",\n        \"comet\": \"かみっと\",\n        \"bicolor\": \"Bicolor\",\n        \"deans pro office\": \"帝恩PRO事务所\",\n        \"mizutaniya\": \"水谷屋\",\n        \"arysuivery\": \"ありぃすいべりぃ\",\n        \"nekojarasare\": \"猫じゃらされ\",\n        \"puchiota rakugaki\": \"ぷちオタ落描き\",\n        \"activa\": \"ACTIVA\",\n        \"atsuatsu muchimuchi\": \"アツアツムチムチ\",\n        \"kuro lili no heya\": \"黒りりの部屋\",\n        \"rip at lip\": \"Rip@Lip\",\n        \"marinesapphire\": \"海苍玉\",\n        \"liche\": \"Liche\",\n        \"seven deadly sins\": \"Seven deadly sins\",\n        \"mikan dou\": \"みかん堂\",\n        \"kotonosha\": \"琴乃舎\",\n        \"yume-zakura\": \"ゆめざくら\",\n        \"micro house\": \"みくろハウス\",\n        \"rapidrabbit\": \"RapidRabbit\",\n        \"melt soft\": \"めるとソフト\",\n        \"asahiage\": \"あさひあげ\",\n        \"muchakai\": \"梦茶会\",\n        \"gechunchi\": \"ゲッチュんち\",\n        \"seventh heaven maxion\": \"セブンスヘブンMAXION\",\n        \"caramel macchiato\": \"Caramel Macchiato\",\n        \"dokudoku meron\": \"どくどくめろん\",\n        \"buwu 26 celsius\": \"部屋26℃\",\n        \"htsk\": \"HTSK\",\n        \"eucalyptus house\": \"ユーカリハウス\",\n        \"akiba maou\": \"秋叶魔王\",\n        \"nagiya honpo\": \"なぎや本舗\",\n        \"lu yan suo\": \"炉研所\",\n        \"nippon h manga kyoukai\": \"日本H漫画协会\",\n        \"urakata honpo\": \"里方本铺\",\n        \"ando six gates\": \"Ando Six Gates\",\n        \"tamagou\": \"多摩豪\",\n        \"haruharutei\": \"春叶流亭\",\n        \"nizyuugokuhiya\": \"二十极秘屋\",\n        \"pokachutei\": \"ぽかちゅ亭\",\n        \"w.label\": \"W.label\",\n        \"mutekei-fire\": \"むてけいファイヤー\",\n        \"qp flapper\": \"QP:flapper\",\n        \"momo no tsubomi\": \"モモのつぼみ\",\n        \"zenra restaurant\": \"全裸レストラン\",\n        \"kabushikigaisha toranoana\": \"株式会社虎の穴\",\n        \"lezmoe\": \"レズ萌え!\",\n        \"yuriru-rarika\": \"ユリルラリカ\",\n        \"kuroquis\": \"クロッキー!!\",\n        \"tmzf no circle\": \"TMZFのサークル\",\n        \"miniature magic\": \"みにちゅあまじっく\",\n        \"tinker bell\": \"てぃんかーべる\",\n        \"just-k\": \"JUST-K\",\n        \"justice-flame\": \"JUSTICE-FLAME\",\n        \"yakumi benishouga\": \"药味红生姜\",\n        \"nekonokone\": \"ねこのこね\",\n        \"hiroshikidou\": \"宏式堂\",\n        \"shiftalton\": \"ShiftAltOn\",\n        \"masamune kokichi\": \"マサムネコキチ\",\n        \"redlight\": \"REDLIGHT\",\n        \"komachiya\": \"小町屋\",\n        \"cu-little2\": \"Cu-little2\",\n        \"furaipan daimaou\": \"ふらいぱん大魔王\",\n        \"wicked heart\": \"WICKED HEART\",\n        \"peach candy\": \"Peach Candy\",\n        \"live house\": \"LIVE HOUSE\",\n        \"sujoyu and co.\": \"酢醤油&Co.\",\n        \"dksha\": \"DKsha\",\n        \"re barna\": \"re:barna\",\n        \"furanokumarin\": \"ふらのくまりん\",\n        \"rm-rf-\": \"RM-RF-*\",\n        \"yakumi sarai\": \"薬味さらい\",\n        \"assemblink\": \"アセンブリンク\",\n        \"yorando\": \"洋兰堂\",\n        \"fdsp\": \"FDSP\",\n        \"nyankone\": \"にゃんこね\",\n        \"handsome aniki\": \"ハンサム兄貴\",\n        \"grenade\": \"ぐれねーど\",\n        \"vivid thunder\": \"びびっどサンダー\",\n        \"ryu-seki-do\": \"流石堂\",\n        \"hiyotama goten\": \"ひよたま御殿\",\n        \"seqmed\": \"SEQMED\",\n        \"ichinichi sanjou\": \"一日三锭\",\n        \"kesshoku mikan\": \"血色蜜柑\",\n        \"kakkuu mogura\": \"滑空モグラ\",\n        \"ties\": \"TIES\",\n        \"public bath\": \"Public bath\",\n        \"nagai hamu\": \"長井ハム\",\n        \"maltese\": \"まるちぃず\",\n        \"goromenz\": \"ゴロメンツ\",\n        \"stemun\": \"すてむん\",\n        \"rosapersica\": \"Rosapersica\",\n        \"kudoki dancer\": \"くどきダンサー\",\n        \"athome shuka\": \"アットホーム酒家\",\n        \"111 touban\": \"111当番\",\n        \"iro wa nioe do\": \"色は匂えど\",\n        \"joudan janai yo\": \"冗談じゃないよっっ!\",\n        \"poyopacho\": \"ぽよぱちょ\",\n        \"guilty hearts\": \"GUILTY HEARTS\",\n        \"ortensia\": \"おるてんしあ\",\n        \"expot\": \"EXPOT\",\n        \"shouchuu mac\": \"烧酎MAC\",\n        \"golden zombie\": \"金珠狼\",\n        \"melty pot\": \"Melty Pot\",\n        \"airbox\": \"AIR BOX\",\n        \"suwateria\": \"すわてりあ\",\n        \"ichigosize\": \"いちごさいず\",\n        \"bakutaso switch\": \"爆タソスイッチ\",\n        \"miyuuhodoh\": \"美游穗堂\",\n        \"7cm\": \"7センチ\",\n        \"nisemididoronokai\": \"偽MIDI泥の会\",\n        \"veronica no ha\": \"ヴェロニカの歯\",\n        \"jet-black baselarde\": \"漆黒のバゼラード\",\n        \"juicebox koujou\": \"ジュースボックス工場\",\n        \"yukinohana\": \"ユキノハナ\",\n        \"sa ku\": \"sa_ku\",\n        \"rurunoya\": \"るるノ屋\",\n        \"all delete\": \"ALL DELETE\",\n        \"sigma-arts\": \"Σ-Arts\",\n        \"fanatic fetish\": \"Fanatic Fetish\",\n        \"count2.4\": \"Count2.4\",\n        \"lily\": \"Lily\",\n        \"studio empty\": \"Studio Empty\",\n        \"fuurainin\": \"风来人\",\n        \"dasshifunnyuu\": \"脱脂粉乳\",\n        \"hidamari hwy\": \"ひだまりHWY\",\n        \"insert\": \"INSERT\",\n        \"mbl\": \"MBL\",\n        \"french letter\": \"French letter\",\n        \"sweettaboo\": \"SWEETTABOO\",\n        \"mikezoutei\": \"三毛藏亭\",\n        \"kochou no yume\": \"胡蝶夢\",\n        \"hanekura ginma\": \"羽倉ぎんま\",\n        \"suzunone strike\": \"スズノネストライク\",\n        \"bloody okojo\": \"Bloody Okojo\",\n        \"sunset beach\": \"サンセットビーチ\",\n        \"alicecreation\": \"AliceCreation\",\n        \"shirokurousa\": \"しろくろうさ\",\n        \"rehabilitation\": \"リハビリテーション\",\n        \"fools art gallery\": \"FOOL's ART GALLERY\",\n        \"galaxist\": \"GALAXIST\",\n        \"setoran\": \"せとらん\",\n        \"global one\": \"グローバルワン\",\n        \"sagittarius\": \"サジタリアス\",\n        \"rolling star\": \"ローリングスター\",\n        \"milk pudding\": \"MILK PUDDING\",\n        \"circle are\": \"サークルARE\",\n        \"kazan no you\": \"火山の楊\",\n        \"hard chrome\": \"ハードクローム\",\n        \"pochi-goya.\": \"ぽち小屋。\",\n        \"hikawado\": \"火川堂\",\n        \"mof-mof\": \"mof-mof\",\n        \"aneko no techo\": \"あねこの手帖\",\n        \"circle heron\": \"サークルヘロン\",\n        \"youkai tamanokoshi\": \"ようかい玉の輿\",\n        \"waffle sand\": \"わっふるさんど\",\n        \"monotrust\": \"モノトラスト\",\n        \"fuwamoko honpo\": \"ふわもこ本舗\",\n        \"i-raf-you\": \"I-Raf-you\",\n        \"urahyakkiyakou\": \"里百鬼夜行\",\n        \"boundary of dream\": \"夢の境界\",\n        \"innocent chapel\": \"INNOCENT CHAPEL\",\n        \"studio fow\": \"Studio-FOW\",\n        \"happouvijin\": \"八方微人\",\n        \"squeeze\": \"SQUEEZE!!\",\n        \"squeeze candy heaven\": \"squeezecandyheaven\",\n        \"polinky hiroba\": \"ポリンキー広場\",\n        \"v-slash\": \"V-SLASH\",\n        \"tanima club\": \"谷间俱乐部\",\n        \"paper hearts\": \"PAPER HEARTS\",\n        \"gekikara koushinryou\": \"激辛香辛料\",\n        \"pha-la-dogs\": \"ぱらどっくす。\",\n        \"yojouhan shobou\": \"四叠半书房\",\n        \"maron maron\": \"まろん☆まろん\",\n        \"yukijirushi nyuugyou\": \"逝印乳业\",\n        \"suimitsutou koubou\": \"水密桃工房\",\n        \"netekuras\": \"ネテクラス\",\n        \"hachimitsu syoujo\": \"蜂蜜少女\",\n        \"miyako dokei\": \"みやこ時計\",\n        \"air pocket\": \"Air Pocket\",\n        \"teitetsu kishidan\": \"蹄铁骑士团\",\n        \"yowamidori\": \"よわみどり\",\n        \"koi tenshi doumei\": \"恋☆天使同盟\",\n        \"ayamaji nuji\": \"誤じ脱ぢ\",\n        \"p.d chump\": \"P.D Chump\",\n        \"naya\": \"纳屋\",\n        \"depression\": \"でぱれーしょん\",\n        \"yanasegawabeya\": \"柳瀬川部屋\",\n        \"ponkotsu works\": \"ぽんこつわーくす\",\n        \"amezaiku\": \"雨细工\",\n        \"niboshi\": \"煮干\",\n        \"niboniboshi\": \"にぼ煮干\",\n        \"daisuki beachkun\": \"大好き!!ビーチクン\",\n        \"mirake\": \"MiraKE\",\n        \"yodakapan\": \"ヨダカパン\",\n        \"mimoneland\": \"ミモネランド\",\n        \"doronko yuuyake\": \"どろんこ夕焼\",\n        \"panic room\": \"パニックルーム!\",\n        \"studio aruta\": \"スタジオあるた\",\n        \"haruharudo\": \"はるはる堂\",\n        \"tamanokoshi\": \"たまのこし\",\n        \"minamihamaya\": \"南浜屋\",\n        \"lolipop complete\": \"ロリポップ コンプリート\",\n        \"studio wallaby\": \"スタジオ・ワラビー\",\n        \"castlism\": \"Castlism\",\n        \"mtsp\": \"MTSP\",\n        \"bijutsubu\": \"美术部\",\n        \"yowatari kouba\": \"よわたり工場\",\n        \"staccato squirrel\": \"Staccato・Squirrel\",\n        \"sakuradou\": \"樱堂\",\n        \"candy club\": \"Candy Club\",\n        \"apple amza\": \"APPLE Amza\",\n        \"rorinoutage\": \"ロリの宴\",\n        \"comex\": \"COMEX\",\n        \"marimo-ya\": \"まりも屋\",\n        \"moonglow\": \"MoonGlow\",\n        \"aikanheiwa.\": \"愛館平和。\",\n        \"yokoshimaya\": \"邪屋。\",\n        \"seiryoukei inryousui\": \"清涼系飲料水\",\n        \"mugenkidou a\": \"无限轨道A\",\n        \"penetrate\": \"Penetrate\",\n        \"astral\": \"Astral\",\n        \"choki no kamisama\": \"チョキの神さま\",\n        \"wanwandoh\": \"わんわん堂\",\n        \"f slash t\": \"F/T\",\n        \"kenja time\": \"けんじゃたいむ\",\n        \"turuvege.\": \"つるべじ。\",\n        \"seven colors drop\": \"なないろどろっぷ\",\n        \"foundation slash 1\": \"Foundation／1\",\n        \"happy birthday\": \"Happy Birthday\",\n        \"initial-g\": \"イニシャルG\",\n        \"j.o.n.g.\": \"ジョング\",\n        \"hitomishiri\": \"ひとみしり\",\n        \"mieow\": \"Mieow\",\n        \"kariya\": \"刈屋\",\n        \"kichiku koubou\": \"鬼畜工房\",\n        \"zettai shoujo\": \"绝对少女\",\n        \"circle roman hikou\": \"サークル浪漫飛行\",\n        \"asstaro-san\": \"アスタローサン\",\n        \"kurowasabi\": \"くろわさび\",\n        \"kabayakiya\": \"蒲烧屋\",\n        \"datenshi no ana\": \"墮天使の坑\",\n        \"mix fry\": \"みっくすふらい\",\n        \"kokonokaya\": \"九日屋\",\n        \"orangemaru\": \"OrangeMaru\",\n        \"ishikawa pro\": \"石川プロ\",\n        \"neyukidou\": \"根雪堂\",\n        \"o.n art works\": \"O.N Art Works\",\n        \"an-arc\": \"アンアーク\",\n        \"anmichu dou\": \"あんみちゅ堂\",\n        \"melodeathweep\": \"めろですうぃーぷ\",\n        \"absolute\": \"Absolute\",\n        \"mizone doubutsuen\": \"みぞね動物園\",\n        \"studio honeyblade\": \"STUDIO HONEYBLADE\",\n        \"furukadou\": \"古ヶ堂\",\n        \"dam koubou\": \"だむ工房\",\n        \"heart of green\": \"はーとおぶぐりーん\",\n        \"dogyear\": \"DOGYEAR\",\n        \"kagiyama baking co ltd\": \"鍵山製パン株式会社\",\n        \"shittoden\": \"嫉妬殿\",\n        \"sea-s\": \"SEA-S\",\n        \"stray hermit\": \"ストレイハーミット\",\n        \"fox grave\": \"FOX GRAVE\",\n        \"muoto lab\": \"むおとラボ\",\n        \"momoiro kageboushi\": \"桜色影法師\",\n        \"sennen teikoku\": \"千年帝国\",\n        \"tataraba\": \"たたらば\",\n        \"koniro club\": \"紺色くらぶ\",\n        \"west one\": \"WEST ONE\",\n        \"kotsu\": \"KOTSU\",\n        \"suzume nest\": \"すずめねすと\",\n        \"slash\": \"SLASH\",\n        \"yukimi biyori\": \"雪见日和\",\n        \"hinata to keidai to ennichi\": \"ひなたと境内と縁日\",\n        \"matsuri gensou\": \"祭り幻想\",\n        \"homuraya\": \"ほむら屋★プレアデス\",\n        \"heavy bunny addiction\": \"H.B.A\",\n        \"mata ashita.\": \"また明日。\",\n        \"muses garden\": \"MUSES GARDEN\",\n        \"nekomataya\": \"猫又屋\",\n        \"oving\": \"OVing\",\n        \"ditama kikaku\": \"ぢたま企画\",\n        \"crespirit\": \"CreSpirit\",\n        \"modae tei\": \"闷亭\",\n        \"oyama dennou giken\": \"小山电脑技研\",\n        \"lux soft\": \"ルクスソフト\",\n        \"gunsryu\": \"GUNsRYU\",\n        \"happy core\": \"HAPPY CORE\",\n        \"dai-kotetsu dan\": \"ダイコテツ団\",\n        \"tora machine\": \"虎マシーン\",\n        \"z.a.p.\": \"Z.A.P.\",\n        \"aozora shoujo\": \"青空少女\",\n        \"morimi-ya\": \"森见屋\",\n        \"upa24\": \"UPA24\",\n        \"twilight road\": \"Twilight Road\",\n        \"nine four air\": \"Nine Four Air\",\n        \"yogurt prince\": \"ヨーグルトプリンス\",\n        \"ukkaridou\": \"うっかり堂\",\n        \"sawwei005\": \"Sawwei005\",\n        \"fujiya honten\": \"藤屋本店\",\n        \"nijigen shoujo\": \"虹元少女\",\n        \"muskel bild\": \"Muskel☆Bild\",\n        \"takebouzu\": \"竹坊主\",\n        \"egyptsobaya\": \"エジプトそば屋\",\n        \"dm-fc\": \"DM-FC\",\n        \"awareness\": \"Awareness\",\n        \"peromex\": \"ぺろめっくす\",\n        \"jouji mujoh\": \"常时无常\",\n        \"shinjugai\": \"真珠贝\",\n        \"sui-sui-laboratory\": \"萃酔研究所\",\n        \"ashita ganbaru.\": \"明日がんばる。\",\n        \"kidoya\": \"きどや\",\n        \"chimichanga\": \"ちみチャンガ\",\n        \"fukinshin\": \"布巾心\",\n        \"cleari tei\": \"くれり亭\",\n        \"ash wing\": \"Ash Wing\",\n        \"kousyoudou\": \"咬伤堂\",\n        \"leimkissa\": \"LeimkissA\",\n        \"paschara-mode\": \"ぱっきゃらもーど\",\n        \"e61 geinou pro\": \"E61芸能プロ\",\n        \"nijiiro zakura\": \"にじいろ桜\",\n        \"tri-moon\": \"TRI-MOON!\",\n        \"algolagnia\": \"アルゴラグニア\",\n        \"arestica\": \"ARESTICA\",\n        \"hapoi-dokoro\": \"はぽい処\",\n        \"route1\": \"ROUTE1\",\n        \"chural-an\": \"ちゅらる庵\",\n        \"monaka udon\": \"もなかうどん\",\n        \"kingyo origin\": \"金魚オリジン\",\n        \"yudokuya\": \"友毒屋\",\n        \"sandworks\": \"SANDWORKS\",\n        \"sorairokibun\": \"空色気分\",\n        \"stella\": \"Stella\",\n        \"yuunagi gaibutai\": \"夕凪外部隊\",\n        \"lionoil\": \"らいおんおいる\",\n        \"arekusa thunder\": \"アレクササンダー\",\n        \"seaside\": \"SEA SIDE\",\n        \"sakyuya\": \"砂丘屋\",\n        \"ph-bu\": \"PH部\",\n        \"kyurettokyuretto\": \"^^\",\n        \"panda cotta\": \"Panda Cotta\",\n        \"tsujimo ga machi ni yattekita\": \"つじもが町に殺ってきた!!!\",\n        \"bindume syojo.\": \"瓶诘少女。\",\n        \"pinsize inc.\": \"PINSIZE Inc.\",\n        \"hakka-ya\": \"薄荷屋\",\n        \"akai shougeki\": \"緋い笑撃\",\n        \"goma saba\": \"ごまさば\",\n        \"binkan de nani ga warui\": \"びんかんでなにがわるい\",\n        \"minagi zakura\": \"みなぎざくら\",\n        \"root 12-hedron\": \"ルート十二面体\",\n        \"gunjyou zensen\": \"群青前线\",\n        \"yanagiba dai\": \"柳叶台\",\n        \"wasanbon\": \"わさんぼん\",\n        \"pk gristle\": \"PKグリッスル\",\n        \"rintoneko\": \"りんとねこ\",\n        \"seiitsukyou\": \"性一教\",\n        \"canvas\": \"カンバス\",\n        \"weee\": \"Weee\",\n        \"ichigo pants\": \"いちごぱんつ\",\n        \"uramonoya\": \"うらもの屋\",\n        \"yukinkousagi\": \"ゆきんこうさぎ\",\n        \"swat\": \"SwaT\",\n        \"sandai yokkyuu\": \"さんだいよっきゅう\",\n        \"ameya.\": \"饴屋。\",\n        \"yumemiru shiro\": \"ゆめみる白\",\n        \"peach garden\": \"桃【Peach Garden】园\",\n        \"rubi-sama wo agameru kai\": \"るび様を崇める会\",\n        \"akikaze asparagus\": \"秋風アスパラガス\",\n        \"ranpakudou\": \"卵白堂\",\n        \"decoppachi\": \"DECOッパチ\",\n        \"z-vector\": \"Z-VECTOR\",\n        \"himeshibori\": \"ヒメシボリ\",\n        \"milkybox\": \"MilkyBox\",\n        \"sushipuri\": \"スシプリ\",\n        \"ruman-dou\": \"るまん堂\",\n        \"kaientai\": \"絵援隊\",\n        \"atugi de 5\": \"厚木で5時\",\n        \"sol-fa-soft\": \"sol-fa-soft\",\n        \"right away\": \"Right away\",\n        \"pianiishimo\": \"ピアニッシモ\",\n        \"ijimaya\": \"イジマヤ\",\n        \"inariya\": \"稻荷屋\",\n        \"triple head\": \"とりぷるへっど\",\n        \"tamaya\": \"珠屋\",\n        \"nigatsu umare\": \"二月生まれ\",\n        \"ninja yashiki\": \"忍者屋敷\",\n        \"nekoshin\": \"NEKOSHIN\",\n        \"momo9\": \"ももきゅー\",\n        \"hidebou house\": \"ヒデボウハウス\",\n        \"kawazoko\": \"KAWAZOKO\",\n        \"sexual khorosho\": \"セクシャルハラショー\",\n        \"urayoroduya\": \"里万屋\",\n        \"lost rarities\": \"LOST RARITIES\",\n        \"gesshoku\": \"月蚀\",\n        \"misuterutein\": \"みすてるていん\",\n        \"namacyoko\": \"生チョコ\",\n        \"payanikov\": \"ぱやニコフ\",\n        \"3dt\": \"3DT\",\n        \"extreme ponkotsu\": \"エクストリームポンコツ\",\n        \"gorilla bouzu\": \"ゴリラ坊主\",\n        \"mutant\": \"Mutant\",\n        \"junginboshi\": \"纯银星\",\n        \"h2o aquarium\": \"H2O Aquarium\",\n        \"kurousagi project\": \"黒兎プロジェクト\",\n        \"kekemotsu\": \"ケケモツ\",\n        \"yom shoten\": \"よむ書店\",\n        \"tsukemayuge\": \"つけまゆげ\",\n        \"omochi\": \"おもち\",\n        \"horsetail\": \"ほーすている\",\n        \"nukesaku\": \"拔作\",\n        \"ichi-kan\": \"いちかん。\",\n        \"karashi mentaiko\": \"からしめんたい子\",\n        \"nextpreview\": \"NextPreview\",\n        \"saga planets\": \"Saga Planets\",\n        \"banana koubou\": \"ばな奈工房\",\n        \"mujitan\": \"むじたん\",\n        \"aka no hana\": \"赤のハナ\",\n        \"caustica\": \"コースティカ\",\n        \"denen shoujo\": \"田园少女\",\n        \"dressing plus party\": \"Dressing+Party\",\n        \"butakoma 300g\": \"ぶたコマ300g\",\n        \"white lily\": \"White Lily\",\n        \"oeuvre bijutsukan\": \"ウーブル美術館\",\n        \"kyoumen aquarium\": \"鏡面アクアリウム\",\n        \"mamemaru shoten\": \"豆丸书店\",\n        \"joibo no juunin\": \"ジョイボの住人\",\n        \"metagraft\": \"MetaGraft\",\n        \"festa.\": \"ふぇすた。\",\n        \"slash yen\": \"/￥\",\n        \"pastas estab\": \"PASTA'S ESTAB\",\n        \"rinjuu circus\": \"临终马戏团\",\n        \"ue ni aru mikan\": \"うえにあるみかん\",\n        \"ruu kikaku\": \"龙企画\",\n        \"hoshizora sutekki\": \"星空ステッキ\",\n        \"come through\": \"Come Through\",\n        \"wancho-ke\": \"わんちょ家\",\n        \"kajishima onsen\": \"梶岛温泉\",\n        \"kuroneko-kan\": \"クロネコ缶\",\n        \"cook milk\": \"くっくみるく\",\n        \"kudamono monogatari\": \"果物物语\",\n        \"romance no neko ookami musume\": \"ろまんすの猫狼娘\",\n        \"nanairo otogizoushi\": \"七色御伽草子\",\n        \"buruman\": \"BURUMAN\",\n        \"nyaito senyou\": \"にゃいと専用\",\n        \"pinata party\": \"ぴにゃたぱ～てぃ\",\n        \"hatena-box\": \"HATENA-BOX\",\n        \"black smile\": \"BLACK SMILE\",\n        \"ph\": \"PH\",\n        \"aane\": \"あーね\",\n        \"tsuki no uragawa\": \"ツキノウラガワ\",\n        \"manekineko\": \"まねきねこ\",\n        \"mayoriyo\": \"MayoRiyo\",\n        \"moe shoujo ryouiki\": \"萌少女领域\",\n        \"sakakiya\": \"榊屋\",\n        \"unstoppable plus\": \"Unstoppable+\",\n        \"the nation of head scissors\": \"The Nation of Head Scissors\",\n        \"airy socks\": \"エアリーソックス\",\n        \"sheepfold\": \"羊小屋\",\n        \"aroma gaeru\": \"あろまガエル\",\n        \"arion canvas\": \"Arion Canvas\",\n        \"a color summoner\": \"アカラサマナ\",\n        \"marimo\": \"MARIMO\",\n        \"alem-gakan\": \"アレム画館\",\n        \"re.lay\": \"莉零\",\n        \"milk force\": \"ミルクフォース\",\n        \"kuureishiki zunou\": \"空冷式头脑\",\n        \"matsurija\": \"祭社\",\n        \"asgo\": \"ASGO\",\n        \"yobigakka\": \"预备学科\",\n        \"locker room\": \"LockerRoom\",\n        \"pettan doujou\": \"ペッタン道場\",\n        \"art book chipika\": \"Art Book Chipika\",\n        \"alemateorema\": \"アレマテオレマ\",\n        \"otokojuku\": \"おとこじゅく\",\n        \"kitsune-goya\": \"きつね小屋\",\n        \"kuroni\": \"クロニ\",\n        \"seventh engine\": \"せぶんすえんじん\",\n        \"n-cyak-m-mu-\": \"んーちゃかむーむー\",\n        \"purple salamander\": \"パープルサラマンダー\",\n        \"yume yori suteki na\": \"夢よりすてきな\",\n        \"alice no takarabako\": \"ありすの宝箱\",\n        \"akumu no takuhaibin\": \"Nightmare Express-悪夢の宅配便-\",\n        \"san se fang\": \"三色坊\",\n        \"uninigumi\": \"うにに組\",\n        \"otomekibun\": \"乙女気分\",\n        \"gasshuukoku netamekoru\": \"合众国ネタメコル\",\n        \"shallot coco\": \"シャルロット・ココ\",\n        \"orange restaurant\": \"オレンジレストラン\",\n        \"astro creep\": \"ASTRO CREEP\",\n        \"gin no hoshitei\": \"銀の星亭\",\n        \"yorokobi no kuni\": \"ヨロコビの国\",\n        \"babel\": \"BABEL\",\n        \"o-g-g\": \"O・G・G\",\n        \"ikebukuro dpc\": \"池袋DPC\",\n        \"ningyou gishou\": \"人形技厂\",\n        \"saiga dou\": \"SAIGA堂\",\n        \"k-drive\": \"K-Drive\",\n        \"larchange\": \"L'ARCHANGE\",\n        \"nyuu koubou\": \"にゅう工房\",\n        \"freehand tamashii\": \"フリーハンド魂\",\n        \"tabuchi-san chi\": \"たぶちさんち\",\n        \"2d creative\": \"2Dクリエイティブ\",\n        \"higuma-ya\": \"ひぐま屋\",\n        \"clearmana plum\": \"クリアマナ・プラム\",\n        \"hanjuku iriko dashi\": \"半熟いりこ出汁\",\n        \"pururun estate\": \"プルルンエステ\",\n        \"heatwave\": \"HEATWAVE\",\n        \"nerco\": \"NERCO\",\n        \"zensuu hakai kensa\": \"全数破坏检査\",\n        \"ng010\": \"NG010\",\n        \"silver meteor\": \"SILVER METEOR\",\n        \"houmitsudou\": \"方密堂\",\n        \"tennenseki\": \"天然石\",\n        \"artienne\": \"アルティエーヌ\",\n        \"under the honey shine\": \"Under The Honey Shine\",\n        \"infinity-force\": \"INFINITY-FORCE\",\n        \"akane makes revolution\": \"A・M・R\",\n        \"gujira 4 gou\": \"ぐじら4号\",\n        \"shimapan\": \"しまぱん\",\n        \"candy paddle\": \"candy paddle\",\n        \"daihonei\": \"大本营\",\n        \"condiment moderately\": \"コンディメントは8分目\",\n        \"digital accel works\": \"Digital Accel Works\",\n        \"masaoyan\": \"まさお屋ン\",\n        \"skirthike\": \"Skirthike\",\n        \"mitarashi dango\": \"みたらし団GO\",\n        \"cartagra\": \"骨牌仓\",\n        \"fomalhaut\": \"FOMALHAUT\",\n        \"ring castle\": \"Ring Castle\",\n        \"takatakaya\": \"たか々屋\",\n        \"unagigoya\": \"うなぎ小屋\",\n        \"celtrance\": \"CELTRANCE\",\n        \"amazoness\": \"アマゾネス\",\n        \"hitotsukami\": \"ヒトツカミ\",\n        \"kossorikakuredokoro\": \"こっそり隠れ処\",\n        \"sweet milk shake\": \"すいーとみるくしぇいく\",\n        \"jabarand\": \"ジャバランド\",\n        \"kuromutu\": \"くろむつ\",\n        \"hoyoyodou\": \"ほよよ堂\",\n        \"wlho\": \"WLHO\",\n        \"mamiretei\": \"まみれ亭\",\n        \"osouzaiya-san\": \"お総菜屋さん\",\n        \"gensuifu\": \"幻醉腐\",\n        \"zooya\": \"ZOOYA!\",\n        \"nanashi no rakugakijo\": \"名無しの落書き所\",\n        \"m-ya\": \"M屋\",\n        \"blue bean\": \"ぶるーびーん\",\n        \"dr.vermilion\": \"Dr.VERMILION\",\n        \"kinqhassin\": \"紧急发进\",\n        \"yagisaki ginza\": \"八木崎银座\",\n        \"p.l.t.works\": \"P.L.T.works\",\n        \"galaxy monooki\": \"ギャラクシー物置\",\n        \"arikawadou\": \"有川堂\",\n        \"akatsuki souken\": \"晓创圈\",\n        \"ikaring\": \"乌贼轮\",\n        \"marvelous grace\": \"Marvelous Grace\",\n        \"muchi muchi seven\": \"ムチムチ7\",\n        \"yuruyuru gts\": \"ゆるゆるGTS\",\n        \"dangerous thoughts\": \"DANGEROUS THOUGHTS\",\n        \"itaba tatamiten\": \"板场叠店\",\n        \"pinvise\": \"pinvise\",\n        \"cobanzame\": \"こばんざめ\",\n        \"p shoukai\": \"P商会\",\n        \"indexacg\": \"IndexACG\",\n        \"yuriai kojinshi kai\": \"悠理爱个人志会\",\n        \"lachenalia\": \"Lachenalia\",\n        \"apricot plus\": \"apricot+\",\n        \"studio huan\": \"STUDIOふあん\",\n        \"machi no onikuya-san\": \"まちのおにくやさん\",\n        \"mnst\": \"MNST\",\n        \"aohige kaizokudan\": \"青髯海贼团\",\n        \"sanbyaku rokujuu do\": \"-三百六十度-\",\n        \"armadillo\": \"Armadillo\",\n        \"spec.c\": \"spec.C\",\n        \"dragon kitchen\": \"Dragon Kitchen\",\n        \"shirukke no ooi zakuro\": \"汁っけの多い柘榴\",\n        \"chocolate cube\": \"CHOCOLATE CUBE\",\n        \"furafura toxin\": \"ふらふらトキシン\",\n        \"cat garden\": \"CAT GARDEN\",\n        \"kuroneko smith\": \"黒猫スミス\",\n        \"rukonosu\": \"龙虎乃巢\",\n        \"samoyedest\": \"サモエデスト\",\n        \"yuunabe shinkouchuu\": \"夕锅进行中\",\n        \"royal milk\": \"Royalみるく\",\n        \"nanohanatea\": \"なのはなtea*\",\n        \"sound sticker\": \"サウンドステッカー\",\n        \"gainamon\": \"がいなもん\",\n        \"loflat\": \"LOFLAT\",\n        \"chococornet\": \"チョココロネ\",\n        \"wnb\": \"WNB\",\n        \"custom size\": \"カスタムサイズ\",\n        \"flicker10\": \"Flicker10\",\n        \"arkhetelos\": \"あるけてろす\",\n        \"juggernaut\": \"じゃがぁの～と\",\n        \"aki no mikaku\": \"あきのみかく\",\n        \"ukatsu de wa nai\": \"うかつではない\",\n        \"ennui\": \"ENNUI\",\n        \"orange channel\": \"ORANGE☆CHANNEL\",\n        \"eternal land\": \"ETERNAL LAND\",\n        \"timtim machine\": \"TIMTIMマシン\",\n        \"artistic time\": \"Artistic Time\",\n        \"niliu chahui\": \"逆流茶会\",\n        \"seikei doujin\": \"正经同人\",\n        \"b.b.t.t.\": \"B.B.T.T.\",\n        \"kumak.com\": \"KUMAK.COM\",\n        \"neruneru\": \"ねるねる\",\n        \"bomb shelter\": \"核弹避难室\",\n        \"shokakuya\": \"少年觉醒夜\",\n        \"toadstool factory\": \"有害蕈类集会所\",\n        \"elane workshop\": \"エルアネ工房\",\n        \"fukuroutei\": \"福笼亭\",\n        \"zvizva-dan\": \"ズビズバ団\",\n        \"uruujima\": \"うるう島\",\n        \"chilled house\": \"CHILLED HOUSE\",\n        \"jack to nicholson\": \"ジャックとニコルソン\",\n        \"shoujo kakei\": \"少女架刑\",\n        \"looptheloop\": \"LOOPTHELOOP!\",\n        \"tsukimi dango\": \"月见团子\",\n        \"paradiddle\": \"パラディドル\",\n        \"mousouzoku no soukutsu\": \"妄想族の巣窟\",\n        \"fuji sengendou\": \"富士浅间堂\",\n        \"negative gang\": \"ネガティブギャング\",\n        \"aloe-nano\": \"Aloe-nano\",\n        \"genshi bangou 47\": \"原子番号47\",\n        \"milky been\": \"Milky Been!\",\n        \"mebae anime\": \"めばえあにめ\",\n        \"alison airlines\": \"ALISON航空\",\n        \"boku to kimi to kakuu sekai to\": \"僕と君と架空世界と\",\n        \"gantai critical\": \"眼帯クリティカル\",\n        \"a-walks\": \"A-WALKs\",\n        \"minuetworks\": \"MinuetWorks\",\n        \"enokiya\": \"榎屋\",\n        \"bindume no kairou\": \"ビン詰めの回廊\",\n        \"mitsuroh\": \"MITSUROH\",\n        \"milk protein\": \"ミルクプロテイン\",\n        \"aokihoshi\": \"AOKIHOSHI\",\n        \"brain dead\": \"ぶれいんでっど\",\n        \"p.p\": \"P:P\",\n        \"loverevo\": \"ラブレボ\",\n        \"po buyuu\": \"PO武勇\",\n        \"zensoku rider\": \"漸速ライダー\",\n        \"windarteam\": \"风艺WindArTeam\",\n        \"curl up\": \"CURL UP\",\n        \"gensou stomach\": \"幻想ストマック\",\n        \"88 gou\": \"88号\",\n        \"ofuton de suyaa\": \"おふとんでスヤァ\",\n        \"fatalpulse\": \"Fatalpulse\",\n        \"oneone1\": \"ONEONE1\",\n        \"marchen box\": \"メルヘンBOX\",\n        \"pokopii\": \"ぽこぴー\",\n        \"hikaru no kobeya\": \"ひかるの小部屋\",\n        \"kiyokawa zaidan\": \"虚川财团\",\n        \"aardvark\": \"Aardvark\",\n        \"no osaka no life\": \"NO OSAKA NO LIFE\",\n        \"peace maker\": \"PEACE MAKER\",\n        \"solid line\": \"Solid Line\",\n        \"makeinu\": \"負け犬\",\n        \"lucky doggy\": \"LUCKY DOGGY\",\n        \"daraku jiko chousa iinkai\": \"堕落事故调查委员会\",\n        \"umi no sachi\": \"うみのさち\",\n        \"yuunagiya\": \"夕凪屋\",\n        \"aimaitei\": \"愛昧亭\",\n        \"ohmiya tsukasa\": \"大宫司\",\n        \"mikekodou\": \"みけこ堂\",\n        \"hekichaen\": \"碧茶园\",\n        \"amatoro bow\": \"甘とろ棒\",\n        \"ruciedo\": \"るしえ堂\",\n        \"jingai makyou\": \"ジンガイマキョウ\",\n        \"steam d\": \"すち～む・D\",\n        \"65535th avenue\": \"65535あべぬー。\",\n        \"makuu gundan\": \"魔空军团\",\n        \"kinokomushin\": \"きのこむ神\",\n        \"ichibariki\": \"一马力\",\n        \"okotan pekoe\": \"おこたんぺこ\",\n        \"we are coming\": \"We are COMING!\",\n        \"sanutei\": \"さぬ亭\",\n        \"tanic ya\": \"タニシ屋\",\n        \"wild flower\": \"WILD FLOWER\",\n        \"brave heart petit\": \"BRAVE HEART petit\",\n        \"chocolate synapse\": \"Chocolate Synapse\",\n        \"boku wa maso desu\": \"僕はマゾです\",\n        \"stanky\": \"STANKY\",\n        \"wizs studio\": \"Wiz's Studio\",\n        \"alkaloid\": \"アルカロイド\",\n        \"d slash l\": \"D/L\",\n        \"kirastar\": \"KiraStar\",\n        \"kokyu no heya\": \"コキュの部屋\",\n        \"askray\": \"AskRay\",\n        \"burstbomb.t\": \"BurstBomb.T\",\n        \"usa daioh\": \"ウサ大王\",\n        \"kaitsushin\": \"海通信\",\n        \"muramuramura\": \"村々村\",\n        \"mumu\": \"夢々\",\n        \"henreikai\": \"片励会\",\n        \"super flat lolinitron\": \"超平板小娘电视台\",\n        \"ashurame gajoh\": \"阿修罗女画帖\",\n        \"kyokushou shoujo\": \"极少少女\",\n        \"luft forst\": \"Luft Forst\",\n        \"gesewa na hanashi\": \"下世話な話\",\n        \"yatsufusa no kobeya\": \"八房の小部屋\",\n        \"ponpharse\": \"ぽんふぁーず\",\n        \"hihumiya\": \"一二三矢\",\n        \"saragi\": \"蛇穴\",\n        \"c2.inc\": \"C2.Inc\",\n        \"km1chome\": \"健町一丁目\",\n        \"atelier dr.heads\": \"アトリエDr.HEAD'S\",\n        \"datsuryoku kenkyuukai\": \"脱力研究会\",\n        \"mebius no wa\": \"Mebiusの環\",\n        \"zenra qq\": \"全裸QQ\",\n        \"ironimu\": \"イロニム\",\n        \"ahobaka\": \"AHOBAKA\",\n        \"corori\": \"CORORI\",\n        \"berosuya\": \"べろす屋\",\n        \"blank check\": \"ぶらんく☆ちぇっく\",\n        \"tonkotsu\": \"とんこつ\",\n        \"necocoya\": \"ねここや\",\n        \"ss-brain\": \"SS-BRAIN\",\n        \"fleur 9 pri\": \"ふるるきゅぷり\",\n        \"jyujiro\": \"十字路\",\n        \"oricomplex\": \"ORICOMPLEX\",\n        \"ohtado\": \"おおた堂\",\n        \"labomagi\": \"らぼまじ!\",\n        \"natsu otome\": \"ナツオトメ\",\n        \"nyanyahouse\": \"NyaNyaHouse\",\n        \"elephant jelly\": \"エレファントゼリー\",\n        \"shounen zoom\": \"少年ズーム\",\n        \"nemuneko\": \"寝梦猫\",\n        \"heart manju mania\": \"はぁと饅頭マニア\",\n        \"dadada coffee\": \"だだだ珈琲\",\n        \"sorairo inn\": \"空色イン\",\n        \"ecchi na taikendan kokuhaku toukou otoko jyuku\": \"エッチな体験談告白投稿男塾\",\n        \"kuramochi zukan\": \"仓持图鉴\",\n        \"uran no yakata\": \"雨兰の馆\",\n        \"tears39\": \"Tears39\",\n        \"milkberry\": \"milkberry\",\n        \"gyoniku\": \"鱼肉\",\n        \"studio c-take\": \"Studio C-TAKE\",\n        \"saru no koshikake\": \"サルノコシカケ\",\n        \"jall boint\": \"ジョールボイント\",\n        \"wadamemo\": \"wadamemo\",\n        \"nanka no atama\": \"何かのあたま!\",\n        \"scratch jikkou iinkai\": \"スクラッチ実行委員会\",\n        \"gn\": \"GN\",\n        \"anko ni gohan\": \"あんこに御飯\",\n        \"hyappo hissatsu\": \"百步必杀\",\n        \"ajiichi\": \"味市\",\n        \"aozoramichi\": \"苍空道\",\n        \"calm atmosphere\": \"カルムアトモスフィア\",\n        \"hikakuteki simple na panty\": \"比較的シンプルなパンティ\",\n        \"hachimitsu romance\": \"蜂蜜ロマンス\",\n        \"trouble makers\": \"Trouble Makers\",\n        \"p-collection\": \"P-Collection\",\n        \"nekotoraya\": \"猫虎屋\",\n        \"wulazula\": \"うらずら\",\n        \"shotaian\": \"所带庵\",\n        \"pirozhki teikoku\": \"ピロシキ帝国\",\n        \"c.rs nest\": \"C.R's NEST\",\n        \"cat expert\": \"きゃっといいえっくす\",\n        \"soundz of bell\": \"Soundz of Bell\",\n        \"achiki no megane\": \"あちきのめがね\",\n        \"blackbox\": \"BlackBox\",\n        \"basutei shower\": \"バス停シャワー\",\n        \"hakueki shobou\": \"白液书房\",\n        \"iromiiro\": \"いろみいろ\",\n        \"uroboros\": \"UROBOROS\",\n        \"marked-two\": \"Marked-two\",\n        \"surume no oka\": \"するめの丘\",\n        \"moezilla-gumi\": \"もえじら組\",\n        \"hisagoya\": \"瓢屋\",\n        \"yohsyuan\": \"杨州庵\",\n        \"bundosuikou\": \"文土水口\",\n        \"potato house\": \"POTATO HOUSE\",\n        \"sabaku x syoujyo\": \"砂漠×少女\",\n        \"hougakuya\": \"方角屋\",\n        \"koro chan fan club\": \"コロちゃんファンクラブ\",\n        \"4hands\": \"4HANDS\",\n        \"takachihoscramble\": \"高千穂スクランブル\",\n        \"doku tonkotsu niku dorei\": \"毒とんこつ肉ドレイ\",\n        \"moon night kitten\": \"月夜のこねこ\",\n        \"american kenpou\": \"アメリカン拳法\",\n        \"erondon hearts\": \"ERONDON HEARTS\",\n        \"shd\": \"SHD\",\n        \"purin kai yoghurt\": \"プリン海ヨーグルト\",\n        \"shouyu no sato\": \"醤油の里\",\n        \"amatou\": \"あまとう | 甘党\",\n        \"sennin no atelier\": \"仙人のアトリエ\",\n        \"magicalflight\": \"MagicalFlight\",\n        \"inucream\": \"いぬくりぃむ\",\n        \"dangan minorz\": \"ダンガンマイナーズ\",\n        \"wohana gokoro\": \"ヲ花心\",\n        \"jack-pot\": \"JACK-POT\",\n        \"gamu-syara\": \"饿武者罗\",\n        \"jinsukeya\": \"甚助屋\",\n        \"mushoku santaro\": \"无色三太郎\",\n        \"team nekojishi\": \"Team Nekojishi\",\n        \"angelbox\": \"ANGELBOX\",\n        \"mokusei zaijuu\": \"木星在住\",\n        \"nekonomizoshiru\": \"猫のみぞ汁\",\n        \"da hootch\": \"DA HOOTCH\",\n        \"hooliganism\": \"集团暴力\",\n        \"eroquis\": \"EROQUIS!\",\n        \"18master\": \"18マスター\",\n        \"date in vitro\": \"Date in vitro\",\n        \"yamanotesen\": \"山手线\",\n        \"lovewn outpost\": \"Lovewn Outpost\",\n        \"kitsune no shippo momitai\": \"狐の尻尾揉みたい\",\n        \"othukimi\": \"オツキミ\",\n        \"mesu gorilla.\": \"メスゴリラ。\",\n        \"samurai ikka\": \"さむらい一家\",\n        \"akutagawa toranosuke\": \"芥川虎之介\",\n        \"seventh zest\": \"seventh zest\",\n        \"niku drill\": \"肉ドリル\",\n        \"mugu\": \"MUGU\",\n        \"kaleido circus\": \"Kaleido Circus\",\n        \"marimofu extension\": \"まりもふえくすてんしょん\",\n        \"piripun\": \"ぴりぷん\",\n        \"g-nose\": \"G-Nose\",\n        \"hokyuun\": \"ほきゅーん\",\n        \"studio boxer\": \"スタジオぼくさぁ\",\n        \"chibikko kingdom\": \"CHIBIKKO KINGDOM\",\n        \"granada sky\": \"グラナダの空\",\n        \"baraneko yougashi-ten\": \"薔薇猫洋菓子店\",\n        \"puu no puupuupuu\": \"ぷぅのぷぅぷぅぷぅ\",\n        \"dokusai switch\": \"独裁スイッチ\",\n        \"junshain inoue\": \"准社员井上\",\n        \"mad order\": \"MAD ORDER\",\n        \"ochikonium\": \"おちこにうむ\",\n        \"arusenchioratatema\": \"アルセンチオラタテマ\",\n        \"fonchau\": \"蜂巢\",\n        \"abalone soft\": \"Abalone Soft\",\n        \"randou house\": \"乱道ハウス\",\n        \"chocolate chuudoku\": \"チョコレイト中毒\",\n        \"blue section\": \"Blue Section\",\n        \"aoin no junreibi\": \"アオインの巡礼日\",\n        \"akutensoushin\": \"恶转奏进\",\n        \"phylactery\": \"PHYLACTERY\",\n        \"hassystant\": \"ハシスタント\",\n        \"rabbit\": \"＊rabbit\",\n        \"kakukonoka\": \"かくこのか\",\n        \"arterial heart\": \"ARTERIALHEART\",\n        \"moriq\": \"moriQ\",\n        \"mofurentei\": \"もふれん亭\",\n        \"sonna kanji de heiankyou\": \"そんな感じで平安京\",\n        \"night springs\": \"ナイトスプリングス\",\n        \"aki to haru no yume\": \"秋と春の夢\",\n        \"tomatohouse-905s room\": \"tomatohouse-905's room\",\n        \"dai 6 kichi\": \"第6基地\",\n        \"movefromoneplacetoheaven\": \"MoveFromOnePlacetoHeaven\",\n        \"workholic\": \"わーくほりっく\",\n        \"astro qube.\": \"AstroQube.\",\n        \"pikorin\": \"ぴこりん!\",\n        \"ngmyu\": \"んみゅ\",\n        \"gintou seika\": \"银糖制菓\",\n        \"damage yuka r\": \"ダメージ床R\",\n        \"ruibosucha\": \"るいぼす茶\",\n        \"kuroisuisei\": \"黒い彗星\",\n        \"se bone\": \"背・骨\",\n        \"tugumix\": \"TUGUMIX\",\n        \"tfc kikaku to yukaina nakamatachi\": \"TFC企画とゆかいな仲間たち\",\n        \"yumemigachi campus\": \"夢想キャンパス\",\n        \"a.o.i\": \"A・O・I\",\n        \"yamanashi musume.\": \"やまなし娘。\",\n        \"zetsubou shiromuji\": \"絶望しろむじ\",\n        \"tottoko mtarou\": \"とっとこMたろう\",\n        \"sad.co\": \"sad.co\",\n        \"an an shokudou\": \"あん♪あん♪食堂\",\n        \"hurupontei\": \"ふるぽん亭\",\n        \"samidaregiri\": \"五月雨斬り\",\n        \"harigane shinshi doumei\": \"针金绅士同盟\",\n        \"dessert time\": \"Dessert Time\",\n        \"fuka fuka\": \"不可不可\",\n        \"suzuki dogezaemon\": \"铃木土下座卫门\",\n        \"anrakugai\": \"安乐街\",\n        \"nurumayu\": \"ぬるま湯\",\n        \"urasekai 2\": \"里世界2\",\n        \"yanyanyo\": \"やんやんよ\",\n        \"fuzukikai\": \"文月会\",\n        \"wanwan bakufu\": \"わんわん幕府\",\n        \"yamitsuki honpo\": \"やみつき本舗\",\n        \"studio kfc\": \"Studio KFC\",\n        \"atelier maso\": \"アトリエマゾ\",\n        \"hachigo\": \"ハチゴ\",\n        \"miyakoochi partisan\": \"都落ちPartisan\",\n        \"efuya\": \"エフ屋\",\n        \"inbuland\": \"iNBULAND\",\n        \"tsukikaze machi\": \"月风町\",\n        \"kuro zuishou\": \"黑水晶\",\n        \"shinyanchi\": \"シンヤんち\",\n        \"gyuunyuu nomiba\": \"牛乳飲み場\",\n        \"kurumi namiki\": \"くるみ並木\",\n        \"kazemichiya\": \"风道屋\",\n        \"su-mi-tan\": \"粟米汤\",\n        \"amuai okashi seisakusho\": \"あむぁいおかし製作所\",\n        \"mofmof\": \"もふもふ\",\n        \"katsu tights\": \"カツタイツ\",\n        \"ainomugen\": \"あいの無限\",\n        \"nuko majin\": \"ぬこ魔神\",\n        \"uni no tane\": \"うにの種\",\n        \"gunjou robot\": \"群青ロボット\",\n        \"hyper dropkick\": \"はいぱーどろっぷきっく\",\n        \"shanghai hanten\": \"上海饭店\",\n        \"hyakki yakou\": \"百鬼夜行\",\n        \"ame ramune\": \"アメラムネ\",\n        \"project kaguya\": \"PROJECT KAGUYA\",\n        \"futayami koubou\": \"双暗工房\",\n        \"mappa namatta\": \"マッパなまった\",\n        \"yumeiro snowgazer\": \"夢色スノーゲイザー\",\n        \"nijutteya\": \"弐十手屋\",\n        \"maguro coffee\": \"まぐろ珈琲\",\n        \"shoujo gesshoku\": \"少女月蝕\",\n        \"kokuto koukuu\": \"黒兎航空\",\n        \"manshin soui\": \"満身創痍\",\n        \"soukousen\": \"創攻線\",\n        \"neko gosho\": \"猫御所\",\n        \"harunatsuakifuyu\": \"春夏秋冬\",\n        \"yoshino\": \"吉野\",\n        \"murakami suigun no yakata\": \"村上水軍の館\",\n        \"takanaedoko\": \"高苗床\",\n        \"ichijikushirabe shiki\": \"九調四季\",\n        \"aoirokanata\": \"蒼色彼方\",\n        \"kurokudo-ya\": \"黒クド屋\",\n        \"iorigumi\": \"庵組\",\n        \"kedama gyuunyuu\": \"毛玉牛乳\",\n        \"gyuunyuuya-san\": \"牛乳屋さん\",\n        \"senpenbankashiki\": \"千变万化式\",\n        \"amakuchi syoujo\": \"あまくち少女\",\n        \"akutoku doumei\": \"悪徳同盟\",\n        \"andorogynous\": \"ANDOROGYNOUS\",\n        \"kikurage-ya\": \"きくらげ屋\",\n        \"shis\": \"SHIS\",\n        \"tomoshibiya koubou\": \"灯夜工房\",\n        \"kakuzato-ichi\": \"核座头市\",\n        \"poppenheim\": \"ぽっぺんはいむ\",\n        \"chitei no nikuya\": \"地底の肉屋\",\n        \"manaita\": \"まないた\",\n        \"mizore nabe\": \"みぞれ鍋\",\n        \"onefes jikkou iinkai\": \"オネフェス実行委員会\",\n        \"isuwie-ya\": \"イスィ屋\",\n        \"yabitsutouge\": \"弥美津峠\",\n        \"chotto dake aruyo.\": \"チョットだけアルヨ。\",\n        \"shiro no ehonya-san\": \"しろの絵本屋さん\",\n        \"neutron city\": \"Neutron city\",\n        \"h-gabmenters\": \"H-gabmenters\",\n        \"shichimen soka\": \"七面楚歌\",\n        \"shin nanka tou\": \"新なんか党\",\n        \"tefutefu.\": \"てふてふ。\",\n        \"menkui\": \"めんくい\",\n        \"amamineko cafe\": \"あまみねこカフェ\",\n        \"maron koubou\": \"マロン工房\",\n        \"nekomonido\": \"ネコモニ堂\",\n        \"nikuniku italian\": \"にくにくイタリアン\",\n        \"darkside room\": \"だーくさいどるーむ\",\n        \"chimee house\": \"ちみはうす\",\n        \"h at break\": \"H@BREAK\",\n        \"saigado\": \"彩画堂\",\n        \"yuuendou\": \"遊猿堂\",\n        \"kouchaya\": \"红茶屋\",\n        \"testa kitchen\": \"てすた厨房\",\n        \"kireinabuta\": \"キレイナブタ\",\n        \"saihate-kukan\": \"最果て空間\",\n        \"seki sabato\": \"関サバト\",\n        \"garyuuya\": \"我龍屋\",\n        \"corona 314\": \"コロナ314\",\n        \"yume to kyouki no chomolung oukoku\": \"夢と狂気のチョモラン王国\",\n        \"lazy star lazy\": \"Lazy★Lazy\",\n        \"70 nenshiki yuukyuu kikan\": \"70年式悠久機関\",\n        \"amazake hatosyo-ten\": \"甘酒鳩商店\",\n        \"batten kariba\": \"X仮歯\",\n        \"mosquitone.\": \"もすきーと音。\",\n        \"hachibusaki\": \"八分咲\",\n        \"kouen tanpaku q\": \"交援蛋白Q\",\n        \"egao de bouryoku\": \"笑顔で暴力\",\n        \"beta houkai\": \"β崩壊\",\n        \"chuuou bunritai\": \"中央分離隊\",\n        \"neko wa manma ga utsukushii\": \"ねこはまんまがうつくしい\",\n        \"nekomarudow.\": \"猫丸堂\",\n        \"honoji\": \"Honoji\",\n        \"watagashi\": \"わた菓子\",\n        \"morphine\": \"モルピネ\",\n        \"amahara teikoku\": \"天原帝国\",\n        \"rocket chousashitsu\": \"ロケット調査室\",\n        \"esora note\": \"エソラnote\",\n        \"ozitan yasan\": \"おじたん屋さん\",\n        \"nechorapoddo\": \"ねちょらぽっど\",\n        \"luminocity\": \"ルミノシティ\",\n        \"gakushokutei\": \"学食亭\",\n        \"nagisa no yoko\": \"渚のヨーコ\",\n        \"ruiketsuan\": \"泪穴庵\",\n        \"ribi dou\": \"RIBI堂\",\n        \"anmonkan\": \"暗梦馆\",\n        \"dairoku kadan\": \"第六花坛\",\n        \"salt choc\": \"塩ちょこ\",\n        \"sawayaka tokunou milk\": \"爽やか特濃みるく\",\n        \"armament calcium\": \"武装カルシウム\",\n        \"sharaku-dou\": \"写楽堂\",\n        \"shoujo renka\": \"少女恋歌\",\n        \"yakiniku tabetai\": \"焼肉食べたい\",\n        \"shiitake nouen\": \"しいたけ農園\",\n        \"almond-nabe\": \"アーモンド鍋\",\n        \"hizaue 5cm\": \"膝上5センチメートル\",\n        \"ponponpain\": \"ぽんぽんぺいん\",\n        \"grinp\": \"GRINP\",\n        \"lost rage\": \"Lost Rage\",\n        \"yahai\": \"矢ハイ\",\n        \"mohumohu chaya\": \"もふもふ茶屋\",\n        \"kirororo\": \"KirororO\",\n        \"zinfandel\": \"ZINFANDEL\",\n        \"fumituki\": \"踏月\",\n        \"mimipuru\": \"みみぷる\",\n        \"yc-tv\": \"YC－TV\",\n        \"strangechameleon\": \"ストカメ\",\n        \"eseneko tale\": \"えせねこてーる\",\n        \"tensaizoku\": \"天災族\",\n        \"zenoside\": \"ぜのさいど\",\n        \"kata k-shiki\": \"型K式\",\n        \"yume no shima\": \"ユメノシマ\",\n        \"dot eito\": \"ドットエイト\",\n        \"ao\": \"青\",\n        \"w-18\": \"W-⑱\",\n        \"poprication\": \"poprication\",\n        \"seemu\": \"seemu。\",\n        \"mix-edge\": \"MIX-EDGE\",\n        \"muni koubou\": \"むに工房\",\n        \"marota teikoku\": \"麻吕太帝国\",\n        \"tenkirin\": \"天气轮\",\n        \"gust\": \"GUST\",\n        \"tsurikichi doumei\": \"釣りキチ同盟\",\n        \"ran-ya\": \"蘭屋\",\n        \"neko-bus tei\": \"ねこバス停\",\n        \"loli ace\": \"ロリエース\",\n        \"dynamo\": \"DYNAMO\",\n        \"clash house\": \"くらっしゅハウス\",\n        \"rainbow vanilla\": \"Rainbow Vanilla\",\n        \"kuma no ana\": \"熊の穴\",\n        \"flourish\": \"flourish\",\n        \"cocoa holic\": \"ココアホリック\",\n        \"retro\": \"RETRO\",\n        \"tekomenchi\": \"てこめんち\",\n        \"nattou misoshiru\": \"納豆味噌汁\",\n        \"kurimomo\": \"くりもも\",\n        \"garimpeiro\": \"Garimpeiro\",\n        \"naturefour\": \"風林火山\",\n        \"usagigo\": \"うさぎ号\",\n        \"cube\": \"CUBE\",\n        \"stella candy\": \"Stella Candy\",\n        \"zip\": \"Zip\",\n        \"moe moe cafe\": \"モエモエカフェ\",\n        \"hitenkei\": \"HitenKei\",\n        \"muzin syoujo\": \"無人少女\",\n        \"hasuneya\": \"はすねや\",\n        \"chilly polka\": \"Chilly polka\",\n        \"morimiyakan\": \"森宫缶\",\n        \"ninokoya\": \"にのこや\",\n        \"mocha2popcorn\": \"mocha*2popcorn\",\n        \"kuronisiki\": \"黒錦\",\n        \"awayukitist\": \"あわ雪チスト\",\n        \"ugc\": \"UGC\",\n        \"akapenguin\": \"アカペンギン\",\n        \"coin toss\": \"こいんとす\",\n        \"haikibutsu\": \"廃棄物\",\n        \"betemius\": \"BETEMIUS\",\n        \"nihon kemomimi suishou iinkai\": \"日本ケモ耳推奨委員会\",\n        \"ayakase-ke no neko\": \"綾枷家の猫\",\n        \"mignon works\": \"MIGNON WORKS\",\n        \"ichijiku yogurt\": \"いちじくよーぐると\",\n        \"egoistic honey\": \"Egoistic Honey\",\n        \"amamiya\": \"甘味屋\",\n        \"curry berg dish\": \"カリーバーグディッシュ\",\n        \"tamanegiya\": \"玉葱屋\",\n        \"casis-kabosu\": \"カシスかぼす\",\n        \"studio a\": \"studio A\",\n        \"shougentei\": \"翔玄亭\",\n        \"d.n.a.lab.\": \"D・N・A.Lab.\",\n        \"kinokonomi\": \"きのこのみ\",\n        \"pigpanpan\": \"PigPanPan\",\n        \"yomairi sensei\": \"よまいり先生\",\n        \"koniro kajitsu\": \"紺色果実\",\n        \"pandora box\": \"ぱんどらぼっくす\",\n        \"jekyll and hyde\": \"Jekyll and Hyde\",\n        \"roentgen\": \"Roentgen\",\n        \"puchimaple\": \"ぷちめいぷる\",\n        \"aratoya\": \"あらと屋\",\n        \"mapler\": \"MAPLER\",\n        \"yuribatake bokujou\": \"百合畑牧場\",\n        \"monyamonya\": \"モニャモニャ\",\n        \"tatakai no kiseki\": \"戦いの軌跡\",\n        \"arcadia\": \"ARCADIA\",\n        \"sorairo nyannyan\": \"空色にゃんにゃん\",\n        \"ichigo crown\": \"Ichigo Crown\",\n        \"side effects\": \"SIDE EFFECTS\",\n        \"t2 art works\": \"T2 ART WORKS\",\n        \"yokkora pencil\": \"よっこらペンシル\",\n        \"marumieya\": \"まる美絵屋\",\n        \"indico lite\": \"Indico lite\",\n        \"haraheridou\": \"はらヘリ堂\",\n        \"hitsuji kikaku\": \"ヒツジ企画\",\n        \"hiyashi yaki teishoku\": \"冷やし焼き定食\",\n        \"burittohiroba\": \"burittohiroba\",\n        \"pypyworks\": \"PYPYworks\",\n        \"lilith lauda laboratory\": \"リリスラウダ研究所\",\n        \"slime kikaku\": \"スライム企画\",\n        \"mukousharan\": \"無口遮欄\",\n        \"l5ex\": \"L5EX\",\n        \"socha-ya\": \"そちゃ屋\",\n        \"mermerry\": \"メルメリー\",\n        \"doyagaobyo\": \"どや顔病\",\n        \"studio hitoribocchi\": \"スタジオひとりぼっち\",\n        \"kyokutou koumuten\": \"极东工务店\",\n        \"takemasaya\": \"たけまさ屋\",\n        \"novelize\": \"NOVELIZE\",\n        \"konohanaku\": \"此花区\",\n        \"hisyoku no tansansui\": \"緋色の炭酸水\",\n        \"comoyoko\": \"コモヨコ\",\n        \"witchs marionette\": \"witch's marionette\",\n        \"key trash\": \"KEY TRASH\",\n        \"alchemy\": \"あるけみい\",\n        \"a.l.l\": \"A・L・L\",\n        \"hiyakake gohan\": \"ひやかけごはん\",\n        \"expander welder\": \"エキスパンダー溶接\",\n        \"makarontaitei\": \"まかろん大帝\",\n        \"hoshi to matango\": \"ほしとマタンゴ\",\n        \"resort ukami\": \"リゾートうかみ\",\n        \"hatishiro\": \"はちしろ\",\n        \"yureru keikoutou\": \"揺れる蛍光灯\",\n        \"rump\": \"RUMP\",\n        \"soratomoe\": \"ソラトモエ\",\n        \"death para\": \"ですぱら\",\n        \"hachiouji kaipan totsugeki kiheitai\": \"八王子海パン突撃騎兵隊\",\n        \"sand\": \"sand\",\n        \"usagigoya.\": \"うさぎごや。\",\n        \"genmaicha\": \"玄米茶\",\n        \"skk\": \"SKK\",\n        \"ins-mode\": \"INS-mode\",\n        \"mellowmind\": \"めろうまいんど\",\n        \"40denier\": \"40デニール\",\n        \"utsura uraraka\": \"うつらうららか\",\n        \"pannomimi\": \"ぱんのみみ\",\n        \"sweet avenue\": \"Sweet Avenue\",\n        \"atelier stars\": \"あとりえスターズ\",\n        \"wildstyle\": \"wildstyle\",\n        \"monofille\": \"モノフィーユ\",\n        \"cassiopeia\": \"CASSIOPEIA\",\n        \"keepon\": \"keepON\",\n        \"yojigen kaidenpa\": \"四次元怪電波\",\n        \"saikutsu kichi\": \"採掘基地\",\n        \"7th semicolon mint\": \"7th;Mint\",\n        \"hitsuji no gohan\": \"ひつじのごはん\",\n        \"tokyoboogienight\": \"桃京武戯夜\",\n        \"taco\": \"TACO\",\n        \"pirokobo\": \"ピロコボ\",\n        \"fujitsubo-machine\": \"富士壺機械\",\n        \"kokusai tenjijou uramon\": \"国際展示場裏門\",\n        \"daifuku\": \"大福\",\n        \"misaki\": \"三崎\",\n        \"umenomi gahou\": \"梅の実画報\",\n        \"akari blast\": \"Akari blast!\",\n        \"rokata aruki\": \"縁側珈琲\",\n        \"idonchi\": \"いどんち\",\n        \"sanbaizu\": \"三杯酢\",\n        \"j.d.world\": \"J.D.World\",\n        \"0000\": \"0000\",\n        \"lovelyplace\": \"LOVELYPLACE\",\n        \"studio hatake\": \"STUDIO畑\",\n        \"seitokaishitsu\": \"生徒会室\",\n        \"kuma no tooru michi\": \"くまのとおるみち\",\n        \"kindou shoujo\": \"金瞳少女\",\n        \"yukimi-fuumi\": \"ゆきみ風味\",\n        \"cotesdenoix\": \"CotesDeNoix\",\n        \"from nuts\": \"From nuts\",\n        \"upagoya\": \"うぱ小屋\",\n        \"muraimura\": \"村井村\",\n        \"apple effect\": \"Apple Effect\",\n        \"sukoburuyama\": \"すこぶるやま\",\n        \"otabe dynamites\": \"おたべ★ダイナマイツ\",\n        \"milk bar\": \"MILK BAR\",\n        \"chikuwa no wakka\": \"ちくわのわっか\",\n        \"nekoyashiki\": \"猫屋敷\",\n        \"cheeseyeast\": \"チーズ酵母\",\n        \"neko tanteidan peach\": \"ネコ☆探偵団\",\n        \"water drop\": \"うぉーたーどろっぷ\",\n        \"honey butter3g\": \"はちみつバター3g\",\n        \"ichibocchi\": \"ゐちぼっち\",\n        \"low temp\": \"low*temp\",\n        \"against\": \"against\",\n        \"jigizagi\": \"ジギザギ\",\n        \"pochi\": \"POCHI\",\n        \"dragon panda\": \"DRAGON PANDA\",\n        \"trip spider\": \"TRIP SPIDER\",\n        \"smile studio\": \"すまいるすたじお\",\n        \"nimunoya\": \"にむの屋\",\n        \"studio big-x\": \"スタジオBIG-X\",\n        \"uzumaki hiyoko\": \"うずまき☆ひよこ\",\n        \"shinshi kouryuuku\": \"紳士交流区\",\n        \"yugen no suda\": \"有限の須田\",\n        \"daidabi\": \"ダイダビ\",\n        \"selvage fisheries\": \"セルビッチ水産\",\n        \"take out\": \"Take Out\",\n        \"necomicle\": \"necömicle\",\n        \"omlet\": \"OMLET\",\n        \"kohipotion\": \"KOHIPOTION\",\n        \"allegro mistic\": \"Allegro Mistic\",\n        \"aho-cross\": \"AHO-CROSS\",\n        \"nekosu no sumika\": \"ねこすのすみか\",\n        \"izumiya\": \"いずみ屋\",\n        \"middly\": \"MIDDLY\",\n        \"0846net\": \"オヤシロネット\",\n        \"fuzichaku\": \"不時着\",\n        \"studio snow man\": \"Studio Snow Man\",\n        \"goldengoblins\": \"GoldenGoblins\",\n        \"kitaku jikan\": \"归宅时间\",\n        \"tanima ginkou\": \"谷间银行\",\n        \"nagaredamaya\": \"流弹屋\",\n        \"dschinghis khan no tamanegi wa ore no yome\": \"ジンギスカンの玉葱は俺の嫁\",\n        \"usagi boss\": \"兔子老大\",\n        \"popochichi\": \"ぽぽちち\",\n        \"g.y.more.l\": \"G.Y.MORE.L\",\n        \"nyoudou juunisei\": \"尿道十二世\",\n        \"hobukuro\": \"ほおぶくろっ!\",\n        \"yasai no kuni\": \"野菜の国\",\n        \"ikkizuka\": \"いっきづか\",\n        \"komadori nouen\": \"こまどり農園\",\n        \"kuma-tan flash\": \"くまたんFlash!\",\n        \"ryuu no kinyoubi\": \"龍の金曜日\",\n        \"kuusoubune\": \"空想舟\",\n        \"perorimeshi.\": \"ぺろり飯。\",\n        \"coupe pain ginga\": \"こっぺぱん銀河\",\n        \"kimi no tomodachi.\": \"君の友達。\",\n        \"mugendai\": \"無限大\",\n        \"sanshikisumire\": \"さんしきすみれ\",\n        \"beruennea\": \"ベルエンネーア\",\n        \"orange tile\": \"オレンジタイル\",\n        \"laminaria\": \"LAMINARIA\",\n        \"nanbou hitogakushiki\": \"南方ヒトガクシキ\",\n        \"narumiya\": \"成宮\",\n        \"circle-fiore\": \"サークルフィオレ\",\n        \"popopo\": \"ぽぽぽ\",\n        \"toushitu catapult\": \"糖質過多ぱると\",\n        \"ojopie sentimental\": \"おじょぱいセンチメンタル\",\n        \"dokutoku no m\": \"独特のM\",\n        \"watari laboratory\": \"渡里laboratory\",\n        \"wappururun\": \"わっぷるるん\",\n        \"anzen chitai\": \"安全地带\",\n        \"loli seiyouken\": \"萝莉西洋剑\",\n        \"shimizuan\": \"清水庵\",\n        \"sakusei kenkyuujo\": \"搾精研究所\",\n        \"in the sky\": \"In The Sky\",\n        \"happy aroma\": \"Happy Aroma\",\n        \"molamola\": \"Molamola\",\n        \"masochist high\": \"マゾヒスト・ハイ\",\n        \"onsoku\": \"おんそく\",\n        \"ringoen\": \"RINGOEN\",\n        \"koibito wa kuroi neko\": \"コイビトハクロイネコ\",\n        \"hz-box\": \"Hz-box\",\n        \"waterfall\": \"Waterfall\",\n        \"amamori weekly\": \"あまもりウィークリー\",\n        \"signalmass\": \"SignalMass\",\n        \"suoiretsym\": \"スアリテスミ\",\n        \"rireba\": \"リレバ\",\n        \"crerpsucre\": \"CrerpSucre\",\n        \"indo no kyuuden\": \"いんどの宮殿!\",\n        \"kacchuu musume\": \"甲冑娘\",\n        \"110-groove\": \"110-GROOVE\",\n        \"yuuki kagoubutsu\": \"有機化合物\",\n        \"a gokuburi\": \"A極振り\",\n        \"sendouya\": \"千堂屋\",\n        \"kokusan jk\": \"国产JK\",\n        \"istanbul high sox\": \"イスタンブール・ハイソックス\",\n        \"chika 7cm\": \"地下7cm\",\n        \"secret society m\": \"秘密结社M\",\n        \"kawaraya-koubou\": \"瓦屋工房\",\n        \"kamishiki\": \"かみしき\",\n        \"popocket\": \"ぽぽケット\",\n        \"tanu choco\": \"たぬチョコ\",\n        \"taketate kakeya\": \"竹立掛屋\",\n        \"rico-ba\": \"Rico-ba\",\n        \"futotta obasan\": \"太ったおばさん\",\n        \"mainichi kenkou seikatsu\": \"毎日健康生活\",\n        \"noramani\": \"のらまに\",\n        \"w no honnou\": \"Wの本能\",\n        \"tokyo prominence tomato\": \"东京プロミネンストマト\",\n        \"gainax\": \"GAINAX\",\n        \"sister mytory\": \"Sister Mytory\",\n        \"yubisaki studio\": \"ユビサキスタジオ\",\n        \"wata punch\": \"WATA★PUNCH\",\n        \"poyopoyosky\": \"ぽよぽよスカイ\",\n        \"world of pure\": \"ワールドオブピュア\",\n        \"hakusen\": \"はくせん\",\n        \"pietoro\": \"ピエトロ\",\n        \"doukyara doukoukai\": \"同キャラ同好会\",\n        \"yosutebito na mangakaki\": \"世捨人な漫画描き\",\n        \"bakunyu fullnerson\": \"爆乳フルネルソン\",\n        \"kyockchokyock\": \"きょくちょ局\",\n        \"satoh katoh\": \"砂糖加糖\",\n        \"condaya\": \"今田屋\",\n        \"tennen koubo pan koubou\": \"天然酵母パン工房\",\n        \"hiyoko sabure\": \"ひよこサブレ\",\n        \"ashitamooyasumi\": \"あしたもおやすみ!\",\n        \"crown\": \"CROWN\",\n        \"island of horizon\": \"Island of Horizon\",\n        \"elriz\": \"ELRIZ\",\n        \"yakiniku teikoku\": \"焼肉帝国\",\n        \"gouache blue\": \"GOUACHE BLUE\",\n        \"duralumin love\": \"ジュラルミンラブ\",\n        \"ganryuu island\": \"巌流アイランド\",\n        \"ryoushi koubou\": \"量子工房\",\n        \"sprelidia\": \"sprelidia\",\n        \"iaidou\": \"居合堂\",\n        \"waterwheel\": \"waterwheel\",\n        \"kitaguni moyashi seizousho\": \"北国もやし製造所\",\n        \"god ryokutya\": \"GOD緑茶\",\n        \"t.4.p\": \"T.4.P\",\n        \"jagabata\": \"じゃがバター\",\n        \"ryuuseidou honpo\": \"龍正堂本舗\",\n        \"tonzura douchuu\": \"とんずら道中\",\n        \"kuromahou kenkyuujo\": \"黒魔法研究所\",\n        \"hotel negresco\": \"Hotel Negresco\",\n        \"kuzunoha\": \"屑乃葉\",\n        \"moni\": \"moni\",\n        \"greennight\": \"GreeNNight\",\n        \"unsympathetic\": \"疎ましいくらいな\",\n        \"meisaiya\": \"meisaiya\",\n        \"tegone spike\": \"てごねスパイク\",\n        \"amasyrup\": \"amasyrup\",\n        \"maybenavy\": \"MaybeNavy\",\n        \"nounai kanojo\": \"脑内彼女\",\n        \"jinsei yokosuberi.\": \"人生横滑り。\",\n        \"sanshoku nattou meshi\": \"三食納豆飯\",\n        \"shiguredoki\": \"しぐれどき\",\n        \"hirusuta\": \"昼星\",\n        \"shikaniku kohan\": \"しかにく湖畔\",\n        \"ua daisakusen\": \"U・A大作戦\",\n        \"white parabellum\": \"white parabellum\",\n        \"pecora room\": \"pecora room\",\n        \"lonely church\": \"Lonely Church\",\n        \"nekotyabatake\": \"猫茶畑\",\n        \"practice\": \"practice\",\n        \"sakuranoiro\": \"サクラノイロ\",\n        \"lunatic maiden\": \"Lunatic*Maiden\",\n        \"freelance\": \"FREELANCE\",\n        \"nekono oyashiro\": \"ねこのおやしろ\",\n        \"croix crown\": \"croix crown\",\n        \"chronolog\": \"CHRONOLOG\",\n        \"fururi.\": \"ふるり。\",\n        \"amamitu hakushi\": \"甘蜜博士\",\n        \"masaru dot com\": \"マサルドットコム\",\n        \"irodori\": \"IRODORI\",\n        \"kamaboko koubou\": \"カマボコ工房\",\n        \"shiki be careful\": \"四季注意\",\n        \"yamakon-ya\": \"山绀屋\",\n        \"botugo\": \"没后\",\n        \"calm white\": \"カームホワイト\",\n        \"curtaincall\": \"CurtainCαll\",\n        \"rainboy\": \"RainBoy\",\n        \"nekocat\": \"NekoCat\",\n        \"dicebomb\": \"DiceBomb\",\n        \"tetrapot\": \"TETRAPOT\",\n        \"tabgraphics\": \"tabgraphics\",\n        \"akari koubou\": \"灯工房\",\n        \"kajou sesshu\": \"過剰摂取\",\n        \"mousou bijutsubu\": \"妄想美術部\",\n        \"yuruyakatou\": \"ゆるやか島\",\n        \"p.a. works\": \"P.A.Works\",\n        \"commamion\": \"狐狸恩\",\n        \"gantai shoujo chudoku\": \"眼帯少女中毒\",\n        \"alice syndrome\": \"アリスシンドローム\",\n        \"pale light\": \"PALE LIGHT\",\n        \"saboten saibaijo\": \"サボテン栽培所\",\n        \"tsundere is love\": \"Tsundere is Love\",\n        \"irodoriya\": \"彩屋\",\n        \"kinakomochi\": \"木なこもち\",\n        \"gelatin\": \"Gelatin*\",\n        \"kusakabeworks\": \"KusakabeWorks\",\n        \"maho-bin\": \"まほ～びん\",\n        \"near harmonica\": \"ニアハモニカ\",\n        \"kankitsu shoujo\": \"柑橘少女\",\n        \"chickelata\": \"チキラータ\",\n        \"shida bokujou\": \"羊歯牧場\",\n        \"chiffonxx\": \"Chiffonxx\",\n        \"floralia\": \"Floralia\",\n        \"happy color festival\": \"HAPPY COLOR FESTIVAL!\",\n        \"sembyokibu\": \"扇猫喜舞\",\n        \"weapon container\": \"武器櫃\",\n        \"shinsekai set\": \"シンセカイセット\",\n        \"ruinon\": \"RUINON\",\n        \"yamada shoukai\": \"山田商会\",\n        \"takemoto seisaku iinkai\": \"竹本製作委員会\",\n        \"umemoto seisaku iinkai\": \"梅本制作委員会\",\n        \"kotei gainen\": \"固定概念\",\n        \"akausagi\": \"赤兔\",\n        \"haru koubou\": \"春工房\",\n        \"rin yuu\": \"Rin☆Yuu\",\n        \"citron no mori\": \"しとろんの杜\",\n        \"mugen jirai\": \"无限地雷\",\n        \"pion\": \"Pion\",\n        \"kuragamo\": \"蔵鴨\",\n        \"kaguya hime koubou\": \"火愚夜姫工房\",\n        \"ikujinashi no fetishist\": \"いくじなしのフェティシスト\",\n        \"fuzuii undou\": \"不随意運動\",\n        \"circle tokomaya\": \"サークルとこまや\",\n        \"barumishu\": \"ばーるみしゅ\",\n        \"megami no flask\": \"女神のフラスコ\",\n        \"hiiro no kenkyuushitsu\": \"灯色の研究室\",\n        \"sukiyaki club\": \"すきやきクラブ\",\n        \"kasoku edge\": \"かそくえっぢ\",\n        \"doku denpa jushin-chuu\": \"毒電波受信中\",\n        \"ebi manga teikoku\": \"えびまんが帝国\",\n        \"180milli cannon\": \"180ミリキャノン\",\n        \"zetsubou teisyoku\": \"ぜつぼう定食\",\n        \"milk engine\": \"Milk Engine\",\n        \"romantic sintai-kensa.\": \"ロマンティック身体検査\",\n        \"white guardian\": \"White Guardian\",\n        \"creayus\": \"CREAYUS\",\n        \"chabashira chainsaw\": \"チャバシラチェーンソー\",\n        \"renai mangaka\": \"恋爱漫画家\",\n        \"hakuto-can\": \"白桃缶\",\n        \"kemono ekaki no kousoku 2\": \"ケモノ絵描きの光速2\",\n        \"niji no magellan\": \"にじのまぜらん\",\n        \"nyanko batake\": \"猫畑\",\n        \"tsukimi dojin\": \"月見道神\",\n        \"sakanaya\": \"魚屋\",\n        \"tonyu bokujo\": \"豆乳牧場\",\n        \"kanai\": \"仮名居\",\n        \"tateyoko issen\": \"縦横一線\",\n        \"ohoshisamadou\": \"おほしさま堂\",\n        \"pure plastic\": \"純情プラスチック\",\n        \"otaku beam\": \"オタクビーム\",\n        \"gin no ame\": \"銀のあめ\",\n        \"mochipeach\": \"MochiPeach\",\n        \"tokunocin\": \"tokunocin\",\n        \"viking\": \"バイキング\",\n        \"caslton\": \"キャッスルトン\",\n        \"ntroom.\": \"NTroom.\",\n        \"shiropro\": \"しろぷろ\",\n        \"bizen dorobune koubou\": \"備前泥舟工房\",\n        \"kitsune no yomeiri\": \"きつねのよめいり\",\n        \"shinsei lolishota\": \"新生ロリショタ\",\n        \"bakuretsu fusen\": \"爆裂风船\",\n        \"natsume benkei\": \"夏目ベンケイ\",\n        \"la-go-on\": \"LA-GO-ON\",\n        \"takahashisan\": \"たかはしさん\",\n        \"kiracnadays\": \"KiracnaDays\",\n        \"nagomi\": \"和\",\n        \"dekoboko hurricane\": \"凸凹ハリケーン\",\n        \"amaineiro\": \"あまいねいろ\",\n        \"gentsuki okiba\": \"ゲンツキオキバ\",\n        \"mashira dou\": \"ましら堂\",\n        \"nijitsuya kenkyuujo\": \"虹艶研究所\",\n        \"samurai ninja greentea\": \"サムライ忍者GREENTEA\",\n        \"alicesyndrome\": \"AliceSyndrome*\",\n        \"uousaohkoku\": \"鱼ウサ王国\",\n        \"konoshiro shinko\": \"コノシロしんこ\",\n        \"kansai orange\": \"关西オレンジ\",\n        \"imomuya honpo\": \"いもむや本舗\",\n        \"ryuukakusan nodoame\": \"龙角散喉糖\",\n        \"okadatei\": \"おかだ亭\",\n        \"niramikko koujou\": \"にらみっ子工場\",\n        \"kaeri no kai 2\": \"帰りの会2\",\n        \"4h\": \"4H\",\n        \"kaitoushinshidan\": \"怪盗绅士团\",\n        \"pastyle\": \"pastyle\",\n        \"chocolate sheep\": \"Chocolate Sheep\",\n        \"hokkyoku tairiku\": \"北極大陸\",\n        \"fuguriya\": \"ふぐり屋\",\n        \"inran shounen\": \"淫乱少年\",\n        \"rokumonsen\": \"ろくもんせん\",\n        \"tenkaichi babys\": \"天下一Babys\",\n        \"beniya\": \"红屋\",\n        \"sashichigai-dan\": \"挿し違い団\",\n        \"yasai batake\": \"諏訪やさい\",\n        \"ichimi-zanmai\": \"一味三昧\",\n        \"sugar berry syrup\": \"Sugar＊Berry＊Syrup\",\n        \"kousei\": \"コウセイ\",\n        \"sugarringo\": \"SUGARRINGO\",\n        \"hajimeryu\": \"はじめりゅう\",\n        \"neovertex\": \"NEOVERTEX\",\n        \"mizuiro no bara\": \"水色のバラ\",\n        \"trinket\": \"TrinkeT\",\n        \"letra\": \"LETRA\",\n        \"kitazawa sangyo\": \"北沢産業\",\n        \"chocolate land\": \"ちょこれーとらんど\",\n        \"zebrasmise\": \"zebrasmise\",\n        \"kakurenbo\": \"かくれんぼ\",\n        \"chericot rozel\": \"Chericot*Rozel\",\n        \"pockyfactory\": \"PockyFactory\",\n        \"pixel phantom\": \"Pixel Phantom\",\n        \"afurokuma honten\": \"アフロくま本店\",\n        \"sashimi necoya\": \"さしみねこ屋\",\n        \"rurudot\": \"rurudot\",\n        \"nanashimushi land\": \"ななし虫らんど\",\n        \"chaos no genri\": \"カオスの原理\",\n        \"black sousai studio\": \"BLACK SOUSAI STUDIO\",\n        \"haechaimu\": \"ハエチャイム\",\n        \"jagaimo kenkyuujo\": \"じゃがいも研究所\",\n        \"madoromi andon\": \"まどろみ行灯\",\n        \"hakoniwa-kairou\": \"はこにわかいろう\",\n        \"akitake zensen\": \"秋茸前线\",\n        \"octopus jelly\": \"Octopus Jelly\",\n        \"kaden ryohanten seijin corner\": \"荷電量販店成人コーナー\",\n        \"black note\": \"ブラックノート\",\n        \"sentimentcolor\": \"SentimentColor\",\n        \"komowa\": \"こも輪\",\n        \"baby lop\": \"Baby Lop\",\n        \"mersugar\": \"Mersugar\",\n        \"nagatsuki\": \"NAGATSUKI\",\n        \"tayanumaya\": \"田屋沼屋\",\n        \"bottle ship bottler\": \"ボトルシップボトラー\",\n        \"saz\": \"SAZ\",\n        \"clowns\": \"Clowns'\",\n        \"toumei dolce\": \"透明ドルチェ\",\n        \"peroppoi tokoro\": \"ぺろっぽい処\",\n        \"earrings bom factory\": \"イヤリング爆弾工場\",\n        \"ororiya enpitsudo\": \"オロリヤ鉛筆堂\",\n        \"l.g.c.\": \"L.G.C.\",\n        \"midorineko\": \"みどりねこ\",\n        \"q-model\": \"Q-MODEL\",\n        \"cherish\": \"*Cherish*\",\n        \"allows\": \"Allows\",\n        \"pico martel\": \"Pico Martel\",\n        \"osenbei no mori\": \"おせんべいの森\",\n        \"sakura saku saku\": \"佐倉さくさく\",\n        \"calorie and cholesterols\": \"カロリー&Cholesterols\",\n        \"stapspats\": \"Stapspats\",\n        \"letitia no ohirune\": \"レティーシャのお昼寝\",\n        \"rokumarusou\": \"ろくまる荘\",\n        \"yamo7\": \"ヤモセブン\",\n        \"ginga-kei pride\": \"银河系PRIDE\",\n        \"suiikazuchi\": \"スイイカズチ\",\n        \"atelier hinata\": \"あとりえひなた\",\n        \"tortoiseshell\": \"トーティシェル\",\n        \"shinoya\": \"篠屋\",\n        \"ink complex\": \"Ink Complex\",\n        \"supe\": \"すぺ\",\n        \"akaneiro\": \"紅音色\",\n        \"hakukoukai\": \"白蛟会\",\n        \"marshmallow balloon\": \"マシュマロ風船\",\n        \"zombie to yukaina nakamatachi\": \"ぞんびと愉快な仲間たち\",\n        \"anmitsuyomogitei\": \"あんみつよもぎ亭\",\n        \"golden complex\": \"金色complex\",\n        \"kannko bokujyo\": \"缶子牧場\",\n        \"sencyairo\": \"sencyairo\",\n        \"himeya\": \"姫屋\",\n        \"doanobu\": \"どあのぶ\",\n        \"bunka shinryaku\": \"文化☆侵略\",\n        \"gokudou daigensui\": \"極道大元帥\",\n        \"oojikake\": \"大仕掛け\",\n        \"illumination.\": \"ゐるみねゐしょん。\",\n        \"sumi kara sumi made\": \"スミカラスミマデ\",\n        \"kankodori chaen\": \"閑古鳥茶園\",\n        \"hell and heaven\": \"ヘルアンドヘブン\",\n        \"kisarazu teikoku\": \"きさらづ帝国\",\n        \"tiba-santi\": \"千葉産地\",\n        \"yokoshoku ice\": \"洋紅色アイス\",\n        \"nekomaru shouten\": \"猫マル商店\",\n        \"pandagaippiki.\": \"パンダが一匹。\",\n        \"tousen soudou\": \"冬扇草堂\",\n        \"jukusei kakuzatou\": \"熟成角砂糖\",\n        \"mikenekohanten\": \"三毛猫饭店\",\n        \"kamikire basami\": \"紙切ればさみ\",\n        \"undescribed\": \"アンディスクライブド\",\n        \"koharu syojo\": \"小春少女\",\n        \"hakai daiteikoku\": \"破坏大帝国\",\n        \"gusha suumitsuin\": \"愚者枢密院\",\n        \"kotsubuan\": \"こつぶあん\",\n        \"gokusaishiki\": \"极彩色\",\n        \"kirintei\": \"木铃亭\",\n        \"kanyou shoujo\": \"观用少女\",\n        \"ferallemma\": \"フィラレマ\",\n        \"bakayaro\": \"ばかやろう\",\n        \"nanimoshinai\": \"NANIMOSHINAI\",\n        \"mokumokusei\": \"モクモクセイ\",\n        \"junjou harinezumi\": \"純情ハリネズミ\",\n        \"miniomlet ongakudan\": \"ミニオムレツ音楽団\",\n        \"baiuzensen\": \"梅雨前線\",\n        \"nagomiyasan\": \"なごみやさん\",\n        \"kocc house\": \"koccハウス\",\n        \"hito no fundoshi\": \"人の裈\",\n        \"himitsukessya usagi\": \"秘密结社兔\",\n        \"nekonecotton\": \"ねこねこっとん\",\n        \"punipuni no hoppe\": \"ぷにぷにのほっぺ\",\n        \"houkago inokorigumi\": \"放課後居残り組\",\n        \"hokkyoku hotaru\": \"北極ホタル\",\n        \"kikyakudou\": \"鬼脚堂\",\n        \"ikameshi shokudou\": \"乌贼饭食堂\",\n        \"tairikukan dandoudan dan\": \"大陆间弹道弹团\",\n        \"shimobashira koubou\": \"しもばしら工房\",\n        \"muriyari egao\": \"无理矢理笑颜\",\n        \"southbamboo\": \"南方山竹笋\",\n        \"permission\": \"ぱ～みっしょん\",\n        \"tsuki usagi\": \"月うさぎ\",\n        \"ameiro\": \"あめいろ\",\n        \"alpharalpha alley\": \"アルファラルファ裏通り\",\n        \"thirty saver street 2d shooting\": \"サーティセイバーストリート\",\n        \"ruri ruri kikaku\": \"瑠璃瑠璃企画\",\n        \"amanedou\": \"あまね堂\",\n        \"esperanza\": \"真田成\",\n        \"tamago no kimi\": \"卵の黄身\",\n        \"shadan katsudoh\": \"遮断活動\",\n        \"tougen shokken\": \"桃幻食研\",\n        \"ciel-arc\": \"しえるあーく\",\n        \"meshi shinja\": \"饭信者\",\n        \"ishimuraya\": \"石村屋\",\n        \"seika kairaku shoten\": \"圣华快乐书店\",\n        \"ringo no naru ki\": \"林檎のなる木\",\n        \"traya\": \"TraYA\",\n        \"kuzuya\": \"屑屋\",\n        \"momojiru teien\": \"桃汁庭园\",\n        \"tamatamasanmyaku\": \"たまたま山脈\",\n        \"harthnir\": \"HarthNir\",\n        \"yoru no hitsuji\": \"夜のひつじ\",\n        \"nawairo sonata\": \"縄色ソナタ\",\n        \"momokamasu\": \"ももかます\",\n        \"kumo no ito\": \"雲之糸\",\n        \"tokachibare\": \"十勝晴レ\",\n        \"bomubomuburin\": \"ボムボムブリン\",\n        \"nisiarea\": \"にしえりあ\",\n        \"mentsukidou\": \"眼ん月堂\",\n        \"izumo gingatei\": \"出雲銀河亭\",\n        \"gedoudan\": \"外道团\",\n        \"garyuh-chitai\": \"我流痴带\",\n        \"tsf mousou chikusekijo\": \"TSF妄想蓄积所\",\n        \"ntype\": \"NtyPe\",\n        \"h.b\": \"H・B\",\n        \"star track\": \"★track\",\n        \"o.s\": \"O.S\",\n        \"wakame no oyatsu\": \"Wakame no Oyatsu\",\n        \"pantyhose\": \"パンティーHOSE\",\n        \"tomboy\": \"TomBoy\",\n        \"... mou ii desu.\": \"…もういいです。\",\n        \".7\": \".7\",\n        \".miz\": \".miz\",\n        \"0-parts\": \"0-PARTS\",\n        \"0123456789\": \"0123456789\",\n        \"02\": \"02\",\n        \"03-3297\": \"03-3297\",\n        \"04\": \"04\",\n        \"04th heaven\": \"04th Heaven\",\n        \"04u\": \"04U\",\n        \"0725co\": \"0725co\",\n        \"08base\": \"08BASE\",\n        \"096\": \"096\",\n        \"10-man bariki\": \"10マン馬力\",\n        \"10.10mhz\": \"10.10MHz\",\n        \"1000ap\": \"1000AP\",\n        \"100acre\": \"100Acre\",\n        \"100yenmofa\": \"100円外務省\",\n        \"102 goushitsu\": \"102号室\",\n        \"106gou\": \"106GOU\",\n        \"106m\": \"106m\",\n        \"10mile\": \"10mile\",\n        \"10pasec no kanata\": \"拾八secの彼方\",\n        \"10wadaxx\": \"10wadaxx\",\n        \"10yen jondo\": \"10円ジョンドゥ\",\n        \"110u\": \"いいお湯\",\n        \"112k\": \"112K\",\n        \"12-jigen\": \"12次元\",\n        \"12cut\": \"12CUT\",\n        \"12kaffeins\": \"12KAFFEINS\",\n        \"13cm\": \"13cm\",\n        \"148bpm\": \"148bpm\",\n        \"14lolita\": \"14ロリータ\",\n        \"152hertz\": \"152HERTZ\",\n        \"16 sai\": \"16彩\",\n        \"16000 all\": \"16000オール\",\n        \"16kenme\": \"16軒目\",\n        \"1756 studio\": \"1756スタジオ\",\n        \"17in\": \"17in\",\n        \"17w\": \"17W\",\n        \"180r\": \"180R\",\n        \"185 souko\": \"185倉庫\",\n        \"1bit\": \"1bit\",\n        \"1gaya\": \"1gaya\",\n        \"1or8\": \"イチカバチカ\",\n        \"2 carat\": \"2カラット\",\n        \"2000kcal shake club\": \"2000kcalシェイク同好会\",\n        \"209 goushitsu\": \"209号室\",\n        \"20liquid\": \"20LIQUID\",\n        \"20r0\": \"20R0\",\n        \"20twenty\": \"20twenty\",\n        \"231179rock\": \"231179=ROCK\",\n        \"241 inc.\": \"241 Inc.\",\n        \"273k\": \"273K\",\n        \"2b\": \"2B\",\n        \"2cv.ss\": \"2CV.SS\",\n        \"2d-note\": \"2D-Note\",\n        \"2h\": \"2H\",\n        \"2jimusubi\": \"二次結び\",\n        \"2m\": \"2m\",\n        \"2nd\": \"2ND\",\n        \"2nd life\": \"2nd Life\",\n        \"2p-color\": \"2P-Color\",\n        \"2stroke\": \"2ストローク\",\n        \"2tailqueen\": \"2tail Queen\",\n        \"2vs\": \"2vs\",\n        \"2zigen\": \"2ZIGEN\",\n        \"3 colors cat\": \"3 colors cat\",\n        \"3 colors corona\": \"3色コロナ\",\n        \"3 on 10\": \"3 on 10\",\n        \"3-2 gagen\": \"3-2画源\",\n        \"3-mega.ne\": \"3-MEGA.ne\",\n        \"3.5tousin\": \"3.5等身\",\n        \"300cm\": \"300cm\",\n        \"301 goushitsu\": \"301号室\",\n        \"30min-5000yen\": \"30分5000円ポッキリ\",\n        \"321go\": \"321go\",\n        \"360 degrees c\": \"360°C\",\n        \"36k\": \"36K\",\n        \"38shiki\": \"三十八式\",\n        \"39dmp\": \"39dmp\",\n        \"39xream\": \"ミックスリーム\",\n        \"3egg\": \"3egg\",\n        \"3jou\": \"3情\",\n        \"3lbox\": \"3LBOX\",\n        \"4.5space\": \"4.5space\",\n        \"40010 1-go\": \"40010壱号\",\n        \"4649 club\": \"4649苦愛\",\n        \"4dip\": \"4DIP\",\n        \"4or5 works\": \"よんかごわーくす\",\n        \"4season\": \"4season\",\n        \"4st injection\": \"4st Injection\",\n        \"5 06\": \"ゴー!マルロク\",\n        \"5 slash 4\": \"5/4\",\n        \"50000s\": \"五萬S\",\n        \"50on\": \"50on!\",\n        \"50pointcaliper\": \"50PointCaliper\",\n        \"5th library\": \"5th Library\",\n        \"5up\": \"5UP\",\n        \"64bit spectrum\": \"64bitスペクトル\",\n        \"64kbit\": \"64Kbit\",\n        \"66 no oka\": \"66の丘\",\n        \"662kb\": \"662KB\",\n        \"666-346\": \"666-346\",\n        \"666protect\": \"666プロテクト\",\n        \"69erotique\": \"69EROTIQUE\",\n        \"69hb\": \"69HB\",\n        \"6colors\": \"6COLORS\",\n        \"6x8breads\": \"6x8breads\",\n        \"7 colored led\": \"虹色発光ダイオード\",\n        \"7-ban no okimono\": \"7番の置物\",\n        \"707room\": \"707号室\",\n        \"73feti\": \"73フェチ\",\n        \"73gou koudou\": \"73号坑道\",\n        \"774 house\": \"774ハウス\",\n        \"7961shiki\": \"7961式\",\n        \"7fleur\": \"7Fleur\",\n        \"7menzippo\": \"7メンZippo\",\n        \"7th ark\": \"7th_arK\",\n        \"7th door\": \"7th Door\",\n        \"7th utopia\": \"7th utopia\",\n        \"8 no ji club\": \"8の字倶楽部\",\n        \"8 slash 7\": \"8/7\",\n        \"81dora\": \"81dora\",\n        \"86 saver\": \"86 SAVER\",\n        \"86cafe\": \"86珈琲店\",\n        \"88scones\": \"88scones\",\n        \"8cm\": \"8cm\",\n        \"8graphica\": \"エイトグラフィカ\",\n        \"8ji sugi\": \"8時すぎ\",\n        \"93bangai\": \"93番街\",\n        \"999 q-miz\": \"999 Q-miz\",\n        \"99mg\": \"99mg\",\n        \"9z\": \"9z\",\n        \"a\": \"Circle A\",\n        \"a 3103 hut\": \"a 3103 hut\",\n        \"a after school of silence\": \"沈黙の放課後\",\n        \"a cherry-blossom front\": \"A cherry-blossom front\",\n        \"a face\": \"a face\",\n        \"a hoimi\": \"a hoimi\",\n        \"a pear tree\": \"a pear tree\",\n        \"a taku studio takuno\": \"A TAKU STUDIO TAKUNO\",\n        \"a yellow aurora\": \"A Yellow Aurora\",\n        \"a-anima\": \"A-Anima\",\n        \"a-arinco\": \"A-arinco\",\n        \"a-hole\": \"A-HOLE\",\n        \"a-lucky murashige no ran\": \"A-Lucky☆村重の乱\",\n        \"a-mania9s\": \"A-mania9's\",\n        \"a-mw.\": \"A-mw.\",\n        \"a-office\": \"A-office\",\n        \"a.boc70\": \"a.boc70\",\n        \"a.c.g arts\": \"A.C.Gアーツ\",\n        \"a.l.c\": \"A.L.C\",\n        \"a.la.mode\": \"ア・ラ・モード\",\n        \"a.p. retriever\": \"A.P.レトリバー\",\n        \"a.p.yamamoh\": \"A.P.YAMAMOH\",\n        \"a.s.g group\": \"A・S・Gグループ\",\n        \"a.s.s\": \"A.S.S\",\n        \"a.u.forest\": \"A.U.FOREST\",\n        \"a.v. tokkoutai\": \"A.V.特攻隊\",\n        \"a2 lampshade\": \"A2 LAMPSHADE\",\n        \"a2-wing\": \"A2-WiNG\",\n        \"a440\": \"a440\",\n        \"aa aishiteru\": \"ああ愛してる\",\n        \"aa doushiyou\": \"あぁどうしよう\",\n        \"aa warera katou hayabusa sentoutai\": \"嗚呼、我等加藤隼戦斗隊\",\n        \"aaru\": \"アアル\",\n        \"ab normal\": \"あーびーのーまる\",\n        \"ab10\": \"AB10\",\n        \"abalone kiss\": \"ABALONE KISS\",\n        \"abara ga itai\": \"あばらが痛い\",\n        \"abarenbow tengu\": \"暴れん坊天狗\",\n        \"abaretabi\": \"暴れ旅\",\n        \"abbey load\": \"Abbey Load\",\n        \"abdg encirclement formation\": \"ABDG包囲網\",\n        \"abellcain\": \"アベルカイン\",\n        \"aberyu\": \"悪部流\",\n        \"abgrund\": \"abgrund\",\n        \"abigor\": \"アビゴール\",\n        \"abliss\": \"ABLISS\",\n        \"abonriya\": \"あぼんり屋\",\n        \"abradeli kami\": \"油照紙\",\n        \"absolute fantasy\": \"ABSOLUTE FANTASY\",\n        \"absorb\": \"アブそ～ぶ\",\n        \"abstract limit\": \"抽象境界\",\n        \"abunae koubou\": \"あぶな絵工房\",\n        \"abunai zeiniku\": \"あぶないぜいにく\",\n        \"aburasoba biyori\": \"あぶらそば日和\",\n        \"abyssdragon.\": \"AbyssDragon.\",\n        \"acchi no seikatsu\": \"あっちの生活\",\n        \"accidentbitterchocolate\": \"AccidentBitterChocolate\",\n        \"accolt\": \"accolt\",\n        \"ace enterprise\": \"Ace Enterprise\",\n        \"achromic\": \"Achromic\",\n        \"achumuchi\": \"あちゅむち\",\n        \"acid eaters\": \"ACID EATERS\",\n        \"acid noel\": \"Acid Noel\",\n        \"acidsea\": \"ACIDSEA\",\n        \"acid-head\": \"ACID-HEAD\",\n        \"acoram\": \"Acoram\",\n        \"action mokei\": \"アクション模型\",\n        \"active\": \"アクティブ\",\n        \"active sunrise\": \"あくてぃぶサンライズ\",\n        \"actively dawn\": \"ACTIVELY DAWN\",\n        \"actress\": \"アクトレス\",\n        \"actuator\": \"アクチュエーター\",\n        \"acute\": \"あきゅ〜と\",\n        \"ad-hoc\": \"Ad-Hoc\",\n        \"adabana\": \"徒花\",\n        \"adalt only\": \"成人向け\",\n        \"ade no shin\": \"あでのしん\",\n        \"adeyaka kunoichi-dan\": \"艶やかくノ一団\",\n        \"adnis\": \"ADNiS\",\n        \"adult house\": \"あだるとはうす\",\n        \"advance\": \"ADVANCE\",\n        \"advanced twinkle castle shinobi jou giga\": \"ADVANCEDトィンクル☆キャッスル+忍城GIGA\",\n        \"advanced-ss\": \"Advanced-SS\",\n        \"aeba fukashi\": \"饗庭淵\",\n        \"aegistone\": \"aegistone\",\n        \"aerial\": \"エアリアル\",\n        \"aerial rave\": \"AERIAL RAVE\",\n        \"aerial soul\": \"Aerial Soul\",\n        \"aerodog\": \"AERODOG\",\n        \"affidavit\": \"Affidavit\",\n        \"affix\": \"Affix\",\n        \"afj\": \"AFJ\",\n        \"after party\": \"after party\",\n        \"again.\": \"again.\",\n        \"ageage\": \"アゲ揚げ\",\n        \"ageku no hate no\": \"あげくの果ての\",\n        \"ago\": \"アゴ\",\n        \"agohimo yoika\": \"アゴヒモヨイカ\",\n        \"agoitei\": \"AGOI亭\",\n        \"ah.\": \"あー。\",\n        \"ahaan\": \"AHAAN\",\n        \"ahm\": \"AHM\",\n        \"ahoge\": \"あほ毛\",\n        \"ahou basha\": \"阿呆馬車\",\n        \"ahriman\": \"アーリマン\",\n        \"ahun\": \"アフン\",\n        \"ai no inu koujou\": \"愛の犬工場\",\n        \"ai no kura\": \"あいの倉\",\n        \"ai no senshi mimikaki\": \"愛の戦士みみかき\",\n        \"ai no sunatokei\": \"藍の砂時計\",\n        \"ai urara\": \"あいうらら\",\n        \"ai wa kurayami\": \"愛は暗闇\",\n        \"ai-chan no ozashiki\": \"あいちゃんのお座敷\",\n        \"aiai\": \"あいあい\",\n        \"aiaigasa\": \"あいあい傘\",\n        \"aida.\": \"間。\",\n        \"aidon raiki\": \"合丼来来\",\n        \"aienkien\": \"愛鉛奇縁\",\n        \"aigamodou\": \"あいがも堂\",\n        \"aigan shounen\": \"愛玩少年\",\n        \"aihara otome\": \"相原乙女\",\n        \"aiiro paradox\": \"藍色パラドックス\",\n        \"aiirojikan\": \"藍色時間\",\n        \"aiirosakura\": \"あいいろさくら\",\n        \"aik sole\": \"アイクソール\",\n        \"aikokusha\": \"愛国者\",\n        \"aikotobako\": \"アイコトバコ\",\n        \"aim\": \"AIM\",\n        \"aim-zero\": \"Aim-ZERO\",\n        \"aimaimemai\": \"あいまいめまい\",\n        \"aimaimoko\": \"曖昧模糊\",\n        \"aimasutei\": \"愛増庭\",\n        \"aimy\": \"Aimy\",\n        \"ainekokan\": \"愛猫缶\",\n        \"aiokougadou\": \"アイオコウガドウ\",\n        \"aion\": \"AION\",\n        \"air hike\": \"Air Hike\",\n        \"air plants\": \"Air Plants\",\n        \"air praitre\": \"AirФPraitre\",\n        \"air union\": \"AIR UNION\",\n        \"airily steps\": \"Airily Steps\",\n        \"airmusica\": \"AIRMUSICA\",\n        \"airyu\": \"あいりゅ\",\n        \"aitsu no tatebue\": \"あいつのたてぶえ\",\n        \"aiuea\": \"あいうえあ\",\n        \"aiviera\": \"アイヴィエラ\",\n        \"aiyamatarei\": \"あいやまたれい\",\n        \"aizou roman kikan\": \"愛憎浪漫機関\",\n        \"ajala\": \"戯アジャラ\",\n        \"ajapaa.\": \"あじゃぱー。\",\n        \"aje\": \"AJE\",\n        \"aji no hiraki\": \"あじのひらき\",\n        \"aji star\": \"鯵スター\",\n        \"aju ga mitsukarimasen\": \"あじゅが見つかりません\",\n        \"ajinomoto\": \"あじのもと\",\n        \"ajisaihuumitei\": \"紫陽花風味亭\",\n        \"aka\": \"aka\",\n        \"akaao\": \"あかあお\",\n        \"akabei soft\": \"AKABEi SOFT\",\n        \"akabei soft2\": \"あかべぇそふとつぅ\",\n        \"akabei soft3\": \"あかべぇそふとすりぃ\",\n        \"akachang time\": \"赤ちゃングタイム\",\n        \"akachi\": \"あかち\",\n        \"akacia\": \"AKACIA\",\n        \"akadama-ya\": \"赤玉屋\",\n        \"akadashi no misoshiru\": \"赤だしのみそ汁\",\n        \"akaeboshi\": \"アカエボシ\",\n        \"akagiridan\": \"あかぎり団\",\n        \"akagisou\": \"赤木荘\",\n        \"akagumotei\": \"朱雲亭\",\n        \"akahira kirin\": \"あかひら麒麟\",\n        \"akai chi to tetsu no roudousha tou\": \"赤い血と鉄の労働者党\",\n        \"akai hitomi to aoi tsuki\": \"紅い瞳と蒼い月\",\n        \"akai kitsune\": \"アカイキツネ\",\n        \"akai marlboro\": \"赤いマルボロ\",\n        \"akai muffler\": \"赤いマフラー\",\n        \"akai syohousen\": \"赤い処方箋\",\n        \"akai tsubasa\": \"赤い翼\",\n        \"akaihoho\": \"akaihoho\",\n        \"akairo mambo\": \"赤色まんぼー\",\n        \"akaironomahou\": \"あかいろのまほう\",\n        \"akamiru\": \"Akamiru\",\n        \"akamuni.\": \"あかむに。\",\n        \"akanagi\": \"あかなぎ\",\n        \"akane shuuhei dou\": \"茜しゅうへい堂\",\n        \"akaneko\": \"赤猫\",\n        \"akanoiki\": \"赤の域\",\n        \"akari wa honnori tomoreba ii\": \"明かりはほんのり灯ればいい\",\n        \"akaringo-chan\": \"あかりんごちゃん\",\n        \"akarui sm\": \"明るいSM\",\n        \"a-ka-sa-works\": \"あかさ製作所\",\n        \"akashitei\": \"あかし亭\",\n        \"akatama\": \"アカタマ\",\n        \"akatsuki akaza dou\": \"赤月赤座堂\",\n        \"akatsuki katsuie no circle\": \"暁勝家ノサークル\",\n        \"akatsuki works\": \"暁WORKS\",\n        \"akatsuki doumei\": \"アカツキドウメイ\",\n        \"aki no yonaga ni yoiyami ni\": \"秋の夜長に宵闇に\",\n        \"aki6666\": \"AKI6666\",\n        \"akifumi-chan\": \"あきふみちゃん\",\n        \"akikan\": \"アキカン\",\n        \"akino melpa\": \"アキノメルパ\",\n        \"akisame moyashi\": \"あきさめ萌やし\",\n        \"akisora\": \"秋空\",\n        \"akitaka seinikuten\": \"あきたか贅肉店\",\n        \"akitaku kikaku\": \"アキタク＊キカク\",\n        \"akitarainu\": \"あきたらいぬ\",\n        \"akitsuki\": \"秋月\",\n        \"akiya\": \"空屋\",\n        \"akiyama production\": \"アキヤマ興業\",\n        \"akkan-bi project\": \"あっかんBi～\",\n        \"akou kurou\": \"アコウクロウ\",\n        \"akoyagai to aumale ebi\": \"あこや貝とオマールえび\",\n        \"akuheki\": \"悪癖\",\n        \"akuma no ehon hakushu dan\": \"悪魔の絵本拍手団\",\n        \"akuma toshi keikaku\": \"悪魔都市計画\",\n        \"akumara\": \"あくまら\",\n        \"akumaster\": \"Akumaster\",\n        \"akunaki hourou\": \"あくなき放浪\",\n        \"akunomangakarenmei\": \"悪の漫画家連盟\",\n        \"akuochisukii kyoushitsu\": \"アクオチスキー教室\",\n        \"akuta space\": \"あくたスペース\",\n        \"akuyukai\": \"悪遊怪\",\n        \"akys honpo\": \"AKYS本舗\",\n        \"al dente\": \"あるでんて\",\n        \"albatross\": \"あるばとろす\",\n        \"albercorp.\": \"あるばーCorp.\",\n        \"albino no yuuhatsu\": \"アルビノの融発\",\n        \"albireo 7\": \"あるびれお7\",\n        \"alchemist works\": \"Alchemist works\",\n        \"alfalfa\": \"alfalfa\",\n        \"ali-san maku\": \"ALIさんマーク\",\n        \"alibi\": \"アリバイ\",\n        \"alice complex\": \"Alice Complex\",\n        \"alice digital factory\": \"Alice Digital Factory\",\n        \"alice-do\": \"ありす堂\",\n        \"alice.blood\": \"Alice.Blood\",\n        \"aliceflag\": \"AliceFlag\",\n        \"alicegarden\": \"AliceGarden\",\n        \"alicemiller\": \"alicemiller\",\n        \"alicetale\": \"ありすている♪\",\n        \"alikui v line\": \"ありくいVライン\",\n        \"alisex\": \"alisex\",\n        \"alkaloid no baketu\": \"アルカロイドノバケツ\",\n        \"all over the place.\": \"all over the Place.\",\n        \"all-time\": \"ALL-TiME\",\n        \"allbyte\": \"AllByte\",\n        \"allegro launcher\": \"アレグロランチャー\",\n        \"allium tuberosum\": \"Allium tuberosum\",\n        \"allo\": \"allo\",\n        \"almanacco\": \"almanacco\",\n        \"almism\": \"ALMISM\",\n        \"almond republic\": \"あーもんど共和国\",\n        \"almond to kyogyuunyuu\": \"アーモンドと巨牛乳\",\n        \"aloha soft\": \"あろはそふと\",\n        \"alpa\": \"ALPA\",\n        \"alpaca unit\": \"ALPACA Unit\",\n        \"alpha to yukaina nakamatachi\": \"有葉と愉快な仲間たち\",\n        \"alpha-beta\": \"alpha-beta\",\n        \"alps\": \"アルプス興業\",\n        \"alsetro\": \"ALSeTRO\",\n        \"alsiel\": \"Alsiel\",\n        \"alt\": \"ALT\",\n        \"alte notiz\": \"あるてのてぃつ\",\n        \"alter maschine\": \"Alter Maschine\",\n        \"altergott\": \"Altergott\",\n        \"alto letzel\": \"あるとれっつぇる\",\n        \"alto realize\": \"Alto realize\",\n        \"altopia\": \"アルトピア\",\n        \"altron\": \"アルトロン\",\n        \"alumi soft\": \"あるみそふと\",\n        \"alumican\": \"あるみかん\",\n        \"am colon tiger\": \"AM:TIGER\",\n        \"amaama-tei\": \"甘々亭\",\n        \"amadeus no isan\": \"アマデウスの遺産\",\n        \"amadoiza\": \"雨樋座\",\n        \"amadoki\": \"雨時\",\n        \"amagaeru to sprocket\": \"雨蛙とスプロケット\",\n        \"amagasa touge\": \"雨傘峠\",\n        \"amagashi\": \"甘菓子\",\n        \"amagi an ironworks\": \"天城製鉄所\",\n        \"amagoi koubou\": \"雨乞い工房\",\n        \"amai wakusei\": \"あまい惑星\",\n        \"amaichigo\": \"あまいちご\",\n        \"amairo denshi koubou\": \"天色電子工房\",\n        \"amakasas\": \"Amakasas\",\n        \"amakashi\": \"アマカシ\",\n        \"amakaya\": \"天香屋\",\n        \"amakuchi\": \"あまくち\",\n        \"amakura89gou ten\": \"天倉89号店\",\n        \"amakuro okami\": \"あまくろ狼\",\n        \"amakurodou\": \"甘黒堂\",\n        \"amam\": \"AMAM\",\n        \"amamin koubou\": \"あまみん工房\",\n        \"amanatsu mix\": \"あまなつミックス\",\n        \"amanatsu quality\": \"甘夏クオリテ\",\n        \"amanatsuya\": \"天夏屋\",\n        \"amanogawa tsuushin\": \"天の川通信\",\n        \"amanojaku\": \"天ノ邪鬼\",\n        \"amaon\": \"amaon\",\n        \"amaoto rensa yohou\": \"雨音連鎖予報\",\n        \"amapoteya\": \"あまぽて屋\",\n        \"amarini senpaku\": \"あまりにセンパク!\",\n        \"amatosui\": \"甘桃水\",\n        \"amatou continue\": \"甘党こんてぃにゅー\",\n        \"amatsu hanten opi\": \"天津反転OPi!\",\n        \"amatsukami\": \"アマツカミ\",\n        \"amayadori plus\": \"AMAYADORI+\",\n        \"amazake resonance\": \"甘酒レゾナンス\",\n        \"amazawa kingdom\": \"AMAZAWA KINGDOM\",\n        \"amazingsweets\": \"Amazing Sweets\",\n        \"ambience\": \"ambience\",\n        \"ambivalence\": \"AMBIVALENCE\",\n        \"ambivalent-e\": \"Ambivalent-E\",\n        \"ambivalenz\": \"AmBiVaLenZ\",\n        \"ame hotel\": \"AMEホテル\",\n        \"ame no aji\": \"雨の味\",\n        \"ame no murakumo\": \"アメノムラクモ\",\n        \"ame no nikki\": \"雨のにっき\",\n        \"amecir\": \"あめさー\",\n        \"amedamazakura\": \"飴玉桜\",\n        \"amefurasy\": \"amefurasy\",\n        \"amefuri canvas\": \"雨ふりキャンバス\",\n        \"ameiro biscuit\": \"飴色ビスケット\",\n        \"amemizu\": \"あめみず\",\n        \"ameno oukan\": \"雨の王冠\",\n        \"amenyan-tai\": \"あめにゃん隊\",\n        \"ameyama telegraph\": \"雨山電信社\",\n        \"ami-dabutsu\": \"ami-だぶつ\",\n        \"aminendo\": \"あみねんど\",\n        \"ammolite\": \"アンモライト\",\n        \"amorphous innocent fiction\": \"AMORPHOUS innocent fiction\",\n        \"ampullaria\": \"あんぷらりあ\",\n        \"amrita\": \"AMRITA\",\n        \"amuamu tiger\": \"あむあむタイガー\",\n        \"amulet\": \"あみゅれっと\",\n        \"amuse craft erotica\": \"アミューズクラフトエロチカ\",\n        \"ana\": \"ANA\",\n        \"ana futatsu\": \"穴ふたつ\",\n        \"anagura\": \"穴蔵\",\n        \"anal crisis\": \"アナル☆クライシス\",\n        \"analcime\": \"アナルシム\",\n        \"analog e.c.\": \"アナログE.C.\",\n        \"analog store\": \"あなろぐストア\",\n        \"ananas dolce\": \"Ananas Dolce\",\n        \"ananwanco\": \"あんあんわんこ\",\n        \"anapom\": \"ANAPOM\",\n        \"anarchy gangsta\": \"アナーキーギャングスタ\",\n        \"anarcomix\": \"ANARCOMIX\",\n        \"anchor\": \"ANCHOR\",\n        \"andante\": \"あんだんて\",\n        \"anegaoka sanchoume\": \"姉ヶ丘三丁目\",\n        \"anemitsu\": \"あねみつ\",\n        \"anemone\": \"Anemone\",\n        \"aneurysm.\": \"あにゅうりずむ。\",\n        \"anfini\": \"ANFINI\",\n        \"ange\": \"アンジェ\",\n        \"angel bless\": \"Angel Bless\",\n        \"angel of blue sky\": \"Angel of Blue Sky\",\n        \"angelic feather\": \"天使の羽\",\n        \"angelphobia\": \"angelphobia\",\n        \"angensou\": \"黯幻想\",\n        \"anglachel\": \"アングラヘル\",\n        \"angler soft\": \"アングラーソフト\",\n        \"angora doll\": \"Angora doll\",\n        \"ani ga saru\": \"兄が猿\",\n        \"aniki otokodou\": \"兄貴漢堂\",\n        \"anim\": \"Anim\",\n        \"animal herb\": \"あにまるハーブ\",\n        \"animal passion\": \"Animal Passion\",\n        \"animal service\": \"アニマルサービス\",\n        \"animalism\": \"あにまりずむ\",\n        \"animankan\": \"アニマン館\",\n        \"anime brothers\": \"アニメブラザーズ\",\n        \"animeeru\": \"あにめーる\",\n        \"ankake cha-han\": \"あんかけCha-haN\",\n        \"ankake chameshi\": \"あんかけチャメシ\",\n        \"ankanke\": \"安閑家\",\n        \"ankimo factory\": \"あんきも工房\",\n        \"anko koubou\": \"あんこ工房\",\n        \"ankoku azumaya\": \"暗黒あずまや\",\n        \"ankoku marimokan\": \"アンコクマリモカン\",\n        \"ankoku-bousougumi\": \"暗黒暴走組\",\n        \"ankoya\": \"アンコ屋\",\n        \"anmin koutou benmukan jimusho\": \"安眠高等弁務官事務所\",\n        \"anmitsuya\": \"あんみつや\",\n        \"annee suplex\": \"あんねーすーぷれっくす\",\n        \"annin\": \"杏仁\",\n        \"annon club\": \"安穏倶楽部\",\n        \"anons flood myth\": \"あのんの大洪水伝説\",\n        \"anonymax\": \"あのにまっくす\",\n        \"anoprimal\": \"アノプライマル\",\n        \"anorak post\": \"Anorak Post\",\n        \"another story\": \"Another Story\",\n        \"another world\": \"Another World\",\n        \"ant colony\": \"蟻の巣\",\n        \"antares\": \"ANTARES\",\n        \"antidying\": \"AntiDying\",\n        \"antineed\": \"ANTINEED\",\n        \"anxious delusionist\": \"アンキデ\",\n        \"anya\": \"ANYa\",\n        \"anysing world\": \"ANYSING WORLD\",\n        \"anything\": \"anything\",\n        \"anzen daiichi\": \"安全第一\",\n        \"anzen ekisu\": \"安全えきす\",\n        \"anzen na buffalo\": \"安全なバッファロー\",\n        \"anzeri kai\": \"アンゼリ会\",\n        \"anzu ame\": \"あんず飴\",\n        \"ao hana\": \"青華\",\n        \"ao niwashi\": \"青庭師\",\n        \"ao no oto\": \"青ノ音\",\n        \"aoaa\": \"AOAA\",\n        \"aoba q madou\": \"青葉Q魔洞\",\n        \"aoboshi\": \"青星\",\n        \"aodiso kankou\": \"青ぢそ甘工\",\n        \"aohibachi\": \"アオヒバチ\",\n        \"aohimo familia\": \"アオヒモファミリア\",\n        \"aoi\": \"AOI\",\n        \"aoi dennou\": \"アオイ電脳\",\n        \"aoi no ie\": \"葵の家\",\n        \"aoi project\": \"AOI PROJECT\",\n        \"aoikitoiki.\": \"青息吐息。\",\n        \"aoiro hakkyou diode\": \"青色ハッキョウダイオード\",\n        \"aoiro ichiza\": \"青色一座\",\n        \"aoirobindume\": \"青色瓶詰\",\n        \"aoirotone works\": \"Aoirotone works\",\n        \"aoiten\": \"青い点\",\n        \"aokumashii\": \"アオクマシー\",\n        \"aomayu\": \"あおまゆ\",\n        \"aomi dream maker\": \"あおみどりーむめーかー\",\n        \"aomidori\": \"蒼見鳥\",\n        \"aonatsusou\": \"蒼夏荘\",\n        \"aotokage\": \"青蜥蜴\",\n        \"aotsukitei\": \"蒼月亭\",\n        \"aoyama seisaku\": \"青山制作所\",\n        \"aozakura\": \"蒼桜\",\n        \"aozora market\": \"蒼空市場\",\n        \"aozora no mieru chikashitsu\": \"青空の見える地下室\",\n        \"apadash\": \"アパダッシュ\",\n        \"apatheia\": \"APATHEIA\",\n        \"aperitif\": \"Aperitif\",\n        \"aphrodite\": \"あふろでぃ～て\",\n        \"aphrodite fan club\": \"アフロディーテファンクラブ\",\n        \"apika\": \"apika\",\n        \"aplysia-gumi\": \"Aplysia組\",\n        \"apocolotte\": \"ApoCoLotte\",\n        \"apocrine.\": \"あぽくりん。\",\n        \"apokari\": \"あぽかり\",\n        \"apollo\": \"APOLLO\",\n        \"apple mint leaves\": \"あっぷるみんとのは\",\n        \"apple pie\": \"アップルパイ\",\n        \"apple rooftop\": \"あっぷる屋上\",\n        \"apple water\": \"Apple Water\",\n        \"applecat\": \"あっぷるきゃっと\",\n        \"applesoft\": \"アップルソフト\",\n        \"applique\": \"あっぷりけ\",\n        \"apricot\": \"apricot\",\n        \"apricot cherry\": \"Apricot Cherry\",\n        \"apricot sirup\": \"あんずシロップ\",\n        \"apricottea\": \"APRICOTTEA\",\n        \"apsara project\": \"あぷさらproject\",\n        \"apsis\": \"apsis\",\n        \"apupop\": \"apupop\",\n        \"apurikokko\": \"あぷりこっこ\",\n        \"aq rotation\": \"AQローテーション\",\n        \"aqua create\": \"AQUA CREATE\",\n        \"aqua space\": \"AQUA SPACE\",\n        \"aqua-baiser\": \"Aqua-baiser\",\n        \"aquadriver\": \"アクアドライバー\",\n        \"aquamarine\": \"あくあまりん\",\n        \"aquapit\": \"あくあぴっと\",\n        \"aquarium\": \"アクアリウム\",\n        \"aquarius gate\": \"Aquarius Gate\",\n        \"aquaver\": \"AQUA:VER\",\n        \"aquilegia\": \"Aquilegia\",\n        \"aquilno-zeroex\": \"あきるのぜろえっくす\",\n        \"aqukan\": \"亜空間\",\n        \"ar da coda\": \"あ～だこ～だ\",\n        \"arachnomania\": \"あらくの☆まにあ\",\n        \"arafuradou\": \"アラフラ胴\",\n        \"arahabaki\": \"アラハバキ\",\n        \"arakiya-san\": \"あらき屋さん\",\n        \"arakureta monotachi\": \"あらくれた者たち\",\n        \"araragi-1071-\": \"ARARAGI-1071-\",\n        \"ararudaito\": \"あらるだいと\",\n        \"arc\": \"ARC\",\n        \"arc slash turbine\": \"ARC/TURBINE\",\n        \"arcana club\": \"あるかな倶楽部\",\n        \"arch\": \"ARCH\",\n        \"archangel\": \"ARCHANGEL\",\n        \"archea\": \"archea\",\n        \"archf\": \"ARCHF\",\n        \"arcon\": \"あるこん\",\n        \"arcs\": \"ArcS\",\n        \"arctangent\": \"ARCTANGENT\",\n        \"arctic char\": \"Arctic Char\",\n        \"arctic pan\": \"北極鍋\",\n        \"are.\": \"あれ。\",\n        \"area-048\": \"Area-048\",\n        \"area-s\": \"Area-S\",\n        \"area188\": \"エリア188\",\n        \"area50\": \"Area50\",\n        \"area7\": \"えりあ7\",\n        \"arearee\": \"あれあれえ\",\n        \"areya\": \"あれ屋\",\n        \"argon\": \"アルゴン\",\n        \"argonauts\": \"Argonauts\",\n        \"argyle\": \"アーガイル\",\n        \"argyle check\": \"Argyle◇check\",\n        \"aria\": \"Aria\",\n        \"aria corporation\": \"アリアコーポレーション\",\n        \"arianrhod\": \"Arianrhod\",\n        \"ariari no nashinashi\": \"ありありのなしなし\",\n        \"arieroof\": \"Arieroof\",\n        \"arigatou\": \"ありが党\",\n        \"arikamatou\": \"ありかま糖\",\n        \"arikui mcqueen\": \"アリクイマックィーン\",\n        \"arimax\": \"アリマックス\",\n        \"arinotowatari\": \"ありのとわたり\",\n        \"arisan-antenna\": \"ありさんアンテナ\",\n        \"ark emerald\": \"Ark Emerald\",\n        \"arkadia\": \"ARKADIA\",\n        \"arkizm\": \"arkizm*\",\n        \"armanium\": \"あるまにうむ\",\n        \"armeria\": \"Armeria\",\n        \"armored ginkakuji\": \"アーマードギンカクジ\",\n        \"armored namamono\": \"アーマードなまもの\",\n        \"aroma terrace\": \"あろまてらす\",\n        \"aromatic girl\": \"aromatic girl\",\n        \"arpeggio\": \"あるぺじお\",\n        \"arsenothelus\": \"アルセノテリス\",\n        \"art en ciel.\": \"art en ciel.\",\n        \"art equals theater\": \"ART=THEATER\",\n        \"art jam\": \"Art Jam\",\n        \"artichoke\": \"artichoke\",\n        \"article 60 of criminal code\": \"刑法第60条\",\n        \"artificial eden\": \"Artificial Eden\",\n        \"arts graffiti\": \"アーツグラフィティ\",\n        \"aru-run\": \"あるるん\",\n        \"arubain\": \"あるばいん\",\n        \"aruchisuto\": \"アルチスト\",\n        \"aruheito\": \"あるへゐと\",\n        \"aruk9\": \"アルK9\",\n        \"arukaseya\": \"歩かせ屋\",\n        \"arumi seigen b-chiku\": \"アルミ制限B地区\",\n        \"arunekoki\": \"歩猫記\",\n        \"arutana\": \"あるたな\",\n        \"as known as\": \"as known as\",\n        \"as mission imphal\": \"インパール作戦\",\n        \"as-zadkiel\": \"As-Zadkiel\",\n        \"asa club\": \"あさクラブ\",\n        \"asabadou\": \"浅葉堂\",\n        \"asadukuyo no utage\": \"朝月夜の宴\",\n        \"asagayatei\": \"あさがや亭\",\n        \"asagindo\": \"あさぎん堂\",\n        \"asai kikaku\": \"あさい企画\",\n        \"asairo milktea\": \"朝色みるくちー\",\n        \"asaiumi\": \"浅い海\",\n        \"asakawa hetero\": \"麻川ヘテロ\",\n        \"asaki blog branch office\": \"朝木blog出張所\",\n        \"asaki yumemishi\": \"あさきゆめみし\",\n        \"asanebou crisis\": \"朝寝坊クライシス\",\n        \"asanegi shouten\": \"麻根木商店\",\n        \"asapi-keikaku.\": \"あさぴ計画。\",\n        \"asatsukimint\": \"アサツキミント\",\n        \"asg-project\": \"ASG-Project\",\n        \"ashanti\": \"アシャンティ\",\n        \"ashi zanmai\": \"あしざんまい\",\n        \"ashibububu\": \"あしぶぶぶ\",\n        \"ashima sandou\": \"芦間山道\",\n        \"ashinoie\": \"あしの家\",\n        \"ashiromance\": \"Ashiromance\",\n        \"ashitakara-ganbaru\": \"あしたから頑張る\",\n        \"ashiya\": \"脚屋\",\n        \"ashly\": \"ashly\",\n        \"ashtray\": \"ASHTRAY\",\n        \"ashuradou\": \"阿修羅堂\",\n        \"ashuraya\": \"阿修羅屋\",\n        \"asianboy\": \"ASIANBOY\",\n        \"asiangirl\": \"ASIANGIRL\",\n        \"ask\": \"ASK\",\n        \"askot\": \"askot\",\n        \"asma\": \"ASMA\",\n        \"asmodeus seiyaku\": \"アスモデウス製薬\",\n        \"asnaronyoichi\": \"あすなろにょいち\",\n        \"asonerikes\": \"アソネリケス\",\n        \"aspara noujou\": \"アスパラ農場\",\n        \"aspergillus\": \"Aspergillus\",\n        \"assaultbeer\": \"アサルトビア\",\n        \"assistreplaytime\": \"A.R.T\",\n        \"asterism\": \"アステリズム\",\n        \"astllatte\": \"アストラッテ\",\n        \"astras\": \"ASTRA'S\",\n        \"astrological sign\": \"Astrological Sign\",\n        \"astronauts alya\": \"アストロノーツ・アリア\",\n        \"astronauts comet\": \"アストロノーツ・コメット\",\n        \"astronomy\": \"ASTRONOMY\",\n        \"asuken\": \"明日軒\",\n        \"asumo koubou\": \"あすも工房\",\n        \"asunaro\": \"ASUNARO\",\n        \"asunaro neat.\": \"Asunaro Neat.\",\n        \"at kenkyuujo\": \"AT研究所\",\n        \"at mousse\": \"あっとむーす\",\n        \"at simapan\": \"@SIMAPAN+\",\n        \"atarime jerky\": \"あたりめジャーキー\",\n        \"atariya kyoushitsu\": \"アタりや教室\",\n        \"atelier bord\": \"Atelier Bord\",\n        \"atelier comet\": \"アトリエコメット\",\n        \"atelier curlicue\": \"Atelier Curlicue\",\n        \"atelier dew\": \"Atelier:Dew\",\n        \"atelier honkijiru\": \"あとりえ本気汁\",\n        \"atelier kaguya cheshirecat\": \"アトリエかぐや CheshireCat\",\n        \"atelier kirara\": \"Atelier Kirara\",\n        \"atelier lepus\": \"あとりえれーぷす\",\n        \"atelier m\": \"アトリエM\",\n        \"atelier sava\": \"アトリエサヴァ\",\n        \"atelier tiv artworks\": \"atelier Tiv artworks\",\n        \"atelier yang\": \"あとりえ・ヤン\",\n        \"atelier-d\": \"atelier-D\",\n        \"atelierkk\": \"あとりえKK\",\n        \"ateliermarl\": \"AtelierMARL\",\n        \"atemonai heya\": \"あてもない部屋\",\n        \"atempo\": \"atempo\",\n        \"aterut\": \"アテレート\",\n        \"ather\": \"エーテル\",\n        \"atkinson\": \"アトキンソン\",\n        \"atmosphere\": \"アトモスフィア\",\n        \"ato nana fun\": \"あと7分\",\n        \"atolier tougenkyou\": \"アトリエ桃源郷\",\n        \"atori akinao\": \"あとり秋尚\",\n        \"atorie rinbou\": \"アトリエ リンボウ\",\n        \"atrip\": \"atrip\",\n        \"ats\": \"ATS\",\n        \"atsd\": \"atSD\",\n        \"atsuatsucook\": \"あつあつCOOK\",\n        \"atsugari giyuugun\": \"あつがり義勇軍\",\n        \"atsuki nettaiya\": \"アつき熱帯夜\",\n        \"attamaro\": \"あったまろ。\",\n        \"attic\": \"ATTIC\",\n        \"attic work space\": \"ATTIC WORK SPACE\",\n        \"au pied\": \"au pied\",\n        \"aug18\": \"aug18\",\n        \"aurelia\": \"オーレリア\",\n        \"auroramix\": \"オーロラミックス\",\n        \"auta moon\": \"あうたむーん\",\n        \"authoring heaven\": \"オーサリングヘヴン\",\n        \"autobahn\": \"Autobahn\",\n        \"automa kikyuu\": \"オートマ気球\",\n        \"autonoe\": \"Autonoe\",\n        \"autoroo\": \"あうとろー\",\n        \"av\": \"サークルAV\",\n        \"avalon\": \"Avalon\",\n        \"avantgarde\": \"AVANTGARDE\",\n        \"avion village\": \"アビオン村\",\n        \"avion village f\": \"アビオン村F\",\n        \"awatsu retsudou\": \"粟津烈堂\",\n        \"ax\": \"あっくす\",\n        \"axis\": \"AXIS\",\n        \"axl\": \"AXL\",\n        \"axolotl\": \"アホロートル\",\n        \"aya pon\": \"あやPON\",\n        \"ayafujii private circle\": \"藤井あや個人サークル\",\n        \"ayamegaoka\": \"文目ヶ丘\",\n        \"ayashige dan\": \"あやしげ団\",\n        \"ayashii ayakashi\": \"アヤシイアヤカシ\",\n        \"ayashii bochi\": \"あやしい墓地\",\n        \"ayashii thigh high ongakutai\": \"怪しいサイハイ音楽隊\",\n        \"ayashii yatsura\": \"あやしいやつら\",\n        \"ayasii hon-ya\": \"あやしい本屋\",\n        \"ayatsuri-doom\": \"​文釣DOOM\",\n        \"ayayabidou\": \"あややび堂\",\n        \"azarashi waltz\": \"あざらしワルツ\",\n        \"azarashisoft\": \"海豹社\",\n        \"azasuke wind\": \"AZASUKE WIND\",\n        \"azcat\": \"azcat\",\n        \"azelye\": \"AzeLye\",\n        \"azi dahaka\": \"アジダハーカ\",\n        \"azksb\": \"あずきそーば。\",\n        \"azmaya\": \"azmaya\",\n        \"aztec theater\": \"Aztec Theater\",\n        \"azuki land\": \"あづきらんど\",\n        \"azuki monaka\": \"あずきもなか\",\n        \"azuki shot\": \"AZUKI SHOT\",\n        \"azuki yougashiten\": \"小豆洋菓子店\",\n        \"azukimanma\": \"あずきまんま\",\n        \"azul\": \"Azul\",\n        \"azuma doujou\": \"東道場\",\n        \"azumaya matsukaze\": \"あずまや松風\",\n        \"azumaya shiten\": \"アズマ屋支店\",\n        \"azure\": \"Azure\",\n        \"azure bekkan\": \"あずれ別館\",\n        \"azure lapis\": \"あずーるらぴす\",\n        \"azurite\": \"Azurite\",\n        \"b kaiman\": \"Bカイマン\",\n        \"b side\": \"B:side\",\n        \"b-bishop\": \"B-bishop\",\n        \"b-crews\": \"Bクルーズ\",\n        \"b-dash jump\": \"B-Dash Jump\",\n        \"b-kyuu kasen\": \"B級河川\",\n        \"b-kyuu site\": \"B級サイト\",\n        \"b-led\": \"B-LED\",\n        \"b-wa\": \"B-wa\",\n        \"b.s.k\": \"B.S.K\",\n        \"b3\": \"B3\",\n        \"b5 doumei\": \"B5同盟\",\n        \"bababalunch\": \"バババランチ\",\n        \"baby replay\": \"ベイビーリプレイ\",\n        \"babybed\": \"ベビーベッド\",\n        \"babylook.net\": \"BabyLook\",\n        \"babymaker\": \"べびーめいかー\",\n        \"babypink\": \"ベイビーピンク\",\n        \"bacchustab\": \"BacchusTAB\",\n        \"backraze\": \"BACKRAZE\",\n        \"backyourluck\": \"ばっくゆあらっく\",\n        \"bad company\": \"ばっどかんぱにー\",\n        \"bad end rst\": \"ばっどえんどRST\",\n        \"bad friend\": \"BAD FRIEND\",\n        \"bad mushrooms\": \"坏茸社\",\n        \"badcore\": \"バッドコア\",\n        \"badis badis\": \"バジスバジス\",\n        \"baguri koubou\": \"馬栗工房\",\n        \"baguri sangyou\": \"馬栗産業\",\n        \"baidou tenpurya\": \"梅洞てんぷりゃー\",\n        \"baka to hasa me\": \"バカトハサミ\",\n        \"bakaitei\": \"馬隗亭\",\n        \"bakemonogakari\": \"ばけものがかり\",\n        \"bakuchi jinsei sp\": \"博打人生SP\",\n        \"bakugeki monkeys\": \"爆撃モンキース\",\n        \"bakuhatsu brs.\": \"ばくはつBRS.\",\n        \"bakuhatsu market\": \"爆発まーけっと\",\n        \"bakunyuu bitch sei\": \"爆乳ビッチ生\",\n        \"bakuretsu shichouson\": \"爆裂市町村\",\n        \"bakushiishi\": \"ばくしぃし\",\n        \"balklash.\": \"バルクラッシュ\",\n        \"banana king\": \"バナナキング\",\n        \"banana no kawa\": \"ばななのかわ\",\n        \"banana saruen\": \"ばななサル園\",\n        \"banana trip\": \"BANANAとりっぷ\",\n        \"bananajam\": \"ばななじゃむ\",\n        \"bananatart\": \"ばななたると\",\n        \"bananer milion\": \"ばななーみりおん\",\n        \"bandit\": \"BANDIT\",\n        \"bang\": \"banG\",\n        \"bangeya\": \"BANGEYA\",\n        \"bannoutumayoujiire\": \"バンノウツマヨウジイレ\",\n        \"banny pop\": \"BANNYぽっぷ\",\n        \"banri no syoujo\": \"万里の少女\",\n        \"bansanchi\": \"ばんさんち\",\n        \"bansankan\": \"バンサンカン\",\n        \"bantendou shoten\": \"卍天堂書店\",\n        \"banubeefriends\": \"BanubeeFriends\",\n        \"banyu\": \"万有\",\n        \"banyuu\": \"万有\",\n        \"baobabu\": \"ばおばぶ\",\n        \"bar modoshiyu\": \"BAR戻し湯\",\n        \"barbaroi no sato\": \"バルバロイの里\",\n        \"barista\": \"バリスタ\",\n        \"barko\": \"Barko\",\n        \"baroque\": \"baroQue\",\n        \"baroqupid\": \"BAROQUPID\",\n        \"bartholin sendan\": \"バルトリン船団\",\n        \"barusan\": \"バルサン\",\n        \"baseson light\": \"BaseSon Light\",\n        \"bash-inc\": \"Bash-inc\",\n        \"basic champions\": \"BASIC CHAMPIONS\",\n        \"basilisk trapezohedron\": \"バジリスクトラペゾヘドロン\",\n        \"baskindam kingdom\": \"バスキンダム王国\",\n        \"batachiki\": \"バタチキ\",\n        \"batchaya\": \"ばっちゃ屋\",\n        \"batsu freak\": \"Batsu freak\",\n        \"batsu jirushi\": \"ばつ印\",\n        \"batten sketch\": \"ばってんスケッチ\",\n        \"bb\": \"BB\",\n        \"bbb\": \"BBB\",\n        \"bbb-extra\": \"BBBえくすとら\",\n        \"bbg\": \"BBG\",\n        \"bbuttondash\": \"BBUTTONDASH\",\n        \"bear tail\": \"べあている\",\n        \"bear-bear\": \"BEAR-BEAR\",\n        \"bears cave\": \"Bear's Cave\",\n        \"beast trail\": \"Beast Trail\",\n        \"beat-pop\": \"BEAT-POP\",\n        \"beats beasts partners\": \"Beats Beasts Partners\",\n        \"beautiful snow\": \"Beautiful Snow\",\n        \"beberoncino sei\": \"ベベロンチーノ星\",\n        \"bect\": \"BECT\",\n        \"bee light\": \"BEe Light\",\n        \"beelzebub\": \"ベルゼブブ\",\n        \"beenyan\": \"び～にゃん\",\n        \"beer bear\": \"BEER BEAR\",\n        \"beer kuzu brothers\": \"ビールクズブラザーズ\",\n        \"behind moon\": \"Behind Moon\",\n        \"beicon\": \"ベイコン\",\n        \"beigon\": \"ベイゴン\",\n        \"bekkoame.\": \"べっこあめ。\",\n        \"bell no su\": \"ベルの巣\",\n        \"bell-da\": \"BELL-DA\",\n        \"belphegor no 39\": \"ベルフェゴールの39\",\n        \"beni\": \"紅-beni-\",\n        \"beni jake soran\": \"紅鮭ソーラン\",\n        \"benichigaya\": \"べにちが屋\",\n        \"benikurage\": \"べにくらげ\",\n        \"benisuzumedo\": \"紅雀堂\",\n        \"beraidot\": \"ベライドット\",\n        \"bergamot\": \"べるがもっと\",\n        \"bergmund\": \"ベルクムント\",\n        \"beropepe\": \"Beropepe\",\n        \"berry 16\": \"Berry!16\",\n        \"berry bagel\": \"BERRY BAGEL\",\n        \"berry lollipop\": \"Berry Lollipop\",\n        \"berserker\": \"バーサーカー\",\n        \"besshun-tei\": \"べっしゅん亭\",\n        \"bhm\": \"BHM\",\n        \"bias factory\": \"バイアスファクトリー\",\n        \"bibasuku\": \"BIBASUKU\",\n        \"bible\": \"ばいぶる\",\n        \"bicho bichodan\": \"びちょびちょ団\",\n        \"bickle\": \"びっくる\",\n        \"bicocattu\": \"Bicocattu\",\n        \"big boss\": \"BIG・BOSS\",\n        \"big gym\": \"BIG GYM\",\n        \"big mama\": \"ビッグママ\",\n        \"big mouse\": \"ビッグマウス\",\n        \"bigfoot no mori\": \"ビッグフットの森\",\n        \"bigwednesday\": \"BigWednesday\",\n        \"bikkuri gyouten\": \"びっくり仰天\",\n        \"bin1production\": \"Bin1production\",\n        \"binatsu\": \"びなつ\",\n        \"binbou noujou\": \"貧乏農場\",\n        \"binbou yusuri\": \"びんぼうゆすり\",\n        \"binbou yusuri express\": \"貧乏ゆすり超特急\",\n        \"bindmix\": \"BindMix\",\n        \"binmalo\": \"ビンマロ\",\n        \"binz studio\": \"Binz Studio\",\n        \"biophile\": \"Biophile\",\n        \"bird forest\": \"Bird Forest\",\n        \"bird joke\": \"バードジョーク\",\n        \"birobon\": \"ビロボン\",\n        \"biroon jr.\": \"びろーんJr.\",\n        \"biroudo kairou\": \"びろうど廻廊\",\n        \"biruban\": \"びるばん\",\n        \"bishamon\": \"びしゃもん。\",\n        \"bishoujo labo\": \"美少女ラボ\",\n        \"bishoujo netto\": \"美少女ネット\",\n        \"bishoujo suishin iinkai\": \"美少女推進委員会\",\n        \"bismarcho\": \"Bismarcho!\",\n        \"bistro mountain\": \"ビストロマウンテン\",\n        \"bitacos\": \"びっくりたこす\",\n        \"bite\": \"BITE\",\n        \"bitimaru\": \"びちまる\",\n        \"bitmap\": \"ビットマップ\",\n        \"bitmap power\": \"びとまぷぱわー\",\n        \"bitter crown\": \"ビタークラウン\",\n        \"bitter sweet\": \"BITTER SWEET\",\n        \"bitto\": \"∞Bitto\",\n        \"bizensiki roroppu\": \"備前式ロロップ\",\n        \"black and white\": \"Black and White\",\n        \"black angel\": \"ブラックエンゼル\",\n        \"black base\": \"BLACK★BASE\",\n        \"black box\": \"Black Box\",\n        \"black crusher\": \"ブラック・クラッシャー\",\n        \"black cyc\": \"ブラックサイク\",\n        \"black doctor\": \"BLACK DOCTOR\",\n        \"black factory\": \"Black Factory\",\n        \"black force\": \"BLACK FORCE\",\n        \"black light\": \"ブラックライト\",\n        \"black list\": \"Black List\",\n        \"black maria\": \"ブラックマリア\",\n        \"black megane kenkyuujo\": \"ブラックメガネ研究所\",\n        \"black moon\": \"ブラックムーン\",\n        \"black package\": \"ブラックパッケージ\",\n        \"black package try\": \"ブラックパッケージトライ\",\n        \"black panda\": \"BLACK PANDA\",\n        \"black pepper\": \"Black Pepper\",\n        \"black russian\": \"ぶらっく☆ルシアン\",\n        \"black sugar\": \"Black_Sugar(仮)\",\n        \"black thunder\": \"Black thunder\",\n        \"black vinegar\": \"ぶらっくびねがー\",\n        \"blackglobe\": \"BLACKGLOBE\",\n        \"blackrainbow\": \"BLACKRAINBOW\",\n        \"blackwing\": \"ブラックウィング\",\n        \"blade\": \"BLADE\",\n        \"blaze\": \"BLAZE\",\n        \"blazer one\": \"Blazer One\",\n        \"blessing fall\": \"Blessing Fall\",\n        \"blind alley\": \"Blind Alley\",\n        \"blink\": \"blink\",\n        \"blip\": \"BLIP\",\n        \"blitzkrieg\": \"ブリッツクリーク\",\n        \"blood plus blood\": \"ぶらっど+ぶらっど\",\n        \"blood temple\": \"BLOOD TEMPLE\",\n        \"bloodberry\": \"BloodBerry\",\n        \"bloodtype-b\": \"Bloodtype-B\",\n        \"bloody hawk\": \"ブラッディーホーク\",\n        \"bloom factory\": \"BLOOM FACTORY\",\n        \"blossom eight\": \"ブロッサムエイト\",\n        \"blossom sphere\": \"Blossom Sphere\",\n        \"blow\": \"BLOW\",\n        \"blue banana\": \"Blue Banana\",\n        \"blue blood\": \"ブルーブラッド\",\n        \"blue bloods\": \"BLUE BLOOD'S\",\n        \"blue blossom\": \"Blue Blossom\",\n        \"blue catty\": \"BLUE CATTY\",\n        \"blue colors nightmare\": \"ブルウカラアズナイトメア\",\n        \"blue cosmos\": \"BLUE COSMOS\",\n        \"blue crest\": \"Blue Crest\",\n        \"blue devil\": \"Blue Devil\",\n        \"blue drop\": \"Blue Drop\",\n        \"blue frill\": \"ブルーフリル\",\n        \"blue gale\": \"ブルーゲイル\",\n        \"blue gale light\": \"ブルゲLIGHT\",\n        \"blue garnet\": \"BLUE GARNET\",\n        \"blue killer\": \"blue killer\",\n        \"blue metal\": \"ブルーメタル\",\n        \"blue moon\": \"ブルームーン\",\n        \"blue percussion\": \"ブルー・パーカッション\",\n        \"blue shachi\": \"ブルーシャッチー\",\n        \"blue sheets\": \"ブルーシーツ\",\n        \"blue signals\": \"BLUE SIGNALS\",\n        \"blue soaproot\": \"Blue soaproot\",\n        \"blue spark\": \"BLUE★SPARK\",\n        \"blue stardust\": \"blue Stardust\",\n        \"blue topaz\": \"ぶるぅとぱぁず\",\n        \"blue trigger\": \"ブルートリガー\",\n        \"blue wave\": \"BLUE WAVE\",\n        \"blue wind\": \"blue wind\",\n        \"blue-noise\": \"BLUE-NOISE\",\n        \"blue24\": \"BLUE24\",\n        \"bluebrand\": \"BlueBrand\",\n        \"bluebullpen\": \"BlueBullPen\",\n        \"bluelagos\": \"Bluelagos\",\n        \"bluemage\": \"BlueMage\",\n        \"bluemonday\": \"BlueMonday\",\n        \"blueocean\": \"BlueOcean\",\n        \"blueversusred\": \"BlueVersusRed\",\n        \"blume\": \"BLUME\",\n        \"blz maniax\": \"BLZ Maniax\",\n        \"bm dan\": \"BM団\",\n        \"bobcaters\": \"BOBCATERS\",\n        \"bocchi island\": \"ぼっちアイランド\",\n        \"bocchi koubou\": \"ぼっち工房\",\n        \"bodley head\": \"BODLEY HEAD\",\n        \"bofubofu mat\": \"ぼふぼふマット\",\n        \"bohyadam\": \"ボヒャダム\",\n        \"bojorebon\": \"ボジョレボン\",\n        \"bokiya\": \"ぼき屋\",\n        \"bokki oniisan\": \"ぼっきおにいさん\",\n        \"boku\": \"撲\",\n        \"boku-hitori.\": \"ぼくひとり。\",\n        \"bokuhako\": \"BOKUHAKO\",\n        \"bokujin\": \"ボクジン\",\n        \"bokura\": \"ぼくら\",\n        \"bokura gosai\": \"ぼくらごさい\",\n        \"bokura no kajitsu\": \"ボクラノカジツ\",\n        \"bolze.\": \"bolze.\",\n        \"boma -born to be mild-\": \"ボマ！-Born to be Mild-\",\n        \"bon\": \"梵\",\n        \"bonanza\": \"ボナンザ\",\n        \"bonelessham\": \"ボンレスハム\",\n        \"bongaichinyon\": \"ぼんがいちにょん\",\n        \"bonnou honpo\": \"煩悩本舗\",\n        \"bonnou strategy\": \"煩悩ストラテジ\",\n        \"bonnou stream\": \"煩悩ストリーム\",\n        \"bonnoudou\": \"凡悩堂\",\n        \"bonsketch\": \"Bonsketch\",\n        \"boobookid\": \"ブーブーキッド\",\n        \"booch\": \"ぶーち\",\n        \"books takada\": \"BOOKSたかだ\",\n        \"boribiya\": \"ボリビ屋\",\n        \"boroboroya\": \"ぼろぼろ屋\",\n        \"boruboru\": \"ボルボる\",\n        \"borushiti teisyoku\": \"ぼるしち定食\",\n        \"bose no doujin manga kenkyuujo\": \"boseの同人漫画研究所\",\n        \"boshi soukan\": \"母子相姦\",\n        \"boston tea party\": \"ボストン茶会\",\n        \"botamochi no utage\": \"ぼたもちの宴\",\n        \"botanzakura\": \"牡丹桜\",\n        \"botibotiikoka\": \"ぼちぼちいこか\",\n        \"botsuraku kizoku\": \"没落貴族\",\n        \"bottle syrup\": \"ボトルシロップ\",\n        \"bottomress pit\": \"Bottomress Pit\",\n        \"bourgeois ice cream\": \"ブルジョワアイスクリーム\",\n        \"bousou fuhatsudan\": \"暴走！！不発団\",\n        \"bouzen meiden r\": \"呆然乙女R\",\n        \"box\": \"■BOX■\",\n        \"box doll\": \"BOX DOLL\",\n        \"boxbear\": \"BoxBear\",\n        \"boyari.\": \"ぼやり。\",\n        \"boyishsuky\": \"BOYISHSUKY\",\n        \"boys be gakuen\": \"ぼーいずびぃ学園\",\n        \"boys musume.\": \"ボーイズ娘。\",\n        \"bp88\": \"BP88\",\n        \"bpm12\": \"bpm12\",\n        \"bq\": \"BQ\",\n        \"brabustersystem\": \"BraBusterSystem\",\n        \"brand new way\": \"Brand New Way\",\n        \"brand nyu\": \"brand nyu\",\n        \"brave chicken\": \"ぶれいぶちきん\",\n        \"bread and cake\": \"パンとケーキ\",\n        \"bread bread\": \"Bread Bread\",\n        \"breath2\": \"BREATH2\",\n        \"breeze\": \"BREEZE\",\n        \"brief case\": \"Brief case\",\n        \"briest\": \"BRIEST\",\n        \"brilliant thunder\": \"brilliant thunder\",\n        \"bringles\": \"ブリんぐるズ\",\n        \"brio\": \"BRIO\",\n        \"britanian\": \"ぶりたにあん\",\n        \"broad smile\": \"Broad smile\",\n        \"broken world\": \"Broken World\",\n        \"bronco hitoritabi\": \"ブロンコ一人旅\",\n        \"bronze age\": \"BRONZE AGE\",\n        \"brown bunny\": \"BROWNBUNNY\",\n        \"brown sugar\": \"Brown sugar\",\n        \"brownie\": \"ブラウニー\",\n        \"brownstone\": \"brownstone\",\n        \"bubble company\": \"バブルカンパニー\",\n        \"bubble fruit\": \"バブルフルーツ\",\n        \"budou bekkan\": \"ブドウ別館\",\n        \"budou nouen\": \"ぶどう農園\",\n        \"buggeman factory\": \"ブギーマンファクトリー\",\n        \"build-tetsu\": \"ビルドテツ\",\n        \"buji kore ameba\": \"無事これアメーバ\",\n        \"buki to bougu no mise\": \"ぶきとぼうぐのみせ\",\n        \"bullet ballet\": \"Bullet Ballet\",\n        \"bumsign\": \"BUMSIGN\",\n        \"bunbonian\": \"ぶんぼにあん\",\n        \"bunbukudou\": \"ぶんぶく堂\",\n        \"bunchindoh\": \"ぶんちん堂\",\n        \"bungalow\": \"バンガロゥ\",\n        \"bunmei kaika\": \"文明快化\",\n        \"buppa studio\": \"ブッパスタジオ\",\n        \"burakuradou\": \"ブラクラ堂\",\n        \"buranko shinshi\": \"ブランコ紳士\",\n        \"buri daikon\": \"ぶり大根\",\n        \"buriburi nyanya\": \"ぶりぶりにゃにゃ\",\n        \"buriki daiou\": \"武力大王\",\n        \"burikichoco\": \"ブリキチョコ\",\n        \"burisuta\": \"ブリスタ\",\n        \"burning hammer\": \"バーニングハンマー\",\n        \"burning sisters\": \"バーニング姉妹\",\n        \"burning soul\": \"バーニンソウル\",\n        \"bushi\": \"節\",\n        \"bushiteki tamashii\": \"武士的魂\",\n        \"busou megami\": \"武装女神\",\n        \"busou yousei\": \"武装妖精\",\n        \"bust emperor\": \"バストエンペラル\",\n        \"buta no bucket\": \"豚のバケツ\",\n        \"buta no hidume\": \"ぶたのひづめ\",\n        \"butagoya dot com\": \"豚小屋.com\",\n        \"butano\": \"ぶたの\",\n        \"butazuraya seinikuten\": \"豚面屋精肉店\",\n        \"butsuri hansha club\": \"物理反射倶楽部\",\n        \"butter cookie\": \"ばたあくっきい\",\n        \"butterfly dream\": \"Butterfly Dream\",\n        \"buttyakedo\": \"ぶっちゃけ堂\",\n        \"buzzer\": \"BUZZER\",\n        \"bv31.5\": \"BV31.5\",\n        \"bye-be\": \"Bye-Be\",\n        \"byougatei\": \"猫画亭\",\n        \"byunbyunhouse\": \"びゅんびゅんはうす\",\n        \"c equal\": \"C=equal\",\n        \"c-arts\": \"C-ARTS\",\n        \"c-company\": \"C-COMPANY\",\n        \"c-line\": \"C-線上\",\n        \"c-rex\": \"C-Rex\",\n        \"c-type\": \"C-type\",\n        \"c.\": \"C.\",\n        \"c.a.t\": \"C・A・T\",\n        \"c.cpu\": \"C.CPU\",\n        \"c.h.a.r.i.o.t\": \"C.H.A.R.I.O.T\",\n        \"c.m.\": \"C.M.\",\n        \"c.n.p\": \"C.N.P\",\n        \"c.o.2\": \"C.O.2\",\n        \"c.r.c\": \"C・R・C\",\n        \"c.s.\": \"C.S.\",\n        \"c.www\": \"C.www\",\n        \"c.y.room\": \"C.Y.roOm\",\n        \"c3h8o3\": \"C3H8O3\",\n        \"c8\": \"C8\",\n        \"c9sou\": \"c9sou\",\n        \"ca.d.d\": \"C：／／A.D.D／\",\n        \"cabbage box\": \"キャベツBOX\",\n        \"cabbage soft\": \"きゃべつそふと\",\n        \"cabbit\": \"Cabbit\",\n        \"caburibbon\": \"caburibbon\",\n        \"cacao\": \"カカオ\",\n        \"cactus\": \"Cactus\",\n        \"cafe atagawa\": \"カフェあたがわ\",\n        \"cafe unlimited\": \"カフェ・アンリミテッド\",\n        \"cafe-hotcocoa.\": \"cafe-hotcocoa.\",\n        \"cafeteria watermelon\": \"カフェテリアWATERMELON\",\n        \"caffeine\": \"Caffeine\",\n        \"cage\": \"CAGE\",\n        \"cahlacahla\": \"CAHLACAHLA\",\n        \"caipirinha\": \"caipirinha\",\n        \"cake maker\": \"cake maker\",\n        \"cake-hitokire\": \"ケーキひと切れ\",\n        \"caligula\": \"カリギュラ\",\n        \"calmblue\": \"CalmBlue\",\n        \"calmboy.com\": \"カームボーイドットコム\",\n        \"calme\": \"calme\",\n        \"calorie off\": \"カロリーオフ\",\n        \"calpara-shed\": \"calpara-shed\",\n        \"calpis koubou\": \"カルピス工房\",\n        \"cambropachycope\": \"カンブロパキコーペ\",\n        \"camp.\": \"カンプ。\",\n        \"campanula\": \"campanula\",\n        \"campers\": \"きゃんぱーず\",\n        \"camrism\": \"カムリズム\",\n        \"can do now\": \"キャンドゥーなう!\",\n        \"canaria\": \"canaria\",\n        \"canary to tsubame\": \"カナリアとつばめ\",\n        \"candy pop\": \"Candy Pop\",\n        \"candy-ya\": \"キャンディー屋\",\n        \"candyman\": \"Candyman\",\n        \"canopus\": \"Canopus\",\n        \"canzume quality\": \"かんづめクオリティ\",\n        \"cao\": \"CaO\",\n        \"capital one\": \"きゃぴたるわん\",\n        \"caplet0.5\": \"caplet0.5\",\n        \"captain santa\": \"Captain SANTA\",\n        \"caramel colors\": \"カラメルシキソ\",\n        \"caramel mamire\": \"カラメルマミレ\",\n        \"caramel soft\": \"キャラメルソフト\",\n        \"caramel yarou\": \"キャラメル野郎\",\n        \"carbonate\": \"carbonate\",\n        \"carburetor\": \"キャブレター\",\n        \"carnage engine\": \"カルネージエンジン\",\n        \"carnelian\": \"CARNELIAN\",\n        \"carnevale9\": \"CARNEVALE9\",\n        \"carol works\": \"Carol Works\",\n        \"carpaccio\": \"カルパッチョ\",\n        \"carrot\": \"きゃろっと\",\n        \"carrot academy\": \"キャロットアカデミー\",\n        \"carrot caramel batake\": \"きゃろっときゃらめる畑\",\n        \"carrot works\": \"きゃろっとワークス\",\n        \"caryo\": \"CARYO\",\n        \"cascade\": \"CASCADE\",\n        \"casket\": \"Casket\",\n        \"casmania\": \"CASMANIA\",\n        \"cassis\": \"CassiS\",\n        \"castella tamago\": \"カステラたまご\",\n        \"castle.m\": \"castle.m\",\n        \"cat and me\": \"Cat&me\",\n        \"cat food\": \"Cat FooD\",\n        \"cat run\": \"Cat Run\",\n        \"cat scratch\": \"CAT scratch\",\n        \"cat tower\": \"きゃっと★たわぁー\",\n        \"catastrophe.\": \"catastrophe.\",\n        \"catcher in the rye\": \"Catcher in the Rye\",\n        \"catchers mitt of silver\": \"銀のキャッチャーミット\",\n        \"catjellyfish\": \"CatJellyFish\",\n        \"catmask\": \"catmask\",\n        \"cats-box\": \"cats-box\",\n        \"cattleya\": \"CATTLEYA\",\n        \"catwalknero\": \"catwalkNERO\",\n        \"cauldron\": \"Cauldron\",\n        \"causciant\": \"かうすしあん\",\n        \"caution\": \"かうじょん\",\n        \"caza mayor\": \"CAZA MAYOR\",\n        \"cc\": \"cc\",\n        \"ccb-elo\": \"ccb-ELO\",\n        \"cdd\": \"CDD\",\n        \"cdpa\": \"CDPA\",\n        \"cecile fan club\": \"セシールファン倶楽部\",\n        \"celeste69\": \"チェレステロック\",\n        \"celica\": \"CELICA\",\n        \"celluloid brothers\": \"セルロイド・ブラザーズ\",\n        \"celluloid-acme\": \"CELLULOID-ACME\",\n        \"celsius\": \"Celsius\",\n        \"cemetery\": \"CEMETERY\",\n        \"censored\": \"censored\",\n        \"cent millibar\": \"¢mb\",\n        \"centaurea cyanus\": \"Centaurea cyanus\",\n        \"center of universe\": \"Center Of Universe\",\n        \"center.village\": \"CENTER.VILLAGE\",\n        \"ceramic heart\": \"セラミックハート\",\n        \"ceremonica\": \"ceremonica\",\n        \"cesalion\": \"シザリオン\",\n        \"cesium-p\": \"セシウムP\",\n        \"cha cha cha brothers\": \"ちゃちゃちゃぶらざーず\",\n        \"chabanchabancha\": \"茶番茶番茶\",\n        \"chabane ninja\": \"ちゃばねにんじゃ\",\n        \"chacha batake.\": \"茶々畑。\",\n        \"chahan\": \"ちゃーはん\",\n        \"chaihazuki\": \"チャイハヅキ\",\n        \"chain reaction\": \"チェーン リアクション\",\n        \"chaingang\": \"CHAINGANG\",\n        \"chakku hankai\": \"チャック半開\",\n        \"chakui\": \"着衣\",\n        \"champagnegold\": \"シャンパンゴールド\",\n        \"champloo\": \"ちゃんぷるー\",\n        \"chandora\": \"ちゃんどら\",\n        \"chanko nabe\": \"ちゃんこ鍋\",\n        \"channel ubai\": \"チャンネル奪\",\n        \"chanpurux\": \"チャンプルX\",\n        \"chantilly\": \"chantilly\",\n        \"chaoizum\": \"ちゃおいずむ\",\n        \"chaos shoujo no mise\": \"カオス少女の店\",\n        \"chaos-graphixxx\": \"chaos-graphixxx\",\n        \"chaos-l\": \"CHAOS-L\",\n        \"chaotic otome studio\": \"カオティック乙女工房\",\n        \"chaotic wolf\": \"Chaotic Wolf\",\n        \"chapedizo\": \"ちゃぺでぃぞ\",\n        \"chaps\": \"チャップス\",\n        \"charan poran\": \"CHARAN PORAN\",\n        \"charinko fox\": \"チャリンコ狐\",\n        \"charis\": \"CHARIS\",\n        \"charisma serve\": \"カリスマサーブ\",\n        \"charme\": \"Charme\",\n        \"charveltiger\": \"シャーベルタイガー\",\n        \"chateau dassault\": \"シャトーダッソー\",\n        \"cheapseek\": \"cheapseek\",\n        \"check mate\": \"Check Mate!\",\n        \"cheese company\": \"チーズカンパニー\",\n        \"cheese takoyaki\": \"チーズたこ焼き\",\n        \"chelsea lip\": \"Chelsea lip\",\n        \"chemi-story\": \"Chemi-Story\",\n        \"chemical itoh\": \"ケミカル伊藤\",\n        \"chemical janky\": \"Chemical Janky\",\n        \"cherokee\": \"CHEROKEE\",\n        \"cherry baron\": \"cherry baron\",\n        \"cherry blossom\": \"チェリーブロッサム\",\n        \"cherry bomb g\": \"チェリーボムG\",\n        \"cherry milk\": \"cherry milk\",\n        \"cherry moon\": \"チェリームーン\",\n        \"cherry pepper\": \"cherry*pepper\",\n        \"cherry snow\": \"ちぇり☆すの\",\n        \"cherry soft\": \"ちぇりーそふと\",\n        \"chest box\": \"ちぇすとぼっくす\",\n        \"chested\": \"chested\",\n        \"chestnut tree\": \"chestnut tree\",\n        \"chibineco honpo\": \"ちびねこ本舗\",\n        \"chicchi bokujou\": \"チッチ牧場\",\n        \"chichai mono club\": \"ちっちゃい物クラブ\",\n        \"chichi mafia\": \"乳マフィア\",\n        \"chichikemo\": \"ちちけも\",\n        \"chick tack bon\": \"ちくたくぼん\",\n        \"chicken nugget gyuuniku aji\": \"チキンナゲット牛肉味\",\n        \"chicken union\": \"ちきんゆにおん\",\n        \"chicken zombies\": \"chicken zombies\",\n        \"chicropokke\": \"チクロポッケ\",\n        \"chideji\": \"チデヂ\",\n        \"chidoriashi\": \"千鳥足\",\n        \"chiduru grind\": \"チヅルグラインド\",\n        \"chie no genseki\": \"知恵の原石\",\n        \"chien\": \"シアン\",\n        \"chiffon\": \"Chiffon\",\n        \"chigen torino\": \"違んTORINO\",\n        \"chigiri-ke\": \"ちぎり家\",\n        \"chigo dou\": \"チーゴ堂\",\n        \"chigoku no icchoume\": \"痴獄の一丁目\",\n        \"chiguraya\": \"ちぐら屋\",\n        \"chigusaya\": \"千草屋\",\n        \"chihagura\": \"ちはぐら\",\n        \"chihiro lanting\": \"千仞蘭庭\",\n        \"chii sanchi\": \"ちい産地\",\n        \"chiisana kagi\": \"小さな鍵\",\n        \"chika kenkyuujo\": \"地下研究所\",\n        \"chikadoh\": \"地下堂\",\n        \"chikashitsu\": \"地下室\",\n        \"chikirazu\": \"チキラーズ\",\n        \"chikiuya\": \"ちきう屋\",\n        \"chiko goya\": \"Limited\",\n        \"chikoku doumei\": \"遅刻同盟\",\n        \"chikoku penpen\": \"遅刻ペンペン\",\n        \"chikomayoya\": \"ちこまよや\",\n        \"chikotsu mania\": \"恥骨マニア\",\n        \"chikutakudoh\": \"ちくたく堂\",\n        \"chikuwa\": \"ちくわ\",\n        \"chikuwa drop\": \"ちくわドロップ\",\n        \"chikuwanko\": \"ちくわんこ\",\n        \"chikuwano kimochi\": \"ちくわの気持ち\",\n        \"childwife\": \"childwife\",\n        \"chill-out\": \"Chill-Out\",\n        \"chilukuni\": \"散る国\",\n        \"chimamire yashiki\": \"血まみれ屋敷\",\n        \"chimatsuriya honpo\": \"血祭屋本舗\",\n        \"chime\": \"ちゃいむ\",\n        \"chimeishou\": \"致命傷\",\n        \"chimere marie\": \"chimere/marie\",\n        \"chimple hotters\": \"チンプルホッターズ\",\n        \"chimple island\": \"チンプル愛☆ランド\",\n        \"chimuya\": \"ちむ屋\",\n        \"chin soudou\": \"珍騒動\",\n        \"chin-up\": \"CHIN-UP\",\n        \"chinasanchi\": \"ちゃいなさんち\",\n        \"chinchintei\": \"ちんちん亭\",\n        \"chinjuu mufy\": \"珍獣ムフィ\",\n        \"chinpudo\": \"珍譜堂\",\n        \"chinshieden\": \"靜雪殿\",\n        \"chinzuri bop\": \"Chinzuri Bop\",\n        \"chips\": \"CHIPS\",\n        \"chiriakuta\": \"塵芥\",\n        \"chirigami goya\": \"ちり紙小屋\",\n        \"chirimen studio\": \"ちりめんすたじお\",\n        \"chirimenjako\": \"ちり綿じゃこ\",\n        \"chirimozuku cha\": \"チリモズク茶\",\n        \"chidorinu\": \"チドリヌ\",\n        \"chirorura\": \"ちろるら\",\n        \"chise\": \"千世\",\n        \"chiukorone\": \"ちうころね\",\n        \"chizakiya\": \"ちざき屋\",\n        \"chloroplast\": \"くろろぷらすと\",\n        \"cho-jin hakaba\": \"超人墓場\",\n        \"choco biscuits\": \"ちょこ★びすけっつ\",\n        \"choco box\": \"choco BOX\",\n        \"choco croissant\": \"チョコクロワッサン\",\n        \"choco zakura\": \"ちょこざくら\",\n        \"choco-banana\": \"ちょこばなな。\",\n        \"chocobits\": \"Chocobits\",\n        \"chococroissants\": \"チョコクロワッサン\",\n        \"chocoholic\": \"chocoholic\",\n        \"chocolat\": \"しょこら～と!\",\n        \"chocolate addiction\": \"Chocolate Addiction\",\n        \"chocolate banana ou lait\": \"ちょこれーとバナナ・オレ\",\n        \"chocolate jam\": \"ちょこれぃとじゃむ\",\n        \"chocolate lily\": \"ちょこりり\",\n        \"chocolate lv.5\": \"chocolate Lv.5\",\n        \"chocolate macaron\": \"チョコレートマカロン\",\n        \"chocolate pepper.\": \"Chocolate Pepper.\",\n        \"chocolate shop\": \"チョコレート・ショップ\",\n        \"chocomoka\": \"ちょこもか\",\n        \"chocotan mogumogu\": \"チョコタンもぐもぐ\",\n        \"chokie\": \"chokie\",\n        \"chokomonetto\": \"ちょこもねっと\",\n        \"chokudoukan\": \"直道館\",\n        \"chokusen ikki\": \"直線一気\",\n        \"chonmage teikoku\": \"丁髷帝国\",\n        \"chori\": \"chori\",\n        \"chotto dake yanke\": \"ちょっとだけやんけ\",\n        \"chotto h gallery\": \"ちょっとHギャラリー\",\n        \"chou a la creme\": \"chou à la crème\",\n        \"chou chemical gakuen z\": \"超ケミカル学園Z\",\n        \"chou mm bekkan\": \"超MM別館\",\n        \"chou project\": \"超プロジェクト\",\n        \"chou the taizenkutsu\": \"超THE体前屈\",\n        \"chou yutori kyouiku\": \"超ゆとり教育\",\n        \"choukyori dandou keisan\": \"长距离弹道计算\",\n        \"choushizen kenkyuujo\": \"超自然研究所\",\n        \"christmas\": \"クリスマス\",\n        \"chroma of wall\": \"壁の彩度\",\n        \"chromaticclip\": \"ChromaticClip\",\n        \"chronicle\": \"くろにくる\",\n        \"chrono mail\": \"クロノ・メール\",\n        \"chrronix\": \"Chrronix\",\n        \"chukara coffee\": \"中辛珈琲\",\n        \"chunhaikan\": \"中海館\",\n        \"chupa chupa ya\": \"ちゅぱちゅぱ屋\",\n        \"chuu ni no kaori\": \"中二のかおり\",\n        \"chuugakukan\": \"中学館\",\n        \"chuuka hanten\": \"ちゅうか飯店\",\n        \"chuuka mantou\": \"中華饅頭\",\n        \"chuuni byoutou\": \"厨二病棟\",\n        \"chuusei mafuman\": \"中性まふまん♀\",\n        \"chuutohanpa man\": \"中途半端マン\",\n        \"ciaociao\": \"ciaociao\",\n        \"cicada\": \"CICADA\",\n        \"ciel\": \"Ciel\",\n        \"cinderella complex\": \"Cinderella Complex\",\n        \"cinnamon cigar\": \"Cinnamon Cigar\",\n        \"cior\": \"Cior\",\n        \"cipher\": \"裁羽\",\n        \"circle 1 gou\": \"サークル1号\",\n        \"circle a\": \"Circle A\",\n        \"anastasia\": \"Anastasia\",\n        \"circle anco\": \"サークルアンコ\",\n        \"circle b.c.a.\": \"サークルB.C.A.\",\n        \"circle baku\": \"サークル獏\",\n        \"circle bob\": \"サークルボブ\",\n        \"circle credit\": \"サークルくれじっと\",\n        \"circle daiinma\": \"サークル大淫魔\",\n        \"circle damesimai\": \"サークル駄目姉妹\",\n        \"circle dare\": \"サークル誰?\",\n        \"circle energy\": \"サークルENERGY\",\n        \"circle enzin\": \"サークルENZIN\",\n        \"circle fairy flower\": \"サークル☆フェアリーフラワー\",\n        \"circle foundation\": \"CIRCLE FOUNDATION\",\n        \"circle ggm\": \"サークルGGM\",\n        \"circle hcm\": \"サークルHCM\",\n        \"circle hitori\": \"サークルひとり\",\n        \"circle huxian\": \"サークル狐仙\",\n        \"circle itaku\": \"サークルイタク\",\n        \"circle itomagoi\": \"サークル暇乞い\",\n        \"circle iwaodou\": \"サークル岩尾堂\",\n        \"circle kgb\": \"サークルKGB\",\n        \"circle king\": \"サークルきんぐ\",\n        \"circle kotatubuton\": \"サークルこたつぶとん\",\n        \"circle meimitei\": \"サークル冥魅亭\",\n        \"circle msm\": \"サークルMSM\",\n        \"circle nekome\": \"サークルねこめ\",\n        \"circle nnn\": \"サークルN･N･N\",\n        \"circle nuruma-ya\": \"サークルぬるま屋\",\n        \"circle of kenkyo\": \"サークルオブ謙虚\",\n        \"circle op\": \"circle OP\",\n        \"circle outerworld\": \"サークルOUTER WORLD\",\n        \"circle plum\": \"サークルぷらむ\",\n        \"circle rachigai\": \"サークル埒外\",\n        \"circle rindou\": \"さーくるりんどー\",\n        \"circle shakunetsu\": \"サークル灼熱\",\n        \"circle sigma\": \"Circle Σ\",\n        \"circle six\": \"circle six\",\n        \"slave\": \"SLAVE\",\n        \"circle spice\": \"さーくるスパイス\",\n        \"circle streak\": \"CIRCLE STREAK\",\n        \"tintin\": \"TinTin\",\n        \"circle trident\": \"Circle Trident\",\n        \"circle yaranaika\": \"サークルやらないか\",\n        \"circle yubokumin\": \"サークル遊牧民\",\n        \"circle yuki\": \"サークルゆき\",\n        \"circle den\": \"田\",\n        \"circled 1\": \"①\",\n        \"circus\": \"サーカス\",\n        \"circus fetish\": \"サーカス・フェティッシュ\",\n        \"citron\": \"CITRON\",\n        \"citron love\": \"CITRON LOVE\",\n        \"citron tree\": \"citron tree\",\n        \"citrus\": \"Citrus\",\n        \"city forest\": \"City Forest\",\n        \"ciz\": \"CIZ!!\",\n        \"cla cla clala\": \"Cla Cla Clala\",\n        \"clammbon\": \"クラムボン\",\n        \"clara soap\": \"クララソープ\",\n        \"classic orange\": \"Classic Orange\",\n        \"cle2700\": \"cle2700\",\n        \"clean up\": \"CLEAN UP\",\n        \"cleanliness.\": \"cleanliness\",\n        \"clear glass\": \"Clear Glass\",\n        \"clearbook\": \"ClearBook\",\n        \"clione house\": \"くりおねハウス\",\n        \"clip\": \"くりっぷ\",\n        \"clipline\": \"クリップライン\",\n        \"clipper\": \"CLiPPER\",\n        \"clock\": \"CLOCK\",\n        \"clodia\": \"CLODIA\",\n        \"close heart\": \"CLOSE HEART\",\n        \"cloud nine\": \"雲9\",\n        \"cloud noise\": \"クラウドノイズ\",\n        \"cloud palette\": \"Cloud Palette\",\n        \"cloudair\": \"cloudair\",\n        \"cloudy\": \"くらうでぃ\",\n        \"clover\": \"CLOVER\",\n        \"clover kai\": \"くろーヴァー会\",\n        \"clownculture\": \"ClownCulture\",\n        \"club bacteria\": \"クラブ・バクテリア\",\n        \"club dark-shadow\": \"CLUB Dark-Shadow\",\n        \"club-z\": \"CLUB-Z\",\n        \"club54\": \"club54\",\n        \"clubmatt\": \"clubmatt\",\n        \"cluster\": \"くらすたぁ\",\n        \"clutch shot king\": \"CLUTCH SHOT KING\",\n        \"clymenia\": \"クリメニア\",\n        \"cnc\": \"CNC\",\n        \"cobrano\": \"こぶらの\",\n        \"coburamenman\": \"コブラーメンマン\",\n        \"cocca\": \"cocca\",\n        \"coccinelle\": \"coccinelle\",\n        \"cock-a-doodle-doo\": \"Cock-a-Doodle-Doo\",\n        \"cocktail soft\": \"カクテル・ソフト\",\n        \"coco\": \"COCO\",\n        \"cocoa break\": \"COCOA BREAK\",\n        \"cocoloco note\": \"CoCoLoCo☆Note\",\n        \"cocon\": \"cocon!\",\n        \"coconutbless\": \"ココナッツブレス\",\n        \"cocoon\": \"cocoon\",\n        \"cocotto\": \"cocotto\",\n        \"cocytusgarden\": \"CocytusGarden\",\n        \"codeine girl\": \"コデインガール\",\n        \"coffee chazuke\": \"珈琲茶漬け\",\n        \"coffee curry\": \"コーヒーカレー\",\n        \"coffee maker\": \"こーひーめーかー\",\n        \"cokot\": \"cokot\",\n        \"cola bolt\": \"コーラーボルト\",\n        \"colette\": \"Colette\",\n        \"coli-chu\": \"coli厨\",\n        \"colobocs\": \"CoLoBoCs\",\n        \"color art\": \"Color art\",\n        \"color hiyoko dousoukai\": \"カラーひよこ同窓会\",\n        \"color-staining\": \"COLOR-STAINING\",\n        \"colosseum\": \"コロセウム\",\n        \"colour and shape\": \"からーあんどしぇいぷ\",\n        \"colt\": \"Colt\",\n        \"colt-run\": \"こるとらん\",\n        \"combat mon-mon\": \"コンバットモンモン\",\n        \"comic empire\": \"コミックエンパイア\",\n        \"comic kingdom\": \"コミックキングダム\",\n        \"command plus z\": \"Command+Z\",\n        \"commanding eagle\": \"Commanding Eagle\",\n        \"commando\": \"コマンドー\",\n        \"commelina\": \"Commelina\",\n        \"comomo\": \"COMOMO\",\n        \"compact software\": \"Compact Software\",\n        \"complete box\": \"コンプリートボックス\",\n        \"complets\": \"コンプリーツ\",\n        \"complex\": \"COMPLEX\",\n        \"concerto\": \"コンチェルト\",\n        \"concrete river\": \"CONCRETE RIVER\",\n        \"coneco house\": \"こねこはうすー\",\n        \"confiture soft\": \"コンフィチュールソフト\",\n        \"consava\": \"こんさば\",\n        \"contamination\": \"こんたみねーしょん\",\n        \"convallo-stick\": \"Convallo-stick\",\n        \"cool brain\": \"COOL BRAIN\",\n        \"cool kyou dai san shibu\": \"クール教第三支部\",\n        \"cool palace\": \"Cool Palace\",\n        \"cool sister\": \"く～るシスター\",\n        \"coolheadwarmheart\": \"CoolHeadWarmHeart\",\n        \"coonelius\": \"くーねりあす\",\n        \"coopy\": \"coopy\",\n        \"copen\": \"こぺん\",\n        \"copin\": \"Copin\",\n        \"copo deluxe\": \"こぽDELUXE\",\n        \"coral reef\": \"コーラルリーフ\",\n        \"corkbox\": \"コルクBOX\",\n        \"coronach\": \"カラナック\",\n        \"cosmic cute\": \"COSMIC CUTE\",\n        \"cothurnus\": \"Cothurnus\",\n        \"cotojikan\": \"琴慈館\",\n        \"cottage\": \"cottage\",\n        \"cotton candy\": \"Cotton Candy\",\n        \"cotton color\": \"コットンカラー\",\n        \"cotton house\": \"こっとん堂\",\n        \"cotton pop\": \"Cotton Pop\",\n        \"cottontail\": \"cottontail\",\n        \"countack\": \"カウンタック\",\n        \"counter attack\": \"COUNTER ATTACK\",\n        \"counter-censorship\": \"COUNTER-CENSORSHIP\",\n        \"counterparts\": \"COUNTERPARTS\",\n        \"countryside\": \"countryside\",\n        \"courmet-nyankichi\": \"くるめにゃん吉\",\n        \"courreges accel\": \"クレージュアクセル\",\n        \"covare\": \"covare\",\n        \"cow lipid\": \"Cow Lipid\",\n        \"cozybowl\": \"cozybowl\",\n        \"cpi\": \"cpi\",\n        \"craft\": \"CRAFT\",\n        \"craft-gear\": \"CRAFT-GEAR\",\n        \"craftworks\": \"CraftWorks\",\n        \"crank.in\": \"クランク・イン\",\n        \"crash tv\": \"CRASH TV\",\n        \"crayon arts\": \"くれよんあーつ\",\n        \"crayon48\": \"くれよん48\",\n        \"crazy alicetale\": \"Crazy Alicetale\",\n        \"crazy clover club\": \"CRAZY CLOVER CLUB\",\n        \"crazy comedian\": \"クレイジーコメディアン\",\n        \"crazyregion\": \"crazyregion\",\n        \"crea-holic\": \"Crea-Holic\",\n        \"cream cider\": \"くりぃむサイダー\",\n        \"cream gallon\": \"くりーむがろん\",\n        \"cream zenzai\": \"くりいむぜんざい\",\n        \"creamy cafe\": \"Creamy Cafe\",\n        \"crear mint\": \"CREAR★MINT\",\n        \"crepe\": \"Crepe\",\n        \"crimson\": \"クリムゾン\",\n        \"crimson crown\": \"Crimson CROWN\",\n        \"crimson ground\": \"CRIMSON GROUND\",\n        \"crimson kantai\": \"クリムゾン艦隊\",\n        \"crips\": \"Crips\",\n        \"critical hit\": \"くりてぃかるひぅと\",\n        \"crocodile-ave.\": \"CROCODILE-Ave.\",\n        \"cronus\": \"Cronus\",\n        \"crooked navel\": \"Crooked Navel\",\n        \"cross down\": \"CROSS DOWN\",\n        \"cross fire\": \"CROSS FIRE\",\n        \"cross hearts\": \"CROSS HEARTS\",\n        \"cross place\": \"CROSS PLACE\",\n        \"cross talk\": \"Cross Talk\",\n        \"cross-do\": \"黒酢堂\",\n        \"crossco switch\": \"くろすこスイッチ\",\n        \"crossnet\": \"クロスネット\",\n        \"crossover\": \"CROSSOVER\",\n        \"crossray\": \"crossray\",\n        \"crotch\": \"Crotch\",\n        \"crowclock\": \"crowclock\",\n        \"crown brigade\": \"CROWN BRIGADE\",\n        \"crowview\": \"CrowView\",\n        \"cryptid\": \"cryptid\",\n        \"crystal capricorn\": \"Crystal Capricorn\",\n        \"crystal shoujo\": \"クリスタル少女\",\n        \"crystal strawberry\": \"硝子の苺\",\n        \"crystal tower\": \"クリスタルタワー\",\n        \"crystalia\": \"CRYSTALiA\",\n        \"cshouse\": \"しーずはうす\",\n        \"ctn\": \"クリスチーネ\",\n        \"cube sugar\": \"Cube Sugar\",\n        \"cubic\": \"Cubic\",\n        \"cuffs\": \"Cuffs\",\n        \"cuniculus\": \"CUNICULUS\",\n        \"cupi\": \"キュピ\",\n        \"cupid ice\": \"キューピッドアイス\",\n        \"curefull base\": \"Curefull Base\",\n        \"curiocity\": \"Curiocity\",\n        \"current storage\": \"Current Storage\",\n        \"cursor\": \"カーソル\",\n        \"curtain wall no ie\": \"カーテンウォールの家\",\n        \"custardragon\": \"Custardragon\",\n        \"custom\": \"くすとむ\",\n        \"cut a dash\": \"CUT A DASH!!\",\n        \"cut works publishing\": \"Cut Works Publishing\",\n        \"cute\": \"Cute\",\n        \"cute bilibili\": \"キュートビリビリ\",\n        \"cvl launching pad\": \"CVL発射台\",\n        \"cyanos\": \"CYANOS\",\n        \"cyber ark\": \"CYBER ARK\",\n        \"cyber f\": \"Cyber F\",\n        \"cyber manga doujou\": \"サイバー☆マンガ道場\",\n        \"cyber sakura\": \"サイバー桜\",\n        \"cyberangel\": \"CYBERANGEL\",\n        \"cyborg hum\": \"サイボーグハム\",\n        \"cyc\": \"Cyc\",\n        \"cyc no-nos\": \"サイクノノス\",\n        \"cyclet\": \"CYCLET\",\n        \"cyclo-\": \"Cyclo-\",\n        \"cyclone\": \"サイクロン\",\n        \"cyduster\": \"CYDUSTER\",\n        \"cykranosh\": \"さいくらの〜しゅ\",\n        \"cynthia\": \"Cynthia\",\n        \"cytokine\": \"CYTOKINE\",\n        \"cz\": \"CZ\",\n        \"d-baird\": \"D-Baird\",\n        \"d-dkd\": \"D-DKD\",\n        \"d-heaven\": \"D-heaven\",\n        \"d-ivision\": \"D-ivision\",\n        \"d-lovers\": \"D-LOVERS\",\n        \"d-march\": \"D-MARCH\",\n        \"d-point\": \"D-Point!\",\n        \"d-ten\": \"D-TEN\",\n        \"d.a.p\": \"d.a.p\",\n        \"d.h\": \"D.H\",\n        \"d.o.\": \"ディーオー\",\n        \"d2 algorithm\": \"D2 Algorithm\",\n        \"dadachamame\": \"だだちゃまめ\",\n        \"daddymulk\": \"DADDYMULK\",\n        \"dagashiya\": \"駄菓子屋\",\n        \"dai 13 kantai\": \"第13艦隊\",\n        \"dai 3 no shippo\": \"だい③のしっぽ\",\n        \"dai 46 kishidan\": \"第46騎士団\",\n        \"dai n honpo\": \"第N本舗\",\n        \"dai ninja teikoku\": \"大忍者帝国\",\n        \"dai nippon kodomo shuppan\": \"大日本子供出版\",\n        \"dai-l studio\": \"第Lスタジオ\",\n        \"daidai koubou\": \"大々工房\",\n        \"daidaido\": \"橙堂\",\n        \"daidaros\": \"ダイだろす\",\n        \"daidenjin koubou\": \"大電人工房\",\n        \"daiginjou masshigura\": \"大吟醸まっしぐら\",\n        \"daiichi denshi\": \"第一電子\",\n        \"daiichi yutakasou\": \"第壱ユタカ荘\",\n        \"daiji na koto wa nikai mo iwanai\": \"大事なことは二回も言わない\",\n        \"daijobi kenkyuujo\": \"ダイジョビ研究所\",\n        \"daikichi-ya\": \"だいきち屋\",\n        \"daikonya sanchoume\": \"大根屋三丁目\",\n        \"daini hokenshitsu\": \"ダイニホケンシツ\",\n        \"dainichakai\": \"第二茶会\",\n        \"dainyu dougumo\": \"代入道雲\",\n        \"dairiseki\": \"大理石\",\n        \"daisaku no iru circle\": \"大作のいるサークル\",\n        \"daisan shinsekai\": \"第三新世界\",\n        \"daisy chain\": \"デイジーチェイン\",\n        \"daitokei\": \"大刀契\",\n        \"daitoutaku\": \"大董卓\",\n        \"daiznosusume\": \"だいずのススメ\",\n        \"daizu azuki\": \"大豆小豆\",\n        \"daizuya\": \"だいず屋\",\n        \"dakashiya oroshi\": \"堕菓子屋卸\",\n        \"daken nanban\": \"駄犬南蛮\",\n        \"dakuhan\": \"だくはん\",\n        \"dall\": \"DALL\",\n        \"dam labo\": \"だむlabo\",\n        \"damage honpo\": \"ダメージ本舗\",\n        \"damaguro\": \"だまぐろ\",\n        \"dame project\": \"DAMe project\",\n        \"damedungeon\": \"DameDungeon\",\n        \"damn bomb\": \"だむぼむ\",\n        \"danball man\": \"ダンボールまん\",\n        \"danball mansion\": \"ダンボールマンション\",\n        \"dancing cat\": \"ダンシングキャット\",\n        \"dandan chinjufu\": \"弾々鎮守府\",\n        \"dandandadan\": \"段々打団\",\n        \"dandelion\": \"だんでらいおん\",\n        \"dandy lonely cherry\": \"Dandy Lonely Cherry\",\n        \"dandy skip\": \"だんでぃすきっぷ\",\n        \"danekoya gunekodou\": \"駄猫屋愚猫堂\",\n        \"dangan densetsu\": \"弾丸伝説\",\n        \"dangan honey\": \"弾丸ハニィ\",\n        \"dange\": \"談華\",\n        \"danger equals zone\": \"DANGER=ZONE\",\n        \"dangerous charms\": \"デンジャラス・チャームス\",\n        \"dangoya\": \"DANGOYA\",\n        \"danikuya-san\": \"駄肉家さん\",\n        \"dankon no sato\": \"男根の里\",\n        \"danna\": \"ダンナ\",\n        \"dannoura\": \"壇ノ浦\",\n        \"dansei clear gadget\": \"弾性クリアガジェット\",\n        \"danshaku ryou\": \"男爵領\",\n        \"dantyo neko\": \"だんちょねこ\",\n        \"danzi engine\": \"ダンジエンジン\",\n        \"darabuchidou\": \"だらぶち堂\",\n        \"daradara no kiheitai\": \"だらだらの騎兵隊\",\n        \"dark battery\": \"Dark battery\",\n        \"dark buta gorilla\": \"ダーク・ブタゴリラ\",\n        \"dark cherish\": \"Dark Cherish\",\n        \"dark crimson\": \"Dark Crimson\",\n        \"dark force\": \"suzuki shinobu\",\n        \"dark roseex-s\": \"Dark RoseEX-S\",\n        \"dark side\": \"ダークサイド\",\n        \"dark spirit\": \"だーくすぴりっと\",\n        \"dark water\": \"Dark Water\",\n        \"dark zone\": \"ダーク・ゾーン\",\n        \"darmax\": \"DARMAX\",\n        \"darumasan koronda\": \"達磨さん転んだ\",\n        \"dashigara 100\": \"ダシガラ100%\",\n        \"dashimakitamago\": \"DASHIMAKITAMAGO\",\n        \"dashinoko\": \"だしの粉\",\n        \"dashiotto\": \"だしおっと\",\n        \"dass\": \"DASS\",\n        \"date wa gorgeous ni\": \"デートはゴージャスに\",\n        \"dateline\": \"デートライン\",\n        \"datendou\": \"堕天堂\",\n        \"daylight\": \"デイライト\",\n        \"db-soft\": \"デービーソフト\",\n        \"dbh\": \"DBH\",\n        \"ddal84\": \"DDAL84\",\n        \"ddt\": \"DDT\",\n        \"dead angle\": \"デッドアングル\",\n        \"dead ranker\": \"Dead Ranker\",\n        \"deadnoodles\": \"Deadnoodles\",\n        \"dear\": \"Dear\",\n        \"dear durandal\": \"Dear Durandal\",\n        \"dear life\": \"DEAR LIFE\",\n        \"deardeer\": \"でぃあでぃあ\",\n        \"dearmyfriends\": \"DearMyFriends\",\n        \"death dolls\": \"Death Dolls\",\n        \"death presso\": \"デスプレッソ\",\n        \"deathgaze-system\": \"deathgaze-system\",\n        \"debagame daisoujou\": \"出歯亀大僧正\",\n        \"debodebodan\": \"でボでボ団\",\n        \"debonosu works\": \"でぼの巣製作所\",\n        \"december-girl\": \"December-Girl\",\n        \"dedepoppo\": \"ででぽっぽ\",\n        \"deed\": \"DEED\",\n        \"deeeepforest\": \"DeeeePforest\",\n        \"def cats\": \"DEF CATS\",\n        \"def999\": \"DEF999\",\n        \"degicat\": \"デジキャット\",\n        \"deisui oukoku\": \"泥酔桜国\",\n        \"dejavu\": \"Dejavu\",\n        \"dejikago\": \"でじかご\",\n        \"dekiai shinkou\": \"溺愛信仰\",\n        \"dekoboko furniture\": \"凸凹ファニチャー\",\n        \"dekoponzu\": \"でこぽんず\",\n        \"dekosenn titai\": \"デコ戦地帯\",\n        \"delayder\": \"でぃれ～だー\",\n        \"delica\": \"Delica\",\n        \"delta\": \"DELTA\",\n        \"delta blade\": \"デルタブレード\",\n        \"delta box\": \"DELTA BOX\",\n        \"deltaforce\": \"DELTAFORCE\",\n        \"delusion\": \"でるしおん\",\n        \"dende\": \"でんで\",\n        \"denden\": \"電電\",\n        \"denden-dou\": \"電伝導\",\n        \"dengenoff\": \"電源OFF\",\n        \"denji yuudou\": \"電磁誘導\",\n        \"denjin\": \"電神\",\n        \"denki biribiri\": \"電気びりびり\",\n        \"denki orange\": \"電気おれんじ\",\n        \"denkishiki\": \"電気式\",\n        \"dennou chocolate\": \"電脳ちょこれーと\",\n        \"dennou denpa hatsureisho\": \"電脳電波発令所\",\n        \"dennou fuyu mikan\": \"電脳冬蜜柑\",\n        \"dennou yamasakigumi\": \"電脳山咲組\",\n        \"dennougiwa\": \"電脳戯話\",\n        \"denpa anshitsu\": \"電波暗室\",\n        \"denpa tsuushin\": \"デンパツーシン\",\n        \"denpa yunyun\": \"電波ゆんゆん\",\n        \"denpaesidan\": \"電派絵師団\",\n        \"derashine can\": \"でらしね缶\",\n        \"derashobokai\": \"でらしょぼ会\",\n        \"deresuke syuppan\": \"でれすけ出版\",\n        \"derlanger\": \"D'ERLANGER\",\n        \"derolian\": \"デロリアン\",\n        \"desafinado\": \"desafinado\",\n        \"desart.\": \"desart.\",\n        \"desire\": \"デザイアー\",\n        \"desire gadget\": \"Desire Gadget\",\n        \"desk drawer\": \"Desk Drawer\",\n        \"desorden\": \"DESORDEN\",\n        \"death purin\": \"デスプリン\",\n        \"destron shoukai\": \"デストロン商会\",\n        \"desuroguma\": \"デスロ熊\",\n        \"detergent\": \"detergent\",\n        \"detox-girls\": \"Detox-Girls\",\n        \"developers\": \"デベロッパーズ\",\n        \"devri channel\": \"デヴリチャンネル\",\n        \"dewdrop\": \"DewDrop\",\n        \"dex plus\": \"DEX+\",\n        \"dg\": \"D☆G\",\n        \"dg project\": \"DG Project\",\n        \"dhr-ken\": \"dHR研\",\n        \"diablo\": \"Diablo\",\n        \"diamond dust\": \"ダイヤモンドダスト\",\n        \"diamond guardian\": \"ダイヤモンドガーディアン\",\n        \"diamond tiara\": \"Diamond tiara\",\n        \"dicca\": \"dicca\",\n        \"dice b\": \"ダイスB\",\n        \"dickpital\": \"ディクピタル\",\n        \"dieppe factory\": \"DIEPPE FACTORY\",\n        \"diethyl ether\": \"ジエチルエーテル\",\n        \"dig dug\": \"Dig Dug\",\n        \"digi-ai\": \"DiGi-Ai\",\n        \"digianko\": \"デジアンコ\",\n        \"digiel\": \"DiGiEL\",\n        \"digital cute\": \"Digital Cute\",\n        \"digital flyer\": \"Digital Flyer\",\n        \"digital g power\": \"デジタルGパワー\",\n        \"digital graffiti\": \"Digital Graffiti\",\n        \"digital onahole\": \"でじたるおなほ～る\",\n        \"digital symphony\": \"DIGITAL SYMPHONY\",\n        \"digital tambourine\": \"でじたるたんばりん\",\n        \"digix\": \"digiX\",\n        \"dildo rotor\": \"ディルドローター\",\n        \"diletta\": \"diletta\",\n        \"dilettante\": \"ディレッタント\",\n        \"dimension empire\": \"dimension empire\",\n        \"dimension25\": \"2.5次元\",\n        \"dinosaur house\": \"だいなそ～ハウス\",\n        \"dip switch\": \"ディップ・スイッチ\",\n        \"dipper magic\": \"Dipper Magic\",\n        \"dirty\": \"DIRTY\",\n        \"dirty69star\": \"Dirty69star★\",\n        \"discovery\": \"ディスカバリー\",\n        \"discovery mars\": \"ディスカバリー・マーズ\",\n        \"dish up\": \"Dish up\",\n        \"divine fountain\": \"神聖ファウンテン\",\n        \"dix-sept\": \"dix-sept\",\n        \"dixie\": \"ディクシー\",\n        \"dixieland\": \"迪西蘭\",\n        \"dkjmn\": \"dkjmn\",\n        \"dmcontrast\": \"DMコントラスト\",\n        \"dmmc\": \"DMMC\",\n        \"do well\": \"Do well !!!\",\n        \"do you die\": \"DO YOU DIE?\",\n        \"dobakin.\": \"どばきん。\",\n        \"dobu no hotori.\": \"どぶのほとり。\",\n        \"doc.\": \"doc.\",\n        \"dodo fuguri\": \"百々ふぐり\",\n        \"dodomeiro teishoku\": \"どどめ色定食\",\n        \"dog house\": \"ドッグハウス\",\n        \"dogear\": \"Dogear\",\n        \"doggie style\": \"doggie★style\",\n        \"dogstyle\": \"DogStyle\",\n        \"dogtag\": \"DOGTAG\",\n        \"dogu-sensya storm\": \"土偶戦車ストーム\",\n        \"dohatsu shouten\": \"怒髪商店\",\n        \"dojin otome\": \"ドージンオトメ\",\n        \"dojinchi\": \"どじんち\",\n        \"dokomademo aoi sora ni ukabu niku\": \"何処までも蒼い空に浮かぶ肉。\",\n        \"doku alice\": \"どくアリス\",\n        \"doku ringo\": \"毒リンゴ\",\n        \"doku sasori\": \"毒蠍\",\n        \"doku69\": \"毒69\",\n        \"dokudami\": \"ドクダミ\",\n        \"dokudenpa jushintei\": \"毒電波受信亭\",\n        \"dokudenpa kenkyuusho\": \"毒電波研究所\",\n        \"dokudenpa tsuushin\": \"毒電波通信\",\n        \"dokudoku melon\": \"どくどくめろん\",\n        \"dokudoku ryouki garou\": \"毒どく猟奇画廊\",\n        \"dokumushi shokeitai\": \"毒虫処刑隊\",\n        \"dokunuma\": \"どくぬま\",\n        \"dokupan koubou\": \"毒パン工房\",\n        \"dokuritsu gurentai\": \"独立愚連隊\",\n        \"dolce\": \"DOLCE\",\n        \"dolce einsatz\": \"Dolce Einsatz\",\n        \"dolcecanto\": \"DolceCanto\",\n        \"dolkavtahn\": \"Dolkavtahn\",\n        \"doll play\": \"DOLL PLAY\",\n        \"dom joshidan\": \"ドM女史団\",\n        \"dom kishidan\": \"ドM騎士団\",\n        \"domestic animals\": \"Domestic animals\",\n        \"donkin darnuts\": \"どんきんだぁなっつ\",\n        \"dontokodon\": \"どんとこどん\",\n        \"dontokoi oo\": \"ドンと来い!○○!\",\n        \"donut ike\": \"ど～なつ池\",\n        \"donzoko kashiwa meshi\": \"どん底かしわめし\",\n        \"donzoko tengoku\": \"ドン底天国\",\n        \"donzoko.\": \"どんぞこ。\",\n        \"doomcomic\": \"ドゥームコミック\",\n        \"doppelgesicht\": \"DOPPELGESICHT\",\n        \"dorepooru\": \"ドレポール\",\n        \"dorgel\": \"dorgel\",\n        \"dorichin koubou\": \"ドリチン工房\",\n        \"doronuma kyoudai\": \"泥沼兄弟\",\n        \"doropanda tours\": \"どろぱんだTOURS\",\n        \"doroyume\": \"とろゆめ\",\n        \"dosukoi\": \"どすこい!\",\n        \"dosukoi jinja\": \"どす恋☆神社\",\n        \"dot collector\": \"Dot Collector\",\n        \"dotechin tengoku\": \"どてちん天国\",\n        \"dotou no m kikaku\": \"怒涛のM企画!!\",\n        \"dots and lines\": \"どっつ&らいんず\",\n        \"dou-chikikure\": \"童チキクレ\",\n        \"double branch\": \"だぶるぼらんち\",\n        \"double deck seisakujo\": \"ダブルデック製作所\",\n        \"double dice\": \"だぶるだいす\",\n        \"double melon\": \"ダブルメロン\",\n        \"double slash\": \"ダブルスラッシュ\",\n        \"double typhoon\": \"ダブルタイフーン\",\n        \"double volante\": \"だぶるぼらんち\",\n        \"double-h\": \"DOUBLE-H\",\n        \"doubleflower\": \"DoubleFlower\",\n        \"doudantsutsujitomonokai\": \"満天星友乃会\",\n        \"douganebuibui\": \"ドウガネブイブイ\",\n        \"doujin kappa\": \"同人河童\",\n        \"doujin mukashibanashi\": \"同人昔話\",\n        \"doumou\": \"DOUMOU\",\n        \"doushia\": \"ドーシア\",\n        \"doushin chaya\": \"童心茶屋\",\n        \"doutei shokudou\": \"童貞食堂\",\n        \"douwa-kensetsu\": \"童話建設\",\n        \"doux\": \"DOUX\",\n        \"downbeat\": \"downbeat\",\n        \"doyondo.\": \"どよんど。\",\n        \"dozo-mae\": \"どーぞーまえ\",\n        \"dragon edge\": \"龍泉\",\n        \"dragon goya\": \"ドラゴン小屋\",\n        \"dragon heart\": \"Dragon Heart\",\n        \"dragon island\": \"ドラゴンアイランド\",\n        \"dragonia\": \"どらごにあ\",\n        \"dragonstorm\": \"ドラゴンストーム\",\n        \"dragula\": \"DRAGULA\",\n        \"drain\": \"drain\",\n        \"drakle-nekota perpetual motion\": \"どらねこ永久機関\",\n        \"draw go\": \"Draw Go\",\n        \"drawpnir\": \"Drawpnir\",\n        \"dream chaser\": \"Dream Chaser\",\n        \"dream club\": \"ドリーム倶楽部\",\n        \"dream dot\": \"ドリームドット\",\n        \"dream halls\": \"Dream Halls!\",\n        \"dream house\": \"DREAM HOUSE\",\n        \"dream project\": \"ドリームプロジェクト\",\n        \"dream rider\": \"DREAM RIDER\",\n        \"dream-mist\": \"dream-mist\",\n        \"drei\": \"Drei\",\n        \"dress\": \"ドレス\",\n        \"dressblackheulee\": \"dressblackheulee\",\n        \"dressmash\": \"DRESSMASH\",\n        \"drill biyori\": \"どりる日和\",\n        \"drilln girl\": \"drill'n girl\",\n        \"drink it\": \"Drink it!\",\n        \"drivehome\": \"drivehome\",\n        \"drizzly rain\": \"drizzly rain\",\n        \"dro-ya\": \"泥屋\",\n        \"drop\": \"DROP\",\n        \"drops\": \"どろっぷす!\",\n        \"drum-kan\": \"ドラム缶\",\n        \"dryr\": \"DryR\",\n        \"dsb style\": \"DSB Style\",\n        \"dso\": \"でぃえすおー\",\n        \"dssk\": \"DSSK\",\n        \"dt koubou\": \"DT工房\",\n        \"dual beat\": \"DUAL BEAT\",\n        \"dual i fap\": \"Dual i fap\",\n        \"dualtail\": \"dual tail\",\n        \"dudedle studio\": \"デュードルスタジオ\",\n        \"dummyrun\": \"DUMMY RUN\",\n        \"dummyusagi\": \"DummyUsagi\",\n        \"dvcommunications\": \"DVコミュニケイションズ\",\n        \"dying kitchen z\": \"Dying Kitchen Z\",\n        \"dynamic kanoke\": \"ダイナミック棺桶\",\n        \"dynamite honey\": \"ダイナマイト☆ハニー\",\n        \"e\": \"e\",\n        \"e ali-al\": \"e☆ALI-aL!\",\n        \"e factory\": \"E factory\",\n        \"e ni kaita mochi\": \"絵にかいた餅\",\n        \"e project\": \"E project\",\n        \"e roman koubou\": \"江☆浪漫工房\",\n        \"e-10 field\": \"E-10フィールド\",\n        \"e-hentaicore\": \"E-Hentaicore\",\n        \"e-lse\": \"E-lse\",\n        \"e.b.\": \"E.B.\",\n        \"e50\": \"絵50\",\n        \"e649ne\": \"e649ne\",\n        \"e73\": \"E73\",\n        \"eapo-zu\": \"eapo-zu\",\n        \"ear-pop\": \"EAR-POP\",\n        \"earl lumines\": \"Earl LUMINES\",\n        \"earth-goya\": \"アース小屋\",\n        \"earthean\": \"アーシアン\",\n        \"earthlight\": \"アースライト\",\n        \"easy thrilling\": \"Easy Thrilling\",\n        \"easygame\": \"EasyGame\",\n        \"ebikino\": \"エビキノ\",\n        \"ebimashi\": \"えびまし\",\n        \"ebisen kikaku\": \"えびせん企画\",\n        \"ebisuya\": \"えびすや\",\n        \"ebisuyu\": \"ゑびす湯\",\n        \"ebitendon\": \"えびてん丼\",\n        \"ebysuya\": \"恵比寿屋\",\n        \"ecarlate\": \"E'carlate\",\n        \"eccentric girl\": \"エキセントリックガール\",\n        \"echigo-ya kikaku\": \"越後屋企画\",\n        \"echizen bugyousho\": \"越前奉行所\",\n        \"echo\": \"ECHO\",\n        \"echo view\": \"Echo View\",\n        \"echo.\": \"echo.\",\n        \"eclipse\": \"えくりぷす\",\n        \"eco-filter\": \"えこふぃるたぁ\",\n        \"ecolonun\": \"えころぬん\",\n        \"ecp\": \"ECP\",\n        \"ectoborn\": \"ectoborn\",\n        \"edash\": \"EDASH\",\n        \"edenmode\": \"EDENMODE\",\n        \"edge\": \"edge\",\n        \"edge diver\": \"Edge Driver\",\n        \"edge worth\": \"えっじわーす\",\n        \"edgeworthia\": \"Edgeworthia\",\n        \"edit\": \"edit\",\n        \"edo-ya\": \"EDO屋\",\n        \"edogawa koubou\": \"江戸川工房\",\n        \"ether\": \"エエテル\",\n        \"ef-labo\": \"ef-labo\",\n        \"effecter\": \"エフェクター\",\n        \"effordom soft\": \"エフォルダムソフト\",\n        \"egao ga ichiban\": \"笑顔が一番\",\n        \"eggplant\": \"えっぐぷらんと\",\n        \"ego\": \"イージーオー\",\n        \"ego dance\": \"EGO DANCE\",\n        \"egoism\": \"EGOISM\",\n        \"egonokatamari\": \"エゴノカタマリ\",\n        \"eichi jijou\": \"エイチジジョウ\",\n        \"chikatetsu shokudou\": \"地下鉄食堂\",\n        \"eien no 17-sai\": \"永遠の17歳\",\n        \"eight beat\": \"エイトビート\",\n        \"eight man\": \"eight man\",\n        \"eight world\": \"エイト・ワールド\",\n        \"eikyuu kikan\": \"永久機関\",\n        \"einfach\": \"einfach\",\n        \"einhorn\": \"あいんほるん\",\n        \"eins\": \"あいんず\",\n        \"einsatz gruppe\": \"EINSATZ GRUPPE\",\n        \"einshotenin\": \"アインショテンイン\",\n        \"eisaidou\": \"えーさい堂\",\n        \"eisbahn\": \"アイスバーン\",\n        \"eisei vegeta g\": \"衛星ベジータG\",\n        \"eisenhower\": \"あいぜんはわぁ\",\n        \"eiwa industries\": \"エイワインダストリーズ\",\n        \"ejigen\": \"EJIGEN\",\n        \"ek-shop\": \"eK-SHOP\",\n        \"ekakigoya\": \"絵描き小屋\",\n        \"ekakigoya notesystem\": \"絵描き小屋\",\n        \"ekitai no tomosha\": \"液体の友社\",\n        \"ekitica\": \"EKITICA\",\n        \"ekurabe\": \"エクラベ\",\n        \"el-ahrairah\": \"El-ahrairah\",\n        \"electric rokugen\": \"エレクトリックロクゲン\",\n        \"electrical\": \"エレクトリカル\",\n        \"electricsheep\": \"ElectricSheep\",\n        \"elephant.giraffe\": \"ELEPHANT.GIRAFFE\",\n        \"elf\": \"エルフ\",\n        \"elfin facies\": \"Elfin Facies\",\n        \"elflite\": \"elflite\",\n        \"elhearts\": \"ELHEART'S\",\n        \"elilys lab.\": \"Elily's Lab.\",\n        \"elithheart\": \"エリスハート\",\n        \"elle-murakami\": \"elle-叢神\",\n        \"ellese no yakata\": \"エリーゼの館\",\n        \"elza\": \"ELZA\",\n        \"emade.\": \"いーめいど。\",\n        \"emakiya-sakyodo\": \"絵巻屋紗香堂\",\n        \"empathy\": \"Empathy\",\n        \"empty lounge\": \"Empty Lounge\",\n        \"empty room\": \"Empty Room\",\n        \"emu\": \"emu\",\n        \"en\": \"袁\",\n        \"en-sof\": \"En-Sof\",\n        \"endless requiem\": \"Endless Requiem\",\n        \"endorphin\": \"Endorphin\",\n        \"energia\": \"えねるぎあ\",\n        \"energya\": \"エネルギヤ出版所\",\n        \"enfant terrible\": \"ENFANT TERRIBLE\",\n        \"engetsuten\": \"遠月点\",\n        \"england peach\": \"England Peach\",\n        \"engoutenma\": \"炎業天魔\",\n        \"enio\": \"Enio\",\n        \"enishi soft\": \"えにしそふと\",\n        \"enishing\": \"縁ing\",\n        \"enji\": \"ENJI\",\n        \"enjoy mix\": \"ENJOY MIX\",\n        \"enka boots\": \"塩化ブーツ\",\n        \"enkan\": \"円環\",\n        \"enmaya\": \"えんま屋\",\n        \"enmuhaze\": \"えんむへいず\",\n        \"ennui akatako\": \"アンニュイ赤蛸\",\n        \"ennui-tei\": \"アンニュイ亭\",\n        \"enokippu\": \"えのきっぷ\",\n        \"enokoro kurage\": \"えのころくらげ\",\n        \"enoughmin\": \"イナフミン\",\n        \"entelekheia\": \"エンテレケイア\",\n        \"entro beast\": \"エントロビースト\",\n        \"enueeru\": \"えぬえ～る\",\n        \"enuemu\": \"enuemu\",\n        \"enuma elish\": \"enuma elish\",\n        \"enyakora hoisassa\": \"えんやこら☆ほいさっさ\",\n        \"equivalence\": \"equivalence\",\n        \"era feel\": \"era feel\",\n        \"erare\": \"ERARE\",\n        \"erdelied\": \"エルデライド\",\n        \"erectlip\": \"エレクトリップ\",\n        \"erimo\": \"えりも\",\n        \"eringitoro salmon\": \"えりんぎとろサーモン\",\n        \"ero ero time\": \"エロ×2TIME\",\n        \"ero mangaka pikupikun\": \"えろ漫画家ピクピクン\",\n        \"ero spirits\": \"エロスピリッツ\",\n        \"erocawa tonya\": \"エロカワ問屋\",\n        \"erocs\": \"erocs\",\n        \"eroitto\": \"エロイット\",\n        \"eroliya\": \"えろり屋\",\n        \"eromafia\": \"エロマフィア\",\n        \"eromazun\": \"エロマズン\",\n        \"eronamin h\": \"エロナミンH\",\n        \"erondo\": \"eRONDO\",\n        \"eroro\": \"Eroro\",\n        \"eros and entertainment\": \"Eros&Entertainment\",\n        \"eroslium\": \"エロスリウム\",\n        \"erostellus\": \"Erostellus\",\n        \"erotic fantasy larvaturs\": \"らばた工房\",\n        \"erotic honeymoon\": \"Erotic Honeymoon\",\n        \"erotica black\": \"EROTICA BLACK\",\n        \"erotica peach\": \"EROTICA PEACH\",\n        \"erotis\": \"ErotIs\",\n        \"erotomania\": \"EROTOMANIA\",\n        \"error\": \"ERROR!\",\n        \"error404\": \"ERROR404\",\n        \"eruapo gundan\": \"エルアポ軍団\",\n        \"escape club\": \"ESCAPE CLUB\",\n        \"escapizma\": \"ESCAPIZMA\",\n        \"escargot club\": \"えすかるご倶楽部\",\n        \"esebateira\": \"エセバテイラ\",\n        \"esecool\": \"エセクール\",\n        \"esoragoto\": \"エソラゴト\",\n        \"espresso\": \"espresso\",\n        \"esto\": \"esto\",\n        \"estrella\": \"estrella\",\n        \"esuesu\": \"EsuEsu\",\n        \"esuodan\": \"えすおだん\",\n        \"esusaizu\": \"えすさいず\",\n        \"etc x etc\": \"ETC×ETC\",\n        \"etcycle\": \"etcycle\",\n        \"eterna-radiare\": \"エテルナ-ラディアーレ\",\n        \"eternal\": \"ETERNAL\",\n        \"eternal song\": \"Eternal Song\",\n        \"eternal world\": \"ETERNAL WORLD\",\n        \"eternal-eclipse\": \"ETERNAL-ECLIPSE\",\n        \"eterno\": \"Eterno\",\n        \"etigoya\": \"えち後屋\",\n        \"etoile zamurai\": \"エトワール待\",\n        \"etsuran\": \"悦卵\",\n        \"etwas\": \"etwas\",\n        \"eunospress\": \"ゆ～のす通信\",\n        \"eunox\": \"EUNOX\",\n        \"eunoxline\": \"EUNOXLINE\",\n        \"euphonia\": \"Euphonia\",\n        \"euphony production\": \"Euphony Production\",\n        \"euphoria\": \"euphoria\",\n        \"euphoric\": \"EUPHORIC!\",\n        \"eve\": \"Eve\",\n        \"eve-sya\": \"EVE-舎\",\n        \"eves garden box\": \"イヴの箱庭\",\n        \"evidence.\": \"Evidence.\",\n        \"evo.r.b\": \"宇行日和\",\n        \"evoll\": \"evoLL\",\n        \"evolution\": \"Evolution\",\n        \"evork festa\": \"Evork Festa\",\n        \"ewokakuman\": \"絵を描くマン\",\n        \"ews at works\": \"EWS@Works\",\n        \"ex production\": \"EXプロダクション\",\n        \"ex-\": \"EX-\",\n        \"ex-one\": \"EX-ONE\",\n        \"ex35\": \"EX35\",\n        \"excite\": \"絵喜祭人\",\n        \"excite neko\": \"エキサイト猫\",\n        \"excite rabbit\": \"えきらび\",\n        \"executor\": \"EXECUTOR ～エグゼクター～\",\n        \"exit nothing\": \"Exit Nothing\",\n        \"exodus\": \"エクソダス\",\n        \"explorer\": \"Explorer\",\n        \"extage\": \"EXtage\",\n        \"extern\": \"extern\",\n        \"extry\": \"ExTry\",\n        \"ezogoro\": \"エゾゴロウ\",\n        \"f no heya\": \"Fの部屋\",\n        \"f.w.zholic\": \"F.W.ZHolic\",\n        \"f.workshop\": \"F.Workshop\",\n        \"f4-company\": \"F4 COMPANY\",\n        \"face to face\": \"face to face\",\n        \"facehouse\": \"Facehouse\",\n        \"fact on fiction\": \"Fact on Fiction\",\n        \"faf\": \"FAF\",\n        \"fairy key\": \"フェアリーキー\",\n        \"fairy pink\": \"FAIRY PINK\",\n        \"fairy tale house\": \"Fairy Tale House\",\n        \"fake an\": \"FAKE庵\",\n        \"fake69rose\": \"fake69rose\",\n        \"fakepucco\": \"偽製pucco\",\n        \"faker\": \"Faker\",\n        \"fakereal\": \"FakeReal\",\n        \"falchion\": \"ファルシオン\",\n        \"fall-in-love\": \"Fall-in-Love\",\n        \"falling spiral\": \"Falling Spiral\",\n        \"fallinmoon\": \"FallinMoon\",\n        \"family affair\": \"Family Affair\",\n        \"family void\": \"ファミリーVOID\",\n        \"fan-na\": \"ふぁんな\",\n        \"fancy fantasia\": \"Fancy Fantasia\",\n        \"fancy feeling\": \"Fancy Feeling\",\n        \"fancy-polori\": \"空想ポロリ\",\n        \"fangs\": \"FANGS\",\n        \"fannel\": \"ファンネル\",\n        \"fantasy of vermilion\": \"Fantasy of Vermilion\",\n        \"fantasy wind\": \"FANTASY WIND\",\n        \"fap seisakusho\": \"FAP製作所\",\n        \"farthest land\": \"farthest land\",\n        \"fastest lap\": \"FASTEST LAP\",\n        \"fastrope\": \"FASTROPE\",\n        \"fat\": \"FAT\",\n        \"fatboy\": \"ふぁっとぼ～い\",\n        \"fatima cigarette\": \"Fatima Cigarette\",\n        \"favorite\": \"FAVORITE\",\n        \"fclg\": \"フクラグ\",\n        \"fechisupi\": \"ふぇちすぴ\",\n        \"feeld hern halle\": \"FEELD HERN HALLE\",\n        \"felicitan\": \"フェリシタン\",\n        \"felina\": \"Felina\",\n        \"felt-kobo\": \"ふぇると工房\",\n        \"femidrop\": \"フェミドロップ\",\n        \"femme enfant\": \"FEMME ♀ ENFANT\",\n        \"festa\": \"ふぇすた。\",\n        \"festival\": \"ふぇすてぃばる!\",\n        \"fetch\": \"Fetch\",\n        \"fetish\": \"ふぇてぃっしゅ\",\n        \"fetish children\": \"フェティッシュ チルドレン\",\n        \"fetism\": \"ふぇちずむ\",\n        \"fever lactic acid bacteria deluxe\": \"フィーバー乳酸菌DX\",\n        \"fhfhfh\": \"fhfhfh\",\n        \"fiance tank\": \"フィアンセ戦車\",\n        \"fiancee\": \"フィアンセ\",\n        \"fiesole\": \"Fiesole\",\n        \"fighting peroriina\": \"ファイティングペロリーナ\",\n        \"figure ni naritai zoku\": \"フィギュアになりたい\",\n        \"figure-hugging\": \"FIGURE-HUGGING\",\n        \"fika\": \"FIKA\",\n        \"film grain\": \"FILM GRAIN\",\n        \"final frontier\": \"FINAL FRONTIER\",\n        \"finecraft69\": \"Finecraft69\",\n        \"finish doll\": \"フィニッシュドール\",\n        \"fippenluck\": \"fippenluck\",\n        \"fire\": \"FIRE\",\n        \"firefly\": \"Firefly\",\n        \"fireworks\": \"ファイヤーワークス\",\n        \"first class\": \"1組\",\n        \"first crash\": \"ファーストクラッシュ\",\n        \"first mirage\": \"FIRST MIRAGE\",\n        \"firstspear\": \"Firstspear\",\n        \"fish\": \"FISH\",\n        \"fish and chicken\": \"魚肉と鳥肉\",\n        \"fishbone\": \"fish bone\",\n        \"fishneak\": \"Fishneak\",\n        \"five\": \"five\",\n        \"fivecoa.\": \"Fivecoa.\",\n        \"fiyorudou\": \"ふぃよる堂\",\n        \"fizz\": \"Fizz\",\n        \"fizzcode\": \"FIZZCODE\",\n        \"fjnsoft\": \"FJNsoft\",\n        \"flaming dragon\": \"フレイミングドラゴン\",\n        \"flamme soft\": \"ふらむそふと\",\n        \"flash point\": \"FLASH POINT\",\n        \"flat\": \"FLAT\",\n        \"flattwelve\": \"FLATTWELVE\",\n        \"flatwoods\": \"Flatwoods\",\n        \"flieger\": \"Flieger\",\n        \"flip tail\": \"FLIP TAIL\",\n        \"flock blue\": \"Flock Blue\",\n        \"flower child\": \"フラワーチャイルド\",\n        \"flowerblade\": \"FlowerBlade\",\n        \"flowerchildueda\": \"flowerchild植田\",\n        \"fluffy x fluffy\": \"fluffy×fluffy\",\n        \"fluid liquid\": \"ふるいどりきっど\",\n        \"fluorite\": \"ふろーらいと\",\n        \"flying chicken\": \"フライングチキン\",\n        \"flying panjandrum\": \"ふらいんぐパンジャンドラム\",\n        \"flyingcat\": \"FlyingCat\",\n        \"foliage fossil\": \"木葉化石\",\n        \"folkro\": \"フォルクロ\",\n        \"fonetrason\": \"FONETRASON\",\n        \"foo10\": \"Foo10\",\n        \"fool-in-love\": \"Fool-in-Love\",\n        \"forbidden-lips\": \"Forbidden-Lips\",\n        \"forest snow\": \"Forest Snow\",\n        \"forever and ever...\": \"Forever and ever...\",\n        \"fortress76\": \"七六要塞\",\n        \"fortuna\": \"FORTUNA\",\n        \"fortunequest\": \"FortuneQuest\",\n        \"foryourprotection\": \"ForYourProtection\",\n        \"foundation\": \"FOUNDATION\",\n        \"four leaves clover\": \"Four Leaves Clover\",\n        \"fourthcape\": \"fourthcape\",\n        \"fox-club\": \"FOX-CLUB\",\n        \"fp works\": \"FP WORKS\",\n        \"fractalthink\": \"FractalThink\",\n        \"fraeulein\": \"Fräulein\",\n        \"fragile\": \"fragile\",\n        \"fragrant olive\": \"Fragrant Olive\",\n        \"frank banana\": \"Frank Banana\",\n        \"frank factory\": \"Frank Factory\",\n        \"frapowa\": \"ふらぽわ\",\n        \"frapper spirits\": \"ふらすぴ\",\n        \"freakilycharming\": \"FreakilyCharming\",\n        \"freaks\": \"フリークス\",\n        \"free color 814\": \"フリーカラー814\",\n        \"free heaven\": \"FREE HEAVEN\",\n        \"free style\": \"Free Style\",\n        \"freedom\": \"FREEDOM\",\n        \"freedom prophet\": \"フリーダムプロフェット\",\n        \"freedom tomy r\": \"フリーダム☆トミーR\",\n        \"freelife\": \"freelife\",\n        \"freeze world\": \"フリーズワールド\",\n        \"french cancan\": \"フレンチカンカン\",\n        \"fresh fruit s\": \"Fresh Fruit S\",\n        \"fresnel lens\": \"ふれぇねるれんず\",\n        \"freud no inmu\": \"フロイトの淫夢\",\n        \"fried kitchen.\": \"ふらいどきっちん。\",\n        \"friendly sky\": \"Friendly Sky\",\n        \"fringe flange\": \"フリンジフランジ\",\n        \"from control\": \"from control\",\n        \"from japan\": \"ふろむ・じゃぱん\",\n        \"from nou kanja no kai\": \"フロム脳患者の会\",\n        \"from scratch\": \"from SCRATCH\",\n        \"frontline\": \"ふろんとらいん\",\n        \"fruitsjam\": \"フルーツJAM\",\n        \"fly dish\": \"ふらいでぃっしゅ\",\n        \"fss\": \"FSS\",\n        \"fuantei\": \"ふあん亭\",\n        \"fudegaki soft\": \"筆柿そふと\",\n        \"fudomae5\": \"フドウマエ5\",\n        \"fuego\": \"FUEGO\",\n        \"fuerzabruta\": \"Fuerzabruta\",\n        \"fugu macaroni\": \"フグマカロニ\",\n        \"fugudoku\": \"川豚毒\",\n        \"fuguri\": \"ふぐり\",\n        \"fuhatudan.\": \"不発団。\",\n        \"fuji sangou koubou\": \"富士参號工房\",\n        \"fuji yoshida sa\": \"藤吉田SA\",\n        \"fujidan\": \"藤団\",\n        \"fujikome-ya\": \"藤米屋\",\n        \"fujiiro bomber\": \"ふじいろボンバー\",\n        \"fujiiro sabou\": \"藤色茶房\",\n        \"fujiko fujio fc kurosawa kei\": \"藤子不二雄FC黒沢系\",\n        \"fujinomiya millenium\": \"藤ノ宮ミレニアム\",\n        \"fujitomomo\": \"藤と桃\",\n        \"fujiya\": \"ふじ家\",\n        \"fujiyuu kenkyuu\": \"不自由研究\",\n        \"fukafuka moufu\": \"ふかふか毛布\",\n        \"fukafuka tenshoku\": \"ふかふか天職\",\n        \"fukagawa\": \"深川\",\n        \"fukahire\": \"フカヒレ\",\n        \"fukakutei kuukan\": \"不確定空間\",\n        \"fukame takame\": \"ふかめたかめ\",\n        \"fukashigi\": \"不可思議\",\n        \"fukasu-santaro\": \"深酢さんたろ\",\n        \"fukazume kizoku\": \"深爪貴族\",\n        \"fuketsudan\": \"不決断\",\n        \"hukidamari\": \"吹溜\",\n        \"fukucha koubou\": \"福茶工房\",\n        \"fukuda sennen oukoku\": \"福田千年王国\",\n        \"fukugou marjoram\": \"複合マジョラム\",\n        \"fukumaden\": \"伏魔殿\",\n        \"fukunoren\": \"福のれん\",\n        \"fukupukutei\": \"福ぷく亭\",\n        \"fukurou naru tori\": \"フクロウなる鳥\",\n        \"fukurou no yuubinya san\": \"梟の郵便屋さん\",\n        \"fukurou-ya\": \"梟屋\",\n        \"fukuya\": \"福屋\",\n        \"full accele\": \"フルアクセル\",\n        \"full bottle\": \"フルボトル\",\n        \"full flap\": \"フルフラップ\",\n        \"fullauto firing\": \"fullauto firing\",\n        \"fullbloom\": \"fullbloom\",\n        \"fullbottom\": \"FULLBOTTOM\",\n        \"fullmetal madness\": \"FULLMETAL MADNESS\",\n        \"fullmoff\": \"ふるもっふ\",\n        \"fullmoon and tangerine\": \"満月と蜜柑\",\n        \"fulloro\": \"fulloro\",\n        \"fullswing otome\": \"フルスイングオトメ\",\n        \"fumichaya\": \"史茶屋\",\n        \"fumifumi cat\": \"ふみふみ☆きゃっと\",\n        \"fumikan.\": \"ふみかん。\",\n        \"fumikirimae\": \"踏切前\",\n        \"fumitsuke\": \"ふみつけ\",\n        \"funa time\": \"ふなたいむ\",\n        \"funanori house\": \"ふなのりはうす\",\n        \"funiai-ice\": \"ふにあいあいす\",\n        \"funi funi soft\": \"ふにふにソフト\",\n        \"funikigumi\": \"雰囲気組\",\n        \"funimani\": \"ふにまに\",\n        \"funiya\": \"ふに屋\",\n        \"funny devil\": \"Funny Devil\",\n        \"funny rays\": \"ファニーレイズ\",\n        \"funwari rice\": \"ふんわり☆らいす\",\n        \"funyuhanyounyaran\": \"ふにゅはにょうにゃらん\",\n        \"furafuradou\": \"ふらふら堂\",\n        \"furansowa\": \"ふらんそわ\",\n        \"furi furi paradise\": \"Furi Furi PARADISE\",\n        \"furikake parapara\": \"ふりかけぱらぱら\",\n        \"furitendou\": \"フリテン堂\",\n        \"furrock\": \"ふぁーろっく\",\n        \"furry fandom\": \"ふぁ～りぃ☆ふぁんだむ\",\n        \"furscoblus\": \"Furscoblus\",\n        \"furuhonya\": \"古本屋\",\n        \"furuike\": \"furuike\",\n        \"furuya\": \"ふる屋\",\n        \"fushigi dou\": \"フシギ堂\",\n        \"fushinsya guilty\": \"不審者罪\",\n        \"fushizen doubutsu hogodantai\": \"不自然動物保護団体\",\n        \"fusions\": \"Fusions\",\n        \"fusuido\": \"封粋堂\",\n        \"fusuma goten\": \"ふすま御殿\",\n        \"futaba\": \"双葉\",\n        \"futabasshu\": \"ふたばっしゅ\",\n        \"futabatei\": \"ふたば亭\",\n        \"futaburo\": \"ふたブロ\",\n        \"futagotei\": \"双子亭\",\n        \"futaket junbikai\": \"ふたけっと準備会\",\n        \"futamura futon ten\": \"ふたむらふとん店\",\n        \"futanarist zatsudan\": \"ふたなりすと雑談\",\n        \"futanarun\": \"ふたなるん\",\n        \"futanaya\": \"フタナ屋\",\n        \"futatsu no hokuro\": \"ふたつのほくろ\",\n        \"futeikei zenzai\": \"不定形ぜんざい\",\n        \"futon mushi\": \"布団虫\",\n        \"futonton\": \"布団団\",\n        \"futoumei z\": \"不透明Z\",\n        \"future\": \"future\",\n        \"futurepack\": \"Futurepack\",\n        \"fuuga\": \"風☆雅\",\n        \"fuukyou kimiko\": \"風狂公子\",\n        \"fuuma kekkai\": \"風舞結界\",\n        \"huurai no dan\": \"風来の団\",\n        \"fuurintei\": \"風鈴亭\",\n        \"fuusa ryouiki\": \"封鎖領域\",\n        \"fuusen club kuroshiki\": \"風船クラブ「黒式！」\",\n        \"fuwa fuwa pinkchan\": \"ふわふわぴんくちゃん\",\n        \"fuwatoro marinepolis\": \"ふわとろ★まりんぽりす\",\n        \"fuwatto\": \"ふわっと\",\n        \"fuyu wa samui\": \"冬は寒い\",\n        \"fuyugomori\": \"FUYUGOMORI\",\n        \"fuyunonchi\": \"冬のん家\",\n        \"fuzainoyamada\": \"ふざいのやまだ\",\n        \"fz5000\": \"FZ5000\",\n        \"g equals kundow\": \"G=Kundow\",\n        \"g-cage\": \"G-CAGE\",\n        \"g-complex\": \"G-complex\",\n        \"g-planet\": \"G-PLANET\",\n        \"g-power\": \"G-Power!\",\n        \"g-r\": \"G-R\",\n        \"g-ring\": \"G-RING\",\n        \"g-rough\": \"g-rough\",\n        \"g-scan corp.\": \"G-SCAN CORP.\",\n        \"g-spot\": \"じぃすぽっと\",\n        \"g.b.f\": \"G.B.F\",\n        \"g.entertainment\": \"G.Entertainment\",\n        \"g.g.blue\": \"G.G.BLUE\",\n        \"g.g.g.\": \"G.G.G.\",\n        \"g.g.t.\": \"G.G.T.\",\n        \"g.k.p.\": \"g.k.p.\",\n        \"g500\": \"G500\",\n        \"ga fake\": \"ガ・フェーク\",\n        \"gaball screen\": \"GABALL SCREEN\",\n        \"gabugabu\": \"GABUGABU\",\n        \"gabunomi tororokonbu\": \"がぶ飲みとろろ昆布\",\n        \"gacha\": \"画チャ\",\n        \"gachapin mukku.\": \"がちゃぴんむっく。\",\n        \"gachi drunkers\": \"ガチ★ドランカーズ\",\n        \"gachinko shobou\": \"我チ○コ書房\",\n        \"gadget\": \"ガジェット工房\",\n        \"gadoujuku\": \"我道塾\",\n        \"gagaga honpo\": \"ガガガ本舗\",\n        \"gagaken\": \"画々研\",\n        \"gaikotsu no spare rib\": \"骸骨のスペアリブ\",\n        \"gaisei dou\": \"凱聖堂\",\n        \"gakeppuchi koubou\": \"崖っぷち工房\",\n        \"gakuen ketsumeichou\": \"學園血盟帖\",\n        \"gakuen yuushabu\": \"学園勇者部\",\n        \"gakugen\": \"楽玄\",\n        \"gakupoppo\": \"牙九ぽっぽ\",\n        \"galapagos\": \"ガラパゴス\",\n        \"galaxy ginga\": \"ギャラクシー銀河\",\n        \"galaxy style\": \"GALAXY STYLE\",\n        \"galerie.\": \"Galerie.\",\n        \"galette\": \"Galette\",\n        \"gallery culter\": \"Gallery Culter\",\n        \"gallery walhalla\": \"gallery walhalla\",\n        \"gallerycraft\": \"ギャラリークラフト\",\n        \"galley\": \"Galley\",\n        \"gallop\": \"gallop\",\n        \"gallphilia\": \"gallphilia\",\n        \"galvas\": \"GALVAS\",\n        \"gamanjiru-ni-chinpaipai\": \"我☆慢☆汁にチンパイパイ\",\n        \"game dome\": \"GAME DOME\",\n        \"game dome ariake\": \"GAME DOME 有明店\",\n        \"game dome hamamatsuchouten\": \"GAME DOME 浜松町店\",\n        \"game technopolis\": \"GAMEテクノポリス\",\n        \"gamenhaji\": \"がめんはじ\",\n        \"gamenhaji no yoru\": \"画面端の夜\",\n        \"games express\": \"ゲーム・エクスプレス\",\n        \"gamugumi\": \"ガムグミ\",\n        \"gamute de kotei\": \"ガムテで固定\",\n        \"ganbari machine\": \"ガンバリマシン\",\n        \"gang koubou\": \"ぎゃんぐ工房\",\n        \"ganmenki joe\": \"巌面鬼JOE\",\n        \"ganmo-no-oyatsu\": \"がんものおやつ\",\n        \"ganmou koubou\": \"がんもぅ工房\",\n        \"ganso sonodaya\": \"元祖園田屋\",\n        \"gaptax\": \"GapTax\",\n        \"gara ayuri nisshi\": \"柄あゆり日誌\",\n        \"garage-talk\": \"garage-talk\",\n        \"garakuta ga oka\": \"ガラクタが丘\",\n        \"garakuta teikoku\": \"がらくた帝國\",\n        \"garakuta-ya\": \"我楽多屋\",\n        \"garam\": \"ガラム\",\n        \"garamumasara\": \"がらむまさら\",\n        \"garandou\": \"がらんどう\",\n        \"garbage\": \"がーべいじ\",\n        \"garden in the air\": \"Garden in the Air\",\n        \"gargoyle\": \"Gargoyle\",\n        \"garigarigari\": \"がりがりがり\",\n        \"garland\": \"Garland\",\n        \"garou kissa hapido\": \"画廊喫茶はぴど\",\n        \"gasayabu\": \"がさやぶ\",\n        \"gashadokuro\": \"がしゃどくろ\",\n        \"gasoku\": \"GASOKU\",\n        \"gate two\": \"GATE TWO\",\n        \"gateau scotch\": \"ガトースカッチ\",\n        \"gaten\": \"画展\",\n        \"gattomakia\": \"ガットマキア\",\n        \"gauloises blue\": \"GAULOISES BluE\",\n        \"gaus\": \"GAUS\",\n        \"gawwow\": \"gawwow!\",\n        \"gby\": \"GBY\",\n        \"gc-dan\": \"GC団\",\n        \"gdmd.\": \"gdmd.\",\n        \"geafcart\": \"ギーフカート\",\n        \"geboku shuppan\": \"下僕出版\",\n        \"gedou shoukai\": \"外道商会\",\n        \"gehlenite\": \"Gehlenite\",\n        \"geiwamiwosukuu\": \"芸は身を救う!!\",\n        \"gekidan asaroku\": \"劇団あさろく\",\n        \"gekidan bunshichi\": \"劇団文七\",\n        \"gekidan kinmirai\": \"劇團近未来\",\n        \"gekidan onigashima\": \"劇団☆鬼ヶ島\",\n        \"gekijou pierrot\": \"激情ピエロ\",\n        \"gekikara\": \"GEKIKARA\",\n        \"gekirou director\": \"激浪Director\",\n        \"gekiteki gekidan l\": \"劇的劇団エル\",\n        \"gekka bijin\": \"月下美刃\",\n        \"gekka no neko\": \"月華の猫\",\n        \"gekkan hitorizumou\": \"月刊一人相撲\",\n        \"gekkan toshiue milk tank\": \"月刊年上ミルクタンク\",\n        \"gekkou sanctuary\": \"月光サンクチュアリ\",\n        \"gekkou tei\": \"月光亭\",\n        \"gekkou touzoku\": \"月光盗賊\",\n        \"gekkou-dou\": \"月咬洞\",\n        \"gekkouya\": \"げっこうや\",\n        \"gelatin utopia\": \"ゼラチンユートピア\",\n        \"gem\": \"GEM\",\n        \"gemasyafyu\": \"ゲマシャフュ\",\n        \"gemou the cat\": \"ゲモウ the Cat\",\n        \"gen sou dokoro\": \"幻創処\",\n        \"genei teito\": \"幻影帝都\",\n        \"geneihohjin\": \"幻影法人\",\n        \"general tank\": \"じぇねらるたんく\",\n        \"genetrix\": \"GENETRIX\",\n        \"genkei yuugi\": \"幻繋遊戯\",\n        \"genki honpo\": \"元気本舗\",\n        \"genki no mizu no wakutokoro\": \"げんきのみずのわくところ\",\n        \"genkotsu dan\": \"げんこつ団\",\n        \"genmonrou\": \"幻門楼\",\n        \"genocide\": \"GENOCIDE\",\n        \"genocide niku shoujo\": \"ジェノサイド肉少女\",\n        \"genocidou\": \"ジェノサイ堂\",\n        \"genshoku sweets\": \"原色スイーツ\",\n        \"genshoudou\": \"幻笙堂\",\n        \"gensou eigakan\": \"幻創映画館\",\n        \"gensou graphics\": \"幻想グラフィックス\",\n        \"gensou hack\": \"幻想ハック\",\n        \"gensou kuukan\": \"幻蒼空間\",\n        \"gensou kyoukai\": \"幻想協会\",\n        \"gensou mikan\": \"幻想美甘\",\n        \"gensou pheles\": \"幻想フェレス\",\n        \"gensou seimeitai\": \"幻想生命体\",\n        \"gensyokuhakoniwa\": \"原色箱庭\",\n        \"gentei mikan\": \"限定蜜柑\",\n        \"gentleman trap\": \"紳士罠\",\n        \"gentou matenrou\": \"幻灯摩天楼\",\n        \"genussmittel\": \"ゲヌスミッテル\",\n        \"genyukyo\": \"幻遊郷\",\n        \"geosiphon\": \"Geosiphon\",\n        \"geranium\": \"GERANIUM\",\n        \"gerhard\": \"GERHARD\",\n        \"german kartoffel\": \"じゃーまんかとっふぇる\",\n        \"gerudochuu oukoku\": \"げるどちゅう王国\",\n        \"gesellschaft\": \"ゲゼルシャフト\",\n        \"gessen do\": \"月泉堂\",\n        \"gessyu\": \"げっしゅ\",\n        \"gesuko no heya\": \"ゲス子のへや\",\n        \"getsusekai\": \"月世界\",\n        \"getsuyoubi no brenda\": \"月曜日ノぶれんだ\",\n        \"gettsu\": \"GETTSU\",\n        \"gewalt\": \"Gewalt\",\n        \"gh\": \"GH\",\n        \"gh.k\": \"GH.K\",\n        \"ghost\": \"Ghost\",\n        \"gift\": \"Gift\",\n        \"giftbell\": \"ぎふとべる\",\n        \"giftkuchen\": \"GiftKuchen\",\n        \"gigameka\": \"ギガメーカー\",\n        \"giman no hakoniwa\": \"欺瞞の箱庭\",\n        \"gimme logic\": \"Gimme Logic\",\n        \"gimmix\": \"ギミックス\",\n        \"gin no ringo\": \"銀の林檎\",\n        \"gin penguin\": \"銀ぺんぎん\",\n        \"ginchaya\": \"銀茶屋\",\n        \"gindokei\": \"銀時計\",\n        \"ginga toppuu\": \"銀河突風\",\n        \"ginga-ryusei\": \"銀河流星\",\n        \"ginger\": \"Ginger\",\n        \"gingerblend\": \"Gingerblend\",\n        \"ginhakushi\": \"銀白紙\",\n        \"giniro noel\": \"銀色ノエル\",\n        \"ginjou maggots\": \"吟醸マゴッツ\",\n        \"ginshari.\": \"ぎんしゃり。\",\n        \"ginsiba.\": \"ぎんしば。\",\n        \"ginto\": \"銀兎\",\n        \"gioncarnival\": \"擬音謝肉祭\",\n        \"gipsy underground\": \"Gipsy underground\",\n        \"girigiri nijiiro\": \"ギリギリ虹色\",\n        \"girigiri works\": \"ギリギリWorks\",\n        \"girin mahha\": \"ぎんりんまっは\",\n        \"girlboy\": \"Girlboy\",\n        \"girls kingdom\": \"少女の王国\",\n        \"girls residence\": \"GIRLS RESIDENCE\",\n        \"girls-potion\": \"Girls-Potion\",\n        \"girls...now\": \"Girls...Now\",\n        \"girlsport\": \"GirlSport\",\n        \"giro chinko shoukai\": \"ギロ・チン子商会\",\n        \"giroutei\": \"妓楼亭\",\n        \"giuniuya\": \"ぎうにう屋\",\n        \"gj-x\": \"GJ-X\",\n        \"gkvoltage\": \"GKボルテージ\",\n        \"glace\": \"GLace\",\n        \"glamour works\": \"GLAMOUR WORKS\",\n        \"glass no kabocha\": \"ガラスのカボチャ\",\n        \"glass wall garden\": \"ぐらすうぉーるがーでん\",\n        \"glassed concrete\": \"ガラストコンクリート\",\n        \"glasses perser\": \"グラセスパーサー\",\n        \"glassfiber\": \"グラスファイバー\",\n        \"glaze\": \"glaze\",\n        \"gleipnir\": \"Gleipnir\",\n        \"globe\": \"GLOBE\",\n        \"glutamic acid\": \"GLUTAMIC:ACID\",\n        \"gmr\": \"牛MR\",\n        \"go go heaven\": \"Go! Go! Heaven!!\",\n        \"go-go-merry-go-round\": \"Go-Go-Merry-Go-Round\",\n        \"goberazzo\": \"ごべらっつぉ\",\n        \"god hand mar\": \"God Hand Mar\",\n        \"godbirdlove\": \"ゴッドバードLOVE\",\n        \"goddandies\": \"GodDandies\",\n        \"godfinmew\": \"Godfinmew\",\n        \"godone syndrome\": \"五度寝シンドローム\",\n        \"gohanya\": \"ごはん屋\",\n        \"gohyakuen chokinbako\": \"五百円貯金箱\",\n        \"gokakukansuu\": \"五角関数\",\n        \"gokigen takabisha\": \"ゴキゲン高飛車\",\n        \"goku-raku\": \"GOKU-RAKU\",\n        \"gokuaku shounin henshuubu\": \"極悪商人編集部\",\n        \"gokufero\": \"極フェロ\",\n        \"gokuraku-chou yon-choume\": \"獄楽町四丁目\",\n        \"gokutsubushi\": \"穀潰し\",\n        \"gold dust\": \"GOLD DUST\",\n        \"gold koman sex\": \"GOLD KOMAN SEX\",\n        \"gold leaf\": \"GOLD LEAF\",\n        \"gold lip\": \"ゴールドリップ\",\n        \"gold ninja\": \"黄金忍者\",\n        \"gold rush\": \"GOLD RUSH\",\n        \"golden bat\": \"GOLDEN BAT\",\n        \"golden fever\": \"ゴールデンフィーバー\",\n        \"golden tube\": \"ゴールデンチューブ\",\n        \"goldendawn89\": \"GoldenDawn89\",\n        \"golem inc.\": \"Golem Inc.\",\n        \"goma brothers\": \"ごまブラザーズ\",\n        \"goma hangetsu\": \"ごまはんげつ\",\n        \"gomadoufu\": \"ごまどうふ\",\n        \"gomafu toufudou\": \"ゴマフ豆腐堂\",\n        \"gomaneko brief\": \"ごまねこブリーフ\",\n        \"gomigomi seisaku iinkai\": \"ゴミゴミ制作委員会\",\n        \"gomix\": \"GOMIX!\",\n        \"gomiyashiki\": \"五三八式\",\n        \"gomoku gohan\": \"五目ごはん\",\n        \"gomuhachi\": \"ごむはち\",\n        \"goo-paaa\": \"goo-paaa\",\n        \"good bye life\": \"Good Bye Life\",\n        \"goodluck\": \"Goodluck\",\n        \"goodsleep\": \"GoodSleep!\",\n        \"goosebumps\": \"goosebumps\",\n        \"goraku hiroba\": \"娯楽広場\",\n        \"gorgeous lunch\": \"ゴージャスランチ\",\n        \"gorichu\": \"ゴリッチュ\",\n        \"gorigorilland\": \"ゴリゴリランド\",\n        \"gorilion\": \"ゴリライオン\",\n        \"gorilla gang dan\": \"ゴリラギャング団\",\n        \"gorilla squad\": \"ゴリラスクワッド\",\n        \"gorilla typhoon\": \"ゴリラタイフーン\",\n        \"gorinjuu\": \"ご臨終\",\n        \"goro mask\": \"クチナシ館\",\n        \"gorori no diy\": \"ゴロリのDIY\",\n        \"gorotaishi\": \"五郎太石\",\n        \"gos to vi\": \"gos to vi\",\n        \"gosousha\": \"護送車\",\n        \"gossipgothic\": \"ごしっぷごしっく\",\n        \"gosuidou\": \"午睡堂\",\n        \"gothical blade\": \"GOTHICAL BLADE\",\n        \"gothya\": \"ゴス屋\",\n        \"gotouroku-goku\": \"誤登録語句\",\n        \"gouon\": \"轟音\",\n        \"gouriki hyakkaten\": \"剛力百貨店\",\n        \"gouten doujou\": \"轟天道場\",\n        \"goutwollow\": \"GoutWolloW\",\n        \"gozen shichiji no awase kagami\": \"午前七時の合わせカガミ\",\n        \"gozenrokuji\": \"午前六時\",\n        \"gpen\": \"じーぺん\",\n        \"gpx\": \"GPX\",\n        \"grace\": \"Grace\",\n        \"grachegrache\": \"ぐらっちぇぐらっちぇ\",\n        \"graf zeppelin\": \"Graf Zeppelin\",\n        \"grafroller\": \"Grafroller\",\n        \"granberry heaven\": \"グランベリーヘヴン\",\n        \"grand cru\": \"Grand Cru\",\n        \"grand-nauts\": \"grand-nauts\",\n        \"grand-slum\": \"grand-slum\",\n        \"graphicarossa\": \"GRAPHICAROSSA\",\n        \"grary\": \"Grary\",\n        \"grassturtle\": \"グラスタートル\",\n        \"grauer hase\": \"グラウエルハーゼ\",\n        \"gravidan\": \"ぐらヴィ団\",\n        \"graygreed\": \"graygreed\",\n        \"grazie\": \"grazie\",\n        \"grease pencil\": \"グリースペンシル\",\n        \"great acta\": \"GREAT芥\",\n        \"great dadan\": \"ぐれいと・だだん\",\n        \"greatest kyuutei\": \"グレイテスト宮廷\",\n        \"green ketchup\": \"グリーンケチャップ\",\n        \"green star\": \"GREEN STAR\",\n        \"green tea lab\": \"Green tea Lab\",\n        \"greenhouse\": \"ぐりいん野はうす\",\n        \"greg soujou\": \"グレッグ僧正\",\n        \"greone\": \"GREONE\",\n        \"greyhound\": \"Greyhound\",\n        \"group 601\": \"グループ601\",\n        \"group hinoran\": \"ぐる～ぷひのらん\",\n        \"group i.n\": \"グループI・N\",\n        \"group neko\": \"グループNEKO\",\n        \"grungeworks\": \"GRUNGE WORKS\",\n        \"gt works\": \"GT Works\",\n        \"gu no nai curry\": \"具のないカレー\",\n        \"guchi wotabatake\": \"愚痴ヲタ畑\",\n        \"gudon-no-uta\": \"ぐどんの歌\",\n        \"guhan shounen\": \"虞犯少年\",\n        \"guild plus\": \"Guild Plus\",\n        \"guillotine mozzarella\": \"ぎろちんモッツァレラ\",\n        \"gul-fuh\": \"Gul-Fuh\",\n        \"gulf stream\": \"Gulf Stream\",\n        \"gum base\": \"ガムベース\",\n        \"gum junky\": \"ガムジャンキー\",\n        \"gumi syrup\": \"グミシロップ\",\n        \"guminchu\": \"ぐみんちゅ\",\n        \"gummy-rise\": \"ガミ・ライズ\",\n        \"gun modoki\": \"群モドキ\",\n        \"gunjou kakumei\": \"群青革命\",\n        \"gunjougoya\": \"群青小屋\",\n        \"gunp\": \"GUNP\",\n        \"guntank\": \"ガンタンク\",\n        \"gurasan boots\": \"ぐらさんぶーつ\",\n        \"guru guru honpo\": \"ぐるぐる本舗\",\n        \"guruguru honpo\": \"ぐるぐる本舗\",\n        \"guruguru taiyo\": \"ぐるぐる太陽\",\n        \"gurumedou\": \"ぐるめ堂\",\n        \"gurumepoppo\": \"ぐるめポッポ\",\n        \"gururido\": \"ぐるり堂\",\n        \"gusha\": \"グシャ!!\",\n        \"gutari-ya\": \"ぐたり屋\",\n        \"gutenberg no musume\": \"グーテンベルグの娘\",\n        \"guts ichimotsu\": \"ガッツいちもつ\",\n        \"guy-ya\": \"男屋\",\n        \"guybase\": \"GUY基地\",\n        \"gyara cter\": \"ギャラ☆クター\",\n        \"gyarandoh\": \"逆乱堂\",\n        \"gyarandou\": \"ぎゃらん堂\",\n        \"gyf-107\": \"GYF-107\",\n        \"gymno\": \"gymno\",\n        \"gyogyou rengou\": \"漁業連合\",\n        \"gyokotsu kouzou\": \"魚骨工造\",\n        \"gyokumi\": \"漁組\",\n        \"gyokusai club\": \"玉砕倶楽部\",\n        \"gyokusaidan\": \"玉砕団\",\n        \"gyokusaijima\": \"玉砕島\",\n        \"gyomania\": \"ギョマニア\",\n        \"gyotaku\": \"魚拓\",\n        \"gyoubudou\": \"刑部堂\",\n        \"gyoukousyu\": \"僥倖酒\",\n        \"gyoutenriki\": \"仰天力\",\n        \"gyunyu-gekijo\": \"牛乳劇場\",\n        \"gyutto dakishimetai\": \"ギュっと抱きしめ隊\",\n        \"gyuunyuuya\": \"牛乳屋\",\n        \"gyuutou chikujinkai\": \"牛頭畜人会\",\n        \"h and k\": \"H&K\",\n        \"h na hon. ya san.\": \"Hなほん。やさん。\",\n        \"h plus\": \"H+\",\n        \"h senshokutai\": \"H染色体\",\n        \"h-net\": \"H-net\",\n        \"h-squad\": \"H-SQUAD\",\n        \"h-sys.\": \"H-sYS.\",\n        \"h.a.h.g.s\": \"H.A.H.G.S\",\n        \"h.h\": \"H.H\",\n        \"h.i.t. koubou\": \"H.I.T.工房\",\n        \"h.p.c. meirei denpa\": \"H.P.C命令電波\",\n        \"h.p.d.\": \"H.P.D.\",\n        \"h.s.c.\": \"H.S.C.\",\n        \"h3i\": \"H×3I\",\n        \"haa haa works\": \"はぁはぁWORKS\",\n        \"hacca candy\": \"薄荷キャンディー\",\n        \"hacchakesou\": \"はっちゃけ荘\",\n        \"hachi\": \"hachi\",\n        \"hachibanchi no kaijin\": \"八番地の怪人\",\n        \"hachigatsu futsuka\": \"八月二日\",\n        \"hachijikan roudou\": \"はちじかんろーどー\",\n        \"hachikoromura\": \"はちころ村\",\n        \"hachimidosan\": \"八緑緑緑\",\n        \"hachimin\": \"ハチミン\",\n        \"hachimitsu himawari\": \"ハチミツヒマワリ\",\n        \"hachimitsu pineapple\": \"はちみつパイナップル\",\n        \"hachimitsu sand\": \"はちみつサンド\",\n        \"hachimitsu soft\": \"はちみつそふと\",\n        \"hachiwaredou\": \"ハチワレ堂\",\n        \"hachiyou\": \"蜂様\",\n        \"hadairo crayon\": \"はだいろクレヨン\",\n        \"hadairo rooibos tea\": \"肌色ルイボスティー\",\n        \"hadairozanmai\": \"肌色三昧\",\n        \"hadantorque\": \"破断torque\",\n        \"hadashi shoujo\": \"裸足少女\",\n        \"haekake\": \"生えかけ\",\n        \"haeya\": \"南風屋\",\n        \"hagane koubou\": \"鋼工房\",\n        \"hagane no naru ki\": \"羽鐘の鳴る木\",\n        \"hagane no tsurugi\": \"はがねのつるぎ\",\n        \"hagure maron\": \"はぐれまろん\",\n        \"haguruma\": \"はぐるま\",\n        \"haguruman\": \"はぐるまん\",\n        \"hai-tai\": \"胚胎\",\n        \"haiana gumentai\": \"肺穴愚麺隊\",\n        \"haiboku kamen\": \"敗北仮面\",\n        \"haidara\": \"haidara\",\n        \"haigoku ryodan\": \"廃獄旅団\",\n        \"haiiro jikuu\": \"灰色時空\",\n        \"haiiro koubou betsumune\": \"灰色工房別棟\",\n        \"haiiro ookami\": \"灰色狼\",\n        \"haikara cafe\": \"ハイカラ喫茶\",\n        \"haikibutsushorijou\": \"廃棄物処理場\",\n        \"haikiro\": \"灰奇路\",\n        \"haikuo-soft\": \"ハイクオソフト\",\n        \"haim mint\": \"ハイムミント\",\n        \"haine club\": \"灰猫倶楽部\",\n        \"hairyo fusoku\": \"配慮不足\",\n        \"haisui no jin\": \"ハイスイノ陣\",\n        \"haitokukan\": \"背德漢\",\n        \"hajimari to owari\": \"はじまりとおわり\",\n        \"hakaba\": \"墓場\",\n        \"hakidame no koganemushi\": \"掃き溜めのこがねむし\",\n        \"hakka onsen\": \"ハッカ温泉\",\n        \"hakkakyou\": \"八卦鏡\",\n        \"hakkekkyuu sekkekkyuu\": \"白血球赤血球\",\n        \"hakkindo\": \"白金堂\",\n        \"hakobune\": \"箱舟\",\n        \"hakkou kimuti\": \"発光きむち\",\n        \"hakoniwa toshokan\": \"ハコニワトショカン\",\n        \"hakonyan.\": \"はこにゃん。\",\n        \"hakorimu\": \"はこりむ\",\n        \"hakubajin\": \"はくばじん\",\n        \"hakuchuu doudou\": \"白昼堂々\",\n        \"hakuchuu shobou\": \"白昼書房\",\n        \"hakudakukei\": \"白濁系\",\n        \"hakuginkan\": \"白銀冠\",\n        \"hakugyoku aquarea\": \"白玉アクエリア\",\n        \"hakushu kassai\": \"拍手喝罪\",\n        \"hakusuijuko\": \"白水重工\",\n        \"hakusyoku miminagaten\": \"白触耳長店\",\n        \"hakutoukai\": \"白糖会\",\n        \"hakuzendo honpo\": \"白髯堂本舗\",\n        \"halcyon\": \"Halcyon\",\n        \"halcyon factory\": \"Halcyon Factory\",\n        \"halcyon maker\": \"ハルシオンメーカー\",\n        \"half mile\": \"はーふまいる\",\n        \"hallenchi planet\": \"ハレンチプラネット\",\n        \"hallucigenia\": \"ハルキゲニア\",\n        \"halopack\": \"HALOぱっく\",\n        \"haltype\": \"ハルタイプ\",\n        \"halumonica\": \"Halumonica\",\n        \"halvetica\": \"HALvetica\",\n        \"halworks\": \"HALWORKS\",\n        \"hamabeuo\": \"ハマベウオ\",\n        \"hamachi tomosaku\": \"ハマチトモサク\",\n        \"hamaiya\": \"はまい屋\",\n        \"hamanan-doboku\": \"浜南土木\",\n        \"hamanasu chaya\": \"はまなす茶屋\",\n        \"hamasei\": \"浜せい\",\n        \"hamehame service area\": \"はめはめサービスエリア\",\n        \"hamham soft\": \"はむはむソフト\",\n        \"hamiheya\": \"はみ部屋\",\n        \"hammer head\": \"HAMMER_HEAD\",\n        \"hamustar\": \"ハム星\",\n        \"hamusuta-nonikomi\": \"ハムスターの煮込み\",\n        \"hana tabako\": \"花煙草\",\n        \"hana to ribon\": \"華とりぼん\",\n        \"hana x hana\": \"花*はな\",\n        \"hanada\": \"縹\",\n        \"hanadorobou\": \"花泥棒\",\n        \"hanafubuki gorilla\": \"花吹雪ゴリラ\",\n        \"hanagara shirt\": \"花柄シャツ\",\n        \"hanairogaeru\": \"花色蛙\",\n        \"hanaji koubou\": \"鼻血工房\",\n        \"hanakuchi mememe\": \"はなくちめめめ\",\n        \"hanamachi horebore chou\": \"花町ホレボレ丁\",\n        \"hanamachi shimaiten\": \"花街姉妹店\",\n        \"hanami-ga saku\": \"花実ガ咲ク\",\n        \"hanamiduki\": \"華みづき\",\n        \"hanamuguri\": \"花潜\",\n        \"hanao shouke\": \"花尾娼家\",\n        \"hanasameyashiro\": \"花雨社\",\n        \"hanaya\": \"華屋\",\n        \"hanbyounin\": \"半病人\",\n        \"hand-grip\": \"はんどぐりっぷ\",\n        \"handful happiness\": \"Handful☆Happiness!\",\n        \"hang on\": \"ハングオン\",\n        \"hanger hansha\": \"ハンガー反射\",\n        \"hanibi land\": \"hanibi land\",\n        \"hanigura soft\": \"はにぐらそふと\",\n        \"haniwa mania\": \"ハニワマニア\",\n        \"haniya\": \"はに屋\",\n        \"hanjuku kinokotei\": \"半熟茸亭\",\n        \"hanjuku nora\": \"ハンジュクノラ\",\n        \"hanjuku yude tamago\": \"半熟茹で卵\",\n        \"hannama\": \"はんなま\",\n        \"hanshi x hanshow\": \"半死半生\",\n        \"hanya yashiki\": \"はにゃ屋敷\",\n        \"hanyan\": \"覇娘。\",\n        \"hanzai tengoku\": \"犯罪天国\",\n        \"haochi\": \"haochi\",\n        \"haoh\": \"覇王\",\n        \"hapa\": \"ハーパー\",\n        \"hapihapi\": \"hapihapi\",\n        \"happaya\": \"葉っぱ屋\",\n        \"happiness milk\": \"はぴねすみるく\",\n        \"happo ryuu\": \"HAPPO流\",\n        \"happy drive\": \"はっぴぃどらいぶっ!\",\n        \"happy life\": \"Happy Life\",\n        \"happy lime\": \"はっぴぃライム\",\n        \"happy man\": \"Happy Man\",\n        \"happy paranoia\": \"ハッピーパラノイア\",\n        \"happy present\": \"はっぴーぷれぜんと\",\n        \"happy strawberry\": \"はっぴーすとろべりー\",\n        \"happy studio\": \"HAPPY STUDIO\",\n        \"happy time\": \"ハッピータイム\",\n        \"happy turn\": \"はっぴ〜た〜ん\",\n        \"happy unbirthday\": \"HAPPY UNBIRTHDAY\",\n        \"happydrop\": \"Happydrop\",\n        \"happypink\": \"happypink\",\n        \"hara-zoo\": \"HARA-ZOO\",\n        \"haradaya\": \"原田屋\",\n        \"haraguro tenshi\": \"腹黒天使\",\n        \"haraise kaiwai\": \"ハライセカイワイ\",\n        \"harakiri gozen\": \"ハラキリ御膳\",\n        \"harakiri yakkyoku\": \"腹切薬局\",\n        \"harako misshitsu\": \"はらこ密室\",\n        \"haranabi shuppan\": \"はらなび出版\",\n        \"harapecodonburi\": \"はらぺこどんぶり\",\n        \"harapekkoken\": \"ハラペッコケン\",\n        \"harapeko shucchoujo\": \"はらぺこ出張所\",\n        \"harapeko teishoku\": \"はらぺこ定食\",\n        \"harapekopon\": \"はらぺこぽん\",\n        \"haratama\": \"ハラタマ\",\n        \"hard days\": \"hard days\",\n        \"hard hypno\": \"HARD HYPNO\",\n        \"hard lucker\": \"Hard Lucker\",\n        \"hard puncher maniax\": \"Hard Puncher Maniax\",\n        \"hardcore 001\": \"ハードコア001\",\n        \"hardcore zayaku souten\": \"ハードコアザヤクソウテン\",\n        \"hardcore zutsuu\": \"ハードコア頭痛\",\n        \"harem\": \"Harem\",\n        \"harem heat\": \"ハーレムヒート\",\n        \"haresaku\": \"ハレサク\",\n        \"hari poteto\": \"はりぽてと\",\n        \"hariko no tora\": \"はりこのとら\",\n        \"harinezumi koubou\": \"はりねずみ工房\",\n        \"hariwata\": \"hariwata\",\n        \"harmorise\": \"Harmorise\",\n        \"harness\": \"HARNESS\",\n        \"harogen\": \"ハロゲン\",\n        \"harshwordsworth\": \"harshwordsworth\",\n        \"haru mochi\": \"はるもち\",\n        \"haru youbi\": \"春曜日\",\n        \"harugoya\": \"はるごや\",\n        \"harugumo.\": \"はるぐも。\",\n        \"haruiro fudepen\": \"はルいろ筆ペン\",\n        \"haruiro no sora\": \"春色の空\",\n        \"harukaze\": \"HARUKAZE\",\n        \"harukomachikan.\": \"はるこまちかん。\",\n        \"harumachi tsurara\": \"春待氷柱\",\n        \"harumankai\": \"はるまん会\",\n        \"harumichi\": \"ハルミチ\",\n        \"harunoyu\": \"ハルノユ\",\n        \"harureri\": \"はるれり\",\n        \"harusame lunch b set\": \"はるさめランチBセット\",\n        \"harusame-soup\": \"はるさめすぅぷ\",\n        \"harvest\": \"HARVEST\",\n        \"harvest home\": \"ハーベストホーム\",\n        \"hashi to knife de niku wo kiru\": \"はしとナイフで肉を切る\",\n        \"hashikure koubou\": \"はしくれ工房\",\n        \"hasoyua\": \"ハソユア\",\n        \"hasshaku-sama\": \"八尺様\",\n        \"hastured cake\": \"ハスタードケーキ\",\n        \"hasuya\": \"はす家\",\n        \"hatahata factory\": \"ハタハタ工房\",\n        \"hatake no oniku\": \"はたけのお肉\",\n        \"hato suppressor\": \"ハトサプレッサー\",\n        \"hatogoya\": \"鳩小屋\",\n        \"hatomame\": \"ハトマメ\",\n        \"hatomugi x genmai\": \"はとむぎげんまい\",\n        \"hatosable\": \"ハトサブレ\",\n        \"hatsuai roumanjou\": \"初愛浪漫帖\",\n        \"hatsuen kikan\": \"発煙器官\",\n        \"hatsushio\": \"ハツ塩\",\n        \"hattari dou\": \"はったり堂\",\n        \"havemoon\": \"はべむん\",\n        \"hawk bit\": \"ホークビット\",\n        \"hayaku byouin e itte kudasai\": \"早く病院へ行ってください\",\n        \"hayashi puramoten\": \"はやしプラモ店\",\n        \"hayo-cinema\": \"はよしねま\",\n        \"hayonipo\": \"はよにぽ\",\n        \"hazama\": \"狭間\",\n        \"hazuki tsuitachi\": \"葉月一日\",\n        \"hb\": \"HB\",\n        \"hbo\": \"HBO\",\n        \"hcg\": \"HCG\",\n        \"hcom\": \"hcom\",\n        \"header liner\": \"へっだらいなー\",\n        \"headroom\": \"HEADROOM\",\n        \"healthy prime\": \"HEALTHY PRIME\",\n        \"heart ga hitotsu\": \"ハートがひとつ\",\n        \"heart house\": \"HEART HOUSE\",\n        \"heart of cool\": \"Heart of cooL\",\n        \"heart some bread\": \"heart some bread\",\n        \"heart tail\": \"ハートテイル\",\n        \"heart work\": \"HEART WORK\",\n        \"heartfolio\": \"Heartfolio\",\n        \"heartless k\": \"ココロナシK\",\n        \"hearts\": \"Hearts\",\n        \"hearts and crusts\": \"HEARTS & CRUSTS\",\n        \"hearts nest\": \"Heart's Nest\",\n        \"heat-soft\": \"HEAT-SOFT\",\n        \"heavenstar\": \"ヘヴンスター\",\n        \"heavenly\": \"heavenLy\",\n        \"heavens\": \"HEAVENS\",\n        \"heavens gate\": \"Heaven's Gate\",\n        \"heavens unit\": \"HEAVEN'S UNIT\",\n        \"heavy syrup\": \"Heavy syrup\",\n        \"hebereke black7\": \"へべれけBLACK7\",\n        \"hebichang\": \"へびちゃんぐ\",\n        \"hebitunagary\": \"ヘビツナガリ\",\n        \"hechima koubou\": \"へちま工房\",\n        \"hechima teishoku\": \"ヘチマ定食\",\n        \"hechocho\": \"ヘ蝶々\",\n        \"hegurimurayakuba\": \"へぐり村役場\",\n        \"heiantei\": \"平安亭\",\n        \"heika hp\": \"HEIKA HP\",\n        \"heikoto\": \"へいこと\",\n        \"heikoushihenkei\": \"平行四辺形\",\n        \"heineken\": \"Heineken\",\n        \"heinetsu 37 degrees celsius\": \"平熱37°C\",\n        \"heinetsu 98.5 degrees v\": \"平熱98.5°V\",\n        \"heisei chachamaru dou\": \"平成茶々丸堂\",\n        \"heisei metal gakuen\": \"平成メタル学園\",\n        \"heisen-dou\": \"へいせん堂\",\n        \"heiwa seisakujo\": \"平和製作所\",\n        \"heiyou kinki.\": \"ヘイヨウキンキ。\",\n        \"hekiga ni nemuru\": \"壁画に眠る\",\n        \"hekireki\": \"霹靂\",\n        \"hekiten industrial complex\": \"碧天コンビナート\",\n        \"hekohekoroid shidan\": \"へこへこロイド師団\",\n        \"helicalrizing\": \"HelicaLRizinG\",\n        \"hell-ion\": \"HELL-ION\",\n        \"helldevice\": \"HellDevice\",\n        \"hellenism\": \"へれニズム\",\n        \"hellfragrance\": \"ヘルフレグランス\",\n        \"hello girls\": \"Hello Girls!\",\n        \"hellter skelter\": \"ヘルタースケルター\",\n        \"helmet ga naosemasen\": \"ヘルメットが直せません\",\n        \"hemelopa\": \"HeMeLoPa\",\n        \"henderson\": \"HENDERSON\",\n        \"hending\": \"Hending\",\n        \"hentai emblem\": \"へんたいゑむぶれむ\",\n        \"hentai maker tomo no kai\": \"Hentai Maker 友の会\",\n        \"hentai musume\": \"へんたい娘\",\n        \"hentai ojisan\": \"ヘンタイオジサン\",\n        \"hentai to hentai no hentai\": \"HENTAI to HENTAI no HENTAI\",\n        \"hentaiworks\": \"hentaiworks\",\n        \"henyottobird\": \"へにょっとばーど\",\n        \"hep\": \"HEP\",\n        \"heppoko housing\": \"へっぽこはうじんぐ\",\n        \"heppoko youchien\": \"へっぽこ幼稚園\",\n        \"heppokodou\": \"へっぽこ堂\",\n        \"herencia\": \"HERENCIA\",\n        \"hermes shobou\": \"ヘルメス書房\",\n        \"hermit\": \"ハーミット\",\n        \"hermit9\": \"ハーミット9\",\n        \"heroes factory\": \"HEROES FACTORY\",\n        \"herohero hospital\": \"へろへろHospital\",\n        \"heroine engineering\": \"ヒロイン工学研究所\",\n        \"heroineism\": \"Heroineism\",\n        \"herunia tengoku\": \"ヘルニア天国\",\n        \"heshi factory\": \"HESHI FACTORY\",\n        \"hesogoma\": \"へそごま\",\n        \"hesoten\": \"ヘソてん\",\n        \"heta no yoko zuki\": \"ヘタの横好き\",\n        \"hetalearts\": \"ヘタレアーツ\",\n        \"hetaretch\": \"へたれっち\",\n        \"hetchhog\": \"へっちほっぐ\",\n        \"hews\": \"Hews\",\n        \"hexaflange\": \"hexaflange\",\n        \"hexagram point\": \"ヘキサグラムポイント\",\n        \"hexenhaus\": \"ヘクセンハウス\",\n        \"hey you\": \"hey you!\",\n        \"heya no sumi.\": \"部屋の隅。\",\n        \"hgh\": \"HGH\",\n        \"hgt labo\": \"HGTラボ\",\n        \"hhb\": \"hhb\",\n        \"hht\": \"HHT\",\n        \"hi-cal\": \"Hi-CAL\",\n        \"hi-flier\": \"Hi-Flier\",\n        \"hiatari ryoukou\": \"日当良好\",\n        \"hibari\": \"★☆雲雀☆★\",\n        \"hibi kirari production\": \"ひびきらりプロダクション\",\n        \"hibi rakuraku\": \"日日楽楽\",\n        \"hibiiro clutch\": \"ヒビイロクラッチ\",\n        \"hibiki\": \"響輝\",\n        \"hibinoutao\": \"ヒビノウタオ\",\n        \"hibitoridori\": \"日々鳥々\",\n        \"hibon\": \"非凡\",\n        \"hidari kara shitsurei\": \"左から失礼\",\n        \"hidarikiki\": \"HIDARIkiki\",\n        \"hidden sideway\": \"ryuuta\",\n        \"hiensou\": \"飛燕想\",\n        \"hierarchy\": \"ヒエラルキー\",\n        \"hiero\": \"ハイエロ\",\n        \"higashi no penguine\": \"東のペンギン\",\n        \"higasimikawa midoriiro doukoukai\": \"東三河みどり色同好会\",\n        \"hige to deko\": \"Hige to deko\",\n        \"higedaihuku\": \"ひげ大福\",\n        \"higeudon\": \"ひげうどん\",\n        \"high fly flow\": \"はいふらいふろう\",\n        \"high risk revolution\": \"HIGH RISK REVOLUTION\",\n        \"high star\": \"HIGH STAR\",\n        \"high thrust\": \"ハイスラスト\",\n        \"high-spirit\": \"High-Spirit\",\n        \"highdrug\": \"HighDrug\",\n        \"highend\": \"ハイエンド\",\n        \"highleg peach\": \"ハイレグピーチ\",\n        \"highrunning\": \"HighRunning\",\n        \"highway\": \"highway\",\n        \"highway61\": \"Highway61\",\n        \"higouhou shoujo\": \"非合法少女\",\n        \"hihiyama tsuyabon\": \"比比山艶本\",\n        \"hijet\": \"ハイジェット\",\n        \"hijiki-ya\": \"ひじき屋\",\n        \"hijinzou\": \"非人造\",\n        \"hijouguchi\": \"ひじょうぐち\",\n        \"hikage mon\": \"日陰もん\",\n        \"hikagemono\": \"ヒカゲモノ\",\n        \"hikari club\": \"光クラブ\",\n        \"hikari no ki\": \"光の樹\",\n        \"hikari no tomoshibi\": \"光の燭\",\n        \"hikarito mahou koubou\": \"光と魔法工房\",\n        \"hikodge beya\": \"彦二部屋\",\n        \"hikou dai 50 sentai\": \"飛行第50戦隊\",\n        \"hikousensuitei\": \"飛行潜水亭\",\n        \"hiland-studio\": \"ハイランド工房\",\n        \"hima serval\": \"ひまサーバル\",\n        \"himajinism\": \"ひまじにずむ\",\n        \"himameshiki\": \"火豆式\",\n        \"himawari endan\": \"ひまわり園団\",\n        \"himawari seed\": \"ひまわりシード\",\n        \"himawari-noren\": \"向日葵のれん\",\n        \"himawarisou\": \"ひまわり荘\",\n        \"hime club\": \"姫倶楽部\",\n        \"himegami\": \"姫神\",\n        \"himehajime.com\": \"himehajime.com\",\n        \"himepuchitei\": \"ひめぷち亭\",\n        \"himitsu doyoubi\": \"秘密土曜日\",\n        \"himitsu kessha vanitas\": \"秘密結社ヴァニタス\",\n        \"himitsu tetra\": \"ひみつテトラ\",\n        \"hinaeron\": \"ひなえろん\",\n        \"hinahara yashiki\": \"ひなはら屋敷\",\n        \"hinahina box\": \"HINAHINA BOX\",\n        \"hinakan\": \"ひなかん\",\n        \"hinamaru chuujou\": \"ひな丸中将\",\n        \"hinamaru soft\": \"ヒナマルソフト\",\n        \"hinaprin\": \"ひなプリン\",\n        \"hinatabokko\": \"ひなたぼっこ\",\n        \"hinatabokko club\": \"ひなたぼっこ倶楽部\",\n        \"hinauta\": \"ひなうた\",\n        \"hinjyaku\": \"HINJYAKU\",\n        \"hinoenma haken jimukyoku\": \"催眠すし屋\",\n        \"hinoiti\": \"ヒノイティ\",\n        \"hinokiburo\": \"檜風呂\",\n        \"hinokist\": \"hinokist\",\n        \"hinouhe family\": \"ひのうへファミリー\",\n        \"hirani\": \"ヒラマニ\",\n        \"hirame jichiku\": \"ひらめ自治区\",\n        \"hirari\": \"ひらり\",\n        \"hirataira\": \"平平\",\n        \"hired girl\": \"ハイヤードガール\",\n        \"hirekatsu\": \"ヒレカツ\",\n        \"hiroi heya\": \"拾い部屋\",\n        \"hirojuu renshuuchou\": \"広十練習帖\",\n        \"hirokaworld\": \"ヒロカワールド\",\n        \"hirumeshidoki\": \"昼飯時\",\n        \"hirusagari no bijutsukan\": \"昼下がりの美術館\",\n        \"hisoutan\": \"ひそうたん\",\n        \"hispano-suiza\": \"Hispano-Suiza\",\n        \"hissatsuwaza\": \"ひっさつわざ\",\n        \"hisuitei\": \"翡翠亭\",\n        \"hitobankoneko\": \"一晩仔猫\",\n        \"hitodenashi\": \"ひとでなし\",\n        \"hitoe\": \"一重\",\n        \"hitokumi\": \"ひとくみ\",\n        \"hitomaron\": \"ひとまろん\",\n        \"hitonchi\": \"ひとんち\",\n        \"hitori de dekirumon\": \"火鳥でできるもん！\",\n        \"hitori kakumei\": \"一人革命\",\n        \"hitori no daiyokujou\": \"一人の大浴場\",\n        \"hitori online\": \"一人オンライン\",\n        \"hitori tower bridge\": \"ヒトリタワーブリッジ\",\n        \"hitoride dekirumon\": \"ひとりでできるもんっ\",\n        \"hitoriyorihutari\": \"ヒトリヨリフタリ\",\n        \"hitoriyou no pot\": \"ひとりようのポット\",\n        \"hitotosensou\": \"一年戦争\",\n        \"hitoya-r\": \"ヒトヤ-R\",\n        \"hitoyasumi\": \"ひとやすみ\",\n        \"hitstales\": \"ヒッツッツ\",\n        \"hitsuji drill\": \"羊ドリル\",\n        \"hitsuji no munko hiryou\": \"羊のむんこ肥料\",\n        \"hitsuji to kitsune\": \"ひつじときつね\",\n        \"hitsuji-1ban-shibori\": \"ヒツジ一番搾り\",\n        \"hitsujimama\": \"ひつじまま\",\n        \"hitsujin toko\": \"ひつじんトコ\",\n        \"hitsujiniku\": \"ひつじにく\",\n        \"hitujinoki\": \"ひつじの木\",\n        \"hiwatari honpo\": \"樋渡本舗\",\n        \"hiyashi asia\": \"ヒヤシアジア\",\n        \"hiyashi chuuka hajimemashita\": \"冷し中華おわりました\",\n        \"hiyashichuuka hajimemashita\": \"冷やし中華はじめました\",\n        \"hiyocco\": \"HIYOCCO\",\n        \"hiyoko box\": \"ひよこBOX\",\n        \"hiyoko crown\": \"HIYOKO CROWN\",\n        \"hiyoko soft\": \"ひよこソフト\",\n        \"hiyori hamster\": \"ひよりハムスター\",\n        \"hiyorimi no sora\": \"ひよりみのソラ\",\n        \"hiyotamaya\": \"ひよたま屋\",\n        \"hiyoubeya\": \"飛葉部屋\",\n        \"hizadachi bunny\": \"膝立ちバニー\",\n        \"hizamakura\": \"ひざまくら。\",\n        \"hizatora\": \"ヒザトラ\",\n        \"hj production\": \"HJプロダクション\",\n        \"hjukism\": \"HJUKISM\",\n        \"hk\": \"HK\",\n        \"hkmnk\": \"hkmnk\",\n        \"hl\": \"エイチェル\",\n        \"hlz\": \"hlz\",\n        \"hm\": \"HM\",\n        \"hma\": \"HMA\",\n        \"hn.03\": \"Hn.03\",\n        \"hobby land soft\": \"Hobby Land Soft\",\n        \"hochidonmai\": \"ほちどんまい\",\n        \"hoepporoppo\": \"ほえっぽろっぽ\",\n        \"hoge hoge club\": \"ほげほげCLUB\",\n        \"hogege\": \"HOGEGE\",\n        \"hogeplan\": \"HOGEPLAN\",\n        \"hogero kikaku\": \"ほげろー企画\",\n        \"hohhe dan\": \"ほっへ!!団\",\n        \"hokanko\": \"ほかんこ\",\n        \"hokentaiiku\": \"保健体育\",\n        \"hokkahoka-mesotei\": \"ほっかほかめそ亭\",\n        \"hokke\": \"ホッケ\",\n        \"hokke o tabeyou\": \"ほっけを食べよう\",\n        \"hokkebain\": \"ほっけばいん!\",\n        \"hokkepen\": \"ほっけぺん\",\n        \"hokuroza\": \"ホクロ座\",\n        \"hokushintei\": \"北辰亭\",\n        \"hole in one\": \"ほーるいん椀\",\n        \"holiday note\": \"Holiday Note\",\n        \"holiday school\": \"休日学校\",\n        \"holy avenger\": \"ホーリーアベンジャー\",\n        \"holymist\": \"HolyMist\",\n        \"homadelic.\": \"homadelic.\",\n        \"home wrecker\": \"ホームレッカー\",\n        \"homerun chaya\": \"ホームラン茶屋\",\n        \"homuhomu seisakujo\": \"ほむほむ製作所\",\n        \"homunculus\": \"ホムンクルス\",\n        \"honda koumuten\": \"本田工務店\",\n        \"hone shaburi-tei\": \"骨しゃぶり亭\",\n        \"honekawaya\": \"ホネカワ屋\",\n        \"honey bomb\": \"ハニーボム\",\n        \"honey bump\": \"ハニーバンプ\",\n        \"honey bunny\": \"ハニーバニー\",\n        \"honey crunch\": \"HONEY*CRUNCH\",\n        \"honey dipped\": \"Honey Dipped\",\n        \"honey knuckle\": \"Honey Knuckle\",\n        \"honey lounge\": \"honey lounge\",\n        \"honey pharmacy\": \"Honey Pharmacy\",\n        \"honey rice\": \"はちみつごはん\",\n        \"honey rider69\": \"Honey Rider69\",\n        \"honeybee\": \"honeybee\",\n        \"honeybee-tea\": \"蜜蜂紅茶\",\n        \"honeycrown\": \"HoneyCrown\",\n        \"honeysuckle\": \"Honeysuckle\",\n        \"hongkong hanten\": \"香港飯店\",\n        \"honjitsu no higawari lunch\": \"本日の日替わりランチ\",\n        \"honmatsu tentou\": \"本末天道\",\n        \"honnojihen\": \"ホンノーヂヘン\",\n        \"honnori tei\": \"ほんのり亭\",\n        \"honnou juushigata\": \"本能重視型\",\n        \"honnou to yokubou no gyuutan\": \"本能と欲望の牛タン\",\n        \"honohono\": \"HonoHono\",\n        \"honoka na omochiya\": \"ほのかなおもち屋\",\n        \"honomiya\": \"穂の実舎\",\n        \"honoyurara\": \"HONOYURARA\",\n        \"honpou kishitsu\": \"奔放気質\",\n        \"hontoinu\": \"ほんトいぬ\",\n        \"honya no hidari click\": \"ほにゃーの左クリック\",\n        \"hoppe\": \"hoppe\",\n        \"hopper island\": \"ホッパーアイランド\",\n        \"hopuhopu team\": \"ほぷほぷチーム\",\n        \"horic works\": \"HORIC WORKS\",\n        \"horiishi horuto\": \"堀石掘人\",\n        \"horimonya\": \"彫りモン屋\",\n        \"horloger\": \"Horloger\",\n        \"horohoro tei\": \"ホロホロ亭\",\n        \"horonaminz\": \"ホロナミンZ\",\n        \"horumon curry\": \"ほるもんカレー\",\n        \"hoshizora kagekidan\": \"星空華劇団\",\n        \"hoshi ni kaeru\": \"星に帰る!\",\n        \"hoshi no kuzu\": \"星の屑\",\n        \"hoshi no yume\": \"星の夢\",\n        \"hoshiame\": \"星飴\",\n        \"hoshidokei\": \"星時計\",\n        \"hoshiedatei\": \"ほしえだ亭\",\n        \"hoshikuzu comet\": \"星屑コメット\",\n        \"hosikuz dolce\": \"星屑ドルチェ\",\n        \"hoshimaki project\": \"ほしまきProject\",\n        \"hoshimitai\": \"ほしみたい\",\n        \"hoshinagi\": \"星凪\",\n        \"hoshinatenpo\": \"保科店舗\",\n        \"hoshiratta\": \"星らった\",\n        \"hoshiyukicha\": \"干し雪茶\",\n        \"hoshizono\": \"星園\",\n        \"hoshizora tokou\": \"星空渡航\",\n        \"hosi hutatu.\": \"ほしふたつ。\",\n        \"hosinokuzu\": \"Hosinokuzu\",\n        \"hosizora step\": \"星空ステップ\",\n        \"hosokawaya\": \"細川屋\",\n        \"hot kari\": \"H：O：T(仮)\",\n        \"hot language\": \"ホットランゲージ\",\n        \"hot pot\": \"Hot Pot\",\n        \"hotateya\": \"ほたてや。\",\n        \"hotel california\": \"加州大飯店\",\n        \"hotoariboshi\": \"ほとおり星\",\n        \"hotori bocchi\": \"ほとりぼっち\",\n        \"houenken\": \"方円軒\",\n        \"hougyoku densetsu\": \"宝玉伝説\",\n        \"houjuan\": \"峯寿庵\",\n        \"houkago paradise\": \"放課後パラダイス\",\n        \"houkiboshi\": \"箒星\",\n        \"hououya\": \"鳳凰屋\",\n        \"houruri\": \"蓬瑠璃\",\n        \"house game\": \"ハウスゲーム\",\n        \"house of karsea\": \"ハウス オブ KARSEA\",\n        \"house saibai mochi\": \"ハウス栽培もち\",\n        \"houzuki\": \"ほう☆づき\",\n        \"however\": \"However\",\n        \"hozmi kan\": \"ほづみかん\",\n        \"hozuriya\": \"ほづり屋\",\n        \"hr\": \"HR\",\n        \"hr-st\": \"HR-ST\",\n        \"http\": \"http\",\n        \"hukakuteiseigenri\": \"不確定性原理\",\n        \"hulotte\": \"Hulotte\",\n        \"human high-light film\": \"ヒューマン・ハイライト・フィルム\",\n        \"hummel\": \"ヒュンメル\",\n        \"huri-neko\": \"ふりかえればねこがいる\",\n        \"hutoshi nyuugyou\": \"ふとし乳業\",\n        \"huzinami koubou\": \"藤波工房\",\n        \"hy-dou\": \"灰同\",\n        \"hyakkarou no tanuki\": \"百華楼の狸\",\n        \"hyakuen nikuniku\": \"百元肉々\",\n        \"hyakuitishiki\": \"百壱式\",\n        \"hyakumangoku\": \"百萬石\",\n        \"hyakutake sakusen\": \"百武作戦\",\n        \"hyakuyoubako\": \"百葉箱\",\n        \"hyamolot bakurai\": \"ヒャモロット爆雷\",\n        \"hybrid jimushitsu\": \"ハイブリッド事務室\",\n        \"hydden world\": \"ひどぅんワールド\",\n        \"hydroharbor\": \"HydroHarbor\",\n        \"hyk42\": \"HYK42\",\n        \"hyoco road\": \"ひょこ道\",\n        \"hyouketsu mikan\": \"氷結蜜柑\",\n        \"hyper houbokujou\": \"ハイパー放牧場\",\n        \"hyper summer wars\": \"ハイパーサマーウォーズ\",\n        \"hyperiyon\": \"はいぺりよん\",\n        \"hypnotic angel\": \"Hypnotic Angel\",\n        \"hypnotisms\": \"hypnotisms\",\n        \"hyspaniplus\": \"HyspaniPlus\",\n        \"hysteric typhoon\": \"ヒステリックタイフーン\",\n        \"hyudorabo\": \"ひゅどらぼ\",\n        \"hzkletter\": \"HZKletter\",\n        \"i\": \"I\",\n        \"i am a rock\": \"I am a Rock\",\n        \"i slash h slash r\": \"I/H/R\",\n        \"i think\": \"i think\",\n        \"i-proya\": \"あいぷろ屋\",\n        \"i.r.o.zi\": \"i.r.o.Zi\",\n        \"i.s.o.p.\": \"I.S.O.P.\",\n        \"i.t.gyro\": \"I.T.ジャイロ\",\n        \"ibiza\": \"Ibiza\",\n        \"ibotsukigunte\": \"いぼつきぐんて\",\n        \"ibros\": \"ibros\",\n        \"ice cream\": \"アイスクリウム\",\n        \"ice kick\": \"アイスキック\",\n        \"ice lycoris\": \"氷のリコリス\",\n        \"ice manjuu\": \"あいす饅頭\",\n        \"ice pink\": \"Ice Pink\",\n        \"ice sugar\": \"Ice Sugar\",\n        \"ice-place\": \"ICE-PLACE\",\n        \"ichigo\": \"いちご\",\n        \"ichigo bakery\": \"イチゴベーカリ\",\n        \"ichigo batake\": \"いちご畑\",\n        \"ichigo crepe oomorigumi\": \"いちごクレープ大盛組\",\n        \"ichigo fax\": \"Ichigo Fax\",\n        \"ichigo ichie\": \"一期一会\",\n        \"ichigo jet\": \"いちごじぇっと\",\n        \"ichigo maririn\": \"いちごマリ凛\",\n        \"ichigo milk\": \"いちごみるく\",\n        \"ichigoen\": \"いちご苑\",\n        \"ichigohou\": \"苺砲\",\n        \"ichigoya\": \"いちご屋\",\n        \"ichikasho nihoukou\": \"一箇所二方向\",\n        \"ichikawa gekibansha\": \"市川劇版社\",\n        \"inomaru\": \"いの丸\",\n        \"ichimatsu kougyou\": \"市松稿行\",\n        \"ichimonkai\": \"一門会\",\n        \"ichinichi atelier\": \"いちにちアトリエ\",\n        \"ichinichijuu guttari\": \"一日中ぐったり\",\n        \"ichino nijou\": \"いちのにじょう\",\n        \"ichinose\": \"一ノ瀬\",\n        \"ichiokumangenjaya\": \"一億万軒茶屋\",\n        \"ichiokunen wakusei\": \"1億年惑星\",\n        \"ichiya neko no yume\": \"一夜猫の夢\",\n        \"ichiya teikoku\": \"壱屋帝国\",\n        \"ichiyonroku\": \"イチヨンロク\",\n        \"ichiyuzai\": \"壱釉斎\",\n        \"icicle\": \"Icicle\",\n        \"iciclepink\": \"IciclePink\",\n        \"ico-ba\": \"Ico-ba\",\n        \"idenshi no fune\": \"遺伝子の舟\",\n        \"idivide\": \"アイディバイド\",\n        \"ido no naka\": \"井戸の中\",\n        \"ido no soko\": \"井戸の底\",\n        \"idobata kaigisho\": \"井戸端会議所\",\n        \"idolize\": \"iDOLIZE\",\n        \"idomizuya\": \"井戸水屋\",\n        \"if no danpen\": \"ifの断篇\",\n        \"ifdef\": \"ifdef\",\n        \"ifpark com\": \"ifpark.com\",\n        \"igou\": \"異郷\",\n        \"iihama shokudou\": \"飯浜食堂\",\n        \"iihitoya dosukoidou\": \"いい人屋どすこい堂\",\n        \"iiiiitune\": \"IIIIItune\",\n        \"iinari bijin\": \"いいなり美人\",\n        \"iio tetsuaki honpo\": \"飯尾鉄明本舗\",\n        \"iiwake-gaisya\": \"いいわけ会社\",\n        \"iji\": \"IJI\",\n        \"ijigen kichi\": \"異次元基地\",\n        \"ijiise\": \"イジイセ\",\n        \"ik.projectear\": \"IK.projectear\",\n        \"ika client\": \"いか・クライアント\",\n        \"ikaruganomiya\": \"斑鳩宮\",\n        \"ikasumi no dendou\": \"イカスミの殿堂\",\n        \"ikasumiya\": \"烏賊墨屋\",\n        \"ikechika\": \"いけちか\",\n        \"ikeda jun kikakushitsu\": \"池田淳企画室\",\n        \"ikemen teikoku\": \"イケメン帝国\",\n        \"ikennabi\": \"イケンナビ\",\n        \"ikibata 49ers\": \"いきばた49ERS\",\n        \"ikigire shoukai\": \"いきぎれ商会\",\n        \"ikihaji hummingbird\": \"生き恥ハミングバード\",\n        \"ikite-chou-made-todoku\": \"生きて腸まで届く\",\n        \"ikka risan\": \"一家離散\",\n        \"ikkansei\": \"一貫星\",\n        \"ikuiku com\": \"いくいくコン\",\n        \"ikumura\": \"郁村\",\n        \"ikuukan massatsu-ken\": \"異空間抹殺圏\",\n        \"ild cat\": \"ILD CAT\",\n        \"illuminator\": \"illuminator\",\n        \"illust koubou kakutasu\": \"イラスト工房描くたす\",\n        \"im\": \"Im\",\n        \"im fragile\": \"i'm Fragile\",\n        \"imagawatei\": \"今川亭\",\n        \"image craft\": \"IMAGE CRAFT\",\n        \"image rider\": \"Image Rider\",\n        \"imagination scenery\": \"Imagination scenery\",\n        \"imagineforme\": \"イマジンフォルム\",\n        \"imakan\": \"IMAKAN\",\n        \"imakaya\": \"いまか屋\",\n        \"imasori dondai\": \"イマソリドンダイ\",\n        \"imazon no ana\": \"今ゾンの穴\",\n        \"imitation genome\": \"イミテーションゲノム\",\n        \"imitation moon\": \"Imitation Moon\",\n        \"imitation star\": \"イミテーション スタア\",\n        \"immoral heart\": \"Immoral Heart\",\n        \"imoarai-ya\": \"芋洗屋\",\n        \"imomaru\": \"芋。\",\n        \"imopotato\": \"いもポテト\",\n        \"imotare\": \"imotare\",\n        \"imoutogensouzitiku\": \"妹幻想自治区\",\n        \"imozaiku\": \"いもざいく\",\n        \"imozuru-shiki\": \"いもずる式\",\n        \"imperial chicken\": \"インペリアルチキン\",\n        \"imuneko\": \"イムネコ\",\n        \"in the teapot\": \"In the Teapot\",\n        \"in the water\": \"in the WATER.\",\n        \"inaf\": \"INAF\",\n        \"inai uchi ni\": \"いないうちに\",\n        \"inakagurashi\": \"イナカグラシ\",\n        \"inaridou shoten\": \"稲荷堂書店\",\n        \"inarimochi.\": \"いなり餅。\",\n        \"inarizushi\": \"いなりずし\",\n        \"inasaku\": \"稲作\",\n        \"inayama shrine\": \"稲山神社\",\n        \"inchikidou\": \"いんちき堂\",\n        \"include\": \"include\",\n        \"independenko\": \"インデペンダンコ\",\n        \"ineusaruka\": \"イネウサルカ\",\n        \"infinity\": \"infinity\",\n        \"infinity line\": \"infinity line\",\n        \"iniminimanimo\": \"イニミニマニモ\",\n        \"initiative\": \"イニシアティ部\",\n        \"inja no kuruwa\": \"陰者の廓\",\n        \"inkstone\": \"InkStone\",\n        \"inner map\": \"Inner Map\",\n        \"innocence\": \"Innocence\",\n        \"innocent lucy\": \"イノセントルーシー\",\n        \"inran teddy bear\": \"淫乱テディベア\",\n        \"inre\": \"インレ\",\n        \"inshoujo\": \"淫少女\",\n        \"insky.\": \"insky.\",\n        \"inspi.\": \"inspi.\",\n        \"inspire\": \"inspire\",\n        \"intendou\": \"淫天堂\",\n        \"interlude\": \"interlude\",\n        \"intondou\": \"隠遁堂\",\n        \"intrepid\": \"イントレピッド\",\n        \"inu batake\": \"犬畑\",\n        \"inu no sekai\": \"いぬのせかい\",\n        \"inu ringo\": \"イヌリンゴ\",\n        \"inu system\": \"犬システム\",\n        \"inu to kotatsu\": \"犬とコタツ\",\n        \"inubaka\": \"いぬばか\",\n        \"inudamashi\": \"いぬだまし\",\n        \"inudrill lolita engine\": \"イヌドリルロリータエンジン\",\n        \"inudrill.\": \"イヌドリル。\",\n        \"inuduya\": \"いぬづや\",\n        \"inufuro\": \"いぬふろ\",\n        \"inuhouse.\": \"いぬはうす。\",\n        \"inukamedou\": \"いぬかめ堂\",\n        \"inukare\": \"犬彼\",\n        \"inuyamakagashi\": \"イヌヤマカガシ\",\n        \"inuyoukan\": \"狼幼館\",\n        \"inuzuka clinic\": \"犬塚クリニック\",\n        \"inym\": \"INYM\",\n        \"inyu-goya\": \"いにゅ小屋\",\n        \"io lite\": \"Io Lite\",\n        \"ioom\": \"ioom\",\n        \"ioteact\": \"Ioteact\",\n        \"ip\": \"IP\",\n        \"ipheion\": \"Ipheion\",\n        \"ippatsu shooter\": \"一発シューター\",\n        \"ippatsutei\": \"一発亭\",\n        \"ippo mae e\": \"一歩前へ\",\n        \"ipro back dancers\": \"iProバックダンサーズ\",\n        \"iraremai\": \"いられまい\",\n        \"irekubadou\": \"いれくば堂\",\n        \"irene\": \"Irene\",\n        \"iris art\": \"Iris art\",\n        \"iro neko pencil\": \"色ねこペンシル\",\n        \"irodorip\": \"彩RIP\",\n        \"iroiroiro\": \"iroiroiro\",\n        \"iroman\": \"いろまん\",\n        \"iron\": \"iron\",\n        \"iron fin\": \"IRON FIN\",\n        \"iron grimoire\": \"IRON GRIMOIRE\",\n        \"iron plate\": \"あいあんぷれーと\",\n        \"iron sugar\": \"アイアンシュガー\",\n        \"iron y\": \"IRON Y\",\n        \"isada-ke\": \"いさだ家\",\n        \"isami kaihatsu jigyoudan\": \"イサミ再開発事業団\",\n        \"ise no mug cup\": \"いせのマグカップ\",\n        \"isekai ryokou dairiten\": \"異世界旅行代理店\",\n        \"ishi kenpi\": \"石ケンピ\",\n        \"ishi wa hakanaki ame no shirabe ni\": \"意思は儚き雨の調べに\",\n        \"ishidaya\": \"イシダヤ\",\n        \"ishikari shake nabe doukoukai\": \"石狩しゃけ鍋同好会\",\n        \"ishikorodou\": \"イシコロドウ\",\n        \"ishin denshin\": \"以心伝心\",\n        \"ishitoku ya\": \"イシトク屋\",\n        \"island belle\": \"Island Belle\",\n        \"island green\": \"アイランドグリーン\",\n        \"iso no sozaiten\": \"いその惣菜店\",\n        \"isocurve\": \"アイソカーブ\",\n        \"isofura\": \"いそふら\",\n        \"isofura ribbon\": \"イソフラリボン\",\n        \"isorashi dou\": \"イソラシ堂\",\n        \"isotonix\": \"アイソトニクス\",\n        \"isou\": \"isou\",\n        \"issun kobo\": \"一寸工房\",\n        \"isurusdo\": \"いするす堂\",\n        \"itachitai\": \"イタチ隊\",\n        \"itadaki\": \"頂\",\n        \"itadaki cat\": \"イタダキキャット\",\n        \"item box\": \"あいてむぼっくす\",\n        \"itibosi\": \"ITIBOSI\",\n        \"ito ichizo shouten\": \"伊藤一蔵商店\",\n        \"itou chaba\": \"伊東茶葉\",\n        \"itsuka no sora\": \"いつかのそら\",\n        \"itsukano\": \"イツカノ\",\n        \"itsukano cabayaki\": \"いつかのカバヤキ\",\n        \"itsukidou\": \"樹堂\",\n        \"itsutsuba no clover\": \"五つ葉のクローバー\",\n        \"itsuwari no shirohata\": \"偽りの白旗\",\n        \"ittou ryoudan\": \"一刀両断\",\n        \"iv va shin\": \"IV VA SHIN\",\n        \"ivory\": \"IVORY\",\n        \"ivycrown\": \"ivycrown\",\n        \"iwamanga honpo\": \"いわまんが本舗\",\n        \"iwanakaya\": \"岩中屋\",\n        \"iwashita shoten\": \"いわした書店\",\n        \"iyokan.\": \"いよかん。\",\n        \"iyou\": \"iYou\",\n        \"izakaya yocchan\": \"居酒屋よっちゃん\",\n        \"izayoi no tsuki\": \"十六夜の月\",\n        \"izumi gakuen\": \"いずみ学園\",\n        \"izumi shoseki\": \"いづみ書籍\",\n        \"izumiyu\": \"イズミユ\",\n        \"izumnizm\": \"イズムニズム\",\n        \"izumo gasshuukoku\": \"いづも合衆国\",\n        \"izumunizm\": \"IzumuNizm\",\n        \"izuya\": \"IZU屋\",\n        \"j\": \"j\",\n        \"j-m-box\": \"J-M-BOX\",\n        \"j.o.c e.go\": \"J.O.C★e.go!!\",\n        \"j.s\": \"ジェイ・エス\",\n        \"j7w\": \"j7w\",\n        \"jabara yane\": \"じゃばら屋根\",\n        \"jabyssk\": \"JabyssK\",\n        \"jack dou\": \"ジャック堂\",\n        \"jack-o-lantern\": \"ぢゃっからんたん\",\n        \"jack-r\": \"Jack-R\",\n        \"jackass\": \"ジャッカス\",\n        \"jacklake\": \"Jacklake\",\n        \"jackmarry\": \"JACKMARRY\",\n        \"ja no michi wa hebi soft\": \"蛇ノ道ハ蛇ソフト\",\n        \"jagaimo potato\": \"じゃがいもポテト\",\n        \"jail black\": \"JaiL Black\",\n        \"jajujo\": \"じゃじゅじょ\",\n        \"jakushou jimusho shokun\": \"弱小事務所諸君\",\n        \"jaleco\": \"ジャレコ\",\n        \"jam\": \"ジャム\",\n        \"jam kingdom\": \"ジャム王国\",\n        \"jamboree\": \"Jamboree!\",\n        \"jamurika\": \"ジャム理科\",\n        \"jangari koubou\": \"じゃんがり工房\",\n        \"janis toilet\": \"ジャニストイレ\",\n        \"jasmon\": \"JASもん\",\n        \"je taime\": \"濡鼎夢\",\n        \"jelly fish\": \"Jelly fish\",\n        \"jennys jimusho\": \"じぇにーず事務所\",\n        \"jenoa cake\": \"じぇのばけーき\",\n        \"jereheim garden\": \"Jereheim Garden\",\n        \"jermaneels\": \"jermaneels\",\n        \"jet dekopin books\": \"JET DEKOPIN BOOKS\",\n        \"jeter studio\": \"ジータースタジオ\",\n        \"jewelry\": \"ジュエリー\",\n        \"jibaku-system\": \"自爆SYSTEM\",\n        \"zydan\": \"痔男\",\n        \"jido-hikki\": \"じどー筆記\",\n        \"jiesu\": \"じーえす\",\n        \"jigen bakudan\": \"時限爆弾\",\n        \"jigoku potion\": \"地獄ポーション\",\n        \"jigoku shinjuu\": \"地獄心中\",\n        \"jigoku studio\": \"地獄スタジオ\",\n        \"jikansa-kougeki\": \"時間差攻撃\",\n        \"jikayou kamihikouki\": \"自家用紙飛行機\",\n        \"jikomankitsu.\": \"自己満喫。\",\n        \"jikomanzoku\": \"じこまんぞく\",\n        \"jinapakusu\": \"じなぱーくす\",\n        \"jinbow\": \"JINBOW\",\n        \"jingai makyou club\": \"人外魔境倶楽部\",\n        \"jinkenhakudatsu kougeki\": \"人権剥奪攻撃\",\n        \"jinmen 62\": \"ジンメン62\",\n        \"jinoriya\": \"じのり屋\",\n        \"jinraiken\": \"迅雷拳\",\n        \"jinrikisha\": \"人力社\",\n        \"jinsei ano denchuu made sakusen\": \"人生あの電柱まで作戦\",\n        \"jinsei tsuukoudome\": \"人生通行止め\",\n        \"jipohou\": \"時ポ砲\",\n        \"jishaku no sunaba\": \"じしゃくのすなば\",\n        \"jishin kajyou\": \"地震過剰\",\n        \"jishou seijunha\": \"自称清純派\",\n        \"jisyakunyudo\": \"じしゃく入道\",\n        \"jitaku ijouari\": \"自宅異常あり!\",\n        \"jitaku studio\": \"自宅すたじお\",\n        \"jitsuyou tosho fukyuukai r\": \"実用図書普及会\",\n        \"jiyuu inpon tou\": \"自由いんぽん党\",\n        \"jiyuubeya\": \"自由部屋\",\n        \"jiyuugaoka shoutengai\": \"自由ヶ丘商店会\",\n        \"jizeru enjin\": \"じーぜるエンジン\",\n        \"jk-pasta\": \"JKぱすた\",\n        \"jms space\": \"JMSスペース\",\n        \"john doe shinobu\": \"あっぱーきゃんでぃー\",\n        \"johnny iron pipe\": \"ジョニー鉄パイプ\",\n        \"joji panchu uriba\": \"女児ぱんちゅ売場\",\n        \"joker type\": \"JOKER TYPE\",\n        \"jokou kukan\": \"徐行区間\",\n        \"jon\": \"JON\",\n        \"jonathan ssss\": \"じょなさんず\",\n        \"jongotei\": \"ジョーんご亭\",\n        \"jorijori\": \"JoRiJoRi\",\n        \"joshi nimo katezu\": \"女子ニモ勝テズ\",\n        \"joshinzoku\": \"女真族\",\n        \"joujou tenki\": \"上々天気\",\n        \"joukitei\": \"蒸気亭\",\n        \"joy convoy\": \"ジョイコンボイ\",\n        \"joydivision\": \"JoyDivision\",\n        \"js style\": \"J's STYLE\",\n        \"judgement\": \"JUDGEMENT\",\n        \"juicy fruits\": \"Juicy Fruits\",\n        \"jujuppe\": \"ヂュヂュッペ\",\n        \"jukai shoko\": \"樹海書庫\",\n        \"jukujuku juvenile\": \"熟々ジュブナイル\",\n        \"jukuseiya koubou\": \"熟成屋工房\",\n        \"julia\": \"JULIA\",\n        \"jumbomax\": \"JUMBOMAX\",\n        \"jumelles\": \"ジュメルズ\",\n        \"junai shijoushugi\": \"純愛至上主義\",\n        \"junes rain\": \"六月雨\",\n        \"junes202\": \"ジュネス202\",\n        \"junk arts\": \"ジャンクアーツ\",\n        \"junk box\": \"Junk Box\",\n        \"junk center kameyoko bldg\": \"JUNKセンター亀横ビル\",\n        \"junk gear\": \"ジャンクギア\",\n        \"junk island\": \"ジャンクアイランド\",\n        \"junk market\": \"Junk Market\",\n        \"junk story\": \"JUNK STORY\",\n        \"junkan\": \"循環\",\n        \"junkin\": \"純禁\",\n        \"junkissa gen\": \"潤喫茶・弦\",\n        \"junkland2\": \"JUNKLAND2\",\n        \"junkxjunk\": \"JUNK×JUNK\",\n        \"junpuumanpandou\": \"順風満帆堂\",\n        \"jushoku to sono ichimi\": \"住職とその一味\",\n        \"jusou music\": \"十三ミュジック\",\n        \"juubai matsuri\": \"十倍祭り\",\n        \"juugoichie\": \"十誤一会\",\n        \"juujigen\": \"十次元\",\n        \"juuryoku dou\": \"重力堂\",\n        \"juvecross\": \"じゅぶくろす\",\n        \"jyakonegi sarada\": \"じゃこネギさらだ\",\n        \"jyaraya\": \"じゃらや\",\n        \"jyouren kishidan\": \"ジョウ・レン騎士団\",\n        \"jzargo\": \"ジェイザルゴ\",\n        \"k equals k\": \"[K=K]\",\n        \"k h\": \"K☆H\",\n        \"k plus w\": \"K+W\",\n        \"k plus y equals k\": \"K+Y=K\",\n        \"k-1\": \"K-1\",\n        \"k-ten\": \"K-てん\",\n        \"k.a.d\": \"K.A.D\",\n        \"k.f.d.\": \"K.F.D.\",\n        \"k.h.r\": \"K.H.R\",\n        \"k.n.d.\": \"K.N.D.\",\n        \"k.s. ozaki\": \"K.S.尾崎\",\n        \"k2 manhole\": \"K2マンホール\",\n        \"k2 tomo no kai\": \"K²友の怪\",\n        \"ka-mi-night town\": \"カーミー夜番街\",\n        \"kaaburidou\": \"顔振堂\",\n        \"kab-studio\": \"KAB-studio\",\n        \"kabaya\": \"樺屋\",\n        \"kabocha company\": \"かぼちゃカンパニー\",\n        \"kabocha daioh\": \"かぼちゃ大王\",\n        \"kabocha get\": \"かぼちゃげっと\",\n        \"kabocha heim\": \"かぼちゃハイム\",\n        \"kabocha obake\": \"カボチャオバケ\",\n        \"kabocha oukoku\": \"かぼちゃ王国\",\n        \"kabuki-man\": \"カブキマン\",\n        \"kabuto jirushi\": \"カブト印\",\n        \"kabutomushi\": \"カブとムシ\",\n        \"kabuttari kaburanakattari\": \"かぶったりかぶらなかったり\",\n        \"kachiwari jikkenshitsu\": \"カチワリ実験室\",\n        \"kachusha\": \"Kachusha\",\n        \"kadobeya tengoku\": \"角部屋天国\",\n        \"kaede momiji\": \"かえでもみじ\",\n        \"kaede no harawata\": \"楓のはらわた\",\n        \"kaededou\": \"楓道\",\n        \"kaedelic\": \"KAEdeLIC\",\n        \"kaeru neko no shippo\": \"かえるねこのしっぽ\",\n        \"kaeru no oyado\": \"カエルの御宿\",\n        \"kaerudon teishoku\": \"カエル丼定食\",\n        \"kagamichaya\": \"鏡茶屋\",\n        \"kage kiri\": \"影霧\",\n        \"kagehara juukou\": \"影原重工\",\n        \"kageneko\": \"カゲねこ\",\n        \"kageneko.\": \"かげねこ。\",\n        \"kagero\": \"カゲ路\",\n        \"kaginord\": \"鍵のーど\",\n        \"kagimushi\": \"かぎむし\",\n        \"kagitsuki\": \"限月\",\n        \"kagura hitsuji\": \"神楽ひつじ\",\n        \"kaguradou\": \"かぐら堂\",\n        \"kaguyahime\": \"かぐや姫\",\n        \"kahlua milk\": \"かるーあみるく\",\n        \"kai\": \"KAI\",\n        \"kai.tenchou\": \"改・店長\",\n        \"kaibido\": \"快微動\",\n        \"kaicho-maniax\": \"カイチョーマニアックス\",\n        \"kaigansen\": \"カイガンセン\",\n        \"kaigetsudou\": \"海月堂\",\n        \"kaigishitsu\": \"カイギ室\",\n        \"kaigun daisan shidan\": \"怪軍第3師団\",\n        \"kaihatsushitsu\": \"開発室\",\n        \"kaikan algorithm\": \"快感アルゴリズム\",\n        \"kaiki dennou manga bako\": \"怪奇電脳漫画箱\",\n        \"kaiki nisshoku\": \"怪奇日蝕\",\n        \"kaiman\": \"カイマン\",\n        \"kairaku shuudan\": \"怪楽集団\",\n        \"kairaku yarou g team\": \"快楽野郎Gチーム\",\n        \"kairanban\": \"快乱版\",\n        \"kairansya\": \"海覧車\",\n        \"kairoudou\": \"海老堂\",\n        \"kairyuu\": \"海竜\",\n        \"kaisei hallelujah\": \"快晴ハレルヤ\",\n        \"kaisei yohou\": \"快晴予報\",\n        \"kaisen teikoku\": \"海鮮帝国\",\n        \"kaishaku\": \"介錯\",\n        \"kaishundou honpo\": \"回春堂本舗\",\n        \"kaiteisinden\": \"海底神殿\",\n        \"kaiteki circle\": \"カイテキサークル\",\n        \"kaiten anzu tei\": \"回転杏子亭\",\n        \"kaiten sommelier\": \"回転ソムリエ\",\n        \"kaitenshiki kebabu\": \"回転式けばぶ\",\n        \"kaiun\": \"海運\",\n        \"kaiyuu kikaku\": \"回遊企画\",\n        \"kaizoku seibutsu\": \"海族生物\",\n        \"kajigurumi\": \"かじぐるみ\",\n        \"kajimura market\": \"かじむらマーケット\",\n        \"kakao kakoujou\": \"カカオ加工場\",\n        \"kaki no boo\": \"柿ノ房\",\n        \"kakinotanehitotsubu\": \"柿の種一粒\",\n        \"kakitsubata no yashiro\": \"杜若社\",\n        \"kakkasouyou\": \"かっかそうよう\",\n        \"kakogawa-ya\": \"加古川屋\",\n        \"kakohimenoutuwa\": \"かこひめのうつわ\",\n        \"kaku shoseki\": \"架空書籍\",\n        \"kakumei seifu kouhoushitsu\": \"革命政府広報室\",\n        \"kakumeiji\": \"革命児\",\n        \"kakuni\": \"KAKUNI\",\n        \"kakuq\": \"kakuQ\",\n        \"kakuu byoutou\": \"架空病棟\",\n        \"kalbi santarou\": \"カルビさん太郎\",\n        \"kaleido sky\": \"Kaleido Sky\",\n        \"kalmia\": \"KALMIA\",\n        \"kalmia8\": \"Kalmia8\",\n        \"kamaboko koujouchou.\": \"かまぼこ工場長。\",\n        \"kamaboko-doh\": \"かまぼこ堂\",\n        \"kamabokodokoro\": \"かまぼこ処\",\n        \"kamadeva\": \"Kamadeva\",\n        \"kamagabuchi\": \"かまがぶち\",\n        \"kamakiri farm\": \"カマキリファーム\",\n        \"kamameshiya\": \"かまめし屋\",\n        \"kamaros\": \"カマロス\",\n        \"kamarujirushi\": \"かまる印\",\n        \"kamawanyo\": \"KAMAWANYO\",\n        \"kame no ko\": \"亀の子\",\n        \"kamebeya\": \"かめべや\",\n        \"kamemushi\": \"カメムシ\",\n        \"kameneji\": \"かめねじ\",\n        \"kamepotel\": \"かめぽてる\",\n        \"kami no misosiru\": \"神のみそ汁\",\n        \"kami no tsuki no yashiro\": \"神の月の社\",\n        \"kamibukuro works\": \"紙袋Works\",\n        \"kamico\": \"カミコ!\",\n        \"kamifubukimura\": \"紙ふぶき村\",\n        \"kamikawa studio\": \"神川スタジオ\",\n        \"kamikaze style\": \"神風STYLE\",\n        \"kaminari-neko\": \"カミナリネコ\",\n        \"kaminendo.corporation\": \"KAMINENDO.CORPORATION\",\n        \"kaminosaki shiten\": \"神ノ裂支店\",\n        \"kamiyan\": \"かみやん\",\n        \"kamiyorozu\": \"上万\",\n        \"kamome no shokudou\": \"かもめの食道\",\n        \"kamoro-sa-z\": \"鴨ローサーズ\",\n        \"kamoshireya\": \"かもしれ屋\",\n        \"kamotama shuzou\": \"かもたま酒造\",\n        \"kamotamaza\": \"かもたま座\",\n        \"kamukamu\": \"かむかむっ!\",\n        \"kanagawa macchiato.\": \"かながわマキアート。\",\n        \"kanakana shoutengai\": \"カナカナ商店街\",\n        \"kanariya bai kanariya\": \"カナリヤバいカナリヤ\",\n        \"kanarukan\": \"歌鳴館\",\n        \"kanbotan\": \"カンボタン\",\n        \"kancho hatto\": \"艦長法度\",\n        \"kandelaar\": \"カンテラ\",\n        \"kanemasita\": \"kanemasita\",\n        \"kaneshiro083\": \"カネシロ083\",\n        \"kanidouraku\": \"かにどうらく\",\n        \"kanie-don\": \"鹿贄どん\",\n        \"kanifry\": \"カニフライ\",\n        \"kanikieru\": \"カニキエル\",\n        \"kaniman\": \"かにまん\",\n        \"kanimura hanten\": \"蟹村飯店\",\n        \"kaniparadise\": \"かにぱらだいす\",\n        \"kaniya\": \"かに家\",\n        \"kankyokusetsu\": \"寒極雪\",\n        \"kanmi ningyou\": \"甘味人形\",\n        \"kanmido\": \"甘味堂\",\n        \"kanmidokoro usb\": \"甘味処USB\",\n        \"kanmidokoro-hibiki\": \"甘味処 響\",\n        \"kanmiya makkuro\": \"感味屋真黒\",\n        \"kanmuri kamuri\": \"冠かむり\",\n        \"kannazuki seisakusho\": \"神無月製作所\",\n        \"kanosamu line\": \"KANOSAMU LINE\",\n        \"kanosawa\": \"カノサワ\",\n        \"kansai kemono rengou\": \"関西ケモノ連合\",\n        \"kanshasai soft\": \"感謝祭ソフト\",\n        \"kanshin soft\": \"かんしんソフト\",\n        \"kansyouyou marmotte\": \"鑑賞用モルモット\",\n        \"kanten garas\": \"寒天硝子\",\n        \"kantera\": \"かんてら\",\n        \"kantera no kissaten\": \"カンテラの喫茶店\",\n        \"kantou usagi gumi\": \"関東うさぎ組\",\n        \"kanyou shounen\": \"観用少年\",\n        \"kanzen busouya\": \"完全武装屋\",\n        \"kanzen dokusen\": \"完全独占\",\n        \"kanzume honpo\": \"かんづめ本舗\",\n        \"kaochuu kingdom\": \"顔厨王国\",\n        \"kaodashi bijutsukan\": \"顔出し美術館\",\n        \"kaokaoiyan\": \"かおかおいやん\",\n        \"kaori no nichiyoubi\": \"Kaoriの日曜日\",\n        \"kaoru system\": \"KAORU SYSTEM\",\n        \"kappa create\": \"カッパくりえいと\",\n        \"kappa yousai\": \"かっぱ要塞\",\n        \"kappaya\": \"河童屋\",\n        \"kara no mozuku\": \"空のもずく\",\n        \"kara no tsuki\": \"カラノツキ\",\n        \"karaage market\": \"からあげ市場\",\n        \"karaage of the year\": \"からあげオブザイヤー\",\n        \"karakuchi choucream\": \"辛口しゅーくりーむ\",\n        \"karamomo tart\": \"からももたると\",\n        \"karamoyou\": \"唐模様\",\n        \"karappa\": \"karappa\",\n        \"karashitakana\": \"からしたかな\",\n        \"karasu chan\": \"カラスちゃん\",\n        \"karasu no su\": \"鴉の巣\",\n        \"karasuke honpo\": \"烏毛本舗\",\n        \"karasuma pink higashiiru\": \"烏丸ぴんく東入ル\",\n        \"karaya\": \"殻屋\",\n        \"karazishibotan\": \"からじしぼたん\",\n        \"kareha\": \"生姜うどん\",\n        \"karehaneko\": \"かれはねこ\",\n        \"karei nudol\": \"華麗NUDOL\",\n        \"karen soft\": \"可憐ソフト\",\n        \"karibian\": \"かりび庵\",\n        \"karikari bacon\": \"カリカリベーコン\",\n        \"karin\": \"Karin\",\n        \"karintou\": \"かりん党\",\n        \"karitara kaesu\": \"かりたらかえす\",\n        \"karma laboratory\": \"業-karma-Laboratory\",\n        \"karoyaka step\": \"かろやかステップ\",\n        \"karst diary\": \"カルスト日記\",\n        \"karuhazumi\": \"かるはずみ\",\n        \"karumaya\": \"かるま屋\",\n        \"karuwani\": \"かるわに\",\n        \"kasama kou\": \"カサマ コウ\",\n        \"kasaya\": \"かさや\",\n        \"kasetsu shirokuma kakko yoi\": \"仮設しろくま\",\n        \"kasetsu yousai\": \"仮設要塞\",\n        \"kasha\": \"珈舎\",\n        \"kashinoki\": \"カシノ木\",\n        \"kashitsuki\": \"菓子つき\",\n        \"kashiwa-ya\": \"かしわ屋\",\n        \"kasou genjitsu\": \"禍葬現実\",\n        \"kasozama\": \"過疎座間\",\n        \"kassam rocketer\": \"Kassam rocketer\",\n        \"kasshoku amazoness\": \"褐色アマゾネス\",\n        \"kasshoku waisei\": \"褐色矮星\",\n        \"kasuga 1-chome\": \"春日ー丁目\",\n        \"kasugano kikaku\": \"春日野企画\",\n        \"kasukabe pantsu hunter\": \"糟日部☆ぱんつハンター\",\n        \"kasumi eater\": \"カスミイーター\",\n        \"kasuterura\": \"かすてるら\",\n        \"katagun catapult\": \"片眼カタパルト\",\n        \"katahaba creatures\": \"肩幅クリーチャーズ\",\n        \"katakuchiiwashi\": \"カタクチイワシ\",\n        \"katakuri house\": \"カタクリハウス\",\n        \"katame koime oome\": \"硬め濃いめ多め\",\n        \"katamichi kippu\": \"カタミチキップ\",\n        \"katamimi buta\": \"片耳豚\",\n        \"katamimi headphone\": \"カタミミヘッドフォン\",\n        \"kataribeya\": \"かたりべや\",\n        \"katayude tamago\": \"かたゆでたまご\",\n        \"katooya\": \"カトー屋\",\n        \"katou suzuki\": \"加藤鈴木\",\n        \"katsubushi\": \"勝つ節\",\n        \"katsuma gokurakudou\": \"かつま極楽堂\",\n        \"katsuo shisetsu gallery\": \"カツオ私設ギャラリー\",\n        \"katsuobushi\": \"勝男武士\",\n        \"katuobusi\": \"カツオ武士\",\n        \"katuraya\": \"カツラ屋\",\n        \"kaudenya lab\": \"高電壓Lab\",\n        \"kawaisouko\": \"可哀想子\",\n        \"kawaisounako\": \"かわいそうな子\",\n        \"kawanakashima kobo\": \"川中島工房\",\n        \"kawasaki jian\": \"川崎事案\",\n        \"kawasemi\": \"翡翠\",\n        \"kawauso no hokanko cg\": \"kawauso no hokanko CG\",\n        \"kawazunoen\": \"蛙の宴\",\n        \"kaya no soto\": \"蚊帳の外\",\n        \"kayano mototo\": \"茅ノ素ト\",\n        \"kayoubi\": \"火曜日\",\n        \"kayoudou\": \"華容道\",\n        \"kazakiribane\": \"風切羽\",\n        \"kazama dojo\": \"風間道場\",\n        \"kazamichizu\": \"風海地図\",\n        \"kaze no kotowari\": \"かぜのことわり\",\n        \"kazetonbo\": \"風蜻蛉\",\n        \"kazeuma\": \"かぜうま\",\n        \"kazum\": \"kazum\",\n        \"kazuya\": \"カズ屋\",\n        \"kb\": \"KB\",\n        \"ke-kiyasan\": \"けーきやさん\",\n        \"kearuda\": \"けあるだ\",\n        \"kebero corporation\": \"EBEROコーポレーション\",\n        \"kedama cube\": \"毛玉キューブ\",\n        \"kedamono\": \"kedamono\",\n        \"kedamono kangoku tou\": \"けだもの監獄島\",\n        \"kedamonoya san\": \"ケダモノ屋さん\",\n        \"kee sanpo\": \"けー散歩\",\n        \"keep-out\": \"きーぷあうと\",\n        \"kegani kenkyuushitsu\": \"毛ガニ研究室\",\n        \"kei kei dou\": \"啓々堂\",\n        \"kei kei kei loan\": \"ケイケイケイローン\",\n        \"keigai tengen\": \"境外天元\",\n        \"keikouon\": \"傾向音\",\n        \"keisotsu na ana\": \"軽率な穴\",\n        \"keito\": \"圭斗\",\n        \"keito no mori\": \"毛糸の森\",\n        \"kekanoya\": \"けかの屋\",\n        \"kemao coopercent\": \"ケマオ9%\",\n        \"kemochi\": \"けもち\",\n        \"kemokomoya\": \"けもこも屋\",\n        \"kemomimi eki\": \"けもみみ駅\",\n        \"kemomimi koukyuu jikken kikan\": \"獣耳恒久実験機関\",\n        \"kemono masshigura.\": \"けものまっしぐら。\",\n        \"kemono michi\": \"けものみち\",\n        \"kemono no koshikake\": \"けもののこしかけ\",\n        \"kemonoburg\": \"けものぶるく\",\n        \"kemonomichi\": \"KEMONOMICHI\",\n        \"kemoshiko doukoukai\": \"けもシコ同好会\",\n        \"kemotsubo\": \"ケモつぼ\",\n        \"kemoyuru\": \"けもゆる\",\n        \"kemuriya\": \"煙屋\",\n        \"kemusi no bansan kai\": \"けむしの晩餐会\",\n        \"ken-chan no tokoro\": \"ケンちゃんのところ\",\n        \"kengai san\": \"圏外さん\",\n        \"kenix\": \"KENIX\",\n        \"kenja mode\": \"賢者も～ど\",\n        \"kenkou kyoushitsu\": \"健康教室\",\n        \"kenkou wagomu\": \"けんこう輪ゴム\",\n        \"kenou shineitai\": \"拳王親衛隊\",\n        \"kenrou koubo\": \"けんろー工房\",\n        \"kensoh ogawa\": \"ケンソウオガワ\",\n        \"keraku no tsubomi\": \"けらくのつぼみ\",\n        \"kereno teikoku\": \"けれの帝国\",\n        \"kerokero mountain chicken\": \"けろけろまうんてんちきん\",\n        \"keruto\": \"ける都\",\n        \"kes3000\": \"KES3000\",\n        \"kesa and noise\": \"ケサトノイズ\",\n        \"kesson shoujo\": \"欠損少女\",\n        \"ketchup aji no mayonnaise\": \"ケチャップ味のマヨネーズ\",\n        \"ketsudon teishoku\": \"ケツ丼定食\",\n        \"ketsune cyadokoro\": \"けつね茶処\",\n        \"keumaya\": \"希有马屋\",\n        \"keyspa\": \"きーすぱ\",\n        \"kezukaya\": \"毛塚屋\",\n        \"kf\": \"KF\",\n        \"kfc\": \"KFC\",\n        \"kgb\": \"KGB\",\n        \"ki no nekko\": \"木のねっこ\",\n        \"ki-software\": \"KI-SofTWarE\",\n        \"kibawomuku\": \"牙を剥く\",\n        \"kichiku bansankai\": \"きちくばんさんかい\",\n        \"kichinemu\": \"キチネム\",\n        \"kichu\": \"きちゅ!\",\n        \"kid\": \"KID\",\n        \"kidou juushi\": \"機動重視\",\n        \"kidoukan\": \"綺堂館\",\n        \"kieyza cmp\": \"喜栄座cmp\",\n        \"kigeki banzai\": \"喜劇万歳\",\n        \"kigeki gahou\": \"喜劇画報\",\n        \"kigineiro\": \"木々音色。\",\n        \"kiheitai\": \"畸兵隊\",\n        \"kiina vitamin\": \"きいなビタミン\",\n        \"kiiro bird\": \"きいろバード\",\n        \"kijinrou\": \"奇人楼\",\n        \"kijinabe to kitsunedon\": \"きじ鍋ときつね丼\",\n        \"kikaiatama\": \"機械頭\",\n        \"kikaishojo kaiho-sensen\": \"機械少女解放戦線\",\n        \"kikaten\": \"キカテン\",\n        \"kikitsukiya\": \"ききつき屋\",\n        \"kikka-shurou\": \"菊花酒楼\",\n        \"kikkanten\": \"喫甘展\",\n        \"kikkaya\": \"橘花屋\",\n        \"kikonet\": \"きこねっと\",\n        \"kikuya\": \"姫玖屋\",\n        \"kikyou no hana no saku tokoro\": \"桔梗の花の咲くところ\",\n        \"kill the king\": \"きるきん\",\n        \"killer bambi\": \"KILLER BAMBI\",\n        \"killkill michill\": \"Killkill Michill\",\n        \"kilometer\": \"きろめーとる\",\n        \"kimagu restaurant\": \"きまぐれすとらん\",\n        \"kimagure blue\": \"きまぐれblue\",\n        \"kimagure full course\": \"気まぐれフルコース\",\n        \"kimagure na bakeneko\": \"気まぐれな化け猫\",\n        \"kimagure nyaa nyaa\": \"きまぐれ娘々♪\",\n        \"kimarinet\": \"Kimarinet\",\n        \"kimidori\": \"君彩\",\n        \"kimino kakuremino\": \"キミノカクレミノ\",\n        \"kimpotsu\": \"きムぽつ\",\n        \"kimuchi\": \"鬼武致\",\n        \"kimuchi-tei\": \"キムチ亭\",\n        \"kin-youbi\": \"金揚尾\",\n        \"kinari\": \"きなり\",\n        \"kinbou sokai\": \"近傍租界\",\n        \"kindandowa\": \"禁断童話\",\n        \"kindergarten\": \"キンダーガーテン\",\n        \"kinema bambi\": \"キネマ☆バンビ\",\n        \"kinen jumper\": \"禁煙ジャンパー\",\n        \"kinetoscope\": \"キネトスコープ\",\n        \"king revolver\": \"キングリボルバー\",\n        \"kingpin\": \"キングピン\",\n        \"kingyo no suisou\": \"金魚の水槽\",\n        \"kinmekki damashii\": \"金メッキ魂\",\n        \"kinmekki studio\": \"金メッキスタジオ\",\n        \"kinmirai kyouyou bunko\": \"近未来教養文庫\",\n        \"kino manga sekkeishitsu\": \"鬼ノ漫画設計室\",\n        \"kinoko dx\": \"きのこDX\",\n        \"kinoko hamburg tei\": \"きのこはんばーぐ亭\",\n        \"kinoko house\": \"キノコハウス\",\n        \"kinoko no kakushi beya\": \"きのこの隠し部屋\",\n        \"kinoko no karutei-nu\": \"キノコの狩るてぃーぬ\",\n        \"kinoko pot pie\": \"きのこポットぱい\",\n        \"kinoko-ex\": \"KINOKO-ex\",\n        \"kinokotai\": \"きのこ隊\",\n        \"kinokoya kari\": \"茸屋(仮)\",\n        \"kinominoyama\": \"きのみの山\",\n        \"kinomiya\": \"季の宮\",\n        \"kinzoku hannou\": \"きんぞくはんのう\",\n        \"kirakira candy\": \"キラキラキャンディ\",\n        \"kirarinkuru\": \"きらりんくる\",\n        \"kirei club\": \"奇令クラブ\",\n        \"kirei na oneesan\": \"紀霊なお姉さん\",\n        \"kirimochi texture\": \"キリモチテクスチャ\",\n        \"kirin mamire\": \"キリンまみれ\",\n        \"kirin no chisato\": \"きりんのちさと\",\n        \"kirisawa giken\": \"桐沢技研\",\n        \"kirsi engine\": \"キルシーエンジン\",\n        \"kirscherise\": \"kirscherise\",\n        \"kisachi\": \"kisachi\",\n        \"kisama soredemo ningenka\": \"貴様それでも人間か!!\",\n        \"kisamamaki soft\": \"貴様巻きソフト\",\n        \"kisaradudou\": \"木更津堂\",\n        \"kiseki\": \"軌跡\",\n        \"kisekitei\": \"軌跡亭\",\n        \"kisha-\": \"きしゃー\",\n        \"kishiben\": \"きし弁\",\n        \"kisidou\": \"旗幟堂\",\n        \"kisoima\": \"きそいま\",\n        \"kisou d koubou\": \"奇想D工房\",\n        \"kisoutengai\": \"奇想天外\",\n        \"kissyoudo\": \"亀祥堂\",\n        \"kitagawajima\": \"キタガワジマ\",\n        \"kitaizumi koubou\": \"北泉工房\",\n        \"kitakami triple\": \"北神トリプル\",\n        \"kitakara tagayase\": \"きたからたがやせ\",\n        \"kitchen studio\": \"きっちんすたじお\",\n        \"kitkaters\": \"キットカッターズ\",\n        \"kitsch\": \"吉鼠-Kitsch-\",\n        \"kitsukedou\": \"きつけ堂\",\n        \"kitsune\": \"来つ寝\",\n        \"kitsune box system\": \"きつねぼっくすしすてむ\",\n        \"kitsune no daishokudou\": \"キツネの大食堂\",\n        \"kitsune to budou\": \"きつねとぶどう\",\n        \"kitsunenomori\": \"狐の杜\",\n        \"kitsunenotera\": \"きつねのてら\",\n        \"kitsuneya\": \"きつね屋\",\n        \"kitsuneyane\": \"きつね屋根\",\n        \"kitsunezuka\": \"狐塚\",\n        \"kittydrop\": \"KittyDrop\",\n        \"kiyosumi hurricane\": \"清炭ハリケーン\",\n        \"kizaruya\": \"黄猿屋\",\n        \"kizuna project\": \"絆プロジェクト\",\n        \"kk-spa\": \"KK-SPA\",\n        \"kki\": \"KKI\",\n        \"kkk\": \"KKK\",\n        \"kkkk\": \"kkkk\",\n        \"kkm\": \"K·K·M\",\n        \"klara works\": \"Klara Works\",\n        \"klaramate\": \"クララメイト\",\n        \"kleitos\": \"クレイトス\",\n        \"kmkz5.56\": \"KMKZ5.56\",\n        \"knife edge\": \"ナイフエッジ\",\n        \"knights\": \"KNIGHTS\",\n        \"knuckle chop\": \"knuckle chop\",\n        \"knuckle head\": \"KNUCKLE HEAD\",\n        \"ko nekoneko house\": \"こねこねこはうス\",\n        \"koa\": \"こあ\",\n        \"koakuma sageha\": \"小悪魔sage派\",\n        \"koala machine\": \"コアラマシン\",\n        \"koban dou\": \"小判堂\",\n        \"kobasoft\": \"KOBAsoft;\",\n        \"koboro nindan\": \"小幌忍団\",\n        \"koboshi no niwa\": \"コボシノニワ\",\n        \"kocher\": \"コッヘル\",\n        \"kocho kocho koukou\": \"こちょこちょ高校\",\n        \"kodama planet\": \"コダマノ惑星\",\n        \"kodanukidou\": \"小狸堂\",\n        \"kodoh\": \"kodoh\",\n        \"kodomo no koe\": \"こどものこえ\",\n        \"kodukuejou\": \"小机城\",\n        \"koedame\": \"KOEDAME\",\n        \"koei\": \"コーエー\",\n        \"kogemashita\": \"焦げました\",\n        \"kohaneto\": \"こはねと\",\n        \"koharu koubou\": \"こはる工房\",\n        \"koharuchaya\": \"KOHARUCHAYA\",\n        \"koharumachi\": \"小春町\",\n        \"kohimemachi\": \"狐姫町\",\n        \"kohitsujitei\": \"古羊亭\",\n        \"kohri club\": \"氷倶楽部\",\n        \"koi no danmenzu\": \"恋の断面図\",\n        \"koigokoro no borderline\": \"恋心のボーダーライン\",\n        \"koike-ya\": \"こいけ屋\",\n        \"koikuchi kinako\": \"こいくちきなこ\",\n        \"koinu computer\": \"koinu computer\",\n        \"koinu gumi\": \"こいぬ組\",\n        \"koinu kantai\": \"子犬艦隊\",\n        \"koito sousakusho\": \"小糸創作所\",\n        \"koji2\": \"KOJI2\",\n        \"kojiki hiroba\": \"乞食広場\",\n        \"kojimashiki\": \"コジマシキ\",\n        \"kokemomo\": \"こけもも\",\n        \"kokesimuken\": \"こけしム軒\",\n        \"kokikko\": \"KOKIKKO\",\n        \"kokkei-nagaya\": \"滑稽長屋\",\n        \"kokkishin\": \"こっき心\",\n        \"kokochikyuu\": \"心地球\",\n        \"kokonokiya\": \"ここのき屋\",\n        \"kokoro metro\": \"ココロメトロ\",\n        \"kokoro no boss\": \"心のBOSS\",\n        \"kokoro no ie\": \"心之家\",\n        \"kokoro no tsubasa\": \"こころのつばさ\",\n        \"kokoro shidoushitsu\": \"ココロ指導室\",\n        \"kokumaren\": \"kokumaren\",\n        \"kokuten no sato\": \"黒甜の郷\",\n        \"kokutou kuromame\": \"黒糖くろまめ\",\n        \"kokuyouchou\": \"黒耀蝶\",\n        \"komagome pipette\": \"コマゴメピペット\",\n        \"komamesugata\": \"こまめすがた\",\n        \"komanest\": \"こまねすと\",\n        \"komatsuna-ya\": \"小松菜屋\",\n        \"komatta tomato\": \"こまったとまと\",\n        \"komatta yatsu da na.\": \"こまった奴だな。\",\n        \"komaya\": \"駒屋\",\n        \"kome\": \"米\",\n        \"kome nouka\": \"こめ農家\",\n        \"komebitsu\": \"米びつ\",\n        \"komedokoro\": \"こめどころ\",\n        \"komekami kishi dan\": \"こめかみ騎士団\",\n        \"komekouji\": \"コメコウジ\",\n        \"komenikki\": \"米にっき。\",\n        \"komenosukima\": \"米の隙間\",\n        \"kometubu\": \"米粒\",\n        \"komickers\": \"Komickers\",\n        \"komorebi-notebook\": \"こもれびのーと\",\n        \"komorebitei\": \"木漏れ日亭\",\n        \"komugiko 100 percent\": \"小麦粉100%\",\n        \"kon no pencase\": \"紺のペンケース\",\n        \"konagona biscuit\": \"こなごなビスケット\",\n        \"konagona makki shoujou\": \"粉々末期症状\",\n        \"konapoka01\": \"こなぽか01\",\n        \"konatuiro\": \"来夏色\",\n        \"konbu-maru\": \"こんぶ丸\",\n        \"konbuni\": \"こんぶに\",\n        \"koneko dorobou\": \"子猫泥棒\",\n        \"koneko gumi\": \"こねこ組\",\n        \"koneko no manma\": \"こねこのまんま\",\n        \"konekotei\": \"虎猫亭\",\n        \"kongou rikisi\": \"金剛力士\",\n        \"kongs home\": \"kongs home\",\n        \"koniro drops\": \"绀色ドロップス\",\n        \"koniro milkiro\": \"紺色ミルク色\",\n        \"konjiki no monde selection\": \"金色のモンドセレクション\",\n        \"konjikineko\": \"金色猫\",\n        \"konna tokoro no kinniku made kitaeru nante...\": \"こんなところのきんにくまできたえるなんて...\",\n        \"konno seisakubou\": \"紺野制作坊\",\n        \"konnyaku\": \"こんにゃく\",\n        \"konoderu\": \"このでる\",\n        \"konoha\": \"このは\",\n        \"konohanaya\": \"此花屋\",\n        \"konowata\": \"コノワタ\",\n        \"konpekitou\": \"紺碧糖\",\n        \"konpon jinja\": \"コンポン神社\",\n        \"kontohboh\": \"痕桃梦\",\n        \"konton lady studio\": \"混沌レディースタジオ\",\n        \"koori ame\": \"こおりあめ\",\n        \"koorigoya\": \"氷小屋\",\n        \"kooriume\": \"こおりうめ\",\n        \"kopanda\": \"子パンダ\",\n        \"koppamijin\": \"コッパミジン\",\n        \"koppun\": \"骨粉\",\n        \"korikori koubou\": \"狐狸古里工房\",\n        \"korindou\": \"こりん堂\",\n        \"korisuya\": \"こりすや\",\n        \"korogarutsuki\": \"コロガルツキ\",\n        \"korogi comics\": \"こおろぎコミックス\",\n        \"korokoro koronp\": \"ころころころんぴ\",\n        \"korokorokokoro\": \"ころころこころ\",\n        \"korokuto\": \"ころくと\",\n        \"korokyu\": \"孤狼宮\",\n        \"koropot\": \"ころぽっと\",\n        \"kororofu\": \"コロロフ\",\n        \"koruri-ya\": \"こるり屋\",\n        \"kosuko teikoku\": \"こすこ帝国\",\n        \"kosuru buta\": \"こする豚\",\n        \"kotacyuya\": \"こたちゅ屋\",\n        \"kotake souhonke\": \"小武総本家\",\n        \"kotatsu de mikan chokubaijo\": \"こたつでみかん直売所\",\n        \"kotatsu guild\": \"コタツギルド\",\n        \"kotatsu no tsukaima\": \"古竜の使い魔\",\n        \"kotatsu room\": \"KOTATSU ROOM\",\n        \"kotatsuya\": \"炬燵屋CO.LTD\",\n        \"kotau\": \"こたう\",\n        \"kotee\": \"コテ絵\",\n        \"koti\": \"KOTI\",\n        \"kotoba asobi\": \"言葉遊戯\",\n        \"kotobukiya\": \"ことぶきや\",\n        \"kotonoya\": \"琴乃屋\",\n        \"kotori jimusho\": \"小鳥事務所\",\n        \"kotoribidou\": \"小鳥日堂\",\n        \"kotorikan\": \"小鳥館\",\n        \"kotoshiki\": \"コトシキ\",\n        \"kotoyoshi wired\": \"琴義ワイアード\",\n        \"kotsumudiya\": \"こつむぢや\",\n        \"kou kidou shoujo\": \"高機動少女\",\n        \"koubai gekka\": \"紅梅月下\",\n        \"koubaitei\": \"勾配亭\",\n        \"koubou juuichiya\": \"工房十一屋\",\n        \"koucha rakkyo\": \"紅茶辣韭\",\n        \"koudansha\": \"幸田ん舎\",\n        \"koufukuya\": \"幸福屋\",\n        \"kougaku meisai\": \"光学迷彩\",\n        \"kougeki\": \"幸撃\",\n        \"kougi anmitsu\": \"公儀あんみつ\",\n        \"kougi no mikan batake\": \"KOUGIのみかん畑\",\n        \"kougyo\": \"耿魚\",\n        \"kougyokutei dokuringo\": \"紅玉亭毒林檎\",\n        \"kouhuku shigen\": \"幸福資源\",\n        \"kouketsu no otome\": \"高潔の乙女\",\n        \"koukotsu panda\": \"恍惚熊猫\",\n        \"koukyou koukoku kikou\": \"公共広告奇行\",\n        \"kourinsha\": \"降臨社\",\n        \"koushi\": \"子牛\",\n        \"kousoku bitch network\": \"高速ビッチネットワーク\",\n        \"kousoku gurihari-tei\": \"高速グリハリ亭\",\n        \"kousoku kaiten\": \"高速回転\",\n        \"koutarou with t\": \"こうたろうWithティー\",\n        \"koutetsu\": \"鋼鉄\",\n        \"koutetsu rengou\": \"鋼鉄連合\",\n        \"koutetsuryoku kikaku\": \"鋼鉄力企画\",\n        \"kouya ni sakebu aitsu no heya\": \"荒野に叫ぶアイツの部屋\",\n        \"kouyadou\": \"こうや堂\",\n        \"kouzaka-san to makino jimusho\": \"神坂さんとマキノ事務所\",\n        \"kouzukitei\": \"香月亭\",\n        \"kouzuya\": \"興津屋\",\n        \"kowaremono\": \"こわれもの\",\n        \"kowareta omocha\": \"壊れたおもちゃ\",\n        \"kozimoko\": \"こじもこ\",\n        \"kozouya\": \"子蔵屋\",\n        \"kptms\": \"KPTM'S\",\n        \"kraftbox\": \"Kraftbox\",\n        \"krono-hudenekotei\": \"クロノ筆猫亭\",\n        \"kss\": \"ケイエスエス\",\n        \"ktn\": \"KTN\",\n        \"ktq48\": \"KTQ48\",\n        \"ku-ten\": \"KU-TEN\",\n        \"kubaya\": \"くば屋\",\n        \"kubotaya\": \"久保田屋\",\n        \"kuchen sirup\": \"く～へんしろっぷ\",\n        \"kuchibashi feti\": \"くちばしフェチ\",\n        \"kuchiki no uro\": \"朽木ノ洞\",\n        \"kudamono damono\": \"くだものだもの\",\n        \"kudarizaka guardrail\": \"下り坂ガードレール\",\n        \"kugatsuya\": \"九月屋\",\n        \"kuikome sagi\": \"食い込め詐欺\",\n        \"kujira logic\": \"くぢらろじっく\",\n        \"kujuukuri nyajuu kai\": \"九十九里ニャ獣会\",\n        \"kukudou\": \"くく堂\",\n        \"kukuya\": \"くく屋\",\n        \"kulmov\": \"kulmov_\",\n        \"kuma knights\": \"クマナイツ\",\n        \"kuma no mori\": \"くまのもり\",\n        \"kuma x usagi\": \"くま×うさぎ\",\n        \"kuma-puro\": \"Kuma-puro\",\n        \"kumagai stars\": \"くまがいスターズ\",\n        \"kumagaya hakushon kai\": \"熊谷はくしょん会\",\n        \"kumakumadou\": \"くまくま道\",\n        \"kumakumaice\": \"くまくまあいす\",\n        \"kumakuramizu\": \"熊倉水\",\n        \"kumameshi-ya\": \"クマ飯屋\",\n        \"kumanikotec\": \"クマニコテック\",\n        \"kumao cafe\": \"くまおカフェ\",\n        \"kumapanda\": \"くまぱんだ\",\n        \"kumatyu bokujou\": \"クマチュウ牧場\",\n        \"kume\": \"久米\",\n        \"kumikae dna\": \"組換DNA\",\n        \"kumogakure.\": \"くもがくれ。\",\n        \"kumohatiya\": \"雲八屋\",\n        \"kune kune project\": \"Kune Kune Project\",\n        \"kunkakunka teikoku\": \"くんかくんか帝国\",\n        \"kunseidou\": \"燻製堂\",\n        \"kuon hirohiko\": \"久遠広彦\",\n        \"kuoone\": \"くお～ね\",\n        \"kuragakuya\": \"倉楽屋\",\n        \"kurage kenkyuusho\": \"くらげ研究所\",\n        \"kurage no candume\": \"くらげのかんづめ\",\n        \"kurage suizokukan\": \"くらげ水族館\",\n        \"kurahashi shoin\": \"倉橋書院\",\n        \"kurakamadou\": \"くらかま堂\",\n        \"kurasan\": \"倉さん\",\n        \"kurenai heptagon\": \"KureNAI HeptaGoN\",\n        \"kurenai shoujo\": \"紅少女\",\n        \"kureten\": \"KURETEN\",\n        \"kureura seisakujo\": \"呉浦製作所\",\n        \"kuributon\": \"栗布団\",\n        \"kurimanjuu\": \"くりまんじゅう\",\n        \"kurione-sha\": \"くりおね館\",\n        \"kuripachi no heya\": \"クリパチの部屋\",\n        \"kuripick\": \"栗pick\",\n        \"kuripod\": \"KURIPOD\",\n        \"kurita sora\": \"栗田空\",\n        \"kuro cornet\": \"黒こるね\",\n        \"kuro inu sha\": \"黒戌舎\",\n        \"kuro majutsu coffee\": \"黒魔術コーヒー\",\n        \"kuro no alice\": \"黒のアリス\",\n        \"kuro queen\": \"Kuro Queen\",\n        \"kuro to kane no hane\": \"黒と銀の羽\",\n        \"kuro-level\": \"KURO-LEVEL\",\n        \"kurobuchi\": \"クロブチ\",\n        \"kurocan\": \"クロ缶\",\n        \"kurodamaya\": \"黒玉屋\",\n        \"kurodensha\": \"黒電車\",\n        \"kurodenwa\": \"黒電話\",\n        \"kurodou holdings\": \"黒堂ホールディングス(株)\",\n        \"kurogane cage\": \"くろがねけーじ\",\n        \"kuroge to momojiru\": \"黒毛と桃汁\",\n        \"kurogomaknights\": \"黒ごま騎士団\",\n        \"kurohamya\": \"黒ハム屋\",\n        \"kurohime\": \"黒姫\",\n        \"kurohina\": \"黒雛\",\n        \"kurohinabako\": \"黒雛箱\",\n        \"kurohonyasan\": \"くろほんやさん\",\n        \"kuroi inu no daisharin\": \"黒い犬の大車輪\",\n        \"kuroi kyoudain\": \"黒いキョーダイン\",\n        \"kuroi mikan no naru momo no ki\": \"黒いみかんのなるももの木\",\n        \"kuroi miyako\": \"黒イ都\",\n        \"kuroi mono\": \"黒いモノ\",\n        \"kurokami studio s\": \"クロカミスタジオS\",\n        \"kurokari\": \"くろかり\",\n        \"kurokishi no kakurega\": \"黒騎士の隠れ家\",\n        \"kurokoya\": \"くろこ屋\",\n        \"kuromame pack\": \"くろまめぱっく\",\n        \"kuromisakaijou\": \"黒ミサ会場\",\n        \"kuromogu teikoku\": \"黒モグ帝国\",\n        \"kuromori-ya\": \"黒森屋\",\n        \"kuroneko akaribon\": \"黒ねこ赤リボン\",\n        \"kuroneko to taijutei\": \"黒猫と大樹亭\",\n        \"kuroneko waltz\": \"黒ネコワルツ\",\n        \"kuronekodou\": \"黒猫堂\",\n        \"kuronekokan-monpetit\": \"黒猫館モンプチ\",\n        \"kuronekotei\": \"黒猫亭\",\n        \"kurono taitsu\": \"黒野タイツ\",\n        \"kuropoplar\": \"くろぽぷら\",\n        \"kurosawa pict\": \"黒澤pict\",\n        \"kuroshikatei\": \"黒鹿亭\",\n        \"kuroshiro desire\": \"黒白デザイア\",\n        \"kurotoshiro\": \"黒ト白\",\n        \"kurotoya\": \"黒杜屋\",\n        \"kurotsuki shoukai\": \"黒月商会\",\n        \"kurousagi\": \"kurousagi\",\n        \"kuroyuki\": \"黒雪\",\n        \"kurozako palace\": \"くろざこパレス\",\n        \"kurubusi-kai\": \"踝会\",\n        \"kuruguru dna\": \"くるぐるDNA\",\n        \"kurumian\": \"くるみ庵\",\n        \"kurusugawa pikumintei\": \"来栖川ピクミン亭\",\n        \"kusanagi-blade\": \"KUSANAGI-BLADE\",\n        \"kusari\": \"KUSARI\",\n        \"kusari caterpillar\": \"锁キャタピラ\",\n        \"kusari no youjo\": \"鎖の幼女\",\n        \"kusariku\": \"草陸\",\n        \"kushimoto house\": \"くしもとハウス\",\n        \"kushiyabu\": \"クシヤブ\",\n        \"kusosweets\": \"kusosweets\",\n        \"kusoyuridanchi\": \"クソユリ団地\",\n        \"kusozako nameko\": \"くそざこなめこ\",\n        \"kusugu land\": \"くすぐらんど\",\n        \"kusuribako\": \"くすり箱\",\n        \"kusurin soft\": \"くすりんソフト\",\n        \"kutushita nijiru honpo\": \"靴下煮汁本舗\",\n        \"kuuchuusen\": \"空中線\",\n        \"soramitiheno-r\": \"空道へのR\",\n        \"kuudou flare\": \"空洞フレア\",\n        \"kuuppii\": \"くぅっぴぃ\",\n        \"kuurintei\": \"空輪艇\",\n        \"kuusou banana\": \"空想バナナ\",\n        \"kuusou kyuuka\": \"空想休暇\",\n        \"kuusou monochrome\": \"空想モノクローム\",\n        \"kuusou post\": \"空想ポスト\",\n        \"kuusou riot\": \"空想RIOT!\",\n        \"kuusou switch\": \"空想スイッチ\",\n        \"kuwaikuwa\": \"くわいくわ\",\n        \"kuzu no kagami\": \"クズの鑑\",\n        \"kuzumochi\": \"KUZUMOCHI\",\n        \"kuzunari\": \"くずなり\",\n        \"kwi ag\": \"KWI AG\",\n        \"kyapa city\": \"きゃぱCITY\",\n        \"kyo-rakuji\": \"享楽寺\",\n        \"kyodai kidou yousai kyoushuu\": \"巨大軌道要塞強襲\",\n        \"kyojinkou\": \"巨人港\",\n        \"kyokutou dennou kaihatsukyoku\": \"極東電脳開発局\",\n        \"kyokutou funamushi\": \"極東舟虫\",\n        \"kyomu no uta\": \"虚無の歌\",\n        \"kyoshoku shou\": \"虚飾症\",\n        \"kyosuu shiniki\": \"虚数神域\",\n        \"kyoten heichou\": \"拠点兵長\",\n        \"kyou no keiro\": \"今日の毛色\",\n        \"kyoubou jouchotai\": \"凶暴情緒帯\",\n        \"kyougetsutei\": \"共月邸\",\n        \"kyouki na shiunten\": \"狂気な試運転\",\n        \"kyoumata\": \"今日また\",\n        \"kyounetsuzanbun\": \"強熱残分\",\n        \"kyourakuen\": \"享樂苑\",\n        \"kyouretsu hiyougeka\": \"強烈肥養外科\",\n        \"kyouryuu no tamago\": \"恐竜の卵\",\n        \"kyousatu\": \"きょうさつ\",\n        \"kyousei josou kyousei nyotaika kyousei otokonoko\": \"強制女装・強制女体化・強制男の娘\",\n        \"kyousei tsf no ohanashi\": \"強制TSFのお話し\",\n        \"kyouun rrr\": \"きょううんRRR\",\n        \"kyouya\": \"今日屋\",\n        \"kyozoya\": \"京蔵屋\",\n        \"kyujitsusyukkin\": \"休日出勤\",\n        \"kyun kyun art works\": \"きゅんきゅんあーとわーくす\",\n        \"kyusuisei polymer\": \"吸水性ポリマー\",\n        \"kyuu no mon\": \"九の門\",\n        \"kyuu tekki jidai\": \"旧鉄器時代\",\n        \"kyuukeijo no higashi\": \"休憩所の東\",\n        \"kyuuketsukousi\": \"吸血公子\",\n        \"kyuusanpin\": \"きゅうさんぴん\",\n        \"kyuushoku dorobou\": \"給食泥棒\",\n        \"l novels\": \"Lノベルズ\",\n        \"l-u\": \"L-u\",\n        \"l.l. milk\": \"L.L.MILK\",\n        \"l.o.w\": \"L.O.W\",\n        \"l.p.e.g.\": \"L.P.E.G.\",\n        \"la vender\": \"La vender\",\n        \"la.c.\": \"La.C.\",\n        \"lab chicken\": \"LAB CHICKEN\",\n        \"lab-star\": \"らびすたー\",\n        \"laboratory\": \"Laboratory\",\n        \"laboratory 09\": \"Laboratory#09\",\n        \"lacti9\": \"Lacti9\",\n        \"lactobacillus\": \"ラクトバシラス\",\n        \"lactucopicrin\": \"ラクチュコピクリン\",\n        \"ladybacker\": \"LadyBacker\",\n        \"lagarto\": \"Lagarto\",\n        \"lagerstatten\": \"Lagerstatten\",\n        \"lagrangian-point\": \"Lagrangian-Point\",\n        \"laichi\": \"LAICHI\",\n        \"lala soft\": \"Lala soft\",\n        \"lala studio\": \"LALA STUDIO\",\n        \"lamchat\": \"ラム茶っと!\",\n        \"lamia\": \"Lamia\",\n        \"lamipas\": \"lamipas\",\n        \"landurchin\": \"Land Urchin\",\n        \"landcut\": \"ランドカット\",\n        \"lapis blue.\": \"LAPIS BLUe.\",\n        \"lapis lazuli\": \"ラピスラズリ\",\n        \"lapiss\": \"Lapiss\",\n        \"lapiz lazuli kouseki\": \"ラピスラズリ鉱石\",\n        \"laplacedotcom\": \"らぷらすどっとこむ\",\n        \"laplacian\": \"Laplacian\",\n        \"lass\": \"ラス\",\n        \"lass pixy\": \"Lass Pixy\",\n        \"last eden\": \"LAST EDEN\",\n        \"last resort\": \"ラストリゾート\",\n        \"latelate\": \"latelate\",\n        \"lathimania kyouwakoku\": \"ラチマニア共和国\",\n        \"latte\": \"Latte\",\n        \"laurier\": \"ろりえーる\",\n        \"lazy crew\": \"レイジークルー\",\n        \"lazystyle\": \"LazyStyle\",\n        \"leaf geometry\": \"リーフジオメトリ\",\n        \"leaf party\": \"リーフパーティー\",\n        \"leaz koubou\": \"りーず工房\",\n        \"left\": \"LEFT\",\n        \"legato\": \"Legato\",\n        \"leimz-project\": \"LEIMZ-PROJECT\",\n        \"leman koukoku\": \"レマン公国\",\n        \"lemming\": \"Lemming\",\n        \"lemniscate\": \"レムニスケート\",\n        \"lemon bakudan\": \"レモンばくだん\",\n        \"lemon cake\": \"レモンケーキ\",\n        \"remon no omise\": \"れもんのお店\",\n        \"lemon zest\": \"LEMON ZEST\",\n        \"lemonbridge\": \"レモンブリッジ\",\n        \"lemontei\": \"檸檬亭\",\n        \"leo-circle\": \"さーくるLEO-CIRCLE\",\n        \"leprotto\": \"Leprotto\",\n        \"lesport\": \"Lesport\",\n        \"lesser panda ga yome\": \"レッサーパンダが嫁\",\n        \"leucojum\": \"LEUCOJUM\",\n        \"level-x\": \"LEVEL-X\",\n        \"level.41\": \"Level.41\",\n        \"level1\": \"level1\",\n        \"lewd angels\": \"Lewd Angels\",\n        \"leymei\": \"LEYMEI\",\n        \"lhezi\": \"LHEZI\",\n        \"liar-soft\": \"ライアーソフト\",\n        \"libertaria\": \"リバタリア\",\n        \"libido\": \"リビドー\",\n        \"libido kaikan\": \"リビドー会館\",\n        \"libido soft\": \"りびどーそふと\",\n        \"libya cuckoo\": \"リビア郭公\",\n        \"licorice candy\": \"リコリスキャンディ\",\n        \"liddell\": \"Liddell\",\n        \"liebe\": \"リーベ\",\n        \"lielos no kakurega\": \"ゆいれその隠れ家\",\n        \"life\": \"life\",\n        \"life degeneration laboratory\": \"人生堕落研究所\",\n        \"light\": \"ライト\",\n        \"light garden\": \"ライト・ガーデン\",\n        \"light in the night\": \"ライトインザナイト\",\n        \"light of night\": \"Light of Night\",\n        \"light pink\": \"ライトピンク\",\n        \"light rate port pink\": \"ライト・レイト・ポート・ピンク\",\n        \"lightguide\": \"LightGuide\",\n        \"lightplan\": \"ライトプラン\",\n        \"likefairly\": \"LikeFairly\",\n        \"lilac\": \"lilac\",\n        \"lili\": \"lili\",\n        \"lili marleen\": \"リリーマルレーン\",\n        \"lilije drug\": \"リリェドラッグ\",\n        \"lilim\": \"LiLiM\",\n        \"lilim darkness\": \"リリムダークネス\",\n        \"lilium\": \"LILIUM\",\n        \"lilium auratum\": \"Lilium auratum\",\n        \"liliya\": \"リリ舎\",\n        \"lilliput\": \"リリパット\",\n        \"lily under\": \"リリーアンダー\",\n        \"lilyth\": \"Lilyth\",\n        \"limecat\": \"LimeCat\",\n        \"limit\": \"LIMIT\",\n        \"limit break\": \"りみっとぶれいく\",\n        \"limit cycle\": \"LIMIT CYCLE\",\n        \"limit plus\": \"limit+\",\n        \"limit works\": \"Limit Works\",\n        \"limited\": \"ちこ★小屋\",\n        \"lindas ark\": \"Linda's ark\",\n        \"linke hand\": \"Linke Hand\",\n        \"linkringrin\": \"リンクリングリン\",\n        \"lion heart\": \"Lion Heart\",\n        \"liongoya\": \"らいおん小屋\",\n        \"lip van winkle\": \"Lip Van Winkle\",\n        \"lipstar\": \"LIPSTAR\",\n        \"lipterrible\": \"クチビルテリブル\",\n        \"liquid\": \"リキッド\",\n        \"lirico\": \"lirico\",\n        \"listless time\": \"listless time\",\n        \"lithium\": \"Lithium\",\n        \"little bear\": \"リトルベア\",\n        \"little cosmos\": \"Little☆Cosmos\",\n        \"little hopper with h\": \"りとるほっぱー with H\",\n        \"little lindo\": \"Little Lindo\",\n        \"little mantis\": \"Little mantis\",\n        \"little mermaid henshuubu\": \"リトル・マーメイド編集部\",\n        \"little quartz\": \"Little Quartz\",\n        \"little shop\": \"little shop\",\n        \"little snow\": \"little snow\",\n        \"littlemare\": \"リトルメア\",\n        \"littleollie\": \"Littleollie\",\n        \"live kuroneko iin\": \"来舞黒猫医院\",\n        \"liz\": \"LiZ\",\n        \"liz project\": \"liz project\",\n        \"lo likyo new\": \"LoりきょNEW!\",\n        \"lo5type\": \"Lo5type\",\n        \"lobatt\": \"LOBATT\",\n        \"lobelia\": \"Lobelia\",\n        \"local kintas\": \"Local Kintas\",\n        \"locomocodon\": \"ろこもこどん\",\n        \"locus\": \"Locus\",\n        \"log\": \"LOG\",\n        \"log house\": \"Log House\",\n        \"logic choco\": \"ロジックチョコ\",\n        \"loiter\": \"loiter\",\n        \"lol\": \"LOL\",\n        \"loli goranyo\": \"ろりーごーらんにょ\",\n        \"lolic system\": \"LOLIC SYSTEM\",\n        \"lolicon trap\": \"ロリコントラップ\",\n        \"lolimajin\": \"ろりま陣\",\n        \"lolimate seizou koujou\": \"ロリメイト製造工場\",\n        \"lolli pop\": \"Lolli*PoP\",\n        \"lolol\": \"LOLOL\",\n        \"lomelette\": \"Lomelette\",\n        \"lonely island\": \"ロンリーアイランド\",\n        \"longhorntrain\": \"LongHornTrain\",\n        \"loopholic\": \"loopholic\",\n        \"loopsoft\": \"loopsoft\",\n        \"lop\": \"LOP\",\n        \"lopet dan\": \"ろぺっとだん\",\n        \"loser\": \"LOSER\",\n        \"lost garden\": \"Lost Garden\",\n        \"lotus\": \"LOTUS\",\n        \"love and sekkan\": \"らぶ&セッカン\",\n        \"love bird\": \"Love Bird\",\n        \"love bitch\": \"らぶびっち\",\n        \"love circle young punch\": \"ラブサークルヤングパンチ\",\n        \"love kyun maiden\": \"らぶキュンめいでん\",\n        \"love me do\": \"LOVE ME DO\",\n        \"love size\": \"ラブサイズ\",\n        \"love xxx.\": \"love xxx.\",\n        \"love-rs\": \"love-Rs\",\n        \"love4sale\": \"love4sale\",\n        \"lovejuice pink\": \"LoveJuiceピンク\",\n        \"loveletter carburetor\": \"恋文気化器\",\n        \"lovelovedoll\": \"LOVELOVEDOLL\",\n        \"lovely complex\": \"Lovely complex\",\n        \"lovely pretty chou aishiteru\": \"ラブリープリチー超愛してる\",\n        \"loveolsis\": \"らぶおるしす\",\n        \"lovesca\": \"lovesca\",\n        \"lovesugi\": \"らぶすぎ\",\n        \"low angler\": \"ろうあんぐら～\",\n        \"low tech team\": \"Low Tech Team\",\n        \"low-f\": \"Low-F\",\n        \"low-tension\": \"Low-Tension\",\n        \"lowhide project\": \"LOWHIDE PROJECT\",\n        \"lrig lab\": \"ルリ研\",\n        \"ls\": \"LS\",\n        \"ls-box\": \"LS-Box\",\n        \"lsize\": \"Lサイズ\",\n        \"ltm.\": \"LTM.\",\n        \"ltu\": \"Ltu\",\n        \"luciferhood\": \"Luciferhood\",\n        \"luck and pluck co.\": \"LUCK&PLUCK!Co.\",\n        \"luck gear\": \"Lucky GEAR\",\n        \"luck10\": \"Luck10\",\n        \"lucky club\": \"LUCKY CLUB\",\n        \"lucky paranoia\": \"lucky paranoia\",\n        \"luckyend\": \"ラッキーエンド\",\n        \"luckystripe\": \"LuckyStripe\",\n        \"lucretia\": \"LUCRETiA\",\n        \"lucyr\": \"LUCYR\",\n        \"lulu koubou\": \"LULU工房\",\n        \"lummy\": \"Lummy\",\n        \"lumnesoda\": \"ラムネソーダ\",\n        \"luna industria\": \"ルナ・インダストリア\",\n        \"luna papa\": \"LUNA PAPA\",\n        \"luna soft\": \"ルナソフト\",\n        \"lunacy\": \"Lunacy\",\n        \"lunar gravity acceleration\": \"月面重力加速度\",\n        \"lunarium\": \"ルナリウム\",\n        \"lunasummit\": \"LUNASUMMIT\",\n        \"lunaterk\": \"るなたーく\",\n        \"lunatic\": \"ルナティック\",\n        \"lunatic joker\": \"lunatic joker\",\n        \"lunatic orgasm\": \"ルナティックオーガズム\",\n        \"lunatic prophet\": \"LUNATIC PROPHET\",\n        \"lunatic star\": \"ルナティックスター\",\n        \"lunatic traveler\": \"るなてぃっくとらべらー\",\n        \"lunatics\": \"Lunatics\",\n        \"lunatique\": \"LUNATIQUE\",\n        \"lunch box\": \"LUNCH BOX\",\n        \"lunchbox\": \"lunchbox\",\n        \"lune\": \"ルネ\",\n        \"lune comic\": \"ルネコミック\",\n        \"lune team bitters\": \"ルネ Team Bitters\",\n        \"lust bit\": \"ルストビット\",\n        \"lusterise\": \"Lusterise\",\n        \"lutein\": \"るていん\",\n        \"luwen workshop\": \"Luwen Workshop\",\n        \"luxia continent\": \"るくしあ大陸\",\n        \"luxury\": \"ラグジュアリー\",\n        \"luxury tiara\": \"Luxury Tiara\",\n        \"lv.x\": \"LV.X+\",\n        \"lycoly\": \"Lycoly\",\n        \"lyrical magical\": \"リリカルマジカル\",\n        \"lyricalize\": \"Lyricalize\",\n        \"lyricbox\": \"リリックボックス\",\n        \"m\": \"M\",\n        \"m de pink\": \"M de PINK\",\n        \"m no violet\": \"エム・ヴァイオレット\",\n        \"m shousetsu doumei\": \"M小説同盟\",\n        \"m-10\": \"M-10\",\n        \"m-free\": \"M-FREE\",\n        \"m-keifu\": \"Mケイフ\",\n        \"m-koujou\": \"M工場\",\n        \"m-lab.\": \"M-LAB.\",\n        \"m-style\": \"M・S T Y L E\",\n        \"m-trinity\": \"M-trinity\",\n        \"m.a.d works\": \"M.A.D WORKS\",\n        \"m.a.f\": \"M.A.F\",\n        \"m.a.l.t\": \"m.a.l.t\",\n        \"m.h. bokujou\": \"M.H.牧場\",\n        \"m.i.r.u\": \"M.I.R.U\",\n        \"m.i.ring\": \"M.I.RING\",\n        \"m.o.k. teabag\": \"M.O.K.ちゃぶくろ\",\n        \"m.r products\": \"M.R プロダクツ\",\n        \"m2230\": \"m2230\",\n        \"ma2\": \"MA2\",\n        \"mabatakimosezu\": \"瞬きもせず\",\n        \"mabo udon teishoku\": \"麻婆うどん定食\",\n        \"mabonasu\": \"マーボーナス\",\n        \"macaron\": \"マカロン\",\n        \"macaron sketch\": \"Macaron*Sketch\",\n        \"macaron sugar\": \"まかろんシュガー\",\n        \"macaroncrown\": \"MacaronCrown\",\n        \"macaroni ring\": \"マカロニグミ\",\n        \"macaroni teikoku\": \"マカロニ帝国\",\n        \"macchadokoro\": \"抹茶処\",\n        \"macdoll\": \"macdoll\",\n        \"machednia\": \"まけどに屋\",\n        \"machi no kissaten\": \"街の喫茶店\",\n        \"machida cherry boys\": \"町田チェリーボーイズ\",\n        \"machikado-mapoze\": \"街角麻婆豆\",\n        \"machinery\": \"マシーナリー\",\n        \"machwing\": \"マッハウイング\",\n        \"maclona\": \"まっ黒な\",\n        \"macneil koubou\": \"マクニエル工房\",\n        \"macolulu\": \"マコルル\",\n        \"macrown\": \"macrown\",\n        \"macv-sog\": \"MACV-SOG\",\n        \"mad hand rowa\": \"マドハンドロワ\",\n        \"mad mac\": \"MAD MAC\",\n        \"mad-puppy\": \"MAD-PUPPY\",\n        \"mada maniau kamo\": \"まだ間に合うかも\",\n        \"madam project\": \"マダム・プロジェクト\",\n        \"mado no kuchibue fuki\": \"窓の口笛吹き\",\n        \"mado soft\": \"まどそふと\",\n        \"madogiwa oukoku\": \"窓際王国\",\n        \"madogiwa works\": \"Madogiwa Works\",\n        \"madou shiryoushitsu\": \"魔導資料室\",\n        \"madraid\": \"マッドレイド\",\n        \"maebax\": \"maebax\",\n        \"mafiya\": \"マフィ家\",\n        \"mafuri marimonnu\": \"まふりまりもんぬ\",\n        \"mafuya\": \"まふ屋\",\n        \"mag\": \"まぐ!\",\n        \"mag kan\": \"MAG館\",\n        \"magaimonoyasoinabashiten\": \"まがいもの八十稲羽支店\",\n        \"magetarudou\": \"髷樽堂\",\n        \"magi\": \"MAGI\",\n        \"magi black\": \"MAGI black\",\n        \"magic fortune hachioujiten\": \"マジックフォーチュン八王子店\",\n        \"magic house\": \"まじっくハウス\",\n        \"magic machinery\": \"MAGIC MACHINERY\",\n        \"magic private eye\": \"魔法探偵社\",\n        \"magic wand\": \"Magic wand\",\n        \"magical arts\": \"マジカルアーツ\",\n        \"magical garden\": \"魔法庭園\",\n        \"magnetic field\": \"MAGNETIC FIELD\",\n        \"magnitude 711\": \"マグニ厨度711\",\n        \"magnolia\": \"MAGNOLIA\",\n        \"magont\": \"MAGONT\",\n        \"magudara kaihou doumei\": \"マグダラ解放同盟\",\n        \"magukappu\": \"マグカップ\",\n        \"maguma sansou\": \"マグマ山荘\",\n        \"maguni fc\": \"マグニFC\",\n        \"maguro\": \"MAGURO\",\n        \"maguro beya\": \"まぐろ部屋\",\n        \"maguro bokujo\": \"まぐろ牧場\",\n        \"maguro donburi\": \"まぐろどんぶり\",\n        \"maguro.\": \"maguro.\",\n        \"magurodrastic\": \"まぐろドラスティック\",\n        \"mahirutei\": \"まひる亭\",\n        \"mahjong yugen co.ltd 58\": \"麻雀有限会社58\",\n        \"mahola\": \"MaHoLa\",\n        \"mahouse\": \"MAHOUSE\",\n        \"mahupoko\": \"マフポコ\",\n        \"maibotsu\": \"埋没\",\n        \"maichan kikaku\": \"まいちゃん企画\",\n        \"maid club\": \"メイド倶楽部\",\n        \"maika\": \"MAIKA\",\n        \"maikata kougyou\": \"マイカタ工業\",\n        \"maimaimai\": \"まいまいまい！\",\n        \"maina-mania\": \"マイナー・マニア\",\n        \"mainichi ga mushi no iki\": \"毎日が虫の息\",\n        \"mainichi sonoba shinogi\": \"毎日その場シノギ\",\n        \"maisai\": \"まいさい\",\n        \"majesticrune\": \"MajesticRune\",\n        \"majihima\": \"まじひま\",\n        \"majikayo\": \"マジかよ\",\n        \"majikoru gensou kyoudan\": \"蠱る幻想狂団\",\n        \"majimadou\": \"真嶋堂\",\n        \"majin houkou\": \"魔神咆哮\",\n        \"majocolony\": \"majocolony\",\n        \"maka no sokutu\": \"摩訶の巣窟\",\n        \"maka-rakko\": \"まからっこ\",\n        \"make pig press\": \"make pig press\",\n        \"make3d\": \"MAKE3D\",\n        \"makepriority\": \"MakePriority\",\n        \"makiba no asa\": \"まきばの朝\",\n        \"makikusu\": \"まきくす\",\n        \"makino eki\": \"牧野駅\",\n        \"makka tintin\": \"マッカTINTIN\",\n        \"makkou kujira\": \"まっこうくじら\",\n        \"makkurona\": \"まっ黒な\",\n        \"makoto shiyaka\": \"間琴しや架\",\n        \"makoto skip\": \"まこと☆スキップ\",\n        \"maku\": \"Maku\",\n        \"makura\": \"枕\",\n        \"makuriya\": \"まくりや\",\n        \"makushiro\": \"マクシロ\",\n        \"malus pumila\": \"まるすぷみら\",\n        \"mama ni wa naisho\": \"ママにはナイショ\",\n        \"mama-san ballet\": \"ママさんバレエ\",\n        \"mamagotoya\": \"ままごと屋\",\n        \"mamagult\": \"ママグル徒\",\n        \"mamamax\": \"MAMAMAX\",\n        \"mame\": \"豆\",\n        \"mamedaifukuya\": \"豆大福屋\",\n        \"mamekome\": \"まめこめ\",\n        \"mamekura\": \"豆蔵\",\n        \"mamemochi\": \"まめもち\",\n        \"mamenon\": \"まめのん\",\n        \"mamex\": \"mamex\",\n        \"mamiana paradise\": \"狸穴天国\",\n        \"mammypoko\": \"＊mammypoko＊\",\n        \"mamoru soup\": \"まもるスープ\",\n        \"man chin low\": \"満珍楼\",\n        \"man say\": \"Man Say\",\n        \"man-room\": \"MAN-ROOM\",\n        \"manam\": \"MANAM\",\n        \"manamagu\": \"まなまぐ\",\n        \"manbaka\": \"漫バカ\",\n        \"manboutei\": \"まんぼう亭\",\n        \"manbun no ichi\": \"万分の市\",\n        \"manchindou\": \"マンチン堂\",\n        \"mandoragora striker\": \"まんどらごらすとらいかー\",\n        \"mandrill\": \"まんドリル\",\n        \"manga jigoku\": \"マンガジゴク\",\n        \"manga super\": \"マンガスーパー\",\n        \"mangan\": \"マンガン\",\n        \"mangana\": \"漫画な。\",\n        \"manganiku\": \"幡芽にく\",\n        \"mange\": \"万華\",\n        \"mangetsu hagure\": \"満月はぐれ\",\n        \"mangosteen\": \"マンゴスチン\",\n        \"manguri cannon\": \"まんぐりキャノン\",\n        \"maniac street\": \"Maniac Street\",\n        \"manianima\": \"まにあにま\",\n        \"maniax55\": \"ManiaX55\",\n        \"manimani.\": \"まにまに。\",\n        \"manitou\": \"MANITOU\",\n        \"manjuu x\": \"まんじゅうX\",\n        \"manjyu-umai.\": \"まんじゅううまい。\",\n        \"mankan zenseki\": \"漫甘全席\",\n        \"manles laboratory\": \"マンルのラボラトリー\",\n        \"manman\": \"まんまん\",\n        \"manmanya\": \"まんまん屋\",\n        \"manmaru hoppe\": \"まんまるほっぺ\",\n        \"mano-ya\": \"まの屋\",\n        \"manpuchi\": \"まんぷち\",\n        \"mantaman\": \"マンタマン\",\n        \"manten hoshizora\": \"満天星空\",\n        \"mantobi\": \"まんとび\",\n        \"many b\": \"Many B\",\n        \"manymanyrain\": \"manymanyrain\",\n        \"manzokudou\": \"満足堂\",\n        \"maple-go\": \"maple号\",\n        \"marabians\": \"マラビアンズ\",\n        \"marakkuma\": \"マラックマ\",\n        \"maraparte\": \"まらぱるて\",\n        \"marasca no oni\": \"マラスカの鬼\",\n        \"maraschino\": \"MARASCHINO\",\n        \"marastudio\": \"MaraStudio\",\n        \"marble\": \"marble\",\n        \"marble candy soft\": \"マーブルCandySoft\",\n        \"marble kid\": \"マーブルキッド\",\n        \"marbodon\": \"MARBODON\",\n        \"march\": \"MARCH\",\n        \"marchen honpo\": \"メルヘン本舗\",\n        \"margarita\": \"Margarita\",\n        \"marge-loop\": \"Marge-Loop\",\n        \"maria system00\": \"Maria_System00\",\n        \"marialite\": \"Marialite\",\n        \"mariana kaikou kikaku\": \"まりあな海溝企画\",\n        \"marigold\": \"marigold\",\n        \"marin\": \"まりん\",\n        \"marinconia\": \"MARINCONIA\",\n        \"marine\": \"マリン\",\n        \"marinwhip\": \"まりんホイップ\",\n        \"mario almanac\": \"MARIO ALMANAC\",\n        \"marisaya\": \"まりさ屋\",\n        \"marley and scrooge shoukai\": \"マーリィ&スクルージ商会\",\n        \"marmalade\": \"ま～まれぇど\",\n        \"maromayu\": \"まろまゆ\",\n        \"maromi club\": \"まろみくらぶ\",\n        \"maron head\": \"マロンヘッド\",\n        \"maroron ex\": \"マロロンEX\",\n        \"maroyaka kominka\": \"まろやか古民家\",\n        \"marry bell\": \"マリーベル\",\n        \"marshmallow kyoudan\": \"マシュマロ響団\",\n        \"marshmallow soft\": \"ましゅまろそふと\",\n        \"marshmallow x whip\": \"ましゅまろ×ほいっぷ\",\n        \"maru tendon\": \"まる天丼\",\n        \"maruarai\": \"まるあらい\",\n        \"marubatsu bunko\": \"○×文庫\",\n        \"maruchuu seisaku\": \"まるちゅう製作\",\n        \"marugoshi-do\": \"丸腰堂\",\n        \"maruguya.exe\": \"まるぐ屋.exe\",\n        \"maruhamaya\": \"マルハマヤ\",\n        \"marui don\": \"丸居丼\",\n        \"maruiro kikou\": \"丸色季候\",\n        \"marukaya\": \"まるか家\",\n        \"marumagic\": \"まるまgic\",\n        \"marumaru arumajiro\": \"まるまるアルマジロー\",\n        \"marume works\": \"マルメワークス\",\n        \"maruno keikaku\": \"まるの計画\",\n        \"marunomare\": \"まる のま れ\",\n        \"marusan\": \"まるサン\",\n        \"maruta production\": \"MARUTA Production\",\n        \"maruta-dojo\": \"丸田道場\",\n        \"marutori corp\": \"まる鳥Corp\",\n        \"marutori no chazuke\": \"丸鳥の茶漬け\",\n        \"marvelous zents\": \"Marvelous Zents\",\n        \"mary no yamai\": \"メリィの病\",\n        \"mashimin koubou\": \"ましみん工房\",\n        \"mashiro no hihoukan\": \"真城の秘宝館\",\n        \"mashomaro\": \"マショ麻呂\",\n        \"masmenos\": \"マスメノス\",\n        \"massala\": \"まっさら\",\n        \"massaratou\": \"まっさら島\",\n        \"master volume\": \"Master Volume\",\n        \"master-random\": \"Master-random\",\n        \"masulao maximum\": \"MASULAO MAXIMUM\",\n        \"masuraion.\": \"ますらいおん。\",\n        \"masurao\": \"MASURAO\",\n        \"mat\": \"MAT\",\n        \"matagitei\": \"マタギ亭\",\n        \"matango honten\": \"マタンゴ本店\",\n        \"matatabi sanjou\": \"またたび参上\",\n        \"maten\": \"魔天\",\n        \"material\": \"Material\",\n        \"matilda kanmidokoro\": \"まちるだ甘味処\",\n        \"matine\": \"matine\",\n        \"matsuda shin\": \"松田シン\",\n        \"matsuge antenna\": \"マツゲアンテナ\",\n        \"matsumoto drill kenkyuujo\": \"松本ドリル研究所\",\n        \"matsumoto kichidi\": \"松本きちぢ\",\n        \"matsumotoke\": \"松本家\",\n        \"matsunoan\": \"マツノアン\",\n        \"matsuri kikaku\": \"祭企画\",\n        \"matsurika\": \"茉莉花\",\n        \"matsutakehime\": \"松茸姫\",\n        \"matsuyama seiji\": \"松山せいじ\",\n        \"mattari house\": \"まったりハウス\",\n        \"mattsuaya\": \"まっつあ屋\",\n        \"matyaya\": \"真茶屋\",\n        \"maumau shoujotai\": \"まうまう少女帯\",\n        \"max and cool\": \"MAX&Cool.\",\n        \"maxal\": \"マクサル\",\n        \"maxi\": \"MAXI\",\n        \"maxi age\": \"MAXI AGE\",\n        \"maxi queen\": \"Maxi Queen\",\n        \"maximum wind\": \"MAXIMUM WIND\",\n        \"maxiy\": \"MAXIY\",\n        \"maxzheart\": \"マックズハート\",\n        \"may\": \"May\",\n        \"may no tenshi\": \"メイの天使\",\n        \"maya-tei\": \"まや邸\",\n        \"mayakasiya\": \"まやかしや\",\n        \"mayo bukuro\": \"マヨぶくろ\",\n        \"mayoineko\": \"迷い猫\",\n        \"mayonaka no acchigawa\": \"真夜中のあっち側\",\n        \"mayonaka no funkotsudou\": \"真夜中のふんこつどう\",\n        \"mayonaka tsubame\": \"真夜中ツバメ\",\n        \"mayonnaise bakufu\": \"マヨネーズ幕府\",\n        \"mayorice suishou iinkai\": \"マヨライス推奨委員会\",\n        \"mayu to mato\": \"まゆとまと\",\n        \"mayugesaien\": \"眉毛菜園\",\n        \"mayugeya\": \"眉毛屋\",\n        \"mazarashi\": \"まざらし\",\n        \"maze\": \"まぜ | 迷-めいず-(メイズ)\",\n        \"maze rerijio\": \"迷図 レリジオ\",\n        \"mazemono\": \"まぜもの\",\n        \"mbs truth\": \"メイビーソフトトゥルース\",\n        \"mc hanbaiten\": \"エムシー販売店\",\n        \"mcnail koubou\": \"まくねいる工房\",\n        \"mdo\": \"MDO\",\n        \"mean machine\": \"MEAN MACHINE\",\n        \"mebi-ken\": \"女美研\",\n        \"mach maze\": \"メックメイズ\",\n        \"mechanical code\": \"メカニカルコード\",\n        \"mechanical pencil\": \"メカニカルペンシル\",\n        \"mecharis\": \"mecharis\",\n        \"medama keikoku\": \"めだま渓谷\",\n        \"medetasi\": \"めでたし\",\n        \"media zomex\": \"メディアZOMEX\",\n        \"medical berry\": \"Medical Berry\",\n        \"medical company\": \"めでぃかるカンパニー\",\n        \"medium bodied\": \"Medium bodied\",\n        \"medium passion\": \"medium passion\",\n        \"mega heart ski\": \"Mega Heart Ski\",\n        \"mega w\": \"mega w\",\n        \"mega-mix\": \"MEGA-MIX\",\n        \"megabox\": \"メガボックス\",\n        \"megacycle13\": \"Megacycle13\",\n        \"megafeps\": \"MEGAFEPS\",\n        \"megalith production\": \"MEGALITH PRODUCTION\",\n        \"megalodon\": \"megalo丼\",\n        \"megami\": \"メガミ\",\n        \"megami kyouten\": \"女神教典\",\n        \"megami no tamago\": \"メガミノタマゴ\",\n        \"megamouthsystem\": \"MEGAMOUTHsystem\",\n        \"megane beam\": \"めがねビーム\",\n        \"megane gaikotsu\": \"メガネガイコツ\",\n        \"megane81\": \"MEGANE81\",\n        \"megasoundorchestra\": \"MegaSoundOrchestra\",\n        \"megative gate\": \"メガてぃぶGATE\",\n        \"megaton express\": \"メガトン・エクスプレス\",\n        \"megrim\": \"Megrim\",\n        \"meguro teikoku\": \"目黒帝国\",\n        \"megurumi\": \"めぐるみ\",\n        \"mei\": \"明\",\n        \"meikyoushisui\": \"明鏡止水\",\n        \"meiousei presents\": \"冥王星Presents\",\n        \"meirei denpa\": \"命令電波\",\n        \"meisaku network\": \"名作ネットワーク\",\n        \"meishou misettei\": \"名称未設定\",\n        \"meisou junkie\": \"迷走ジャンキー\",\n        \"meiteitei.\": \"MEiTEiTEi.\",\n        \"mekabu fighter\": \"メカブファイター\",\n        \"mekabutei\": \"めかぶ亭\",\n        \"mekakushi musume\": \"目隠し娘\",\n        \"mekao\": \"Mekao\",\n        \"mekimeki oukoku\": \"めきめき王国\",\n        \"mekongdelta\": \"MEKONGDELTA\",\n        \"mekujira\": \"めくじら\",\n        \"mekurume yuuen\": \"目眩悠遠\",\n        \"mellow\": \"mellow\",\n        \"melody\": \"Melody\",\n        \"melomo\": \"メロモ\",\n        \"melon\": \"Melon\",\n        \"melon no hoshiboshi\": \"めろんの星々\",\n        \"melon pants\": \"めろんぱんつ\",\n        \"meloncholic\": \"meloncholic\",\n        \"melt downers\": \"MELT DOWNERS\",\n        \"melt-down\": \"MELT-DOWN\",\n        \"melty koubou\": \"メルティ工房\",\n        \"mememery\": \"mememery\",\n        \"memexile\": \"めめXILE\",\n        \"memeya\": \"メメ屋\",\n        \"memme douza\": \"メッメ堂座\",\n        \"memoria\": \"Memoria\",\n        \"mengerekun\": \"めんげれくん\",\n        \"menino\": \"Menino\",\n        \"mens equal k\": \"MEN'S=K\",\n        \"mentaiko\": \"MENたいこ\",\n        \"mental sex\": \"mental sex\",\n        \"mental specialist\": \"めんたるスペシャリスト\",\n        \"mentei dokoro\": \"めんてい処\",\n        \"menya okamoto\": \"麺屋オカモト\",\n        \"meow\": \"MEOW\",\n        \"meowdic core\": \"Meowdic Core\",\n        \"mephisto\": \"メフィスト\",\n        \"merapuremi\": \"めらぷれみ\",\n        \"mercator zuhou\": \"メルカトル図法\",\n        \"merci\": \"メルシー\",\n        \"mercurochrome\": \"ま～きゅろ\",\n        \"meringue\": \"めれんげ\",\n        \"merino\": \"めりの\",\n        \"merkmal\": \"めるくまーる\",\n        \"meromero melon\": \"xoxoメロン\",\n        \"meromerofactory xl\": \"メロメロファクトリーXL\",\n        \"meronpanchu\": \"めろんぱんちゅ\",\n        \"meroro\": \"meroro\",\n        \"merukoro\": \"メルコロ\",\n        \"merveille\": \"merveille\",\n        \"meryx3\": \"MERYx3\",\n        \"meshita\": \"目下\",\n        \"meshiya\": \"飯屋\",\n        \"mess zylinder\": \"メスしりんだ～\",\n        \"messiah and pikaring\": \"messiah&pikaring\",\n        \"messiah syndrome\": \"MessiahSyndrome\",\n        \"shiawase hotel\": \"しあわせホテル\",\n        \"mesuchanghonpo\": \"メスチャンホンポ\",\n        \"mesuman teikoku\": \"メスマン帝国\",\n        \"metabocafe offensive smell uproar\": \"メタボ喫茶異臭騒ぎ\",\n        \"metal drill pure chinpo land\": \"メタルドリルピュアちんぽランド\",\n        \"metal kids meeting\": \"METAL KIDS MEETING\",\n        \"metal-egg\": \"METAL-EGG\",\n        \"metal-wind\": \"METAL-WIND\",\n        \"metallic steel\": \"メタリックスチール\",\n        \"metalltanz\": \"メタルタンツ\",\n        \"metalrack\": \"めたるらっく\",\n        \"metamor\": \"めたもる\",\n        \"metamorphose\": \"めたもるふぉーぜ\",\n        \"meteor\": \"メテオ\",\n        \"meteor garden\": \"メテオガーデン\",\n        \"meteor labyrinth\": \"メテオ☆ラビリンス\",\n        \"metro notes\": \"めとろのーつ\",\n        \"metroier\": \"メトロイヤー\",\n        \"mexe.jp\": \"mexe.jp\",\n        \"mezase esisama\": \"目指せ絵師様\",\n        \"mf future\": \"MF Future\",\n        \"mg.\": \"mg.\",\n        \"mgt\": \"MGT\",\n        \"mgw\": \"MGW\",\n        \"mi\": \"mi\",\n        \"miburi\": \"美武里\",\n        \"mica\": \"MICA\",\n        \"michinakaba\": \"三血中吐\",\n        \"michinoku hitori tabi\": \"みちのく一人旅\",\n        \"micro page\": \"みくろぺえじ\",\n        \"microbeurre\": \"Microbeurre\",\n        \"microbit\": \"Microbit\",\n        \"microdat\": \"マイクロ脱兎\",\n        \"micromacro\": \"MICROMACRO\",\n        \"middle earth\": \"みどるあ～す\",\n        \"midnight muumus\": \"ミッドナイトむぅむズ\",\n        \"midnight pleasure\": \"ミッドナイトプレジャー\",\n        \"midori no niwatori\": \"緑の鶏\",\n        \"midoriiro cut in\": \"緑色カットIN\",\n        \"midoriya\": \"みどりや\",\n        \"mig\": \"mig\",\n        \"migimagari-ya\": \"右曲がり屋\",\n        \"migome\": \"ミゴメ\",\n        \"migumigu-sou\": \"ミグミグ荘\",\n        \"mijirushi box\": \"みじるしBOX\",\n        \"mika-chan center\": \"ミカちゃんセンター\",\n        \"mikaguuland\": \"みかぐーらんど\",\n        \"mikaka\": \"みかか\",\n        \"mikan douwa\": \"未完童話\",\n        \"mikan to uri\": \"蜜柑と瓜\",\n        \"mikan-ya\": \"みかん屋\",\n        \"mikanbako\": \"みかん箱\",\n        \"mikanberry\": \"ミカンベリー\",\n        \"mikandensya\": \"蜜柑電車\",\n        \"mikapikazo\": \"MikaPikazo\",\n        \"mikayla\": \"ミカイラ\",\n        \"mikazuki ondo\": \"三日月音頭\",\n        \"mike ni mage\": \"三毛にマゲ\",\n        \"mikeneko disco\": \"三毛猫ディスコ\",\n        \"mikeneko-children\": \"三毛猫チルドレン\",\n        \"mikenekodou\": \"三毛猫堂\",\n        \"mikenekotei\": \"みけ猫亭\",\n        \"mikkamisaki\": \"みっかみさき\",\n        \"mikorabi\": \"みこらび\",\n        \"mikouken 2nd\": \"味巧軒2nd\",\n        \"milcrepe\": \"みるくれーぷ\",\n        \"milf shobou\": \"ミルフ書房\",\n        \"milk angel\": \"みるくえんじぇる\",\n        \"milk boy\": \"みるくぼーい\",\n        \"milk cha\": \"みるく茶\",\n        \"milk chips\": \"ミルクチップス\",\n        \"milk cocoa shake\": \"ミルクココアセーキ\",\n        \"milk crown\": \"ミルククラウン\",\n        \"milk drop\": \"みるくどろっぷ\",\n        \"milk ejaculation\": \"みるくいじゃきゅれーしょん\",\n        \"milk gohan\": \"みるくごはん\",\n        \"milk hall\": \"milk hall\",\n        \"milk land\": \"MILK LAND\",\n        \"milk pai\": \"みるくぱい\",\n        \"milk price\": \"MILK☆PRICE\",\n        \"milk ring\": \"milk ring\",\n        \"milk rotary\": \"みるくロータリー\",\n        \"milk server\": \"みるくさーばー\",\n        \"milk standard\": \"MILK STANDARD\",\n        \"milk tea house\": \"牛乳茶屋\",\n        \"milk-size\": \"みるく-SIZE\",\n        \"milkholic\": \"milkholic\",\n        \"milkpop\": \"MILKPOP\",\n        \"milkshake work\": \"奶昔工坊\",\n        \"milktub\": \"milktub\",\n        \"milky high tension\": \"ミルキーハイテンション♂\",\n        \"milky paint\": \"Milky Paint\",\n        \"milky pearl\": \"みるきぃぱぁる\",\n        \"milky souffle\": \"みるきーすふれ\",\n        \"milky strike\": \"milky strike\",\n        \"milky way\": \"みるきーうぇい\",\n        \"mill-mill\": \"Mill-Mill\",\n        \"mille-feuille\": \"ミルフィーユ\",\n        \"million bank\": \"みりおんばんく\",\n        \"million beast from diana\": \"Million beast from DIANA\",\n        \"million drops\": \"MILLION☆DROPS\",\n        \"millionlove\": \"みりおんらぶ\",\n        \"millions hope\": \"Millions Hope\",\n        \"milts chaya\": \"みるつ茶屋\",\n        \"mimasaka direct\": \"ミマサカダイレクト\",\n        \"mime channel\": \"MImeチャンネル\",\n        \"mimesis\": \"ミメーシス\",\n        \"mimicry.z\": \"みみくりどっとぜっと\",\n        \"mimippu\": \"みみっぷ\",\n        \"mimishiki\": \"耳式\",\n        \"mimitto\": \"ミミット\",\n        \"mimiya\": \"耳屋\",\n        \"mimizu thousand\": \"ミミズサウザンド\",\n        \"mimo hutamo\": \"身も蓋も\",\n        \"mimori.\": \"ミモリ。\",\n        \"mimoritei\": \"水護亭\",\n        \"mimoton\": \"みもとん\",\n        \"mimura namae\": \"三村生恵\",\n        \"minadukitei\": \"水無月亭\",\n        \"minami alps\": \"ミナミアルプス\",\n        \"minamikanazawa 5th studio\": \"南金沢第五スタジオ\",\n        \"minamono\": \"みなmono\",\n        \"minamoon\": \"みなむーん\",\n        \"minarai honpo\": \"みならい本舗\",\n        \"minarindo\": \"みなりん堂\",\n        \"minarui\": \"みなるい\",\n        \"minasokomori\": \"水底森\",\n        \"minato carnival\": \"みなとカーニバル\",\n        \"minato future\": \"minato future\",\n        \"mind and mind\": \"Mind and Mind\",\n        \"mindstone\": \"マインドストーン\",\n        \"mine noujou\": \"ミネ農場\",\n        \"mine slash mine\": \"mine/mine\",\n        \"mineya\": \"峰屋\",\n        \"mini\": \"mini\",\n        \"minies club\": \"MINIES CLUB\",\n        \"minimum lab\": \"みにまむラボ\",\n        \"mink\": \"ミンク\",\n        \"mink ego\": \"Mink EGO\",\n        \"minna shindoi\": \"みんなしんどい\",\n        \"mino kureha\": \"美濃紅葉\",\n        \"minobu gentle\": \"身延ジェントル\",\n        \"minobuya\": \"みのぶ屋\",\n        \"minomushitei\": \"みのむし亭\",\n        \"minori\": \"minori\",\n        \"minori kenkyuujo\": \"みのり研究所\",\n        \"minors escort\": \"マイナーズエスコート\",\n        \"minpee\": \"みんペー\",\n        \"minshuku inarimushi\": \"民宿いなりむし\",\n        \"mint blue\": \"MINT BLUE\",\n        \"mint chocolate\": \"ミントチョコレート\",\n        \"mintcube\": \"MintCUBE\",\n        \"mintjulep\": \"mintjulep\",\n        \"minus unlimited\": \"-unlimited\",\n        \"minusartworks\": \"MinusArtWorks\",\n        \"minwa\": \"ミンワ\",\n        \"miogui\": \"澪杙\",\n        \"miracle candy\": \"ミラクルキャンディ\",\n        \"miracle ponchi matsuri\": \"ミラクルポンチ祭り\",\n        \"mirage\": \"鏡樹\",\n        \"mirage cat\": \"MIRAGE CAT\",\n        \"mirage-soft\": \"みらーじゅそふと\",\n        \"mirai\": \"mirai\",\n        \"mirapare\": \"みらぱれ\",\n        \"mirin\": \"みりん\",\n        \"mirukomi\": \"みるこみ\",\n        \"mirukuseiki\": \"みるく世紀\",\n        \"misaki ai\": \"美咲愛\",\n        \"misakix megamix\": \"MISAKIX MEGAMIX\",\n        \"misokko chuutai\": \"みそっ子中隊\",\n        \"misonodenpatou\": \"みそのデンパ塔\",\n        \"misopanya\": \"みそパン屋\",\n        \"misoya\": \"味噌屋\",\n        \"miss black offline\": \"MISS BLACK OFFLINE\",\n        \"missa\": \"missa\",\n        \"missing park\": \"MISSING PARK\",\n        \"misssail\": \"MISS/SAIL\",\n        \"mist night\": \"Mist Night\",\n        \"misty\": \"ミスティ\",\n        \"misty isle\": \"Misty Isle\",\n        \"misty wind\": \"Misty Wind\",\n        \"mita kazuo daihyakka\": \"三田和夫大百科\",\n        \"mitarashi club\": \"みたらし倶楽部\",\n        \"mitarou teishoku\": \"ミタロウ定食\",\n        \"mitegura\": \"MITEGURA\",\n        \"mithril\": \"ミスリル\",\n        \"miti\": \"ミィティ\",\n        \"mitikage\": \"みちかげ\",\n        \"mitsu\": \"蜜\",\n        \"mitsu-iro syrup\": \"蜜色シロップ\",\n        \"mitsuami mobius\": \"蜜あみメビウス\",\n        \"mitsuami romance\": \"三つ編みロマンス\",\n        \"mitsuiri house\": \"みついり♡ハウス\",\n        \"mitsuki no mori\": \"林樹の森～ミツキノモリ～\",\n        \"mitsumata suihanki\": \"三又炊飯器\",\n        \"mitsunoya\": \"みつのや\",\n        \"mitsuya yoguru\": \"ミツヤヨーグル\",\n        \"miumiu\": \"MiUMiU\",\n        \"miura jota\": \"三浦いお太\",\n        \"mitsuwa building\": \"三輪ビルヂング\",\n        \"miwaku-iro missile\": \"魅惑色ミサイル\",\n        \"mix station\": \"ミックス ステーション\",\n        \"mix-ism\": \"MIX-ISM\",\n        \"mixed breed\": \"mixed breed\",\n        \"mixwill soft\": \"Mixwill Soft\",\n        \"miyabi tsuzuru bu\": \"みやびつづる部\",\n        \"miyama enseki\": \"深山燕石\",\n        \"miyanchi\": \"みやんち\",\n        \"miyubi\": \"ミユビ\",\n        \"miyumiyu project\": \"みゆみゆProject\",\n        \"mizu\": \"水\",\n        \"mizuiro usagi\": \"Mizuiro うさぎ\",\n        \"mizuiro zenmai\": \"みずいろぜんまい\",\n        \"mizujouyu jouryuusho\": \"水醤油蒸留所\",\n        \"mizuki-chan club\": \"みずきちゃんくらぶ\",\n        \"mizukidou\": \"観月堂\",\n        \"mizumo club\": \"みずも倶楽部\",\n        \"mizutama neko\": \"水玉ねこ\",\n        \"mizutofu\": \"水豆腐\",\n        \"mizuwari neko\": \"水割り猫\",\n        \"mjgg\": \"もりじおぎゅうぎゅう\",\n        \"mjkitty\": \"mjkitty\",\n        \"mjks\": \"mjks\",\n        \"mk ultra\": \"MKウルトラ\",\n        \"mlkx\": \"MLKx\",\n        \"mm kan\": \"MM館\",\n        \"mmt\": \"MMT!!\",\n        \"mmu2000\": \"MMU2000\",\n        \"mnh\": \"MNH\",\n        \"moai lion\": \"モアイライオン\",\n        \"mob.1\": \"MOB.1\",\n        \"mobco.\": \"mobco.\",\n        \"mobris\": \"MOBRIS\",\n        \"mocchimochiya\": \"もっちもち屋\",\n        \"mocchomudake\": \"モッチョム茸\",\n        \"mochi dog laboratory\": \"餅犬製作所\",\n        \"mochi hasamiuchi da\": \"餅はさみ撃ちだっ!\",\n        \"mochi kiss junkie\": \"もちxoジャンキー\",\n        \"mochi mochi\": \"もちもち\",\n        \"mochi mochi mikan\": \"もちもちみかん\",\n        \"mochi-ya\": \"餅屋\",\n        \"mochimochi carnevale\": \"もちもちCarnevale\",\n        \"mochimochi dou\": \"もちもち堂\",\n        \"mochimochitaiyo\": \"もちもちたいよう\",\n        \"mochinige\": \"持ち逃げ\",\n        \"mochinonnon.\": \"もちのんのん。\",\n        \"mocking soft\": \"木琴Soft\",\n        \"moco chouchou\": \"Moco Chouchou\",\n        \"moco note\": \"もこのーと\",\n        \"mocreation\": \"mocreation\",\n        \"modae shine\": \"悶え死ね!!!\",\n        \"moe\": \"MoE\",\n        \"moe dukuri oukoku\": \"萌えづくり王国\",\n        \"moegekidon\": \"萌撃丼\",\n        \"moehina kagaku\": \"萌雛化学\",\n        \"moekorodo\": \"萌殺堂\",\n        \"moenai gomi bukuro\": \"萌えないゴミ袋\",\n        \"moenomiya\": \"萌宮\",\n        \"moeru gomi\": \"燃えるゴミ\",\n        \"moewrest\": \"もえれす\",\n        \"moffle\": \"moffle\",\n        \"mofu shippo lab\": \"もふしっぽらぼ\",\n        \"mofumanjuu\": \"もふまんじゅう\",\n        \"mofumofuen\": \"もふもふ苑\",\n        \"mofurafu\": \"mofurafu\",\n        \"mofuya\": \"モフ屋\",\n        \"mogemogeya\": \"モゲモゲ屋\",\n        \"mogetama\": \"もげたま\",\n        \"mogiki-chan chi\": \"もぎきちゃんち\",\n        \"mogullaz\": \"Mogullaz\",\n        \"mogumogu soft\": \"もぐもぐソフト\",\n        \"mogura company\": \"MOGURA COMPANY\",\n        \"mogura tengu\": \"もぐら天狗\",\n        \"moirai\": \"moirai\",\n        \"mojiya\": \"MOじ屋\",\n        \"mokkori musume.\": \"もっこり娘。\",\n        \"mokugyuutan\": \"もくぎゅうたん。\",\n        \"mokumoku\": \"もくもく\",\n        \"mokusa\": \"Mokusa\",\n        \"mokusei-gaeri\": \"木星帰り\",\n        \"mokuzou zabuton\": \"モクゾウザブトン\",\n        \"molamola.software\": \"Molamola.software\",\n        \"molfo\": \"molfo\",\n        \"molossan\": \"喪loss庵\",\n        \"molotov cocktail\": \"モロトフカクテル\",\n        \"molten club\": \"モルテンクラブ\",\n        \"moment silicon\": \"木綿シリコン\",\n        \"momi momi studio\": \"もみもみスタジオ\",\n        \"momiage rapunzel\": \"もみあげラプンツェル\",\n        \"momiji coffee\": \"もみじ珈琲\",\n        \"momiji mofumofutei\": \"椛もふもふ亭\",\n        \"momiji oroshi\": \"もみじおろし\",\n        \"mominoki\": \"もみの木\",\n        \"momizi koubou\": \"もみじ工房\",\n        \"momo\": \"Momo\",\n        \"momo mania\": \"桃マニア\",\n        \"momo no kanzume\": \"桃のカンヅメ\",\n        \"momo no omochi\": \"もものおもち\",\n        \"momo-meron\": \"桃メロン\",\n        \"momo.\": \"momo。\",\n        \"momoameya\": \"桃飴屋\",\n        \"momochi\": \"MOMOCHI\",\n        \"momochoko\": \"ももチョコ\",\n        \"momodaya\": \"百田屋\",\n        \"momohina\": \"桃雛\",\n        \"momoiro cait sith\": \"ももいろけっとしー\",\n        \"momoiro diva\": \"桃色DIVA\",\n        \"momoiro scissors\": \"桜色シザーズ\",\n        \"momoiro settoudan\": \"桃色窃盗団\",\n        \"momoiro sugoroku\": \"桃色双六\",\n        \"momoiro toiki\": \"桃色吐息\",\n        \"momoiro-gekijyou\": \"桃色劇場\",\n        \"momoiro-netsuduki\": \"桃色熱月\",\n        \"momoiro-rip\": \"ももいろリップ\",\n        \"momoirohoppe\": \"ももいろほっぺ\",\n        \"momoirosyounenki\": \"桃色少年期\",\n        \"momokan\": \"ももかん\",\n        \"momokawa\": \"モモカワ\",\n        \"momokuri\": \"もも栗\",\n        \"momomoya\": \"もももや\",\n        \"momonashi potato\": \"桃梨ぽてと\",\n        \"momoneko doumei\": \"ももねこ同盟\",\n        \"momonga club\": \"モモンガ倶楽部\",\n        \"momosakiiro\": \"桃咲色\",\n        \"momoshiba anzu\": \"ももしば杏子\",\n        \"momoziri hustle dou\": \"桃尻ハッスル堂\",\n        \"mon amour.\": \"もなむーる。\",\n        \"mon-petit\": \"mon-petit\",\n        \"monado\": \"MONADO\",\n        \"monako\": \"MONAKO\",\n        \"mondo\": \"モンド\",\n        \"mongoose studio\": \"高浜屋\",\n        \"moni teishoku\": \"もに定食\",\n        \"monica\": \"monica\",\n        \"monji koubou\": \"もんじ肛房\",\n        \"monke\": \"もんけ\",\n        \"monkey adventure\": \"モンキー・アドベンチャー\",\n        \"monkey pinx.\": \"MonkeyPinx.\",\n        \"monkey reppuutai\": \"モンキー烈風隊\",\n        \"monkeys factory\": \"モンキーズFACTORY\",\n        \"monmo bokujou\": \"モンモー牧場\",\n        \"mono letter\": \"モノ手紙\",\n        \"mono x chro\": \"モノ×クロ\",\n        \"monochrome\": \"モノクローム\",\n        \"monochrome circuit\": \"ものくろサーキット\",\n        \"monochrose\": \"monochrose\",\n        \"monoeye\": \"Monoeye\",\n        \"monokichi youhoujou\": \"ものきち養蜂場\",\n        \"monokulolli\": \"ものくろり\",\n        \"monokuromomiji\": \"モノクロモミジ\",\n        \"monokurored\": \"モノクロRed\",\n        \"monolove\": \"MONOLOVE\",\n        \"mononoke hobaku butai\": \"もののけ捕縛部隊\",\n        \"monorabbi\": \"ものらび\",\n        \"monpe kagekiha\": \"モンペ過激派\",\n        \"monshiro\": \"モンシロ\",\n        \"monster box\": \"もんすたーぼっくす\",\n        \"monster tribe\": \"MONSTER TRIBE\",\n        \"monstera\": \"モンステラ\",\n        \"monsters biscuit\": \"モンスターズビスケット\",\n        \"monte carlo-ya\": \"もんてかるろ屋\",\n        \"monteriakitto\": \"もんてりあきっと\",\n        \"monukenokara\": \"もぬけのから\",\n        \"moon knight sparkle\": \"MOON KNIGHT SPARKLE\",\n        \"moon the angry\": \"Moon the angry!\",\n        \"moon wort\": \"Moon Wort\",\n        \"moongarden\": \"MoonGarden\",\n        \"moonknives\": \"moonknives\",\n        \"moonlight diner\": \"ムーンライト・ダイナー\",\n        \"moonrevenge\": \"MoonRevenge\",\n        \"moorusu\": \"モール巣\",\n        \"mopuo oyakata\": \"もぷお親方\",\n        \"mor\": \"MOR\",\n        \"moladolog\": \"モラードログ\",\n        \"morgue\": \"morgue\",\n        \"mori no kumasan yuugekitai\": \"森のくまさん遊撃隊\",\n        \"mori no mushi\": \"森の蟲\",\n        \"mori no seirei tittilty\": \"森の精霊ティッティルティ\",\n        \"morihama no shindansho\": \"モリハマの診断書\",\n        \"moriisan-tokono\": \"森井さんとこの\",\n        \"moriman shoten\": \"森まん商店\",\n        \"morimori runrun\": \"もりもりルンルン\",\n        \"morino koubou\": \"森野工房\",\n        \"morinomiya koushinkyoku\": \"森ノ宮行進曲\",\n        \"morishigeru laboratory\": \"もりしげる研究所\",\n        \"morisoba iccho\": \"盛りそば一丁\",\n        \"morittokoke\": \"もりっとこけ\",\n        \"moriya\": \"杜屋\",\n        \"moriya630\": \"moriya630\",\n        \"morizo\": \"盛増\",\n        \"morning\": \"もーにんぐ\",\n        \"morohane.\": \"もろはね。\",\n        \"morozumix\": \"morozumix\",\n        \"morrow\": \"morrow\",\n        \"moruda ramenya\": \"もる田ラーメン屋\",\n        \"morugastudio\": \"MORUGAstudio\",\n        \"morutaya\": \"もるた屋\",\n        \"mosome\": \"モソーム\",\n        \"motachi\": \"もたち\",\n        \"motchie kingdom\": \"もっちー王国\",\n        \"mothman\": \"もすまん\",\n        \"motley crew\": \"Motley crew\",\n        \"motsu ryouri\": \"もつ料理\",\n        \"mottekoi sangyou\": \"モッテコイ産業\",\n        \"mottocompany\": \"MottoCompany\",\n        \"motu club\": \"モツクラブ\",\n        \"mou nero\": \"もう寝ろ\",\n        \"mou sukoshi hidari e\": \"もう少し左へ\",\n        \"moudou\": \"もうどう\",\n        \"mouko mouretsu hasai dan\": \"蒙古猛烈破砕団\",\n        \"moumoku nezumi\": \"盲目ねずみ\",\n        \"moumoku no inu-tachi\": \"盲黙のいぬたち\",\n        \"moumoubox\": \"も〜も〜ぼっくす\",\n        \"mount position\": \"マウントポジション\",\n        \"mountain topper\": \"マウンテントッパー\",\n        \"mousou aria\": \"妄想アリア\",\n        \"mousou bussan\": \"妄想物産\",\n        \"mousou caution\": \"妄想Caution\",\n        \"mousou colosseum\": \"妄想コロッセオ\",\n        \"mousou endemic\": \"妄想エンデミック\",\n        \"mousou engine\": \"妄想エンジン\",\n        \"mousou fukuzagata\": \"妄想複座型\",\n        \"mousou katharsis\": \"妄想カタルシス\",\n        \"mousou kenkyuujo\": \"妄想研究所\",\n        \"mousou meteoroid\": \"妄想メテオロイド\",\n        \"mousou pasta\": \"妄想パスタ\",\n        \"mousou pushon\": \"妄想PushOn\",\n        \"mousou tokkyuu\": \"妄想特急\",\n        \"mousou wakusei\": \"妄想惑星\",\n        \"mousou web\": \"妄想ウェブ\",\n        \"mousou zukan\": \"もーそーずかん\",\n        \"mousoudokei\": \"妄想時計\",\n        \"moviendo\": \"Moviendo\",\n        \"moyasix\": \"moyasix\",\n        \"mozuchichi\": \"MOZUCHICHI\",\n        \"mozuya\": \"もず屋\",\n        \"mp0\": \"MP0\",\n        \"mr.outside\": \"Mr. Outside\",\n        \"mr.rabbit\": \"Mr.Rabbit\",\n        \"mro\": \"MRO\",\n        \"ms is\": \"M's I's\",\n        \"ms works.\": \"M's WORKS.\",\n        \"msize\": \"エムサイズ\",\n        \"mtk\": \"MTK\",\n        \"mu\": \"美遊\",\n        \"mu-cute\": \"μ-CuTe\",\n        \"mucha koubou\": \"無茶工房\",\n        \"mudai picture\": \"無題ピクチャ\",\n        \"mugcat\": \"Mugcat\",\n        \"mugen honpo\": \"むげん本舗\",\n        \"mugen kairou\": \"夢幻回廊\",\n        \"mugen kidousha\": \"夢幻機動舎\",\n        \"mugen lens\": \"無限レンズ\",\n        \"mugen mountain\": \"夢幻マウンテン\",\n        \"mugen mousou\": \"無限妄想\",\n        \"mugen no soul\": \"無限のソウル\",\n        \"mugendou cinema\": \"無限堂キネマ\",\n        \"mugenkan\": \"夢幻館頒布\",\n        \"mugenya honpo\": \"無限屋本舗\",\n        \"mugicha.\": \"むぎちゃ。\",\n        \"mugichoko store\": \"むぎちょこストア\",\n        \"mugiwara club\": \"麦わらクラブ\",\n        \"muhakiya\": \"ムハキヤ\",\n        \"muhouchitai\": \"無法地帯\",\n        \"muin coffee\": \"無印コーヒー\",\n        \"mujina\": \"狢\",\n        \"mujirushi shounen\": \"無印少年\",\n        \"mujirushi-dou\": \"無印堂\",\n        \"mukade tou\": \"ムカデ島\",\n        \"mukeikaku syugi\": \"無計画主義\",\n        \"muki pomera\": \"ムキぽめら\",\n        \"mukibutsu heart\": \"無機物はーと\",\n        \"mukuchi na hakoniwa\": \"無口な箱庭\",\n        \"mukuge\": \"毳\",\n        \"mukumukumoon\": \"むくむくむーん\",\n        \"mukuton kyouju to soratobu potato.\": \"むくトン教授と空飛ぶポテト。\",\n        \"mukyuu dynamic\": \"ムキューダイナミック\",\n        \"mulberry\": \"マルベリ\",\n        \"multi-type\": \"Multi-Type\",\n        \"multivitamin\": \"MULTIVITAMIN\",\n        \"mumeiya\": \"夢迷屋\",\n        \"mumumu jirushi\": \"むむむ印\",\n        \"mumunyan\": \"むむにゃん\",\n        \"mumyoudou\": \"夢妙堂\",\n        \"mumyoukutsu\": \"無明窟\",\n        \"munak\": \"ムナック\",\n        \"munmun dou\": \"ムンムン堂\",\n        \"munomeritei\": \"むのめり亭\",\n        \"mura no ikinokori\": \"村の生き残り\",\n        \"muramura pocky\": \"ムラムラPocky\",\n        \"murasaki nyanko bar\": \"むらさきにゃんこバー\",\n        \"murasaki switch\": \"ムラサキスイッチ\",\n        \"murasaki-dou honten\": \"紫紀堂本店\",\n        \"murasaki.\": \"紫。\",\n        \"murasakiiro no yoru\": \"むらさきいろのよる\",\n        \"murasakiiro orange\": \"むらさきいろオレンジ\",\n        \"murasame no yousai\": \"村雨の要塞\",\n        \"murderhouse\": \"MURDERHOUSE\",\n        \"muremure kaisendon\": \"むれむれ海鮮丼\",\n        \"murmur\": \"murmur\",\n        \"musansodou\": \"無酸素堂\",\n        \"musasabidou\": \"むささび堂\",\n        \"musashi-dou\": \"武蔵堂\",\n        \"muscadet\": \"ミュスカデ\",\n        \"muse\": \"MUSE\",\n        \"museifu kutsushita doumei\": \"無政府靴下同盟\",\n        \"mushaburu\": \"むしゃぶる\",\n        \"mushikui lettuce\": \"むしくいレタス\",\n        \"mushimusume aikoukai\": \"蟲娘愛好会\",\n        \"mushiringo\": \"むしりんご\",\n        \"mushiyaki\": \"むしやき!!\",\n        \"mushroom pig\": \"マッシュルームピッグ\",\n        \"mushroom shoutengai\": \"マッシュルーム商店街\",\n        \"musukichi\": \"むす吉\",\n        \"mutospectacle\": \"無糖スペクタクル\",\n        \"mutsukidou\": \"睦月堂\",\n        \"mutsuraboshi\": \"むつらぼし\",\n        \"mutsuya\": \"陸奥屋\",\n        \"muttumuu\": \"むっつむー\",\n        \"mx2\": \"M×2\",\n        \"my blue sky\": \"マイブルースカイ\",\n        \"my darling\": \"my_darling\",\n        \"my pace world\": \"my pace world\",\n        \"myao\": \"Myao\",\n        \"mycology.\": \"マイコロジィ。\",\n        \"mylab\": \"MYLAB\",\n        \"myon plus 1\": \"MYON+1\",\n        \"myonlyone\": \"MYONLYONE\",\n        \"myoukenya\": \"みょうけん屋\",\n        \"myriad purity\": \"Myriad Purity\",\n        \"mysp5cm\": \"まいすぺ5cm\",\n        \"mystery clock\": \"MYSTERY CLOCK\",\n        \"mystic chord\": \"ミスティック・コード\",\n        \"n\": \"ん！\",\n        \"n b g\": \"エヌベージー\",\n        \"n no tsukue\": \"Nの机\",\n        \"n shiki\": \"N式\",\n        \"n-bomb asylum\": \"核弾避難室\",\n        \"n-craft\": \"n-craft\",\n        \"n.a.u.s.\": \"N.A.U.S.\",\n        \"n.cs\": \"N.Cs\",\n        \"n.n.f.s\": \"N.N.F.S\",\n        \"n.r.d.works\": \"N.R.D.WORKS\",\n        \"n.s craft\": \"N.S Craft\",\n        \"n.s.project\": \"N.S.project\",\n        \"n2jirai\": \"N2地雷\",\n        \"n7747\": \"N7747\",\n        \"nabe no circle\": \"nabeのサークル\",\n        \"nabesekizaiten\": \"鍋石材店\",\n        \"nabeyaki udon\": \"鍋焼きうどん\",\n        \"nabeyama kaidou\": \"鍋山街道\",\n        \"nabeyashiki\": \"鍋屋敷\",\n        \"nac.\": \"Nac.\",\n        \"nac000\": \"nac000\",\n        \"nachtzug\": \"Nachtzug\",\n        \"nae petit\": \"nae petit\",\n        \"nagaremono\": \"流れもの\",\n        \"nagasaki-inter\": \"長崎インター\",\n        \"nagashi soumen\": \"ながしそうめん\",\n        \"naginata kikaku\": \"なぎなた企画\",\n        \"naginata-kan\": \"薙刀館\",\n        \"nagisa no haikara kingyo\": \"渚のハイカラ金魚\",\n        \"nagisawaya\": \"なぎさわ屋\",\n        \"nagomi no ame\": \"和ノ雨\",\n        \"nagumoya\": \"なぐも屋\",\n        \"naguu no shiro\": \"なぐうの城\",\n        \"nahabaru\": \"ナハバル\",\n        \"nahapuro\": \"なはぷろ\",\n        \"naitou kirara\": \"内藤キララ\",\n        \"naitou2\": \"NAITOU2\",\n        \"naivta\": \"ナイーブタ\",\n        \"naiyori alpha zaidan\": \"Naiyori alpha 財団\",\n        \"nakagawaya\": \"中川家\",\n        \"nakamuratakumi\": \"仲村巧\",\n        \"nakanoku kurochanno...\": \"中野区くろちゃんの…\",\n        \"nakasatogumi\": \"ナカサト組\",\n        \"nakasone battalion\": \"中曽根バタリアン\",\n        \"nakatashi family\": \"中田紫ファミリー\",\n        \"nakaun\": \"なかうん\",\n        \"nakayama shiki kenkou tosho\": \"中山式健康図書\",\n        \"nakayohi\": \"なかよひ\",\n        \"nakayoshi koyoshi\": \"なかよShiこよShi\",\n        \"nakayoshi obgyn\": \"なかよし産婦人科\",\n        \"nakigara\": \"無空\",\n        \"nakuru box\": \"ナクルボックス\",\n        \"nama mochi shichi banchi\": \"生餅七番地\",\n        \"nama shibori sour\": \"生搾りサワー\",\n        \"namaco\": \"NAMACO\",\n        \"namae kinyuuran\": \"名前記入欄\",\n        \"namaikichibi\": \"なまいきちび\",\n        \"namakemono kishidan\": \"なまけもの騎士団\",\n        \"namakoya\": \"なまこ屋\",\n        \"namakura dou\": \"なまくら堂\",\n        \"namakura na kura\": \"なまくらな鞍\",\n        \"namanama shandy gaff\": \"生ナマシャンディガフ\",\n        \"namanamago\": \"ナマナマゴ\",\n        \"namanecotei\": \"生猫亭\",\n        \"namaniku tappuri\": \"生肉たっぷり\",\n        \"namashoku de hara kowasu tami\": \"生食デ腹壊ス民\",\n        \"namasute koubou\": \"生棄工房\",\n        \"namayake.\": \"なまやけ。\",\n        \"namazu-no-ikesu\": \"鯰の生け簀\",\n        \"nambokuya\": \"南北屋\",\n        \"nameless\": \"ネームレス\",\n        \"namelesszero\": \"NamelessZero\",\n        \"nami-nami restaurant\": \"並々食堂\",\n        \"namiroji\": \"波路地\",\n        \"namitaitei\": \"並大抵\",\n        \"nanaban chamaru dou\": \"七番茶○堂\",\n        \"nanacan\": \"NANACAN\",\n        \"nanafundou\": \"七分堂\",\n        \"nanairo batake\": \"なないろ畑\",\n        \"nanairo koubou\": \"なないろ工房\",\n        \"nanairo momogumi\": \"なないろもも組\",\n        \"nanairo no magatama\": \"七色の勾玉\",\n        \"nanairo senpu-ji\": \"七色旋風児\",\n        \"nanairo shichihenge\": \"七色七変化\",\n        \"nanakamado\": \"七竈\",\n        \"nanakorobi yaoki\": \"七転八起\",\n        \"nanakumi\": \"ななくみ\",\n        \"nanamehan\": \"ななめ班\",\n        \"nanameno\": \"ななめの\",\n        \"nanamigumi\": \"七海組\",\n        \"nanamiya\": \"奈波屋\",\n        \"nanamoya\": \"ななも屋\",\n        \"nananana\": \"なななな\",\n        \"nanashi inflation\": \"ななしいんふれーしょん\",\n        \"nanashi shounen\": \"ナナシ少年\",\n        \"nanashiki\": \"七式\",\n        \"nanaten manten\": \"七点万点\",\n        \"nanatsu no kagiana\": \"七つの鍵穴\",\n        \"nanatsuboshi\": \"七つ星\",\n        \"nanatsugumi\": \"ななつ組\",\n        \"nanatsuhane\": \"ナナツハネ\",\n        \"nanaya\": \"奈々屋\",\n        \"nanayoduki\": \"七夜月\",\n        \"nanbu\": \"なんぶ\",\n        \"nandemodozo\": \"なんでもどうぞ\",\n        \"nandemoii\": \"なんでもいい\",\n        \"nanika\": \"なにか\",\n        \"nanika no heya\": \"何かの部屋\",\n        \"nanika-modoki\": \"なにかもどき\",\n        \"nanikaya\": \"なにか屋\",\n        \"naniwaya\": \"浪速屋\",\n        \"nankin honpo\": \"南京本舗\",\n        \"nankotsu age rice\": \"なんこつ揚げライス\",\n        \"nankyoku\": \"なんきょく\",\n        \"nano royal\": \"Nano Royal\",\n        \"nanokah\": \"なのかH\",\n        \"nansyu-koubow\": \"南洲好房\",\n        \"nantan e\": \"南端へ\",\n        \"nantoka narunaru.\": \"なんとかなるなる。\",\n        \"napier sabre\": \"Napier Sabre\",\n        \"napolinu\": \"napolinu\",\n        \"naranashitori\": \"ならなしとり\",\n        \"narashino kaitoudan\": \"習志野海盗団\",\n        \"narimasuya\": \"なります屋\",\n        \"narukotei\": \"鳴狐亭\",\n        \"naruto kenkyu sha\": \"なると研究社\",\n        \"nas-on-ch\": \"NAS-ON-CH\",\n        \"nasi-pasuya\": \"なしぱす屋\",\n        \"nasubi knight\": \"ナスビ騎士\",\n        \"nata de coco soda\": \"ナタデココ・ソーダ\",\n        \"natadekoko\": \"なたでここ\",\n        \"natakuga-yuku\": \"なたくが行く!\",\n        \"natorina dou\": \"なとりな堂\",\n        \"natsu no cheese koujou\": \"夏のチーズ工場\",\n        \"natsu no umi\": \"なつのうみ\",\n        \"natsugumo himawari\": \"夏雲ひまわり\",\n        \"natsuiro laika\": \"夏色ライカ\",\n        \"natsuiro otome\": \"なついろ乙女\",\n        \"natsuiro shoujo\": \"夏色少女\",\n        \"natsuiro terrace\": \"夏色テラス\",\n        \"natsukanmi\": \"なつかんみ\",\n        \"natsukon\": \"なつこん\",\n        \"natsumemo\": \"なつめも\",\n        \"natsumin no circle\": \"なつみんのさーくる\",\n        \"natsuyasumi\": \"夏休み\",\n        \"nattou mania\": \"納豆☆マニア\",\n        \"nattou no mori\": \"なっとうの杜\",\n        \"natukiya\": \"なつき屋\",\n        \"natumiruku\": \"なつみぃ〜るク♪\",\n        \"naturaldays\": \"NATURALDAYS\",\n        \"nature\": \"NaTuRe\",\n        \"nature.\": \"nature.\",\n        \"naughtygal style b\": \"NaughtyGal Style B\",\n        \"naunau\": \"なうなう\",\n        \"navi001\": \"Navi001\",\n        \"navy\": \"NAVY\",\n        \"navy blue\": \"Navy Blue\",\n        \"navy garden\": \"ネイビーガーデン\",\n        \"nawanoren\": \"縄のれん\",\n        \"nayuta\": \"ナユタ\",\n        \"nazo no akanekokan\": \"謎の赤猫団\",\n        \"nazonokai\": \"謎の会\",\n        \"nb teishoku\": \"NB定食\",\n        \"nb.\": \"nb.\",\n        \"ncdn\": \"ニチダン\",\n        \"ne.\": \"ね。\",\n        \"nebosukekin\": \"ねぼすけ菌\",\n        \"necomuffler\": \"ネコマフラー\",\n        \"necotoxin\": \"NECOTOXIN\",\n        \"necrolincer\": \"ネクロリンサー\",\n        \"nedaore\": \"ネダオレ\",\n        \"needle\": \"NEEDLE\",\n        \"needle garden\": \"NEEDLE GARDEN\",\n        \"neet corp\": \"ニート(株)\",\n        \"negapoji-bu\": \"ネガぽじーぶ\",\n        \"negibouzu\": \"ねぎ坊主\",\n        \"negimaers\": \"ねぎまーず\",\n        \"neginegio\": \"ネギネギ夫\",\n        \"negi to takenoko\": \"ねぎとたけのこ\",\n        \"negoro teppou tai\": \"根来鉄砲隊\",\n        \"negoto\": \"negoto\",\n        \"negoya\": \"寝語屋\",\n        \"neguradou\": \"塒堂\",\n        \"negurie\": \"ねぐりえ\",\n        \"neji hina no sekai\": \"ネジヒナの世界\",\n        \"neji roll\": \"ねじロール\",\n        \"nejikiri sister\": \"捻切シスター\",\n        \"nejimaki kougen\": \"ねじまきこうげん\",\n        \"nejiya no hito\": \"ねじやのひと\",\n        \"neko blizzard\": \"猫ブリザード\",\n        \"neko bus unsou\": \"ねこばす運送\",\n        \"neko daifuku\": \"ねこ大福\",\n        \"neko irazu\": \"猫イラズ\",\n        \"nekojarashy\": \"猫じゃらし\",\n        \"nekojarashi\": \"猫じゃらし\",\n        \"neko kan\": \"ねこ缶\",\n        \"neko kinryouku\": \"猫禁猟区\",\n        \"neko melonya\": \"猫メロン屋\",\n        \"neko neko house\": \"ねこねこハウス\",\n        \"neko no onsen\": \"猫の温泉\",\n        \"neko no sakegoto\": \"ねこのさけごと\",\n        \"neko no shoushuugen\": \"ねこの消臭元\",\n        \"neko no te koubou\": \"猫の手工房\",\n        \"neko no yurikago\": \"猫のゆりかご\",\n        \"neko pantsu\": \"ネコぱんつ\",\n        \"neko pockle\": \"ねこぽっくる\",\n        \"neko rop\": \"ねころっぷ\",\n        \"neko rush\": \"ねこらっしゅ\",\n        \"neko saffron\": \"ネコサフラン\",\n        \"neko shounen\": \"ねこ少年\",\n        \"neko studio\": \"ねこスタジオ\",\n        \"neko tantei dan\": \"ネコ☆探偵団\",\n        \"neko to hato\": \"ねことはと\",\n        \"neko yashiki\": \"ねこ屋敷\",\n        \"neko-rise\": \"Neko-rise\",\n        \"nekoarashi\": \"ねこあらし\",\n        \"nekoashi sanbi\": \"猫足讃美\",\n        \"nekomasshigura\": \"猫驀地\",\n        \"nekodaisuki\": \"猫大好き\",\n        \"nekodotto\": \"ネコドット\",\n        \"nekogoro\": \"ねこごろ\",\n        \"nekohachi eigyoubu\": \"猫八営業部\",\n        \"nekohige radio\": \"猫ひげラジオ\",\n        \"nekohigetei\": \"ねこひげ亭\",\n        \"nekoiro\": \"ネコイロ\",\n        \"nekokabe\": \"ネコカベ\",\n        \"nekokaburi\": \"ネコかブリ\",\n        \"nekokagerou\": \"猫蜻蛉\",\n        \"nekokota\": \"nekokotA\",\n        \"nekomajin\": \"ねこまじん\",\n        \"nekomakura soft\": \"ねこまくらsoft\",\n        \"nekomatakan\": \"猫又館\",\n        \"nekomeshiya\": \"ねこめし屋\",\n        \"nekomikan aruiwa nekomikan\": \"猫美館或いは猫蜜柑\",\n        \"nekomimi catharsis\": \"猫耳カタルシス\",\n        \"nekomiya\": \"猫見屋\",\n        \"nekonetoru\": \"ネコネトル\",\n        \"nekonin-so\": \"猫忍荘\",\n        \"nekono kaweruya\": \"ネコノカヱルヤ\",\n        \"nekonohoshi\": \"ネコノホシ\",\n        \"nekonote shobou\": \"ねこのてしょぼう\",\n        \"nekopunch bashibashi\": \"ねこぱんちバシバシ\",\n        \"nekoranbu\": \"猫乱舞\",\n        \"nekorinchi\": \"ねこりんち\",\n        \"nekoro ryuuseigun\": \"ねころ流星群\",\n        \"nekorobi\": \"ねころび\",\n        \"nekorondoru\": \"ネコロンドル\",\n        \"nekosenyou milk\": \"猫専用牛乳\",\n        \"nekoshaku\": \"猫尺\",\n        \"nekosupi\": \"ねこすぴ\",\n        \"nekottorando\": \"ネコットランド\",\n        \"nekousa pudding\": \"ねこうさプリン\",\n        \"nekoya\": \"ねこ屋\",\n        \"nekoya kaigetsudou\": \"猫屋懐月堂\",\n        \"nekoya-systemz\": \"猫屋システムズ\",\n        \"nekozame\": \"ネコザメ\",\n        \"nekozamedan\": \"ねこざめ団\",\n        \"nel\": \"ネル\",\n        \"nel-zel formula\": \"NEL-ZEL FORMULA\",\n        \"nemachizuki chaya\": \"寝待月茶屋\",\n        \"nemaki\": \"ねまき\",\n        \"nemokoroppu\": \"ネモコロップ\",\n        \"nemuke\": \"nemuke?\",\n        \"nemurineko\": \"ねむりねこ\",\n        \"nemutai neko\": \"眠たい猫\",\n        \"nengaranenjuu\": \"年がら年中\",\n        \"nenneko tanuki\": \"ねんねこたぬき\",\n        \"nenokuni\": \"ねのくに\",\n        \"neo frontier\": \"Neo Frontier\",\n        \"neo ultimate works\": \"ネオアルティメットワークス\",\n        \"neo wing\": \"Neo Wing\",\n        \"neo-de\": \"NEO-de\",\n        \"neondou\": \"ねおん堂\",\n        \"neoneet\": \"寝起新人\",\n        \"neonsign\": \"NeonSign\",\n        \"neoseporium\": \"NeoSeporium\",\n        \"neotenys\": \"ネオテニーズ\",\n        \"neotocite\": \"ネオトサイト\",\n        \"nephrite\": \"Nephrite\",\n        \"nerihibari\": \"ねりひばり\",\n        \"neron soft\": \"ネロンソフト\",\n        \"neta e okiba\": \"ネタ絵置き場\",\n        \"netorare masochist\": \"寝取られマゾヒスト\",\n        \"nettaigyo club\": \"熱帯魚倶楽部\",\n        \"neuromancer.\": \"Neuromancer.\",\n        \"neutral boy\": \"にゅーとらるぼぉい\",\n        \"new koubou\": \"NEW工房\",\n        \"new world\": \"NEW WORLD\",\n        \"new york spirits\": \"New York Spirits\",\n        \"new.\": \"NEW.\",\n        \"newberry transfer\": \"Newberry Transfer\",\n        \"newtype kenkyuujo\": \"にゅうたいぷ研究所\",\n        \"nexarius\": \"NEXARIUS\",\n        \"next\": \"N・E・X・T\",\n        \"nextage\": \"NEXTAGE\",\n        \"nexumi no sumika\": \"ねずみの住家\",\n        \"nexus koubou\": \"ネクサス工房\",\n        \"nezumitori\": \"ねズみ砦\",\n        \"nf121\": \"NF121\",\n        \"ngamura-san\": \"んがむらさん\",\n        \"ngl\": \"NGL\",\n        \"nguppu do m hakushaku\": \"んぐっぷ・ド・M伯爵\",\n        \"nhoooooooooooooo\": \"んほぉおおおぉおおおおおお♥おっ♥おっ♥\",\n        \"ni\": \"Ni\",\n        \"nibarera\": \"にばれら\",\n        \"nibiiro no sora\": \"鈍色の空\",\n        \"nibunn no ichi\": \"にぶんのいち!\",\n        \"nichijou superumisu\": \"日常すぺるみす\",\n        \"nico\": \"nico\",\n        \"nico plus\": \"Nico plus\",\n        \"nicolai\": \"NICOLAI\",\n        \"nicolion\": \"二コリオン\",\n        \"niesox\": \"niesox\",\n        \"nigakuriya\": \"ニガクリ屋\",\n        \"nigenige soldier\": \"逃げ逃げソルジャー\",\n        \"nigeru support\": \"にげるサポート\",\n        \"night ray kiss\": \"ナイトレイキス\",\n        \"night stalkers\": \"ないとすとーかーず\",\n        \"night stars\": \"ないと・すたーず\",\n        \"nightmare\": \"NIGHTMARE\",\n        \"nightride\": \"ナイトライド\",\n        \"nightstalker\": \"nightstalker\",\n        \"nigimitama no ya\": \"和魂屋\",\n        \"nigred\": \"ニグレド\",\n        \"nihon dandy\": \"日本ダンディ\",\n        \"nihon denga senmon gakkou\": \"日本電画専門学校\",\n        \"nihon sanjuufu\": \"二飜三十符\",\n        \"nihon sensou game kaihatsu\": \"日本戦争ゲーム開発\",\n        \"nihon shokushu shinkou kyoukai\": \"日本触手振興協会\",\n        \"nihon waru waru doumei\": \"日本ワルワル同盟\",\n        \"niikyuu\": \"にーきゅー\",\n        \"niimii dan\": \"にぃみぃ団\",\n        \"niizuma gaikokkaku\": \"新妻外骨格\",\n        \"niji no saki\": \"虹の先\",\n        \"niji seichou\": \"二次性徴\",\n        \"niji wo machinagara\": \"虹を待ちながら\",\n        \"nijigen complex\": \"にじげんCOMPLEX\",\n        \"nijigen koubou\": \"2次元工房\",\n        \"nijiiro denryuu\": \"虹色電流\",\n        \"nijiiro hyakka\": \"虹色百花\",\n        \"nijiiro mask\": \"虹色MASK\",\n        \"nijiiro suisho\": \"にじいろすいしょう\",\n        \"nijinoren\": \"虹のれん\",\n        \"nijiyome\": \"にじよめ\",\n        \"nijusei\": \"Nijusei\",\n        \"nikka\": \"NIKKA\",\n        \"niko\": \"NIKO\",\n        \"nikomark\": \"にこまあく\",\n        \"nikomutoko\": \"にこむとこ\",\n        \"nikopondo\": \"NIKOPONDO\",\n        \"niku jaguars\": \"NIKU・JAGUARS\",\n        \"niku no sashimi\": \"にくのさしみ\",\n        \"niku sushi\": \"肉寿司\",\n        \"nikukyu\": \"nikukyu\",\n        \"nikumanyaitimi\": \"にくまん屋一味\",\n        \"nikumomu\": \"ニクモム\",\n        \"nikutai gengo club\": \"肉体言語倶楽部\",\n        \"nikutaiha\": \"肉体派\",\n        \"nikuyakitei\": \"肉焼き亭\",\n        \"nikuyoku boutarou\": \"肉欲棒太郎\",\n        \"nil\": \"†NIL†\",\n        \"nilitsu haihan\": \"ニリツハイハン\",\n        \"nimame\": \"煮豆\",\n        \"nimensai\": \"二面賽\",\n        \"nine tail\": \"NINE TAIL\",\n        \"ninelives\": \"ninelives\",\n        \"ningen modoki\": \"人間モドキ\",\n        \"ningen tte iina\": \"にんげんっていいな\",\n        \"nininini\": \"にににに\",\n        \"ninjinpasta\": \"にんじんパスタ\",\n        \"ninniku batake\": \"にんにく畑\",\n        \"ninnindo\": \"にんにん堂\",\n        \"nino-kan\": \"にのカン\",\n        \"niponipo\": \"にぽにぽ\",\n        \"nipopo crisis\": \"ニポポクライシス\",\n        \"nihatsu shika ataranai\": \"2発しか当たらない\",\n        \"nipple mokuba\": \"にっぷる木馬\",\n        \"nippon teikoku toshokan\": \"日本帝國図書館\",\n        \"nipponbashi dennougumi\": \"ニッポンバシ電脳組\",\n        \"nir\": \"NiR\",\n        \"nirabatake\": \"にら畑\",\n        \"niratama\": \"にらたま\",\n        \"nirvana\": \"みるばーな\",\n        \"nirvana soft\": \"Nirvana Soft\",\n        \"nisemono\": \"偽もの\",\n        \"nisemonogoya\": \"ニセもの小屋\",\n        \"nisepakudo\": \"偽朴堂\",\n        \"nisha takuitsu\": \"二沙択一\",\n        \"nisin sansin\": \"にしん三振\",\n        \"nishiogi koubou\": \"西荻工房\",\n        \"nita ken\": \"ニタ研\",\n        \"nita-kane\": \"煮た鐘\",\n        \"nitaroutei\": \"ニタロウ亭\",\n        \"nicchi sangyou\": \"にっちさんぎょう\",\n        \"nitiniti sowa\": \"日々草話\",\n        \"niwakakamikiriyamodoki\": \"ニワカカミキリヤモドキ\",\n        \"niwatori\": \"にわとり\",\n        \"niwatoritowani\": \"にわとりとわに\",\n        \"niyatto company\": \"にやっとカンパニー\",\n        \"niyodo blue\": \"NIYODO BLUE\",\n        \"nizeru\": \"煮ぜる\",\n        \"niziyumedokoro\": \"虹夢処\",\n        \"nna timun\": \"んつぁてぃむん\",\n        \"nnz dan\": \"NNZ団\",\n        \"no actor\": \"NO ACTOR\",\n        \"no brand\": \"NO BRAND\",\n        \"no color\": \"No Color\",\n        \"no future\": \"No Future\",\n        \"no mercy\": \"No Mercy\",\n        \"no need\": \"NO NEED\",\n        \"no plan\": \"No Plan\",\n        \"no strike\": \"の～すとらいく\",\n        \"no such agency\": \"No Such Agency\",\n        \"no-plan\": \"No-Plan\",\n        \"no.3\": \"No.3\",\n        \"no3\": \"No3\",\n        \"noa\": \"noa\",\n        \"noa no sasabune\": \"のあのささぶね\",\n        \"noantica\": \"noantica\",\n        \"nobishiro\": \"のびしろ\",\n        \"nobita graph\": \"ノビタグラフ\",\n        \"nocohica\": \"nocohica\",\n        \"nocturnum\": \"ノクトルム\",\n        \"nodobotoke kingyo\": \"のどぼとけきんぎょ\",\n        \"noelvu\": \"ノエルヴ\",\n        \"noesis\": \"Noesis\",\n        \"noibara-en\": \"ノイバラ園\",\n        \"noirsoft\": \"ノアールソフト\",\n        \"noisy crown\": \"ノイジークラウン\",\n        \"noix\": \"ノア\",\n        \"nokishiki-box\": \"のき式BOX\",\n        \"nokishita-ya\": \"ノキシタ屋\",\n        \"nomad\": \"ノマド\",\n        \"nomucchi\": \"のむっち\",\n        \"nomugicha\": \"野麦茶\",\n        \"non brand\": \"Non_Brand\",\n        \"non non palette\": \"のんのんパレット\",\n        \"nonaka logic\": \"野中ロジック\",\n        \"nonbiri nonbiri\": \"のんびり のんびり\",\n        \"nonchalant\": \"のんしゃらん\",\n        \"nonono tsuushin\": \"ののの通信\",\n        \"nonoya\": \"のの屋\",\n        \"nonsense\": \"Nonsense\",\n        \"nonsugarloess\": \"のんしゅがーれす\",\n        \"nopland\": \"noPland\",\n        \"noppera koubou\": \"のっぺら工房\",\n        \"nora\": \"野良\",\n        \"norakurari.\": \"のらくらり。\",\n        \"noraneko koubou\": \"ノラ猫工房\",\n        \"noranoma\": \"noranoma\",\n        \"noraya\": \"のら屋\",\n        \"nori tokumori\": \"海苔特盛\",\n        \"noriajou\": \"のりあ城\",\n        \"norihee ginjou\": \"のりへぇ吟醸\",\n        \"norinori seika\": \"のりのり製菓\",\n        \"noritama-gozen\": \"のりたま御膳\",\n        \"north carolina power\": \"NORTH CAROLINA POWER\",\n        \"north70\": \"North70\",\n        \"nosebleed\": \"NOSEBLEED\",\n        \"nosekichiku\": \"野石竹\",\n        \"noshiki\": \"の式\",\n        \"nostalgic syndrome\": \"ノスタルジックシンドローム\",\n        \"not\": \"NOT\",\n        \"notari\": \"のたり\",\n        \"notears\": \"NoTears\",\n        \"notes.\": \"Notes.\",\n        \"nothing-plan\": \"Nothing-Plan\",\n        \"notonote\": \"NOTONOTE\",\n        \"notorious\": \"NOTORIUS\",\n        \"nottaya\": \"のっ田屋\",\n        \"noujiru teishokuya\": \"のぅじる定食屋\",\n        \"nounai ekijiru\": \"脳内液汁\",\n        \"nounai pg\": \"脳内PG\",\n        \"nounai zayaku\": \"脳内座薬\",\n        \"nounaihokan\": \"脳内補完\",\n        \"nounanka sedai\": \"脳軟化世代\",\n        \"noushuku kangen\": \"脳縮還元\",\n        \"nouzui majutsu\": \"脳髄魔術\",\n        \"novia\": \"Novia\",\n        \"nowhere\": \"NOWHERE\",\n        \"noxious plant\": \"noxious plant\",\n        \"noyau\": \"noyau\",\n        \"nozarashi\": \"のざらし\",\n        \"nozubeya\": \"野図部屋\",\n        \"nozzo gt\": \"のっつぉGT\",\n        \"np virus jouryuusho\": \"NPウイルス蒸留所\",\n        \"ns2k\": \"ns2k\",\n        \"dondondon\": \"どんどんどん\",\n        \"nt confess\": \"NTconfess\",\n        \"ntlabo\": \"NTラボ\",\n        \"ntr king\": \"NTR キング\",\n        \"ntr suishin iinkai\": \"NTR推進委員会\",\n        \"ntr system\": \"NTRシステム\",\n        \"ntrbear\": \"Ntrbear\",\n        \"nu\": \"Nu\",\n        \"nui gohan\": \"ぬいごはん\",\n        \"nuigurumiya-san\": \"ぬいぐるみやさん\",\n        \"nuit\": \"nuit\",\n        \"nuite amore\": \"抜いて☆アモーレ!\",\n        \"nukarumi\": \"泥濘\",\n        \"nukidamari\": \"ヌキダマリ\",\n        \"nukidokoro.\": \"ぬきどころ。\",\n        \"nukkoru\": \"ぬっこる\",\n        \"nukomashi dou\": \"ぬこまし堂\",\n        \"nukotigura\": \"ぬこちぐら\",\n        \"nukoya\": \"ぬこや\",\n        \"nul neverland\": \"ヌルネバーランド\",\n        \"null mayu\": \"NULLまゆ\",\n        \"null poplus\": \"ぬるぽぷらす\",\n        \"num\": \"#NUM!\",\n        \"numachi\": \"沼地\",\n        \"numadax\": \"ヌマダックス\",\n        \"number 910\": \"910号室\",\n        \"nun\": \"ヌン\",\n        \"nuno no ie\": \"布の家\",\n        \"nuno to kami\": \"布と紙\",\n        \"nupuryu no sato\": \"ぬぷ竜の里\",\n        \"nurebairo\": \"濡羽色\",\n        \"nurume\": \"ぬるめ\",\n        \"nurunuru 30 percent\": \"ぬるぬる30%\",\n        \"nurunurunerune\": \"ぬるぬるねるね\",\n        \"nv3offline\": \"NV3OFFLINE\",\n        \"nw-project\": \"NW-project\",\n        \"nwa\": \"nWa\",\n        \"nwonyo pasun\": \"んをんよ・ぱすん\",\n        \"nxcthermit\": \"N×Cてるみっと\",\n        \"nyaa nyaa koushinjo\": \"にゃ～にゃ～興信所\",\n        \"nyaa. to hidamari\": \"にゃー。とひだまり\",\n        \"nyagos\": \"にゃごズ\",\n        \"nyake\": \"NYAKE\",\n        \"nyakko-ya\": \"にゃっこ屋\",\n        \"nyala ponga\": \"ニャリャポンガ\",\n        \"nyamo nyamo\": \"にゃもにゃも\",\n        \"nyan nyan festival\": \"ニャンニャンフェスティバル\",\n        \"nyan nyan nyan\": \"にゃんにゃんにゃん!\",\n        \"nyan-nyan-hanten\": \"娘娘飯店\",\n        \"nyanderful vegitarian\": \"にゃんだふるべじたりあん\",\n        \"nyanko no me\": \"にゃんこの目\",\n        \"nyankopi\": \"にゃんこぴぃ\",\n        \"nyankoromochimochi\": \"にゃんころもちもち\",\n        \"nyanmilla\": \"ニャンミラ\",\n        \"nyannyan club\": \"娘々倶楽部\",\n        \"nyanpunibocchi\": \"にゃんぷにぼっち\",\n        \"nyaro kizoku\": \"にゃろ貴族\",\n        \"nyawatesou\": \"にゃわて荘\",\n        \"nylon 100\": \"ナイロン100%\",\n        \"nymph\": \"Nymph\",\n        \"nymphy fine fresh\": \"Nymphy Fine Fresh\",\n        \"nyoninka kenkyuujo\": \"女人化研究所\",\n        \"nyoro junction\": \"にょろじゃんくしょん\",\n        \"nyotai kougaku kenkyuujo\": \"女体光学研究所\",\n        \"nyotaian\": \"女体庵\",\n        \"nyuuface\": \"乳ふぇいす\",\n        \"nyuuseihin\": \"乳性貧\",\n        \"o-penguin\": \"俺企鵝\",\n        \"o.riginal brand\": \"O.RIginal brand\",\n        \"o157\": \"O157\",\n        \"oasis plus\": \"Oasis+\",\n        \"oba-q honpo qt\": \"OBA-Q HONPO QT\",\n        \"obake candle\": \"おばけキャンドル\",\n        \"oberkochen\": \"オーバーコッヘン\",\n        \"oboro\": \"朧\",\n        \"oboro hyakuhachishiki\": \"朧百八式\",\n        \"obsession.\": \"おぶせっしょん!\",\n        \"obsidian order\": \"Obsidian Order\",\n        \"obumanjuu\": \"おぶまんじゅう\",\n        \"oc5\": \"oC5\",\n        \"ocarina\": \"おかりな\",\n        \"occhoko-cho\": \"OCCHOKO-CHO\",\n        \"ocelot\": \"オセロット\",\n        \"ochadukeya sandaime\": \"お茶漬け屋三代目\",\n        \"ochaocha honpo\": \"おちゃおちゃ本舗\",\n        \"ochawannomushi\": \"おちゃわんのむし\",\n        \"ochaya\": \"御茶屋\",\n        \"ochigan\": \"堕ち玩\",\n        \"ochikochitei\": \"おちこち亭\",\n        \"ochitsu daisensei\": \"おちつ大先生\",\n        \"ocojoco\": \"ocojoco\",\n        \"odaku\": \"oda九\",\n        \"oden sensei\": \"汚電せんせい\",\n        \"oden-ya\": \"おでんや\",\n        \"odenden\": \"おでんでん\",\n        \"odin\": \"odin\",\n        \"odoshiro canvas\": \"おどしろキャンバス\",\n        \"oekaki seikatsu nikki\": \"お絵かき生活日記\",\n        \"oeuf\": \"Oeuf\",\n        \"off side\": \"OFF SIDE\",\n        \"offaria\": \"offaria\",\n        \"office amagasa\": \"雨傘日傘事務所\",\n        \"office baku\": \"オフィス・バク\",\n        \"office fairy\": \"office fairy\",\n        \"office neko\": \"Office猫\",\n        \"ofuro works\": \"おふろワークス\",\n        \"ofuroya\": \"オフロ屋\",\n        \"ofuzake tale\": \"お巫山戯テイル\",\n        \"ogagaga-sou\": \"おががが荘\",\n        \"ogawa jinguu\": \"小川神宮\",\n        \"ogawaya\": \"小河屋\",\n        \"ogeretsu-dan\": \"おげれつ団\",\n        \"ogerwillow\": \"オーガウィロウ\",\n        \"ogofwitch\": \"OgOfWitch\",\n        \"ogura tankenka\": \"小倉探検家\",\n        \"oguradou\": \"小倉堂\",\n        \"oh-banzai studio\": \"おばんざい☆スタジオ\",\n        \"ohagi.\": \"おはぎ。\",\n        \"ohakotomeno\": \"おはことめの\",\n        \"oharaibako\": \"御祓箱\",\n        \"ohige\": \"おひげ\",\n        \"ohka works\": \"おーかわーくす!\",\n        \"ohnegs\": \"オーネグス\",\n        \"ohsaka spirits\": \"大坂魂\",\n        \"oideyasu honpo\": \"おいでやす本舗\",\n        \"oilan\": \"oilan\",\n        \"oimoto\": \"おいもと\",\n        \"oinari summer\": \"お稲荷Summer\",\n        \"oishii oniku\": \"おいしいお肉\",\n        \"oishii oniku.\": \"おいしいお肉。\",\n        \"oishii udon\": \"おいしいうどん\",\n        \"oiyoko\": \"オイヨコ\",\n        \"ojin koukoku\": \"オジン公国\",\n        \"ojmomo\": \"OJmomo\",\n        \"okachimentaiko\": \"おかちめんたいこ\",\n        \"okameya honpo\": \"おかめや本舗\",\n        \"okami kaikou\": \"おかみかいこう\",\n        \"okashi na denpa\": \"お可視な電波\",\n        \"okashi no ie\": \"お瑕疵の家\",\n        \"okashi senmonten\": \"おかしせんもんてん\",\n        \"okashimo\": \"おかしも\",\n        \"okatoraya\": \"岡虎屋\",\n        \"okayushop\": \"OkayuShop\",\n        \"okazu club\": \"Okazu Club\",\n        \"okazu company\": \"おかずカンパニー\",\n        \"okazu musume\": \"オカズ娘\",\n        \"okett\": \"okett\",\n        \"okina flying factory\": \"Okina Flying Factory\",\n        \"okina keikaku\": \"翁計画\",\n        \"okina utsuwa\": \"大きな器\",\n        \"okinawa chinkosuu\": \"沖縄ちんこすう\",\n        \"okinawa taieki gunjinkai\": \"沖縄体液軍人会\",\n        \"oko-san\": \"おこさん\",\n        \"okojo no machi\": \"オコジョの街\",\n        \"okojodou\": \"御娘女堂\",\n        \"okome rice don\": \"おこめライス丼\",\n        \"okosama lunch\": \"お子様ランチ\",\n        \"okosama pancake\": \"お子様パンケーキ\",\n        \"okosamastar company\": \"オコサマ・スター社\",\n        \"okottei\": \"おこっ亭\",\n        \"okt\": \"OKT!\",\n        \"oktm\": \"OKTM\",\n        \"oku no hosomichi\": \"奥の細道\",\n        \"ol\": \"OL\",\n        \"old school academy\": \"オールドスクールアカデミー\",\n        \"old weapon\": \"おーるどうぇぽん\",\n        \"oldwiseman\": \"Oldwiseman\",\n        \"ole-m\": \"OLE-M\",\n        \"om\": \"おっえむ\",\n        \"omame cyokueitenn\": \"おまめ直営店\",\n        \"omaru bokujou\": \"おまる牧場\",\n        \"omega 2-d\": \"OMEGA 2-D\",\n        \"omega circuit\": \"おめがさーきっと\",\n        \"omega house\": \"おめがはうす\",\n        \"omikidokkuri\": \"オミキドックリ\",\n        \"omizuya\": \"おみずや\",\n        \"ommed\": \"オムメド\",\n        \"omocha kaden\": \"玩具家電\",\n        \"omochaya meguri\": \"おもちゃやめぐり\",\n        \"omochi bazooka\": \"おもち☆バズーカ\",\n        \"omochi soft\": \"おもちそふと\",\n        \"omochibako no text log\": \"おもちばこのテキストログ\",\n        \"omodume\": \"想詰め\",\n        \"omoiukabi enikki\": \"思い浮かび絵日記\",\n        \"omoshiro burger\": \"おもしろバーガー\",\n        \"omoshiro usagi\": \"オモシロウサギ\",\n        \"omoya\": \"母屋\",\n        \"on my way\": \"on my way\",\n        \"on your mark\": \"ON YOUR MARK\",\n        \"on-show\": \"怨床\",\n        \"onagoya\": \"おなご屋\",\n        \"onaka ga suita\": \"おなかがすいた\",\n        \"onbundou\": \"音文堂\",\n        \"once only\": \"Once Only\",\n        \"one week holiday\": \"One Week Holiday\",\n        \"one-seven\": \"ONE-SEVEN\",\n        \"one-shot\": \"ONE-SHOT\",\n        \"one-up\": \"One-up\",\n        \"oneashi\": \"オネアシ\",\n        \"oneekyou\": \"御姉狂\",\n        \"oneforall\": \"わんふぉーおーる\",\n        \"onegross\": \"ONEGROSS\",\n        \"onemu hormone\": \"おねむホルモン\",\n        \"ongr\": \"ongr\",\n        \"oni kizoku\": \"鬼貴族\",\n        \"onigiriz\": \"ONIGIRIズ\",\n        \"onikibitou\": \"鬼きび党\",\n        \"oninoe\": \"鬼ノ餌\",\n        \"onna ni yoru onna e no ryoujoku\": \"女による女への陵辱\",\n        \"onnanoko himitsu seisan koujou\": \"女の子秘密生産工場\",\n        \"onnanoko payapaya\": \"女の子パヤパヤ\",\n        \"onoderasanchi\": \"おのでらさん家\",\n        \"onoe network\": \"小乃枝電網\",\n        \"onomatopoeia\": \"オノマトピア\",\n        \"onpuman\": \"オンプマン\",\n        \"onsoku ebifly\": \"音速エビフライ\",\n        \"onsoku soukou\": \"音速走行\",\n        \"onsoku ubaguruma\": \"音速うばぐるま\",\n        \"onyitei\": \"鬼ぃ亭\",\n        \"onzskds\": \"御曹司ください\",\n        \"ooarai nourakudou\": \"大洗能楽堂\",\n        \"oobae toudai\": \"オオバエ灯台\",\n        \"oobeya potechi house\": \"大部屋ポテチハウス\",\n        \"oogane farm\": \"大金ファーム\",\n        \"ooitei\": \"大井亭\",\n        \"oojinushi\": \"おおじ主\",\n        \"ookami shoujo yuugi dan\": \"狼少女遊戯団\",\n        \"ookina kodomo no omocha bako\": \"大きな子供のおもちゃ箱\",\n        \"oomorian\": \"大森庵\",\n        \"ootsuku shouji\": \"大津久商事(有)\",\n        \"oozora kaiko\": \"大空カイコ\",\n        \"operating room\": \"Operating Room\",\n        \"operation\": \"operatioN\",\n        \"operation panel\": \"操作パネル\",\n        \"oppai baibai\": \"おっぱいばいばい\",\n        \"oppai click\": \"おっぱいクリック\",\n        \"oppai guild\": \"ぱいギル\",\n        \"oppai mochi\": \"おっぱい餅\",\n        \"opt\": \"OPT\",\n        \"optimism small country\": \"楽観主義小国\",\n        \"oracle eggs\": \"Oracle Eggs\",\n        \"orange blossom\": \"おれんじ☆ぶろっさむ\",\n        \"orange chocolat\": \"Orange Chocolat\",\n        \"orange crown\": \"Orange Crown\",\n        \"orange gallery henshuubu\": \"オレンジ・ギャラリー編集部\",\n        \"orange girl\": \"orange girl\",\n        \"orange mill\": \"オレンジミル\",\n        \"orange peel\": \"Orange Peel\",\n        \"orange piece\": \"Orange Piece\",\n        \"orange powder\": \"おらんげぱうだー\",\n        \"orange typhoon\": \"オレンジタイフーン\",\n        \"orangelepsy\": \"オレンジレプシー\",\n        \"ore dake ga tokusuru onsei koubou\": \"俺だけが得する音声工房\",\n        \"ore jon\": \"俺JON\",\n        \"oreaji\": \"俺味\",\n        \"oregun\": \"俺軍\",\n        \"oreichigo\": \"俺苺\",\n        \"oremuha x\": \"オレムハX\",\n        \"orenjiru\": \"おれんジル\",\n        \"oretachi misnon ikka\": \"俺たちミスノン一家\",\n        \"oreteki shikou\": \"俺的嗜好\",\n        \"organico\": \"おるがにこ\",\n        \"orgasmpotential\": \"orgasmpotential\",\n        \"oriental lattice\": \"Oriental Lattice\",\n        \"origami farm\": \"折纸牧场\",\n        \"orihime-bunko\": \"織姫文庫\",\n        \"orubara\": \"オルバラ\",\n        \"orukaniumu-labo\": \"orukaniumu-labo\",\n        \"orz\": \"orz\",\n        \"orz commushoz\": \"Orzコミュショーズ\",\n        \"os tokku\": \"OS特区\",\n        \"osaka lucha libre\": \"大阪ルチャリブレ\",\n        \"osakana planet\": \"おさかなプラネット\",\n        \"osakana tabeyo\": \"おさかなたべよ\",\n        \"osanagokoro no kimi ni\": \"幼心の君に\",\n        \"osaru no noumiso\": \"お猿の脳みそ\",\n        \"osaru-san panic\": \"おさるさんパニック\",\n        \"oshigoto no jikan\": \"おしごとのぢかん\",\n        \"oshikko channel\": \"おしっ娘ちゃんねる\",\n        \"oshiruko kan\": \"おしるこ缶\",\n        \"oshiruko sentimental\": \"おしるこセンチメンタル\",\n        \"oshisyo-san\": \"おししょーさんっ\",\n        \"osiri\": \"osiri\",\n        \"osiris\": \"オシリス\",\n        \"osova\": \"おそば\",\n        \"osterei\": \"OSTEREi\",\n        \"osu to mesu\": \"♂×♀オスとメス\",\n        \"ota office\": \"OTA OFFICE\",\n        \"otafukutei\": \"おたふく亭\",\n        \"otaku no youjinbou\": \"オタクの用心棒\",\n        \"ote\": \"お手っ\",\n        \"otenkiya\": \"おてんき屋\",\n        \"otentomaru\": \"オテント丸\",\n        \"othello ice\": \"オセロアイス\",\n        \"oto\": \"OTO\",\n        \"otogi no kuni no soapland\": \"おとぎの国のソープランド\",\n        \"otogiya\": \"御伽屋\",\n        \"otohime\": \"おとひめ\",\n        \"otohime 49-gou\": \"オトヒメ49号\",\n        \"otohimedou\": \"乙姫堂\",\n        \"otoko no roman\": \"男のROMAN\",\n        \"otokonoko club\": \"おとこの娘倶楽部\",\n        \"otokonoko daisuki iinchou\": \"男の娘大好き委員長\",\n        \"otokonoko soft\": \"男の娘ソフト\",\n        \"otokonoko to onnanoko\": \"男の子と女の子\",\n        \"otome half line\": \"乙女ハーフライン\",\n        \"otome no eden\": \"乙女のエデン\",\n        \"otomeza\": \"処女座\",\n        \"otona no douraku\": \"大人の道楽\",\n        \"otona no youchien\": \"大人の幼恥園\",\n        \"otona teikoku\": \"オトナテイコク\",\n        \"otoreko\": \"OTOREKO\",\n        \"otousan\": \"尾刀産\",\n        \"otto\": \"OTTO\",\n        \"otukimidango\": \"お月見団子\",\n        \"oudon shikoshiko\": \"おうどん☆シコシコ\",\n        \"ougi production\": \"扇プロダクション\",\n        \"ougi ranmaru\": \"扇蘭丸\",\n        \"ougon no yofuke dan\": \"黄金の夜更け団\",\n        \"oumi shouan\": \"近江小庵\",\n        \"ourakutei\": \"王烙亭\",\n        \"ourindou\": \"王林堂\",\n        \"out of mind\": \"Out of Mind\",\n        \"out of service\": \"OUT of SERVICE\",\n        \"out-of-date\": \"アウトオブデイト\",\n        \"outflow\": \"OUTFLOW\",\n        \"outrate\": \"アウトレート\",\n        \"outroad\": \"あうとろーど\",\n        \"ovacas\": \"OVACAS\",\n        \"over drive\": \"OVER DRIVE\",\n        \"over3\": \"Over3\",\n        \"overcrowd\": \"オーバークラウド\",\n        \"overdose\": \"オーバードーズ\",\n        \"overflow\": \"オーバーフロー\",\n        \"overgrown generations\": \"OVERGROWN GENERATIONS\",\n        \"overload\": \"おーばーろーど\",\n        \"owatasha\": \"おわた社\",\n        \"oxg\": \"OXG\",\n        \"oxide.lab\": \"OXIDE.Lab\",\n        \"oxydan\": \"おきし団\",\n        \"oyajiji gumi\": \"オヤジジ組\",\n        \"oyakodon\": \"親子丼\",\n        \"oyasumi disco\": \"おやすみDISCO\",\n        \"oyasumi kobe gyuu\": \"おやすみ神戸牛\",\n        \"oyasumi switch\": \"オヤスミスイッチ\",\n        \"oyasuminasai\": \"おやすみなさい\",\n        \"oyatsukan\": \"おやつ缶\",\n        \"oz project\": \"Oz Project\",\n        \"ozashiki\": \"オザ式\",\n        \"ozawa kobo\": \"緒沢工房\",\n        \"ozen shiryoushitsu\": \"御前資料室\",\n        \"ozone\": \"おぞね\",\n        \"p freak\": \"Pふりーく\",\n        \"p herb\": \"Pハーブ\",\n        \"p kikaku\": \"P企画\",\n        \"p-850\": \"P-850\",\n        \"p-forest\": \"P-FOREST\",\n        \"p-lemo\": \"ぴぃれも\",\n        \"p-me\": \"P-ME\",\n        \"p-point\": \"P-POINT\",\n        \"p.a. project\": \"P.A.Project\",\n        \"p.p.p\": \"P.P.P\",\n        \"p2paramount\": \"P2Paramount\",\n        \"pa-pu-\": \"ぱーぷー\",\n        \"pa.da.wan\": \"Pa・Da・ワン\",\n        \"pachipachi soft\": \"ぱちぱちそふと\",\n        \"pag-pag-magu\": \"ぱぐぱぐまぐぅ\",\n        \"pagumiee\": \"パグミィ\",\n        \"paintingbird\": \"PaintingBird\",\n        \"pairesshu\": \"Paiれっしゅ\",\n        \"pajamas ex\": \"ぱじゃまエクスタシー\",\n        \"pajamas soft\": \"ぱじゃまソフト\",\n        \"pakupaku\": \"ぱくぱく\",\n        \"pakupikubon\": \"パクピクボン\",\n        \"palace village ke\": \"パレスヴィレッジ家\",\n        \"pale scarlet\": \"Pale Scarlet\",\n        \"palette\": \"ぱれっと\",\n        \"palette enterprise\": \"Palette Enterprise\",\n        \"pallet box\": \"Pallet Box\",\n        \"palm sunday\": \"パームサンデー\",\n        \"palpiteria\": \"パルピテリア\",\n        \"pamunosu\": \"ぱむの巣\",\n        \"pan 2\": \"パン2\",\n        \"pan koubou\": \"パン工房\",\n        \"pan no mimi\": \"パンノミミ\",\n        \"pan to butterfly.\": \"パンとバタフライ。\",\n        \"panbai\": \"PANBAI\",\n        \"panda 4gou\": \"パンダ4号\",\n        \"panda pro\": \"ぱんだぷろ\",\n        \"panda scanners\": \"パンダスキャナーズ\",\n        \"panicerr\": \"パニッカー\",\n        \"panier\": \"パニエ\",\n        \"panjandrum\": \"Panjandrum\",\n        \"pankoppe\": \"ぱんこっぺ\",\n        \"pannacotta\": \"Pannacotta\",\n        \"panoramakan\": \"ぱのらま館\",\n        \"panorama tsuushinkyoku\": \"パノラマ通信局\",\n        \"panteitei\": \"PanTei亭\",\n        \"pantie party project\": \"Pantie Party Project\",\n        \"pantsu kakumei.\": \"パンツ革命。\",\n        \"pantsu koubou\": \"ぱんつ工房\",\n        \"pantwo\": \"pantwo\",\n        \"panty stocking\": \"Panty Stocking\",\n        \"panya no enzo\": \"パン屋のエンツォ\",\n        \"pao pao\": \"PAO・PAO\",\n        \"paopaship\": \"ぱぉぱしっぷ\",\n        \"papamilk\": \"Papamilk\",\n        \"papaya milk\": \"ぱぱいや・みるく\",\n        \"papepox2\": \"PAPEPOX2\",\n        \"paper cup and adult key\": \"Paper Cup and Adult Key\",\n        \"paper-doll\": \"Paper-Doll\",\n        \"papercrown\": \"ぺぱくら\",\n        \"papered armor\": \"紙装甲\",\n        \"parade\": \"Parade\",\n        \"paradigm conflict\": \"PARADIGM CONFLICT\",\n        \"paradis\": \"PaRaDis\",\n        \"paradise city\": \"ぱらだいすCity\",\n        \"paradise d products\": \"PARADISED PRODUCTS\",\n        \"paradise jack\": \"パラダイスジャック\",\n        \"paradise lost\": \"パラダイス・ロスト\",\n        \"paradisegom\": \"ParadiseGom\",\n        \"paraiso\": \"ぱらいそ\",\n        \"paraiso saigu\": \"ぱらゐそ祭具\",\n        \"paraiso shugi\": \"パライソ主義\",\n        \"parallel area\": \"パラレルエリア\",\n        \"parameter\": \"パラミター\",\n        \"parasol\": \"Parasol\",\n        \"paret\": \"paret\",\n        \"parin to wareru\": \"パリンと割れる\",\n        \"pariparicandy\": \"ぱりぱりきゃんでぃー\",\n        \"parity nyuu\": \"ぱりてぃー・にゅー\",\n        \"park popcorn\": \"パークポップコーン\",\n        \"part k\": \"Part K\",\n        \"parthenon\": \"パルテノン\",\n        \"particle\": \"ぱーてぃくる\",\n        \"party nights\": \"パーリィナイツ\",\n        \"parukusu\": \"ぱるくす\",\n        \"parupunte\": \"ぱるぷんて\",\n        \"passing shower\": \"ぱっしんぐしゃわー\",\n        \"past\": \"Past\",\n        \"pastel bitch\": \"パステルビッチ\",\n        \"patio canvas\": \"ぱてぃお☆きゃんばす\",\n        \"patoto\": \"PATOTO\",\n        \"patricide\": \"PATRICIDE\",\n        \"pavington\": \"Pavington\",\n        \"pazooka\": \"Pazooka\",\n        \"pazzo s.p.\": \"Pazzo S.P.\",\n        \"pe theta\": \"Peθ\",\n        \"pe.\": \"ぺ。\",\n        \"peach cat\": \"PEACH CAT\",\n        \"peach fox\": \"peach fox\",\n        \"peach kupaa\": \"ピーチクパァ\",\n        \"peach palette\": \"ぴーちパレット\",\n        \"peach store\": \"ぴーちストア\",\n        \"peachbooks hachinohe-ten\": \"PEACHBOOKS八戸店\",\n        \"peachbreath\": \"PeachBreath\",\n        \"peachpulsar\": \"peachpulsar\",\n        \"peaky\": \"ピーキー\",\n        \"pecan\": \"ピーカン\",\n        \"peco poco\": \"ぺこぽこ\",\n        \"peeping phantom\": \"Peeping Phantom\",\n        \"pegasisters\": \"ペガシスターズ\",\n        \"peke no hima\": \"ぺけの閑\",\n        \"peko renmei\": \"ぺこ連盟\",\n        \"pekoe\": \"Pekoe\",\n        \"pell-mell works\": \"PELL-MELL WORKS\",\n        \"pelpan omt\": \"ぺるぱんOMT\",\n        \"peneya\": \"ぺね屋\",\n        \"penguin teikoku\": \"ペンギン帝国\",\n        \"penguindou\": \"筆吟堂\",\n        \"penpen mushi no koucha\": \"ぺんぺん虫の紅茶\",\n        \"penpengusa club\": \"ペンペン草くらぶ\",\n        \"penteru kohboh\": \"ぺんてる工房\",\n        \"peony\": \"ピオニー\",\n        \"peperoncino\": \"ぺぺろんちーの\",\n        \"perceptron\": \"ぱーせぷとろん\",\n        \"perestroika\": \"ピリストローイカ\",\n        \"perfect sea\": \"PERFECT SEA\",\n        \"performance\": \"パーフォーマンス\",\n        \"perilab\": \"ぺりラボ\",\n        \"pero\": \"Pero\",\n        \"peromuji-ya\": \"ぺろむじ屋\",\n        \"perosikos\": \"ペロシコス\",\n        \"persicaria eater\": \"persicaria eater\",\n        \"personal color\": \"PERSONAL COLOR\",\n        \"personal space\": \"personal space\",\n        \"pervert\": \"pervert\",\n        \"petapan\": \"ぺたパン\",\n        \"petica\": \"ペチカ\",\n        \"petit bunny\": \"Petit Bunny\",\n        \"petit ego\": \"ぷちえご!\",\n        \"petit machiya\": \"ぷち町屋\",\n        \"petite x cerisier\": \"Petite＊Cerisier\",\n        \"petit pack\": \"Petit Pack\",\n        \"peto-ya\": \"ぺと屋\",\n        \"pets\": \"PETS\",\n        \"pettanko\": \"ペッたんコっ!\",\n        \"pez.\": \"pez.\",\n        \"pfactory\": \"Pfactory\",\n        \"phantom vibration syndrome\": \"幻想振動症候群\",\n        \"phantomcross\": \"ファントムクロス\",\n        \"phantomsoft\": \"ファントムソフト\",\n        \"phase nine\": \"PHASE NINE\",\n        \"phenomena\": \"PHENOMENA\",\n        \"pheromone lover 358\": \"フェロモンラバー358\",\n        \"philippiana honpo\": \"フィリピアナ本舗\",\n        \"phlodexy\": \"Phlodexy\",\n        \"phoenix project\": \"PHOENIX PROJECT\",\n        \"photonix\": \"PHOTONIX\",\n        \"physalis\": \"PHYSALIS\",\n        \"pi o 2\": \"πO2\",\n        \"pianissimo\": \"ピアニッシモ\",\n        \"piccalilli\": \"ピッカリリ\",\n        \"piccolo studio\": \"ピッコロ工房\",\n        \"pichi pichi garou r\": \"ぴちぴち画廊R\",\n        \"pickled teishoku\": \"ピクルス定食\",\n        \"pico pico labyrinth\": \"ピコピコ★ラビリンス\",\n        \"picopicosoft\": \"PICOPICOSOFT\",\n        \"picosolenodon\": \"ピコソレノドン\",\n        \"picotama.\": \"ぴこたま。\",\n        \"picricacid\": \"ぴくりんさん\",\n        \"pictlier\": \"ぴくとりえ\",\n        \"piepillow\": \"ピエピロー\",\n        \"pierre\": \"PIERRE\",\n        \"pierrot\": \"Pierrot\",\n        \"pigeon blood\": \"鳩血\",\n        \"piggstar\": \"PIGGSTAR\",\n        \"pignon\": \"pignon\",\n        \"pihii shobou\": \"ぴひー書房\",\n        \"pikopiko saber\": \"ピコピコサーベル\",\n        \"pikopikotei\": \"ぴこぴこ亭\",\n        \"pil-vamp\": \"PIL-VAMP\",\n        \"pile driver\": \"PILE DRIVER\",\n        \"pilen\": \"PileN\",\n        \"pillow works\": \"PILLOW WORKS\",\n        \"pilotstar\": \"Pilotstar\",\n        \"pin-13\": \"ピンのワンスリー\",\n        \"pin-point\": \"ピンポイント\",\n        \"pinacotheca\": \"Pinacotheca\",\n        \"pine\": \"ぱいん\",\n        \"pine candy\": \"PINE CANDY\",\n        \"pineapple candy\": \"パイナップルキャンディ\",\n        \"pinpoint\": \"ピンポイント\",\n        \"pink bat\": \"ピンクバット\",\n        \"pink cherry cocktail\": \"Pink Cherry Cocktail\",\n        \"pink chuchu\": \"PINK CHUCHU\",\n        \"pink cloud\": \"ピンククラウド\",\n        \"pink december\": \"Pink December\",\n        \"pink kitten\": \"ぴんくのこねこ\",\n        \"pink no chao\": \"PINKのCHAO!\",\n        \"pink no jaguchi\": \"ピンクの蛇口\",\n        \"pink pepper\": \"Pink pepper\",\n        \"pink pineapple\": \"ピンクパイナップル\",\n        \"pink poison\": \"PINK POISON\",\n        \"pink revolver\": \"ピンクリボルバー\",\n        \"pink rose\": \"PINK ROSE\",\n        \"pink thin cellophane\": \"pink thin cellophane\",\n        \"pink tissue\": \"Pink Tissue\",\n        \"pink-noise\": \"pink-noise\",\n        \"pink.in black\": \"PINK.in BLACK\",\n        \"pinkbell software\": \"PINKBELL SOFTWARE\",\n        \"pinke\": \"ぴんけ\",\n        \"pinkharlem\": \"PinkHarlem\",\n        \"pinkjoe\": \"pinkjoe\",\n        \"pinktips.info\": \"pinktips.info\",\n        \"pinky girl\": \"PINKY GIRL\",\n        \"pintsize\": \"ぱいんとさいず\",\n        \"pipapipa9\": \"pipapipa9\",\n        \"pipasuta\": \"ぴぱスタ\",\n        \"pipiya\": \"ぴぴや\",\n        \"pirates patrol\": \"パイレーツパトロール\",\n        \"pirisyuga\": \"ぴりしゅが\",\n        \"piropiro\": \"PIROPIRO\",\n        \"piropiro-go\": \"ぴろぴろごー\",\n        \"pirorunchi\": \"ぴろるんち\",\n        \"piruporo\": \"ぴるぽろー\",\n        \"pisces\": \"ぴすけす\",\n        \"pish lover\": \"ピシュ☆ラバ\",\n        \"piss\": \"PISS\",\n        \"pistonpower\": \"Pistonpower\",\n        \"pit\": \"PiT\",\n        \"pit.ra.bit\": \"pit.ra.bit\",\n        \"pixel cot.\": \"Pixel Cot.\",\n        \"pixel mint\": \"PIXEL MINT\",\n        \"pixel works\": \"Pixel Works\",\n        \"pixy bell\": \"ピクシーベル\",\n        \"piyo project\": \"ぴよぷろじぇくと\",\n        \"piyokoya\": \"ぴよこ屋\",\n        \"piyopit\": \"PiyoPit\",\n        \"piyopiyo teikoku\": \"ピヨピヨ帝国\",\n        \"piyotama\": \"ぴよたま\",\n        \"pizzaizm\": \"PIZZAIZM\",\n        \"placre\": \"プラクリ\",\n        \"plain ghost\": \"Plain Ghost\",\n        \"planariatei\": \"ぷらなりあ亭\",\n        \"planet\": \"プラネット\",\n        \"planet maris\": \"PLANET MARIS\",\n        \"planet matier\": \"Planet Matier\",\n        \"planet piece\": \"PLANET PIECE\",\n        \"planetary\": \"Planetary\",\n        \"plantain\": \"plantain\",\n        \"plastics\": \"plastics\",\n        \"plato.\": \"plato.\",\n        \"platonica\": \"PLATONiCA\",\n        \"please continue\": \"please continue\",\n        \"pleats time\": \"プリーツたいむ\",\n        \"pleco\": \"PLECO\",\n        \"pleiades fortune\": \"PLEIADES☆FORTUNE\",\n        \"plott\": \"Plott\",\n        \"plum factory\": \"Plum Factory\",\n        \"plume works\": \"PLUME WORKS\",\n        \"plumzero\": \"PlumZERO\",\n        \"plus donburi\": \"+丼\",\n        \"plus elegy\": \"+Elegy\",\n        \"plus house\": \"Plus house\",\n        \"plus10\": \"Plus Ten\",\n        \"plus810\": \"+810\",\n        \"pluto\": \"プルート\",\n        \"pm02 colon 00\": \"pm02:20\",\n        \"pno group\": \"PNO グループ\",\n        \"pno.\": \"PNO.\",\n        \"pnp\": \"ピィーエヌピィー\",\n        \"pocket\": \"POCKET\",\n        \"pocket drop\": \"ポケットドロップ\",\n        \"poco\": \"!POCO\",\n        \"poco poco\": \"POCO POCO\",\n        \"pocorit\": \"ぽこりっと\",\n        \"poga\": \"Poga*\",\n        \"poifull\": \"ぽいふる\",\n        \"point m\": \"Point M\",\n        \"points\": \"Points\",\n        \"poison\": \"POISON\",\n        \"poison breath\": \"ポイズンブレス\",\n        \"poison gray\": \"Poison Gray\",\n        \"poison squid\": \"ポイズンスクイッド\",\n        \"poisonblues\": \"POISONBLUES\",\n        \"poiyo dimension\": \"ポイヨディメンション\",\n        \"pokopen-honpo\": \"ぽこぺん本舗\",\n        \"pokotou\": \"ぽことう\",\n        \"polaris\": \"POLARIS\",\n        \"polbockle\": \"polbockle\",\n        \"pollinosis\": \"ぽりのしす\",\n        \"polorinken\": \"ポロリン軒\",\n        \"pom\": \"PoM\",\n        \"pomato-ya\": \"ぽまと屋\",\n        \"pomegranate\": \"ぽめぐら\",\n        \"pomelanian\": \"Pomelanian\",\n        \"pometeor\": \"ぽメテオ\",\n        \"pon de ushi\": \"ポン・デ・ウシ\",\n        \"poncho mojah\": \"PONCHO MOJAH\",\n        \"pondemix\": \"PONDEMIX\",\n        \"poniponi\": \"poniponi\",\n        \"poniteke zoku\": \"ポニテケ族\",\n        \"ponkotsu box\": \"ぽんこつ×ぼっくす\",\n        \"ponkotsu damashii\": \"ポンコツ魂\",\n        \"ponkotsu teikoku\": \"ポンコツ帝国\",\n        \"ponkotsu-ki\": \"ぽんこつ紀\",\n        \"ponkotsudou\": \"凡骨道\",\n        \"ponkotuna potunoya\": \"ぽんこつなぽつの屋\",\n        \"ponpon-o\": \"ぽんぽんお\",\n        \"ponte\": \"Ponte\",\n        \"pony farm\": \"仔马牧场\",\n        \"pony roll\": \"PONY ROLL\",\n        \"ponyfarm\": \"ポニー牧場\",\n        \"ponys bridle\": \"PONY'S BRIDLE\",\n        \"ponz.info\": \"ponz.info\",\n        \"ponzoom\": \"ぽんずーむ\",\n        \"ponzu ame\": \"ぽんずアメ\",\n        \"pooca\": \"pooca\",\n        \"popcorn koujou\": \"ポップコーン工場\",\n        \"popcorn lamp\": \"にゃじらんぷ\",\n        \"popeo\": \"ぽぺお\",\n        \"popin rabbit\": \"popin'rabbit\",\n        \"popo candy\": \"ぽぽきゃんでぃ\",\n        \"popo doctrine\": \"ポポドクトリン\",\n        \"popoin\": \"ぽぽいん\",\n        \"poppozu\": \"ポッポーズ\",\n        \"popship\": \"ポップシップ\",\n        \"popshot\": \"POPSHOT\",\n        \"popularplus\": \"popularplus\",\n        \"porika\": \"ポリカ\",\n        \"poritabe.\": \"ポリたべ。\",\n        \"porno maker\": \"ぽるのめーかー\",\n        \"pornostar\": \"ポルノ★スター\",\n        \"portion\": \"Portion\",\n        \"porygon137\": \"PORYGON137\",\n        \"potage\": \"Potage\",\n        \"potato salad\": \"ぽてとさらだ\",\n        \"potato seikatsu\": \"ポテト生活\",\n        \"potch pocket\": \"ぽっちぽけっと\",\n        \"poteto-chips\": \"poteto-chips\",\n        \"potosu koubou\": \"ポトス工房\",\n        \"poulain\": \"poulain\",\n        \"powderskin\": \"PowderSkin\",\n        \"power gradation\": \"パワーグラデイション\",\n        \"power of maca\": \"power of maca\",\n        \"power skill\": \"パワースキル\",\n        \"power slide\": \"パワースライド\",\n        \"power step\": \"Power Step\",\n        \"powerful soft\": \"ぱわふるソフト\",\n        \"powerplay\": \"POWERPLAY\",\n        \"praetorium-somnus\": \"プラエトーリウム=ソムヌス\",\n        \"prahapripa\": \"ぷらはぷりぱ\",\n        \"pravo713\": \"PRAVO713\",\n        \"prekano\": \"プレカノ\",\n        \"pretty maids\": \"PRETTY☆MAIDS\",\n        \"pretty penis\": \"プリティペニス\",\n        \"prettydolls\": \"prettydolls\",\n        \"prick\": \"PRICK\",\n        \"prickly ash\": \"プリックリーアッシュ\",\n        \"pride zero\": \"プライドZERO\",\n        \"prima stella\": \"Prima Stella\",\n        \"primal gleam\": \"Primal Gleam\",\n        \"primal gym\": \"Primal Gym\",\n        \"primavista\": \"Primavista\",\n        \"prime-f\": \"Prime-F\",\n        \"princess cage\": \"Princess Cage\",\n        \"princess heart\": \"Princess Heart\",\n        \"princess sugar\": \"Princess Sugar\",\n        \"princia\": \"プリンシア\",\n        \"prism eye\": \"Prism eye\",\n        \"prism silhouette\": \"ぷりずむ しるえっと\",\n        \"prism store\": \"Prism Store\",\n        \"prismatic\": \"PRISMATIC\",\n        \"pritannia\": \"ぷりたにあ\",\n        \"pro-tec\": \"Pro-tec\",\n        \"prodrug\": \"PRODRUG\",\n        \"production n.g\": \"PRODUCTION N.G\",\n        \"progretrance\": \"プログレトランス\",\n        \"project 345\": \"Project 345\",\n        \"project d\": \"ぷろじぇくとD\",\n        \"project freaks\": \"project フリークス\",\n        \"project fw\": \"プロジェクトFW\",\n        \"project harakiri\": \"PROJECTハラキリ\",\n        \"project of dr.q\": \"Project of Dr.Q\",\n        \"project-11\": \"Project-11\",\n        \"projectgs\": \"ProjectGS\",\n        \"proom\": \"Proom\",\n        \"propeller\": \"propeller\",\n        \"protmind\": \"PROTMIND\",\n        \"prymary\": \"prymary\",\n        \"przm star\": \"Przm Star\",\n        \"psy-chs\": \"Psy-chs\",\n        \"psy-force-project\": \"Psy-Force-Project\",\n        \"psy-walken\": \"Psy-Walken\",\n        \"psychetangle\": \"サイケタングル\",\n        \"psycho\": \"Psycho\",\n        \"psychosteak\": \"PSYCHOSTEAK\",\n        \"psycodelicious\": \"PSYCODELICIOUS\",\n        \"ptd\": \"PTD\",\n        \"ptislands\": \"ptislands\",\n        \"public planet\": \"ぱぶりっくぷらねっと\",\n        \"pucchies\": \"ぷっち~ず\",\n        \"pucchu\": \"ぷっちゅ\",\n        \"puchi momo club\": \"ぷちもも倶楽部\",\n        \"puchi parfait\": \"ぷちぱるふぇ\",\n        \"puchi-ya\": \"ぷち屋\",\n        \"pudding delices\": \"プディングデリス\",\n        \"pukupukumanbow\": \"PUKUPUKUMANBOW\",\n        \"pulin nabe\": \"PULIN Nabe\",\n        \"pulltop\": \"PULLTOP\",\n        \"pulltop latte\": \"PULLTOP LATTE\",\n        \"pulp sector\": \"パルプセクタ\",\n        \"pulpox\": \"Pulpox\",\n        \"pulupulu punch\": \"pulupulu punch\",\n        \"pumpkin\": \"ぱんぷきん\",\n        \"pumpkin freaks\": \"PUMPKIN FREAKS\",\n        \"puni puni kikaku\": \"ぷにぷに企画\",\n        \"puni-douraku\": \"ぷに道楽\",\n        \"puni-soft\": \"ぷにソフト\",\n        \"puniiyu\": \"ぷにいゆ\",\n        \"puniponya\": \"ぷにぽんや\",\n        \"punipuni doka-n\": \"ぷにぷにどか～ん♪\",\n        \"punipunikan\": \"ぷにぷに館\",\n        \"punisher punishment\": \"ぱにっしゃーぱにっしゅめんと\",\n        \"punyanica\": \"ぷにゃニカ\",\n        \"puppy biscuit\": \"ぱぴービスケット\",\n        \"puralinedou\": \"puraline堂\",\n        \"puratina no sakana\": \"プラチナのサカナ\",\n        \"pure cruel\": \"PureCruel\",\n        \"pure light\": \"ぴゅあらいと\",\n        \"pure more\": \"pure more\",\n        \"pure-liquid\": \"Pure-Liquid\",\n        \"purehime\": \"PUREHIME\",\n        \"pureskip\": \"PureSkip\",\n        \"pureslider\": \"PureSlider\",\n        \"purge\": \"purge\",\n        \"purgic i.m.o\": \"Purgic I.M.O\",\n        \"purikura\": \"プリクラ\",\n        \"purimomo\": \"ぷり桃\",\n        \"purin dou\": \"ぷりん堂\",\n        \"purin house\": \"ぷりんはうす\",\n        \"purin yokochou\": \"ぷりん横丁\",\n        \"purincho.\": \"ぷりんちょ。\",\n        \"puripoyo pudding\": \"ぷりぽょぷりん\",\n        \"purple dream\": \"パープルドリーム\",\n        \"purple haze\": \"PURPLE HAZE\",\n        \"purple kiss\": \"ぱーぷるきっす\",\n        \"purple sky\": \"パープルスカイ\",\n        \"purple software\": \"パープルソフトウェア\",\n        \"purpleclover\": \"PurpleClover\",\n        \"purumetal\": \"ぷるめたる\",\n        \"purupuru finale\": \"ぷるぷるフィナーレ!!\",\n        \"pururun\": \"ぷるるん\",\n        \"push pop\": \"ぷっしゅぽっぷ\",\n        \"pussy cat\": \"Pussy・CAT\",\n        \"pussy.cat seisaku iinkai\": \"Pussy・CAT制作委員会\",\n        \"pussymark\": \"Pussymark\",\n        \"puzzle74\": \"PUZZLE74\",\n        \"puzzlebox\": \"パズルボックス\",\n        \"px-real\": \"PX-REAL\",\n        \"pyonpyororin\": \"ぴょんぴょろりん\",\n        \"pyramid house\": \"ピラミッドハウス\",\n        \"q kikaku ankoku kiheidan\": \"Q企画暗黒奇兵団\",\n        \"q.o.n\": \"Q.O.N\",\n        \"qcumber\": \"QCUMBER\",\n        \"qlapz\": \"クラプス\",\n        \"qoobrand\": \"Qoobrand\",\n        \"qqq\": \"QQQ\",\n        \"qross\": \"QRoss\",\n        \"quad prime\": \"Quad Prime\",\n        \"qualia\": \"qualia\",\n        \"qualia cheese\": \"くおりあちーず\",\n        \"quarter.\": \"QUARTER.\",\n        \"quartierlatin\": \"カルチェラタン\",\n        \"quartzshow\": \"晶\",\n        \"quda\": \"Q.U.D.A.\",\n        \"queen of vanilla\": \"Queen Of VANILLA\",\n        \"queen soft\": \"クィーンソフト\",\n        \"question\": \"QUESTION?\",\n        \"quick kick lee\": \"Quick kick Lee\",\n        \"quintallagosta\": \"QuintalLagosta\",\n        \"quo vadis\": \"Quo Vadis\",\n        \"quotation\": \"Quotation\",\n        \"qureate\": \"qureate\",\n        \"r equals birth\": \"R=birth\",\n        \"r style\": \"R*style\",\n        \"r-blue\": \"R・blue\",\n        \"r-deco\": \"R-Deco\",\n        \"r-type nirvana\": \"R-Type Nirvana\",\n        \"r-works\": \"R-WORKS\",\n        \"r.a.n.software\": \"ランソフトウェア\",\n        \"r.c.i\": \"R.C.I\",\n        \"r.c.w.d\": \"R.c.W.d\",\n        \"r.e.c\": \"R.E.C\",\n        \"r.h.d\": \"R・H・D\",\n        \"r.i.s factory\": \"r.i.s factory\",\n        \"r.o.c\": \"R.O.C\",\n        \"r1\": \"r;1\",\n        \"r18\": \"R18\",\n        \"r2\": \"R2\",\n        \"r2a\": \"r2A\",\n        \"r55 kyouwakoku\": \"R55共和国\",\n        \"ra-raradan\": \"らーらら団\",\n        \"rabbit beat\": \"Rabbit Beat\",\n        \"rabbit company\": \"ラビットカンパニー\",\n        \"rabbit house\": \"ラビットハウス\",\n        \"rabbit hutch\": \"Rabbit Hutch\",\n        \"rabbit kuukan\": \"ラビット空間\",\n        \"rabbit sniper\": \"ラビットスナイパー\",\n        \"rabbit syndrome\": \"rabbit syndrome\",\n        \"rabbits\": \"らびっつ\",\n        \"rabbits foot\": \"ラビッツフット\",\n        \"raccoon\": \"ラクーン\",\n        \"ractica\": \"RACTICA\",\n        \"radial engine\": \"ラジアルエンジン\",\n        \"radiant slash h plus\": \"radiant/H+\",\n        \"radical dash\": \"RADICAL DASH\",\n        \"rafflesia\": \"らふれしあ\",\n        \"rafoguramu\": \"裸フォグラ夢\",\n        \"ragho\": \"らぐほ\",\n        \"rahue kojo\": \"らふ絵工場\",\n        \"raiden labo\": \"らいでんらぼ\",\n        \"raigekitai\": \"らいげきたい\",\n        \"raijinoh\": \"雷迅皇\",\n        \"raijuu shoujo\": \"雷獣少女\",\n        \"rain drop\": \"Rain*drop\",\n        \"rain rainbow\": \"Rain Rainbow\",\n        \"rain shot\": \"Rain Shot\",\n        \"rainbow cyc\": \"Rainbow Cyc\",\n        \"rainbow force\": \"RAINBOW FORCE\",\n        \"rairai rakuraku\": \"らいらいらくらく\",\n        \"raising staff\": \"Raising Staff\",\n        \"rakdo\": \"落童\",\n        \"rakka sokudo 2.5\": \"落下速度2.5\",\n        \"rakkasei\": \"ラッカセイ\",\n        \"rakubi\": \"楽日\",\n        \"rakuen koubou\": \"楽園工房\",\n        \"rakuen no sora\": \"楽園の空\",\n        \"rakuen tiramisu\": \"楽園ティラミス\",\n        \"rakugaki drops\": \"RAKUGAKI DROPS\",\n        \"rakugaki evo\": \"らくがきEVO\",\n        \"rakugaki ippentou\": \"らくがき一辺倒\",\n        \"rakugaki omochabako\": \"らくがきおもちゃばこ\",\n        \"rakugaki switch\": \"らくがきスイッチ\",\n        \"rakuichimonji\": \"楽一文字\",\n        \"rakukisa\": \"ラクキサ\",\n        \"rakutoa\": \"ラクトア\",\n        \"ramble cat\": \"Ramble Cat\",\n        \"rame\": \"ラメ\",\n        \"ramen half price 280 yen\": \"ラーメン半額280円\",\n        \"ramen rice\": \"らーめんらいす\",\n        \"rampancy\": \"Rampancy\",\n        \"rampant\": \"Rampant\",\n        \"ramubi koubou\": \"らむびー工房\",\n        \"ramune button\": \"ラムネボタン\",\n        \"random parts\": \"ランダムパーツ\",\n        \"ranmado\": \"乱馬堂\",\n        \"ranranpop\": \"らんらんぽっぷ\",\n        \"ranshi to kimi to.\": \"乱視と君と。\",\n        \"rapurando\": \"らぷらんど\",\n        \"rare okowa\": \"レアおこわ\",\n        \"rasa house\": \"らさはうす\",\n        \"rascou\": \"らすこう\",\n        \"rasen kyuuri\": \"螺旋きゅうり\",\n        \"rasinban\": \"Rasinban\",\n        \"rask\": \"RASK\",\n        \"raspberry\": \"Raspberry\",\n        \"raspberry galette\": \"raspberry galette\",\n        \"rat tail\": \"RAT TAIL\",\n        \"ratio1\": \"レシオ1\",\n        \"rauhreif\": \"ラウライフ\",\n        \"raving phantom\": \"RAVING PHANTOM\",\n        \"rayroh\": \"玲瓏\",\n        \"raytrec\": \"RAYTREC\",\n        \"razchoco\": \"RazChoco\",\n        \"rbooks\": \"rbooks\",\n        \"re clel\": \"Re_Clel\",\n        \"re cre at tors\": \"Re:Cre@tors\",\n        \"re set\": \"Re:Set\",\n        \"re-bidou\": \"Re-BI堂\",\n        \"re-fire\": \"リファイア\",\n        \"re-tale\": \"Re-tale\",\n        \"re-vival\": \"Re-vival\",\n        \"real\": \"real\",\n        \"reason\": \"Reason\",\n        \"rebecca\": \"REBECCA\",\n        \"rebirth\": \"rebirth\",\n        \"recaroya\": \"れかろ屋\",\n        \"recette\": \"Recette\",\n        \"rectorica\": \"Rectorica\",\n        \"red\": \"RED\",\n        \"red axis\": \"Red Axis\",\n        \"red bean milk tea\": \"小豆ミルクティー\",\n        \"red chuck\": \"レッドチャック\",\n        \"red delicious\": \"レッドデリシャス\",\n        \"red etude\": \"赤のエチュード\",\n        \"red label\": \"レッドレーベル\",\n        \"red paprika\": \"RED Paprika\",\n        \"red rebel\": \"レッドレベル\",\n        \"red ribbon\": \"RED RIBBON\",\n        \"red ribbon revenger\": \"RED RIBBON REVENGER\",\n        \"red x blue\": \"Red×Blue\",\n        \"red-uguisu\": \"RED-UGUISU\",\n        \"red-zone\": \"RED-ZONE\",\n        \"redbell\": \"れっどべる\",\n        \"reds\": \"Reds!\",\n        \"redsquid\": \"REDSQUID\",\n        \"ref\": \"ref\",\n        \"reflectia\": \"Reflectia\",\n        \"reflection\": \"リフレクション\",\n        \"regnenshower\": \"Regnenshower\",\n        \"regulus\": \"レグルス\",\n        \"rei no tokoro\": \"例の所\",\n        \"reien\": \"黎en\",\n        \"reika-doh\": \"麗華堂\",\n        \"reimonya\": \"礼門屋\",\n        \"reitou cafe terrace\": \"冷凍カフェテラス\",\n        \"rekka\": \"烈火\",\n        \"reku kuukan\": \"れく空間\",\n        \"rela factory\": \"Rela Factory\",\n        \"relpam\": \"りるぱむ\",\n        \"rem9\": \"REM9\",\n        \"remagi\": \"リメイジ\",\n        \"remationmade\": \"リメーションメイド\",\n        \"remnants\": \"Remnants\",\n        \"remonsan project\": \"Remonsan Project\",\n        \"remora field\": \"remora field\",\n        \"remora works\": \"remora works\",\n        \"remorse\": \"Remorse\",\n        \"ren\": \"Ren\",\n        \"ren-ai\": \"REN-AI\",\n        \"rena koubou\": \"レナ工房\",\n        \"renainou\": \"恋愛脳\",\n        \"rengeza\": \"蓮華座\",\n        \"rennyuu aquarium\": \"練乳アクアリウム\",\n        \"renrakumou ami doujin section\": \"連絡網ＡＭＩ同人セクション\",\n        \"renrendou\": \"漣々堂\",\n        \"rensei\": \"連星\",\n        \"rensougyo\": \"蓮双魚\",\n        \"rental senkan\": \"レンタル戦艦\",\n        \"renyaa hearts\": \"レンヤーハーツ\",\n        \"reparation\": \"レパラシオン\",\n        \"replicailia\": \"レプリカイリア\",\n        \"resemble blue\": \"Resemble Blue\",\n        \"resident of iii\": \"Resident of III\",\n        \"respect\": \"リスペクト\",\n        \"ressentiment\": \"ルさんちまん\",\n        \"retasuya\": \"れたす屋\",\n        \"retro star\": \"レトロスター\",\n        \"rev3\": \"Rev3\",\n        \"reverie\": \"REVERIE\",\n        \"revoeme\": \"れぼえめ\",\n        \"revorious\": \"RevoRious\",\n        \"rh\": \"あーるえいち\",\n        \"rh minus\": \"RHまいなす\",\n        \"rhein no mamori shoukai\": \"ラインの守り商会\",\n        \"ribbon super kikaku\": \"リボンスーパー企画\",\n        \"ribons nights\": \"リボーンズナイツ\",\n        \"riboshika unit\": \"Riboshika Unit\",\n        \"rice\": \"Rice\",\n        \"rice ball\": \"らいすぼ～る\",\n        \"ricecandy\": \"RiceCandy\",\n        \"ricering\": \"RiceRing\",\n        \"ricky-tick\": \"RICKY-TICK\",\n        \"rico project\": \"リコプロジェクト\",\n        \"riddle soft\": \"リドルソフト\",\n        \"rideshion\": \"りでしおん\",\n        \"riff-racket\": \"リフラケット\",\n        \"right hand\": \"ライトハンド\",\n        \"riki\": \"RIKI\",\n        \"rikomam\": \"RIKOMAM\",\n        \"rikudou juku\": \"六道塾\",\n        \"rikudoukan\": \"六道館\",\n        \"rikudouya\": \"六道屋\",\n        \"rima cafe\": \"Rima Cafe\",\n        \"rin\": \"RIN\",\n        \"rinarina\": \"RINARINA\",\n        \"rinfin\": \"りんふぃん\",\n        \"ring a bell\": \"リングアベル\",\n        \"ring memo\": \"Ring memo\",\n        \"ringo doumei\": \"りんご同盟\",\n        \"ringo koucha\": \"りんご紅茶\",\n        \"ringo no kisetsu.\": \"りんごの季節。\",\n        \"ringoya\": \"リンゴヤ\",\n        \"rinji party\": \"臨時PT\",\n        \"rinkandou\": \"輪漢堂\",\n        \"rinkichibu\": \"りんキチぶ\",\n        \"rinne\": \"りんね\",\n        \"rinnetensei\": \"輪廻転生\",\n        \"rinrin\": \"倫鈴\",\n        \"rio grande\": \"リオグランデ\",\n        \"ripel egg\": \"らいぷるえっぐ\",\n        \"rippadou\": \"立派堂\",\n        \"ripton sabo\": \"りぷとん☆茶房\",\n        \"ririadoll\": \"リリアドール\",\n        \"ririmat\": \"りりまっと\",\n        \"riroland\": \"RIROLAND\",\n        \"rising sun\": \"らいじんぐさん\",\n        \"risoukyou\": \"理ソウ郷\",\n        \"rissuinoti\": \"立錐之地\",\n        \"ritard.a2\": \"ritard.A2\",\n        \"rivajima\": \"リバ島\",\n        \"rix\": \"RIX\",\n        \"rizaru forest.\": \"リザルフォレスト。\",\n        \"rj\": \"RJ\",\n        \"rkaffy\": \"アールカフィ\",\n        \"rm kikaku\": \"RM企画\",\n        \"road\": \"ロード\",\n        \"road equals road\": \"Road=ロード=\",\n        \"road map\": \"Road map\",\n        \"road side roman\": \"Road Side Roman\",\n        \"roam\": \"roam\",\n        \"robayan no mori\": \"ロバヤンの森\",\n        \"robazoku\": \"ロバ族\",\n        \"robo ittetsu\": \"ロボ一徹\",\n        \"robo moe kenkyuujo\": \"ロボ萌え研究所\",\n        \"roboko teikoku\": \"ろぼこ帝国\",\n        \"rocca\": \"ROCCA\",\n        \"rock clime\": \"ROCK CLIME\",\n        \"rock steady\": \"ろっくすてでぃ\",\n        \"rocket kyoudai\": \"ロケット兄弟\",\n        \"rocket nenryou 21\": \"ロケット燃料★21\",\n        \"rockinchair\": \"ROCK`inChair\",\n        \"rocomani\": \"ろこまに\",\n        \"rocoroto\": \"ロコロト\",\n        \"rodeo\": \"■RODEO\",\n        \"rodiura.\": \"ろぢうら。\",\n        \"rohgun kyoh\": \"老眼郷\",\n        \"rojiko\": \"ロジコ\",\n        \"rojiura holic\": \"路地裏Holic\",\n        \"rojiura jack\": \"路地裏JACK\",\n        \"rojiurakinema\": \"路地裏キネマ\",\n        \"rokugatsu no kashiwamochi\": \"六月の柏餅\",\n        \"rokugatsu no reizouko\": \"六月の冷蔵庫\",\n        \"rokujinchuu\": \"六人柱\",\n        \"rokumen roppi\": \"ろくめん・ろっぴ\",\n        \"rokuroku sanjuuroku\": \"ロクロクサンジューロク\",\n        \"rokusyoku mikan\": \"緑色みかん\",\n        \"rollin thunder\": \"ろーりんさんだー\",\n        \"rolling box\": \"Rolling box\",\n        \"rolling haiena\": \"Rollingハイエナ\",\n        \"romantic london\": \"Romantic London\",\n        \"romantic ren-ai mode\": \"ロマンティック恋愛モード\",\n        \"romantic shinjuu\": \"浪漫的心中\",\n        \"romeo dash\": \"ROMEO DASH\",\n        \"ronpaia\": \"ろんぱいあ\",\n        \"room guarder\": \"ルームガーダー\",\n        \"room0016\": \"Room0016\",\n        \"rope island\": \"ろーぷあいらんど\",\n        \"roppongi shinjuu\": \"六本木神獣\",\n        \"rorerore-ya\": \"ろれろれ屋\",\n        \"rorioiru\": \"ろりおいる\",\n        \"roritora\": \"ロリとら!!\",\n        \"rorororomo\": \"ロロロロモ\",\n        \"rose liese\": \"Rose Liese\",\n        \"rose tiara\": \"ローズティアラ\",\n        \"rose water\": \"ROSE WATER\",\n        \"rosebud\": \"Rosebud\",\n        \"rosemarygarden\": \"RosemaryGarden\",\n        \"roshiman\": \"ろしまん\",\n        \"rotary engine\": \"ろ～たり～Engine\",\n        \"rotten apple\": \"ろってんあっぷる\",\n        \"roubai-tei\": \"狼狽亭\",\n        \"rouge\": \"ルージュ\",\n        \"rough love\": \"ラフラブ\",\n        \"round-house\": \"ROUND-HOUSE\",\n        \"round-o\": \"round-O\",\n        \"rouseiya\": \"狼星屋\",\n        \"route08\": \"ROUTE08\",\n        \"royal\": \"ROYAL\",\n        \"royal crown\": \"ROYAL CROWN\",\n        \"royal maya\": \"Royal Maya\",\n        \"royal moon\": \"Royal Moon\",\n        \"royal.s\": \"ロイヤル・S\",\n        \"royalwatts\": \"ROYALWATTS\",\n        \"rr kenkyuukai\": \"RR研究会\",\n        \"rro\": \"RRO\",\n        \"rrr\": \"RRR\",\n        \"rsag\": \"RSAG\",\n        \"ru-vic\": \"RU-VIC\",\n        \"rubber cup boys\": \"ラバーカップボーイズ\",\n        \"rubbish selecting squad\": \"RUBBISH選別隊\",\n        \"rubens tinctura\": \"Rubens Tinctura\",\n        \"rubicon\": \"ルビコン\",\n        \"ruby eye\": \"Ruby Eye\",\n        \"ruby fruit\": \"RUBY FRUIT\",\n        \"ruf\": \"ruf\",\n        \"ruikotsu\": \"泪骨\",\n        \"ruki ruki exiss\": \"るきるきEXISS\",\n        \"rukruk\": \"RukRuk\",\n        \"ruler shot\": \"Ruler Shot\",\n        \"rumbling heart\": \"らんぶりんぐはあと\",\n        \"rune\": \"ルーン\",\n        \"runner bean\": \"runner bean\",\n        \"runway\": \"Runway\",\n        \"rupinasu touzokudan\": \"るぴなす盗賊団\",\n        \"ruri ringo\": \"瑠璃りんご\",\n        \"ruruna and nimunimu\": \"るるな＆にむにむ\",\n        \"rururairai\": \"縷々来来\",\n        \"rush\": \"RUSH\",\n        \"rush rise line\": \"Rush Rise Line\",\n        \"rushimaru dou\": \"るしまる堂\",\n        \"russia cake\": \"Russia cake\",\n        \"russian neko\": \"ロシアン猫\",\n        \"russiapan\": \"ロシアパン\",\n        \"rustic house\": \"RUSTIC HOUSE\",\n        \"rxr renmei\": \"あるある連盟\",\n        \"ryanhan shibari\": \"二飜縛り\",\n        \"rycanthropy\": \"RYCANTHROPY\",\n        \"ryokucha combo\": \"緑茶コンボ\",\n        \"ryonas station\": \"Ryona's Station\",\n        \"ryoujoku kagekidan\": \"陵辱過激団\",\n        \"ryousangata ponyta\": \"量産型ポニテ\",\n        \"ryu no abara\": \"りゅうのあばら\",\n        \"ryujya dou\": \"竜蛇道\",\n        \"ryuknigthia\": \"リュナイティア\",\n        \"ryuu no yadorigitei\": \"竜の宿り木亭\",\n        \"ryuukisha\": \"隆起社\",\n        \"ryuukotsusan\": \"龍骨山\",\n        \"ryuukuujou\": \"竜宮城\",\n        \"ryuuryokukakou.\": \"りゅうりょくかこう。\",\n        \"ryuusei koubou\": \"流星工房\",\n        \"ryuushikei\": \"粒子系\",\n        \"ryuutai rikigaku\": \"流体力学\",\n        \"ryuutai urinal\": \"流体ユリナアル\",\n        \"s shoten\": \"エス書店\",\n        \"s-14\": \"S-14\",\n        \"s-core\": \"S-Core\",\n        \"s-flake\": \"S-FLAKE\",\n        \"s-force\": \"S-FORCE\",\n        \"s-g.h.\": \"S-G.H.\",\n        \"s-ram\": \"S-Ram\",\n        \"s.\": \"S.\",\n        \"s.c.c.\": \"S.C.C\",\n        \"s.d.works\": \"S・D・Works\",\n        \"s.k.\": \"S.K\",\n        \"s.n.l\": \"S.N.L\",\n        \"s.s.l\": \"S.S.L\",\n        \"saba down\": \"鯖DOWN\",\n        \"sabai shuppan\": \"さばーい出版\",\n        \"sabakunosakura\": \"サバクノサクラ\",\n        \"sabamiso\": \"さばみそ\",\n        \"saberfish\": \"セイバーフィッシュ\",\n        \"sabo-p\": \"SABO-P\",\n        \"saboriguse syndrome\": \"サボリ癖症候群\",\n        \"saboten\": \"サボテン\",\n        \"saboten binta\": \"サボテンビンタ\",\n        \"saboten sankaku\": \"サボテンさんかく\",\n        \"saboten-dou honpo\": \"仙人掌堂本舗\",\n        \"sabusukatchi\": \"サブスカッチ\",\n        \"sadakichi-tei\": \"定吉亭\",\n        \"sadakichidou\": \"定吉堂\",\n        \"sadistic alice\": \"Sadistic Alice\",\n        \"sadistic green\": \"SADISTIC GREEN\",\n        \"sadistic mary\": \"SADISTIC MARY\",\n        \"sae\": \"冴\",\n        \"safire\": \"SAFIRE\",\n        \"saga angel\": \"SAGA Angel\",\n        \"sagamani.\": \"サガマニ。\",\n        \"sagano line\": \"さがのせん\",\n        \"sage\": \"Sage\",\n        \"saicoro chick\": \"サイコロちっく\",\n        \"saigo made anko tappuri\": \"最後まであんこたっぷり\",\n        \"saigo no rakuen -the perfect world-\": \"最後の楽園-the perfect world-\",\n        \"saihate\": \"最果て\",\n        \"saikaihatsu\": \"催開発\",\n        \"saikasou seiteki shoudou kenkyuukai\": \"最下層性的衝動研究会\",\n        \"saikawa youzyo\": \"さぃヵゎ♡ょぅι゛ょ\",\n        \"saiki industrial\": \"佐伯重工\",\n        \"saiko smiling show\": \"サイコすまいりんぐショウ\",\n        \"saikyo gakuen\": \"最強学園\",\n        \"sail-ring on\": \"Sail-ring on\",\n        \"sailor q2\": \"SAILOR Q2\",\n        \"saimin sushiya\": \"催眠すし屋\",\n        \"sainometei\": \"賽の目亭\",\n        \"saint seiya\": \"聖性屋\",\n        \"saipin\": \"さいピン\",\n        \"sairo publishing\": \"豺狼出版\",\n        \"saisons\": \"SaiSonS\",\n        \"saita tsuushin\": \"才田通信\",\n        \"saitei no butagoya\": \"最低の豚小屋\",\n        \"saito-penguin\": \"西東ペンギン\",\n        \"saitou satou\": \"斎藤さとー\",\n        \"saitou teikoku\": \"齋藤帝國\",\n        \"saitoukai\": \"斉藤会\",\n        \"saitouya\": \"斎藤屋\",\n        \"saka muke\": \"さか☆むけ\",\n        \"sakaiya\": \"境屋\",\n        \"sakamusiya\": \"さかむし屋\",\n        \"sakanahen\": \"サカナヘン\",\n        \"sakasadorirakka\": \"逆さ鳥落下\",\n        \"sakasama clover\": \"さかさまクローバー\",\n        \"sakazuki-tei\": \"さかずき亭\",\n        \"sakeitiba\": \"サケ市場\",\n        \"sake no sanran\": \"鮭の産卵\",\n        \"sakekan memorial\": \"鮭缶メモリアル\",\n        \"saketanuki no kakushigura\": \"酒たぬきの隠し蔵\",\n        \"saketoba meshi\": \"鮭とば飯\",\n        \"sakiyama bakufu\": \"sakiyama幕府\",\n        \"sakomicho\": \"さこみちょ\",\n        \"sakotsu no kuni\": \"鎖骨ノ国\",\n        \"saku saku circle\": \"さくさくさーくる\",\n        \"sakuko seisakusho\": \"作呼製作所\",\n        \"sakumaya\": \"さくま屋\",\n        \"sakura garden\": \"さくらがーでん\",\n        \"sakura koubou\": \"さくら工房\",\n        \"sakura mochi\": \"桜餅\",\n        \"sakura no hanabira\": \"桜の花びら\",\n        \"sakura prin\": \"さくらぷりん\",\n        \"sakura zensen\": \"さくら前線\",\n        \"sakuraen\": \"櫻園\",\n        \"sakurai dai energy\": \"櫻井台エネルギー\",\n        \"sakurairo etranger\": \"桜色エトランゼ\",\n        \"sakuraito\": \"サクライト\",\n        \"sakurakan\": \"さくら缶\",\n        \"sakurako\": \"さくら庫\",\n        \"sakurakusa\": \"サクラクサ\",\n        \"sakuraminto\": \"桜眠都\",\n        \"sakuramochi\": \"さくらもち\",\n        \"sakuramouse\": \"SAKURAMOUSE\",\n        \"sakuranbo\": \"桜桃\",\n        \"sakuranbo little\": \"さくらんぼりとる\",\n        \"sakurapink\": \"sakuraPINK\",\n        \"sakurasake\": \"桜鮭\",\n        \"sakurasaku koubou\": \"桜咲く工房\",\n        \"sakurautage\": \"櫻宴\",\n        \"sakurawhite\": \"SAKURAWHITE\",\n        \"sakuraya\": \"SAKURAYA\",\n        \"sakurazuki\": \"桜月\",\n        \"sakuri uchuu model\": \"サクリ宇宙モデル\",\n        \"sakusaku kangen noushuku\": \"サクサク還元濃縮\",\n        \"sakusakusakuchan\": \"さくさくさくちゃん\",\n        \"sakuya no hakoniwa\": \"昨夜の箱庭\",\n        \"sakuya17sai\": \"咲耶17歳\",\n        \"sakyuu\": \"砂丘\",\n        \"salad abura\": \"サラダ油\",\n        \"salmon daisuki club\": \"サーモンだいすきクラブ\",\n        \"salt peanuts\": \"Salt Peanuts\",\n        \"salvage kouboh\": \"サルヴェージ工房\",\n        \"samalimi\": \"samalimi\",\n        \"sameno soft cream\": \"鮫野ソフトクリーム\",\n        \"samgyetang\": \"サムゲタン\",\n        \"samonaberu\": \"サモナベール\",\n        \"samugakupetti\": \"SGPT\",\n        \"samurai\": \"侍\",\n        \"samurai shipmaru\": \"さむらいシップ丸\",\n        \"sunora\": \"さんおれ\",\n        \"sana house\": \"Sana House\",\n        \"sanazura doujinshi hakkoujo\": \"さなづら同人誌発行所\",\n        \"sanb.\": \"さんびー。\",\n        \"sanbai kaiouken\": \"3倍界王軒\",\n        \"sanban yashiki\": \"三番屋敷\",\n        \"sanchi chokusou maguro dan\": \"産地直送マグロ団\",\n        \"sancho panda\": \"さんちょぱんだ\",\n        \"sandal nyan\": \"サンダルニャン\",\n        \"sandansu\": \"sandansu\",\n        \"sandglass\": \"sandglass\",\n        \"sangatsu no lion\": \"三月のライオン\",\n        \"sangatsu no osakai\": \"三月のお茶会\",\n        \"sangenkaidou\": \"三弦回胴\",\n        \"sangenshokudou\": \"三原色堂\",\n        \"sangeriya\": \"サンゲリ屋\",\n        \"sangria\": \"さんぐりあ\",\n        \"sangria kyuuden\": \"サングリア宮殿\",\n        \"sankaku apron\": \"さんかくエプロン\",\n        \"sankaku doumei\": \"さんかく同盟\",\n        \"sanketsushuu\": \"酸欠集\",\n        \"sankyaku rasen\": \"三脚ラセン\",\n        \"sannyuutei\": \"三乳亭\",\n        \"sanolemoon\": \"Sanolemoon\",\n        \"sanryuu club\": \"三流倶楽部\",\n        \"sanryuu kaigishitsu\": \"三流会議室\",\n        \"sansei biyori\": \"賛成日和\",\n        \"sanshodou\": \"山椒堂\",\n        \"sansui\": \"泉泉泉\",\n        \"sansuisha\": \"散水社\",\n        \"santa fe radio\": \"Santa Fe Radio\",\n        \"santarose\": \"サンタローズ\",\n        \"santonana\": \"サントナナ\",\n        \"sanukiya\": \"讃岐屋\",\n        \"sanyongo\": \"三四五\",\n        \"sanzoku no uta\": \"山賊の唄\",\n        \"saomako\": \"さおまこ\",\n        \"saotome-laboratory\": \"早乙女けんきゅう所\",\n        \"saperon black\": \"さぺろんブラック\",\n        \"sardnix\": \"サードニックス\",\n        \"sardonyx\": \"sardonyx\",\n        \"sarfatation\": \"sarfatation\",\n        \"sark\": \"SARK\",\n        \"sarobetsu ginga\": \"サロベツ銀河\",\n        \"sarpaccio\": \"サルパッチョ\",\n        \"sartaiz\": \"さぁたいず\",\n        \"sarurururu\": \"サルルルル\",\n        \"sasa chaya\": \"ささ茶屋\",\n        \"sasainamono\": \"ささいなもの\",\n        \"sasakama box\": \"笹かまボックス\",\n        \"sasaki maru\": \"ささきまる\",\n        \"sasaki muu shouten\": \"佐々木無宇商店\",\n        \"sasaki yasiki\": \"佐々木屋敷\",\n        \"sasami no maruyaki\": \"ささみの丸焼き\",\n        \"sasanoha toro\": \"笹乃葉とろ\",\n        \"sasha forest\": \"サーシア・フォレスト\",\n        \"sashimi choco\": \"さしみチョコ\",\n        \"sashimi no wife\": \"サシミノワイフ\",\n        \"sasumata seven\": \"さすまたせぶん\",\n        \"sasurai no manbou\": \"さすらいのマン棒\",\n        \"sata cleaning\": \"さたクリーニング\",\n        \"satei\": \"砂亭\",\n        \"satellite na spark\": \"サテライトなスパーク\",\n        \"satellites\": \"Satellites\",\n        \"sato samitt\": \"サトサミット\",\n        \"satoimo bokujou\": \"さといも牧場\",\n        \"satomachine.\": \"satomachine.\",\n        \"satooya\": \"さとうや\",\n        \"satori gozen\": \"悟リ御膳\",\n        \"satou furo\": \"砂糖風呂\",\n        \"satou to shio\": \"砂糖と塩\",\n        \"satouseika\": \"サトウ製菓\",\n        \"satsukiimonet\": \"satsukiimonet\",\n        \"satsukinchi\": \"サツキん家\",\n        \"saturday night special\": \"Saturday Night Special\",\n        \"aurorasoft\": \"AuroraSoft\",\n        \"sausage koubou\": \"ソーセージ工房\",\n        \"savageland\": \"SavageLand\",\n        \"sawa chaya\": \"さわ茶屋\",\n        \"sawaraya shoten\": \"佐原屋書店\",\n        \"sayakata kouchakan\": \"さやかた紅茶館\",\n        \"sayonara hornet\": \"サヨナラホーネット\",\n        \"sayupot\": \"さゆぽっと\",\n        \"sayuu-hanten\": \"サユウハンテン\",\n        \"sazameki dori\": \"さざめき通り\",\n        \"sazanka no yado\": \"山茶花の宿\",\n        \"sazareito\": \"さざれいと\",\n        \"sbd\": \"SBD\",\n        \"sbi\": \"SBI\",\n        \"scale garden\": \"スケイルガーデン\",\n        \"scape alice\": \"Scape Alice\",\n        \"scarabe\": \"scarabe\",\n        \"scarlet beast\": \"Scarlet Beast\",\n        \"scarlet leaf\": \"Scarlet Leaf\",\n        \"schatz\": \"Schatz\",\n        \"schenkel union\": \"Schenkel Union\",\n        \"schoolzone\": \"schoolzone\",\n        \"schwarz libelle\": \"シュバルツ･リベレ\",\n        \"schwester\": \"しゅべすた\",\n        \"sco.labo\": \"SCO.LABO\",\n        \"score\": \"スコア\",\n        \"scotchy\": \"すこっちぃ\",\n        \"scp-mio slash\": \"SCP-MiO/\",\n        \"scramble yourouin\": \"スクランブル養老院\",\n        \"screaming dog\": \"Screaming DOG\",\n        \"scrotum\": \"scrotum\",\n        \"scrum hitori\": \"スクラムヒトリ\",\n        \"sddy\": \"SDDY\",\n        \"se-ri\": \"セーリ\",\n        \"seacloud\": \"SEACLOUD\",\n        \"seafox\": \"SeaFox\",\n        \"seamanz\": \"seamanz\",\n        \"search-light\": \"サーチライト\",\n        \"searchlight missing\": \"サーチライトミッシング\",\n        \"sebas\": \"sebas\",\n        \"sec44\": \"sec44\",\n        \"second color\": \"セカンドカラー\",\n        \"second point\": \"Second Point\",\n        \"secreder\": \"SECREDER\",\n        \"secret cure\": \"Secret Cure\",\n        \"secret dmain\": \"Secret Dmain\",\n        \"secret milk\": \"secret milk\",\n        \"secretgarden\": \"secretgarden\",\n        \"section-11\": \"SECTION-11\",\n        \"seduce\": \"SEDUCE\",\n        \"segue laboratory\": \"セグエラボラトリー\",\n        \"sei kuroneko kishidan\": \"聖クロネコ騎士団\",\n        \"seibunkaken\": \"性文化研\",\n        \"seigadou\": \"勢画堂\",\n        \"seigakukan\": \"性学館\",\n        \"seigi no chikubi\": \"正義のちくび\",\n        \"seigi no yakata\": \"セイギノヤカタ\",\n        \"seigou\": \"せいごう\",\n        \"seiheki master\": \"セイヘキマスター\",\n        \"seikan hitchhiker\": \"星間ヒッチハイカー\",\n        \"seikatsu seshishou\": \"性活窃視症\",\n        \"seikinkan\": \"星菫館\",\n        \"seinen shinshi doumei\": \"青年紳士同盟\",\n        \"seishimentai\": \"せいしめんたい\",\n        \"seishinkan eikyuu\": \"星神官永級\",\n        \"seisyun katsusand\": \"青春カツサンド\",\n        \"seisyun to strategy.\": \"青春と戦略。\",\n        \"seiteijin\": \"井庭人\",\n        \"seiwa kanmu\": \"せいわかんむ\",\n        \"seiyou tanka\": \"西洋短歌\",\n        \"seizousha\": \"性造社\",\n        \"sekai chizu wa chi no ato\": \"世界地図は血の跡\",\n        \"sekai kakumei club\": \"世界革命俱乐部\",\n        \"sekai no hate ni hanataba o.\": \"世界の果てに花束を。\",\n        \"sekai no tomizawa\": \"世界のTOMIZAWA\",\n        \"sekai saiko\": \"世界最古\",\n        \"seken no katasumi\": \"世間の片隅\",\n        \"sekichou\": \"赤蝶\",\n        \"sekidou nakama\": \"赤道仲間\",\n        \"sekigaiken\": \"赤外圏\",\n        \"sekilala\": \"せ・き・ら・ら\",\n        \"sekimen shoujo\": \"赤面少女\",\n        \"sekipan\": \"石板\",\n        \"sekishoku vanilla\": \"赤色バニラ\",\n        \"sekitan bukuro\": \"石炭袋\",\n        \"selen\": \"Selen\",\n        \"selene\": \"Selene\",\n        \"sem colon\": \"SEM;COLON\",\n        \"semakute kurai\": \"狭くて暗い\",\n        \"semedain g\": \"セメダインG\",\n        \"semimogura\": \"せみもぐら\",\n        \"sen\": \"煎\",\n        \"sen ka\": \"SEN_KA\",\n        \"sen.exe\": \"sen.exe\",\n        \"senarinko\": \"senarinko\",\n        \"senba kitchen\": \"船場きっちん\",\n        \"senbata rom\": \"せんばたROM\",\n        \"senbata-rom\": \"せんばたROM\",\n        \"senbon knock zadankai\": \"千本ノック座談会\",\n        \"senbunritsu\": \"千分率\",\n        \"sendankaisen\": \"千段櫂船\",\n        \"sengoku joketsu emaki\": \"戦国女傑絵巻\",\n        \"seniman kartun\": \"セニマンカルタン\",\n        \"senju\": \"千寿\",\n        \"senkou campanella\": \"閃光カンパネラ\",\n        \"senmatu-chaya\": \"千松茶屋\",\n        \"sennen comodo\": \"千年コモド\",\n        \"sennen ookami\": \"千年狼\",\n        \"sennohi.\": \"センノヒ.\",\n        \"senri no dou\": \"千里ノ洞\",\n        \"sentou kaiiki\": \"戦闘海域\",\n        \"sentou yousei\": \"仙桃妖星\",\n        \"senya sabou\": \"千夜茶房\",\n        \"senyen\": \"SENYEN\",\n        \"senzendou\": \"仙々堂\",\n        \"sepia\": \"SEPIA\",\n        \"sepia concerto\": \"セピアコンチェルト\",\n        \"sequence\": \"し～くえんす\",\n        \"sequence breaker\": \"シークエンスブレイカー\",\n        \"seraphim\": \"せらぴん\",\n        \"serenta\": \"Serenta\",\n        \"serious graphics\": \"serious graphics\",\n        \"sero-sero\": \"SERO-SERO\",\n        \"service boy\": \"SERVICE BOY\",\n        \"sesame\": \"セサミ\",\n        \"seseragi no machikado\": \"せせらぎの街角\",\n        \"sesso minus\": \"節操マイナス\",\n        \"setouchi pharm\": \"瀬戸内製薬\",\n        \"setsugetsuka\": \"雪月花\",\n        \"setsunasamidare\": \"せつなさみだれ\",\n        \"seven gods\": \"SEVEN GODS!\",\n        \"seven sea star\": \"SEVEN SEA STAR\",\n        \"seven wonder\": \"SEVEN WONDER\",\n        \"sevens magajin\": \"セブンズマガジン\",\n        \"seventh heaven\": \"SEVENTH HEAVEN\",\n        \"sevirey\": \"セビレィ\",\n        \"sexpet project j\": \"sexpet project J\",\n        \"sextant\": \"SEXTANT\",\n        \"sf-l\": \"SF-L\",\n        \"sg\": \"SG\",\n        \"sgsix\": \"SGsix\",\n        \"shadow garden\": \"Shadow Garden\",\n        \"shadow sorceress communication protocol\": \"影法師通訊協定\",\n        \"shagbase\": \"Shadbase\",\n        \"shagwell\": \"SHAGWELL\",\n        \"shakestyle\": \"shakestyle\",\n        \"shallow sleep plus plus\": \"Shallow Sleep++\",\n        \"shamontei\": \"沙門亭\",\n        \"shamrock.\": \"Shamrock.\",\n        \"shan maryland\": \"シャンメリーランド\",\n        \"shanghai honey bee\": \"上海蜜蜂\",\n        \"shangrila\": \"シャングリラ\",\n        \"shanhai kaijou koushi\": \"上海海上公司\",\n        \"sharuru hunter\": \"シャルルハンター\",\n        \"shay-cone\": \"SHAY-CONE\",\n        \"sheep cat\": \"しーぷきゃっと\",\n        \"sheepcloud\": \"SHEEPCLOUD\",\n        \"sherbet soft\": \"シャーベットソフト\",\n        \"shi shi shijimi\": \"SHI SHI しじみ\",\n        \"shi-kugakari saru\": \"飼育係さる\",\n        \"shian\": \"紫庵\",\n        \"shiashiya\": \"しあし屋\",\n        \"shiawase kanmiryou\": \"しあわせ甘味料\",\n        \"shiawase kyouwakoku\": \"幸せ共和国\",\n        \"shiawase manjuu\": \"しあわせまんじゅう\",\n        \"shiawase pudding dou\": \"しあわせプリン堂\",\n        \"shibafu cement\": \"芝生セメント\",\n        \"shibaneko hungry\": \"芝猫はんぐりー!\",\n        \"shibou suitei jikoku\": \"志望推定時刻\",\n        \"shibubu shibubushi\": \"しぶぶしぶぶし\",\n        \"shichirin taisha\": \"七輪大社\",\n        \"shichiyou\": \"七陽\",\n        \"shichiyou souryuujin\": \"七曜蒼龍陣\",\n        \"shigaraki ceramic\": \"シガラキセラミック\",\n        \"shigunyan\": \"しぐにゃん\",\n        \"shigure ebi\": \"しぐれえび\",\n        \"shigureya\": \"しぐれや\",\n        \"shihai shoujo\": \"支配少女\",\n        \"shiina club\": \"しいなくらぶ\",\n        \"shiinotomoshibitake\": \"しいのともしびたけ\",\n        \"shiitake\": \"椎茸\",\n        \"shijima\": \"しじま\",\n        \"shijou misaki\": \"紙上岬\",\n        \"shikaku to sankaku\": \"しかくとさんかく\",\n        \"shiki hanana\": \"紫木はなな\",\n        \"shikibu\": \"式部\",\n        \"shikimisan keiro\": \"シキミ酸経路\",\n        \"shikioriori\": \"シキオリオリ\",\n        \"shikitenshi\": \"色天使\",\n        \"shikkoku no hekireki\": \"漆黒の霹靂\",\n        \"shikkoku no tsubasa\": \"漆黒の翼\",\n        \"shikkoku no voltecker\": \"漆黒のボルテッカー\",\n        \"shikkokuno j.p.s.\": \"漆黒のJ.P.S.\",\n        \"shiko neru mix\": \"シコ寝るミックス\",\n        \"shikunikiwa\": \"しくにきわ\",\n        \"shima hitsuji\": \"しまひつじ\",\n        \"shima kneesocks tayoutai\": \"縞ニーソックス多様体\",\n        \"shimane no inugoya\": \"島根の犬小屋\",\n        \"shimanto seiryuu\": \"四万十清流\",\n        \"shimapanicecandy\": \"しまぱんアイスキャンディー\",\n        \"shimarisutei\": \"しまりす亭\",\n        \"shimashima stripe\": \"しましますとらいぷ\",\n        \"shimashima-pnt\": \"しましまPNT\",\n        \"shimeji777\": \"Shimeji777\",\n        \"shimekiri sanpunmae\": \"〆切り3分前\",\n        \"shimerike\": \"シメリケ\",\n        \"shimoboard\": \"シモボード\",\n        \"shimoda nekomaru\": \"霜田猫丸\",\n        \"shimofuri green meat\": \"しもふりグリーンミート\",\n        \"shimofuritei\": \"霜降亭\",\n        \"shimofutaketa zorome\": \"下二桁ぞろ目\",\n        \"shimokuniya\": \"シモクニヤ\",\n        \"shimotarou\": \"下太郎\",\n        \"shin-chan carnival\": \"Shin-Chan Carnival !?\",\n        \"shinachiku castella\": \"しなちくかすてぃーら\",\n        \"shinanoya\": \"信濃屋\",\n        \"shinba oolong cha\": \"神葉烏龍茶\",\n        \"shinchara\": \"しんきゃら\",\n        \"shinderarejou\": \"しんでられ城\",\n        \"shine nabyss\": \"シャイン・ナビス\",\n        \"shine no syoujyo\": \"シャインの少女\",\n        \"shinimonogurui\": \"しにものぐるい\",\n        \"shining\": \"SHINING\",\n        \"shining star\": \"Shining Star\",\n        \"shinjae iinkai\": \"死んじゃえ委員会\",\n        \"shinjuku koma gekijou\": \"新宿狛劇場\",\n        \"shinkai\": \"深海\",\n        \"shinkai hikou\": \"深海飛行\",\n        \"shinkai saboten\": \"深海サボテン\",\n        \"shinkai seizu\": \"深海星図\",\n        \"shinkan ochimashita\": \"新刊堕ちました\",\n        \"niitakayama tozantai\": \"新高山登山队\",\n        \"shinkuraiku\": \"しんくらいく\",\n        \"shinmichikai\": \"真道会\",\n        \"shinnihon pepsitou\": \"新日本ペプシ党\",\n        \"shinobi no yakata\": \"忍ノ館\",\n        \"shinobi rocket\": \"シノビロケット\",\n        \"shinohara heavy industry\": \"篠原重工営業部\",\n        \"shinpakusu teika\": \"心拍数低下\",\n        \"shinsei shoujo nyuugyou\": \"神聖少女乳業\",\n        \"shinsekai manga kenkyuukai\": \"新世界漫画研究会\",\n        \"shinsen gokuraku\": \"新鮮極楽\",\n        \"shinshi zaibatsu\": \"紳士財閥\",\n        \"shinshunshantonshou\": \"新春山東省\",\n        \"shiodome project\": \"汐留project\",\n        \"shiohama\": \"SHIOHAMA\",\n        \"shioji\": \"しおじ\",\n        \"shionoya\": \"しおのや\",\n        \"shiotsuki suien\": \"汐月水園\",\n        \"shioya\": \"塩屋\",\n        \"shioya abu tsuushin\": \"塩屋虻通信\",\n        \"sioyaki\": \"しおやき\",\n        \"sioyude\": \"しおゆで\",\n        \"shippo banchou\": \"しっぽ番長\",\n        \"shippuudotou\": \"疾風怒濤\",\n        \"shirakaba doori\": \"白樺通り\",\n        \"shiraki no kobeya\": \"白木の小部屋\",\n        \"shiranai ouchi\": \"しらないおうち\",\n        \"shirasagisou\": \"しらさぎ荘\",\n        \"shirasu an\": \"しらす庵\",\n        \"shirasugayu\": \"白子粥\",\n        \"shiratama\": \"しらたま\",\n        \"shiratamarch\": \"しらたまーち\",\n        \"shirayuki shoujodan\": \"白雪少女団\",\n        \"shirikageru taberu\": \"シリカゲルタベル\",\n        \"shiritsu sakuranbo shougakkou\": \"私立さくらんぼ小学校\",\n        \"shiro anmitsu\": \"しろあんみつ\",\n        \"shiro gas koujou\": \"白瓦斯工場\",\n        \"shiro kuro soft\": \"シロクロソフト\",\n        \"shiro no kigen\": \"白の起源\",\n        \"shiroboshi koubou\": \"白星工房\",\n        \"shiroganean\": \"白金庵\",\n        \"shiroi famicon\": \"しろいファミコン\",\n        \"shiroi kitsune no sumu yashiro\": \"白い狐の住む社\",\n        \"shiroi shinoshino\": \"しろいしのしの\",\n        \"shiroi tentoumushi\": \"白い天道虫\",\n        \"shiroi yami\": \"白い闇\",\n        \"shiroino.\": \"白いの。\",\n        \"shiroiro\": \"しろいろ\",\n        \"shiroiro ribbon\": \"しろ色りぼん\",\n        \"shirojia\": \"シロジア\",\n        \"shirokarasuya\": \"白からす屋\",\n        \"shirokuro panda\": \"白黒ぱんだ\",\n        \"shirokurofuurinkou\": \"しろくろ風鈴刻\",\n        \"shirokyuuketsuki\": \"白吸血鬼\",\n        \"shiromitsu nyuugyou\": \"白蜜乳業\",\n        \"shiromitsuya\": \"しろみつ屋\",\n        \"shironegiya\": \"白ネギ屋\",\n        \"shironeko ichizoku\": \"白猫一族\",\n        \"shirorika\": \"シロリカ\",\n        \"shirotsumekusa\": \"シロツメクサ\",\n        \"shis laboratory\": \"SHi's Laboratory\",\n        \"shishamo house\": \"ししゃもハウス\",\n        \"shishamo teikoku\": \"ししゃも帝国\",\n        \"shishamotei\": \"ししゃも亭\",\n        \"shishigami\": \"ししがみ\",\n        \"shishimaruya\": \"獅子丸屋\",\n        \"shishunki\": \"思春棄\",\n        \"shishunki paradigm\": \"思春期パラダイム\",\n        \"shisshin chuudoku\": \"失神中毒\",\n        \"shitsuji no kumaana\": \"シツジノクマアナ\",\n        \"shiwodou.\": \"しを堂。\",\n        \"shiya\": \"志屋\",\n        \"shiyou kougen\": \"四葉弘彦\",\n        \"shiyouka.\": \"しようか。\",\n        \"shizendou\": \"四然堂\",\n        \"shizuka no umi\": \"静香の海\",\n        \"shizuoka kakusei shoujo\": \"静岡覚醒少女\",\n        \"shm\": \"SHM\",\n        \"shobocon\": \"しょぼコン\",\n        \"shocoratie\": \"ショコラティエ!\",\n        \"shokkakuya\": \"食客屋\",\n        \"shokumu taiman\": \"職務タイマン\",\n        \"shokushu mind\": \"触手mind\",\n        \"shokuzai\": \"贖罪\",\n        \"shonen shojo tai\": \"少年少女隊\",\n        \"shonnaka-dou\": \"しょんなか堂\",\n        \"shore\": \"ショアー\",\n        \"shosekido\": \"硝石堂\",\n        \"shoshi magazine hitori\": \"書肆マガジンひとり\",\n        \"shoshinsha crossover\": \"初心者クロスオーバー\",\n        \"shota scratch jikkou iinkai\": \"スクラッチ実行委員会\",\n        \"shotafes junbikai\": \"ショタフェス準備会\",\n        \"shoudansha\": \"笑談者\",\n        \"shouga udon\": \"枯葉\",\n        \"shoujo aigan club\": \"少女愛玩倶楽部\",\n        \"shoujo ex\": \"少女EX\",\n        \"shoujo idenshi\": \"少女遺伝子\",\n        \"shoujo kaihatsu shitsu\": \"少女開発室\",\n        \"shoujo katharsis.\": \"少女カタルシス。\",\n        \"shoujo kousaku\": \"少女交錯\",\n        \"shoujo no dangan\": \"少女の弾丸\",\n        \"shoujo no mori\": \"少女の杜\",\n        \"shoujo no youni\": \"少女のように\",\n        \"shoujo seiyaku\": \"少女製薬\",\n        \"shoujo shumi.\": \"少女趣味。\",\n        \"shoujo zukin\": \"少女頭巾\",\n        \"shounan oshinobi club\": \"湘南おしのびCLUB\",\n        \"shounen byoukan\": \"少年病監\",\n        \"shounen x shoujo\": \"少年×少女\",\n        \"shounen yuuichirou\": \"少年ゆういちろう\",\n        \"shounen-h\": \"少年H\",\n        \"shounendan\": \"少年団\",\n        \"shounin eden\": \"聖人エデン\",\n        \"shouwa kara heisei e\": \"昭和から平成へ\",\n        \"shouwa prism\": \"昭和プリズム\",\n        \"showa saishuu sensen\": \"昭和最終戦線\",\n        \"shouyu gohan\": \"しょうゆごはん\",\n        \"syowajukou\": \"昭和重工\",\n        \"shrine\": \"SHRINE\",\n        \"shudoushiki denki jidousha\": \"手動式電気自動車\",\n        \"shukketsu kansatsu nikki\": \"出血観察日記\",\n        \"shumisen jiru\": \"シュミセンジル\",\n        \"shun shun shouten\": \"しゅん々商店\",\n        \"shungabu\": \"春画部\",\n        \"shuniku 2\": \"しゅにく2\",\n        \"shunran\": \"春蘭\",\n        \"shuraba keikaku\": \"修羅場計画\",\n        \"shuuchuugouu keihou\": \"集中豪雨警報\",\n        \"shuukan freaks\": \"収監フリークス\",\n        \"shuukyuu itsukasei\": \"週休五日制\",\n        \"shuusei patch 3gb\": \"修正パッチ3GB\",\n        \"shyness over drive\": \"SHYNESS OVER DRIVE\",\n        \"shyo chiku bai\": \"笑畜売\",\n        \"side buy side\": \"Side Buy Side\",\n        \"side m\": \"Side:M\",\n        \"side-a\": \"SIDE-A\",\n        \"sideoff\": \"サイドオフ\",\n        \"sigamitsuki mizuhiki\": \"しがみつきみずひき\",\n        \"sigma-plan\": \"∑-PLAN\",\n        \"sigmanica\": \"SIGMANICA\",\n        \"signal go\": \"SIGNaL_GO\",\n        \"signal group\": \"シグナルグループ\",\n        \"signalred\": \"SignalRed\",\n        \"signal yellow\": \"しぐなるいえろー\",\n        \"signares jigen\": \"シグナレス次元\",\n        \"signstandard\": \"サインスタンダード\",\n        \"sikosiko network\": \"SIKOSIKO NETWORK\",\n        \"sikouya\": \"試行屋\",\n        \"silent hill\": \"SILENT HILL\",\n        \"silent4\": \"サイレント4\",\n        \"silicon jichou\": \"シリコン自重\",\n        \"silky to yukai na nakama-tachi\": \"しるきーと愉快な仲間たち\",\n        \"silmaril\": \"しるまりる\",\n        \"silver bloom\": \"SILVER BLOOM\",\n        \"silver bullet\": \"Silver Bullet\",\n        \"silver way\": \"銀色宇宙(仮)\",\n        \"silverfox\": \"銀狐\",\n        \"silverrice\": \"シルバーライス\",\n        \"silverstone\": \"SilverStone\",\n        \"simasima system\": \"しましましすてむ\",\n        \"simfrill\": \"シンプリル\",\n        \"simokentarous\": \"しもケンタロス\",\n        \"simotsukekai\": \"下野会\",\n        \"simple house\": \"SIMPLE HOUSE\",\n        \"sin-maniax\": \"sin-maniax\",\n        \"singleton\": \"Singleton\",\n        \"sinistra\": \"シニストラ\",\n        \"sinizon\": \"SINIZON\",\n        \"sinkirou\": \"心輝楼\",\n        \"sinonome\": \"シノノメ\",\n        \"sinoriya\": \"しのり屋\",\n        \"sinosino\": \"しのしの\",\n        \"sion\": \"SION\",\n        \"siooninco\": \"塩おにんこ\",\n        \"siop\": \"単一統合作戦計画\",\n        \"sippo-soft\": \"SIPPO-SOFT\",\n        \"siratama nikukyuu\": \"しらたま肉球\",\n        \"siratamadon\": \"白玉井\",\n        \"sirius.\": \"SIRIUS.\",\n        \"sirojio\": \"白塩\",\n        \"siropome\": \"しろぽめ\",\n        \"sirotaruto\": \"しろたると\",\n        \"sirotateto\": \"しろたてと\",\n        \"sirousagicafe\": \"しろうさぎカフェ\",\n        \"sister screaming i die\": \"SISTER SCREAMING I DIE\",\n        \"sister soft\": \"しすたーそふと\",\n        \"sisui sisters\": \"しすいシスターズ\",\n        \"sittori oblaat\": \"しっとりオブラート\",\n        \"situation laboratory\": \"シチュラボ\",\n        \"sk01\": \"SK01\",\n        \"skeleton scape\": \"skeleton scape\",\n        \"sketch-book\": \"落描帳\",\n        \"skew\": \"SKEW\",\n        \"skirt tsuki\": \"スカートつき\",\n        \"sklabel\": \"SKlabel\",\n        \"skug\": \"SKUG\",\n        \"skunks\": \"スカンクス\",\n        \"sky daruton gyokuza\": \"天空怠豚玉座\",\n        \"sky lounge garden\": \"Sky Lounge Garden\",\n        \"sky walk\": \"Sky Walk\",\n        \"skycolours\": \"SkycolourS\",\n        \"skyworks\": \"SKYワークス\",\n        \"sl\": \"SL\",\n        \"slaman bokujou\": \"すらまん牧場\",\n        \"slamp\": \"すらんぷ\",\n        \"slap-stick\": \"スラップスティック\",\n        \"slapstickstrike\": \"SlapStickStrike\",\n        \"slavedoll\": \"SlaveDoll\",\n        \"slavenir\": \"スレイブニール\",\n        \"sledgehammerout\": \"SledgehammerOut!\",\n        \"sleeper\": \"Sleeper\",\n        \"sleeping helianthus\": \"Sleeping Helianthus\",\n        \"sleepwatch.ex\": \"寝ヲチEX\",\n        \"slice wakame\": \"スライスわかめ\",\n        \"slime eer\": \"スライムイール\",\n        \"slime mint\": \"すらいむみんと\",\n        \"slime teishoku\": \"スライム定食\",\n        \"slimy alpha\": \"スライミーアルファ\",\n        \"slip bounds\": \"Slip Bounds\",\n        \"sludge\": \"sludge\",\n        \"slump life\": \"すらんぷらいふ\",\n        \"slw\": \"SLW\",\n        \"small dog\": \"Small Dog\",\n        \"small gift\": \"Small Gift\",\n        \"smat.\": \"smat.\",\n        \"smocle\": \"smocle\",\n        \"smokin sick style\": \"Smokin' Sick Style\",\n        \"smooth\": \"smooth\",\n        \"sms\": \"SMS\",\n        \"smuggler\": \"SMUGGLER\",\n        \"smysle\": \"SMYSLE\",\n        \"snack factory\": \"スナック・ファクトリー\",\n        \"snack yoshie\": \"スナックよし江\",\n        \"snake foot\": \"Snake foot\",\n        \"sniff dogs\": \"Sniff Dogs\",\n        \"snob nerd works\": \"SNOB NERD WORKS\",\n        \"snow child\": \"Snow child\",\n        \"snow ice\": \"Snow Ice\",\n        \"snow ring\": \"Snow Ring\",\n        \"snowdance\": \"SNOWDANCE\",\n        \"snowgale\": \"SnowGale\",\n        \"snowrich\": \"すのーりっち\",\n        \"so much in luv\": \"sO mUCH iN LUV\",\n        \"so-matou\": \"そーま党\",\n        \"soar\": \"Soar\",\n        \"soba to mayo\": \"蕎麦とマヨ\",\n        \"soba udon\": \"そばうどん\",\n        \"sobabu\": \"蕎麦部\",\n        \"sobakara\": \"そばから\",\n        \"sobalabo\": \"sobalabo\",\n        \"sobaworks\": \"sobaworks\",\n        \"socarrat\": \"socarrat\",\n        \"soda batake\": \"苏打畑\",\n        \"soda rain\": \"Soda Rain\",\n        \"sodenosumi\": \"袖の墨\",\n        \"sodomutogomora\": \"ソドムトゴモラ\",\n        \"soft circle courreges\": \"ソフトさ～くるクレージュ\",\n        \"soft on omanko\": \"SOFT ON OMANKO\",\n        \"soft thigh\": \"Soft Thigh\",\n        \"soitsu wa yabee\": \"そいつはヤベェ!\",\n        \"soket equals pocket\": \"そけっと=ぽけっと\",\n        \"soko\": \"倉庫\",\n        \"sokotsuya baker\": \"粗忽屋ベイカー\",\n        \"sokuochi neurosis\": \"即堕ちノイローゼ\",\n        \"solala\": \"solala\",\n        \"solar milk soft\": \"そらみるソフト\",\n        \"solarray\": \"ソーラレイ\",\n        \"soleil\": \"Soleil\",\n        \"solex\": \"SOLEX\",\n        \"solid air\": \"SOLID AIR\",\n        \"soloistick\": \"ソリスティック\",\n        \"soloship\": \"ソロシップ\",\n        \"some leaves\": \"SOME LEAVES\",\n        \"somnia\": \"somnia\",\n        \"sondake.\": \"そんだけ。\",\n        \"sonei danchi\": \"村営団地\",\n        \"sonflower\": \"sonflower\",\n        \"sonic\": \"そにっく\",\n        \"sonic star\": \"SONIC STAR\",\n        \"sonic winter\": \"SONIC WINTER\",\n        \"sonnet\": \"Sonnet\",\n        \"sonograph\": \"sonograph\",\n        \"sonohigurashi\": \"その日ぐらし\",\n        \"sonotaozey\": \"その他大勢\",\n        \"sora mint\": \"ソラミント\",\n        \"sora no colors\": \"空のCOLORS\",\n        \"sora no sakura\": \"そらのさくら\",\n        \"sora osen nantai neko\": \"空汚染軟体猫\",\n        \"sora wa chimidoro\": \"空は血みどろ\",\n        \"sorabatake\": \"そらばたけ\",\n        \"soragokoro\": \"そらごころ\",\n        \"soragoto\": \"空言\",\n        \"sorahima\": \"そらひま\",\n        \"sorairo march\": \"空色まーち\",\n        \"sorairo panda\": \"空色パンダ\",\n        \"sorairo telephone\": \"ソライロテレフォン\",\n        \"soramimi\": \"そらみみ\",\n        \"soramune\": \"そらむね\",\n        \"sorasore\": \"そらそれ\",\n        \"soratobu mighty python\": \"空飛ぶマイティ・パイソン\",\n        \"soratobu umeboshi\": \"空飛ぶうめぼし\",\n        \"sorekara\": \"それから\",\n        \"soreya\": \"其レ屋\",\n        \"soronosanchi\": \"そろのさん家\",\n        \"sorudeia\": \"そるでいあ\",\n        \"soseidoh\": \"想成堂\",\n        \"sosl\": \"SOSL\",\n        \"sou soul\": \"Sou Soul\",\n        \"souchou bazooka\": \"早朝バズーカ\",\n        \"souchou no koubou\": \"曹長の工房\",\n        \"sougetsutei\": \"双月亭\",\n        \"souju\": \"蒼樹\",\n        \"souka sentou\": \"双花仙桃\",\n        \"soukai fusso\": \"蒼海☆フッ素\",\n        \"soukentyaya\": \"想見茶屋\",\n        \"souko\": \"倉庫\",\n        \"soukuu\": \"蒼空\",\n        \"soukyuutendou\": \"蒼穹天堂\",\n        \"soul magic\": \"そうるまぢっく\",\n        \"soulfly\": \"SOULFLY\",\n        \"soulsonic\": \"soulsonic\",\n        \"souma books\": \"SOUMA BOOKS\",\n        \"sound milk\": \"SOUND MILK\",\n        \"sounds good\": \"Sounds Good\",\n        \"soundvillage\": \"SoundVillage\",\n        \"sousaku sekkei benran\": \"創作設計便覧\",\n        \"souseiji\": \"創精児\",\n        \"southern blue sky\": \"サザンブルースカイ\",\n        \"souzai soft\": \"そうざいそふと\",\n        \"soy-darake\": \"SOYだらけ\",\n        \"soyoking\": \"ソヨキング\",\n        \"space baron\": \"宇宙男爵\",\n        \"space cat\": \"スペースキャット\",\n        \"space whale\": \"スペースくじら\",\n        \"special action force\": \"SPECIAL ACTION FORCE\",\n        \"speed\": \"SPEED\",\n        \"speed of sound\": \"Speed of Sound\",\n        \"spelflare\": \"すぺるふれあ\",\n        \"spellcaster.\": \"spellcaster.\",\n        \"spermagic\": \"スペルマジック\",\n        \"spermaniax\": \"スペルマニアックス\",\n        \"spermation\": \"スペルメーション\",\n        \"sphere garden\": \"SPHERE GARDEN\",\n        \"spica\": \"♡Spica\",\n        \"spicia\": \"すぱぃしあ\",\n        \"spiciacrow\": \"SpiciaCrow\",\n        \"spicy daisakusen\": \"スパイシー大作戦\",\n        \"spicy loves heaven\": \"スパイシーラブスヘブン\",\n        \"spiel\": \"spiel\",\n        \"spika07\": \"spika07\",\n        \"spinergy\": \"SPINERGY\",\n        \"spira mirabilis\": \"スピラ・ミラビリス\",\n        \"spiral\": \"すぱいらる\",\n        \"spirit-edge\": \"Spirit-Edge\",\n        \"splush wave\": \"SPLUSH WAVE\",\n        \"spongehead\": \"スポンジヘッド\",\n        \"spookyhouse\": \"spookyhouse\",\n        \"spread happiness\": \"Spread Happiness\",\n        \"sprechchor\": \"シュプレヒコール\",\n        \"spring castle\": \"spring castle\",\n        \"springlove\": \"SpringLOVE\",\n        \"sprinkler of calpis\": \"Sprinkler of かるぴす\",\n        \"sprout\": \"SPROUT\",\n        \"spt\": \"SPT\",\n        \"spunk\": \"Spunk!\",\n        \"sputnik\": \"すぷーとにく\",\n        \"spy\": \"SPY\",\n        \"squall\": \"Squall\",\n        \"sr inma no mori\": \"SR 淫魔ノ森\",\n        \"srats\": \"SRATS\",\n        \"ssb\": \"SSB\",\n        \"ssc\": \"SSC\",\n        \"ssdl\": \"SSDL\",\n        \"ssize\": \"Ssize\",\n        \"sst\": \"SST\",\n        \"st 3point\": \"St 3point\",\n        \"st. different\": \"St. Different\",\n        \"st. ochappa\": \"St.おちゃっぱ\",\n        \"st. rio\": \"聖＝リオ\",\n        \"staffing\": \"スタッフィング\",\n        \"stain.\": \"Stain.\",\n        \"stakhanovite movement\": \"スタハノフ運動\",\n        \"stametch\": \"STAMETCH!\",\n        \"stand erection\": \"スタンドエレクション\",\n        \"stand play\": \"STAND PLAY\",\n        \"star berry\": \"STAR BERRY\",\n        \"star fall\": \"STAR FALL\",\n        \"star parlor\": \"STAR PARLOR\",\n        \"stargazer\": \"STARGAZER\",\n        \"starlit sky\": \"Starlit Sky\",\n        \"starmine18\": \"Starmine18\",\n        \"starry sky\": \"Starry Sky\",\n        \"starworks\": \"STARWORKS\",\n        \"stasis\": \"ステイシス\",\n        \"state of see\": \"ステートオブシー\",\n        \"statice\": \"スターチス\",\n        \"status doku\": \"ステータスどく\",\n        \"stay gold\": \"STAY GOLD\",\n        \"steam bread factory\": \"すちーむぶれっどふぁくとりー\",\n        \"steel mayonnaise\": \"Steel Mayonnaise\",\n        \"steelact\": \"STEELACT\",\n        \"stellar\": \"STELLAR\",\n        \"stencil step\": \"ステンシルステップ\",\n        \"steppen wolf\": \"STEPPEN WOLF\",\n        \"stew ni gohan\": \"シチューにごはん\",\n        \"stick number\": \"ステック なんばー\",\n        \"still\": \"Still\",\n        \"stk\": \"STK\",\n        \"stm\": \"STM\",\n        \"stoic romance\": \"Stoic Romance\",\n        \"stone heads\": \"STONE HEADS\",\n        \"stonecake\": \"stonecake\",\n        \"stonemason\": \"stonemason\",\n        \"stop-ten\": \"STOP店\",\n        \"storm\": \"STORM\",\n        \"storm hammer\": \"STORM HAMMER\",\n        \"straight\": \"Straight\",\n        \"strand kyokusen gai\": \"ストランド曲線街\",\n        \"strange beast\": \"ストレンジビースト\",\n        \"strange coquetry\": \"ストレンジコケットリー\",\n        \"strange pop\": \"STRANGE POP\",\n        \"strangesagittarius\": \"StrangeSagittarius\",\n        \"stratos\": \"STRATOS\",\n        \"stratosphere\": \"ストラトスフィア\",\n        \"strawberry\": \"すとろべりー\",\n        \"strawberry and tea\": \"いちごと紅茶\",\n        \"strawberry nipple\": \"ストロベリーにっぷる\",\n        \"strawberry shower\": \"すとろべりーシャワー\",\n        \"straymoon\": \"StrayMoon\",\n        \"stream of creek\": \"STREAM OF CREEK\",\n        \"strega\": \"STREGA\",\n        \"stripe orange\": \"stripe orange\",\n        \"stripeg\": \"stripeg\",\n        \"stroll in the woods\": \"STROLL IN THE WOODS !! -森林浴-\",\n        \"strong7\": \"STRONG7\",\n        \"sts\": \"宇宙旅行協会\",\n        \"studio 7\": \"Studio 7\",\n        \"studio americ\": \"スタジオアメリック\",\n        \"studio anshin\": \"STUDIOあんしん\",\n        \"studio anteros\": \"スタジオ・アンテロス\",\n        \"studio aqa\": \"Studio AQA\",\n        \"studio awake\": \"スタジオ★アオーク\",\n        \"studio b9\": \"Studio B9\",\n        \"studio baki\": \"STUDIO BAKI\",\n        \"studio bass line\": \"STUDIO BASS LINE\",\n        \"studio berserk\": \"Studioベルセック\",\n        \"studio boto-master\": \"すたじおぼとますたあ\",\n        \"studio cardamom\": \"STUDIO カルダモン\",\n        \"studio charen\": \"すたじおちゃれん\",\n        \"studio claim\": \"STUDIO CLAIM\",\n        \"studio cute\": \"Studio Cute\",\n        \"studio d-suke\": \"STUDIO D-Suke\",\n        \"studio daiya\": \"スタジオ・ダイヤ\",\n        \"studio daiya alt\": \"スタジオ・ダイヤ・オルタ\",\n        \"studio dellforce\": \"STUDIOデルフォース\",\n        \"studio dia\": \"スタジオ・ダイア\",\n        \"studio diamond\": \"スタジオ・ダイヤ\",\n        \"studio dimple\": \"スタジオDimple\",\n        \"studio erohouse\": \"スタジオエロハウス\",\n        \"studio f\": \"スタジオ・エフ\",\n        \"studio fatality\": \"STUDiO FATALITY\",\n        \"studio fng\": \"studio FNG\",\n        \"studio fuck\": \"STUDIO FUCK\",\n        \"studio gaudi\": \"Studio Gaudi\",\n        \"studio gomasenbe\": \"STUDIO GOMASENBE\",\n        \"studio gorenuke\": \"スタジオGORENUKE\",\n        \"studio hamachigumi\": \"STUDIOはまち組\",\n        \"studio hamburg\": \"すたじおはんばーぐ\",\n        \"studio hofu-na kaihou sen2\": \"STUDIOホフーナ解放戦線\",\n        \"studio hoshiwatari\": \"Studio 星渡\",\n        \"studio hp plus\": \"STUDIO HP+\",\n        \"studio implant\": \"Studio Implant\",\n        \"studio insane\": \"Studio Insane\",\n        \"studio ipponzeoi\": \"スタジオ一本背負い\",\n        \"studio jam\": \"STUDIO JAM\",\n        \"studio jaren\": \"STUDIO 邪恋\",\n        \"studio jibeta\": \"studio jibeta\",\n        \"studio jikkenshitsu\": \"すたじお実験室\",\n        \"studio k\": \"すたぢおK\",\n        \"studio kakinoha-zaka\": \"STUDIO柿ノ葉坂\",\n        \"studio kame\": \"スタジオ カメ\",\n        \"studio katsudon\": \"スタジオかつ丼\",\n        \"studio kimigabuchi\": \"スタジオKIMIGABUCHI\",\n        \"studio kom\": \"スタジオコム\",\n        \"studio kyawn\": \"スタジオきゃうん\",\n        \"studio lood\": \"STUDIO LOOD\",\n        \"studio loud in school\": \"STUDIO LOUD IN SCHOOL\",\n        \"studio m nda pon\": \"スタジオMんだPON\",\n        \"studio mark ii\": \"スタジオMARKII\",\n        \"studio min\": \"STUDIO Min\",\n        \"studio miris\": \"すたじおみりす\",\n        \"studio mukon\": \"スタジオ夢魂\",\n        \"studio n.ball\": \"スタジオN・BALL\",\n        \"studio nadeshiko\": \"スタジオナデシコ\",\n        \"studio narazuke\": \"スタジオ奈良漬\",\n        \"studio naze\": \"スタジオ名瀬\",\n        \"studio neko kick\": \"スタジオねこキック\",\n        \"studio neko punch\": \"スタジオねこぱんち\",\n        \"studio neo black\": \"Studio Neo Black\",\n        \"studio nunchaku\": \"スタジオヌンチャク\",\n        \"studio omg\": \"スタジオOMG\",\n        \"studio orca\": \"studioオルカ\",\n        \"studio p.m.y\": \"Studio P.M.Y\",\n        \"studio pakira\": \"Studio PAKIRA\",\n        \"studio paradise\": \"STUDIO PARADISE\",\n        \"studio parfe\": \"すたじおぱふぇ\",\n        \"studio parm\": \"Studio★ParM\",\n        \"studio pastel\": \"Studio Pastel\",\n        \"studio pelqurappe\": \"STUDIOぺるくらっぺ\",\n        \"studio pork\": \"スタジオポーク\",\n        \"studio q\": \"すたぢおQ\",\n        \"studio r\": \"すたじおあ～る\",\n        \"studio rakkyou\": \"スタジオらっきょう\",\n        \"studio retake\": \"スタジオリテイク\",\n        \"studio runaway wolf\": \"STUDIO RUNAWAY WOLF\",\n        \"studio ryokucha\": \"すたじお緑茶\",\n        \"studio-sakura\": \"Studio-Sakura\",\n        \"studio sample\": \"Studio SAMPLE\",\n        \"studio sepia\": \"スタジオセピア\",\n        \"studio sfc\": \"スタジオSFC\",\n        \"studio sharaku\": \"STUDIO写裸苦\",\n        \"studio skb\": \"スタジオSKB\",\n        \"studio southpaw\": \"スタジオサウスポー\",\n        \"studio strike\": \"スタジオストライク\",\n        \"studio sunadokei\": \"studio砂時計\",\n        \"studio sushi kui-ne\": \"すたじお寿司くいねぇ\",\n        \"studio tagata\": \"studio TAGATA\",\n        \"studio tamo\": \"スタジオTAMO\",\n        \"studio tapa tapa\": \"すたじお☆たぱたぱ\",\n        \"studio tar\": \"スタジオた～\",\n        \"studio the devil\": \"Studio The DEVIL\",\n        \"studio tiamat\": \"STUDIO TIAMAT\",\n        \"studio triumph\": \"STUDIO TRIUMPH\",\n        \"studio ubai\": \"スタジオ奪\",\n        \"studio walk\": \"studio WALK\",\n        \"studio woruto\": \"すたぢおヲルト\",\n        \"studio z-agnam\": \"スタジオZ-AGNAM\",\n        \"studio z.m\": \"STUDIO Z.M\",\n        \"studio zonzai\": \"STUDIOぞんざい\",\n        \"studio-74\": \"Studio-74\",\n        \"studio.h.a.o\": \"Studio.好\",\n        \"studio187\": \"studio187\",\n        \"studio309\": \"Studio309\",\n        \"studio30neko\": \"Studio30NEKO\",\n        \"studios\": \"StudioS\",\n        \"stuntmans\": \"スタントマンズ\",\n        \"style-c3\": \"スタイルシースリー\",\n        \"stylish marunage\": \"スタイリッシュ丸投げ\",\n        \"styworks\": \"STYworks\",\n        \"subachikyu\": \"すばちきゅ!\",\n        \"subapai-jigyobu\": \"すばパイ事業部\",\n        \"subaruen himawarigumi\": \"すばる園ひまわり組\",\n        \"subcontract studio\": \"SUBCONTRACT STUDIO\",\n        \"subesube tsukiyo\": \"すべすべ月夜\",\n        \"subesube1kg\": \"すべすべ1kg\",\n        \"subliminal daikaiten\": \"サブリミナル大回転\",\n        \"subsonic factor\": \"Subsonic Factor\",\n        \"succubus\": \"Succubus\",\n        \"sucharaka knight\": \"すちゃらか騎士!\",\n        \"suck drop bambies\": \"Suck Drop Bambies\",\n        \"sudachic\": \"すだちっく\",\n        \"sudou factory\": \"すどーファクトリー\",\n        \"suedama\": \"スヱダマ\",\n        \"suezen\": \"据えZEN\",\n        \"sugahouse\": \"スガハウス\",\n        \"sugar house\": \"シュガーハウス\",\n        \"sugar maple\": \"SUGAR MAPLE\",\n        \"sugar star\": \"Sugar Star\",\n        \"sugareya shouten\": \"すがれや商店\",\n        \"sugarspot\": \"SUGAR(S)POT\",\n        \"sugiya\": \"杉屋\",\n        \"sugofire\": \"SUGOFIRE\",\n        \"sugoi ikioi de\": \"すごい勢いで\",\n        \"sugusoko\": \"すぐそこ\",\n        \"suhamaya\": \"洲浜屋\",\n        \"sui sui works\": \"スイスイワークス\",\n        \"suichuu white\": \"水中ホワイト\",\n        \"suika dokei\": \"すいか時計\",\n        \"suikanotane\": \"すいかのたね\",\n        \"suinose\": \"すいのせ\",\n        \"suiren\": \"翠憐\",\n        \"suishoku sendan\": \"翠色戦団\",\n        \"suiteibuin\": \"推定部員\",\n        \"suitekiya\": \"水滴屋\",\n        \"suizokukan\": \"睡族館\",\n        \"sukapon-do\": \"スカポン堂\",\n        \"sukaradog\": \"SUKARADOG\",\n        \"sukebe time\": \"SUKEBE TIME\",\n        \"sukerasparo\": \"SukeraSparo\",\n        \"suketamaya\": \"スケタ魔屋\",\n        \"sukidarake\": \"すきだらけ\",\n        \"sukiiro sekai\": \"スキイロセカイ\",\n        \"sukima sangyou\": \"スキマ産業\",\n        \"sukimakaze honpo\": \"スキマ風本舗\",\n        \"sukinishitai\": \"すきにし隊\",\n        \"sukoburumers\": \"すこぶるまぁズ\",\n        \"sukoyaka collagen\": \"すこやかコラーゲン\",\n        \"sukuri umu\": \"すくりうむ\",\n        \"sumeragi designs\": \"皇DESIGNS\",\n        \"sumicco.\": \"すみっこ。\",\n        \"sumikko\": \"すみっこ\",\n        \"sumire club\": \"スミレ倶楽部\",\n        \"sumisumi dou\": \"スミスミ堂\",\n        \"summer child\": \"SUMMER CHILD\",\n        \"sumomo dou\": \"すもも堂\",\n        \"sunadokei to enpitsu\": \"砂時計と鉛筆\",\n        \"sunagimo.\": \"すなぎも。\",\n        \"sunday shower\": \"SUNDAY SHOWER\",\n        \"sunezumi fauvism\": \"素鼠フォーヴィスム\",\n        \"sunomono purin\": \"すのもの☆ぷりん\",\n        \"sunroad travellers\": \"Sunroad Travellers\",\n        \"sunset dreamer\": \"サンセットドリーマー\",\n        \"sunsetmoon\": \"SunsetMoon\",\n        \"sunsun lab\": \"サンサンLAB\",\n        \"sunyiru\": \"すにぃる\",\n        \"super colorful\": \"スーパーカラフル\",\n        \"super ichigo-chan\": \"スーパーイチゴチャン\",\n        \"super sentou\": \"スーパー銭湯\",\n        \"super usagi comic\": \"スーパーウサギコミック\",\n        \"superbad\": \"スーパーバッド\",\n        \"supplement\": \"サプリメント\",\n        \"supplemental\": \"サプリメンタル\",\n        \"supposo\": \"スッポソ\",\n        \"supurabi\": \"すぷらび\",\n        \"suraimu no youna nanika\": \"すらいむのような何か\",\n        \"surface\": \"Surface\",\n        \"surface tension\": \"Surface Tension\",\n        \"suriko gi\": \"すりこギ部\",\n        \"surumenium\": \"スルメニウム\",\n        \"survive\": \"survive\",\n        \"sus\": \"SUS\",\n        \"susano arashi\": \"スサノアラシ\",\n        \"sushi-go-round\": \"回転寿司\",\n        \"sushi-ya\": \"寿司屋\",\n        \"sushiya.\": \"スシヤ。\",\n        \"sutaco rider\": \"スタコライダー\",\n        \"suteiburus\": \"すていぶるず\",\n        \"suvwave\": \"SUVWAVE\",\n        \"suwatteru\": \"座ってる\",\n        \"suzome\": \"酢ぞめ\",\n        \"suzuki shouten\": \"鈴木商店\",\n        \"suzukure\": \"涼暮\",\n        \"suzume no miya\": \"雀の宮\",\n        \"suzumeno\": \"すずめの\",\n        \"suzumeya\": \"すずめや\",\n        \"suzunaridou\": \"鈴鳴堂\",\n        \"suzune rai chikashitsu\": \"鈴根らい地下室\",\n        \"suzuneiro\": \"すずねいろ\",\n        \"suzuneya ni youkoso\": \"スズネ屋にようこそ\",\n        \"suzupony\": \"すずぽに\",\n        \"suzuran\": \"鈴蘭\",\n        \"suzushirodou\": \"蘿蔔堂\",\n        \"swan\": \"スワン\",\n        \"swan mania\": \"スワンマニア\",\n        \"swastika\": \"SWASTIKA\",\n        \"sweet candle\": \"Sweet Candle\",\n        \"sweet devil\": \"すいーとでびる\",\n        \"sweet girls\": \"Sweet Girls\",\n        \"sweet jasmine\": \"sweet☆jasmine\",\n        \"sweet pea\": \"スイートピー\",\n        \"sweet princess\": \"Sweet Princess\",\n        \"sweet raspberry\": \"スウィートラズベリー\",\n        \"sweet taste\": \"SWEET TASTE\",\n        \"sweetedda\": \"SweetEdda\",\n        \"sweets spaghetti\": \"スイーツスパゲティ\",\n        \"sweetsprite\": \"SweetSprite\",\n        \"swims\": \"SwimS\",\n        \"sxs\": \"SXS\",\n        \"syamisen koubou\": \"三味線工房\",\n        \"sylphian ruby\": \"Sylphian Ruby\",\n        \"sylvia\": \"SYLVIA\",\n        \"symphony\": \"シンフォニー\",\n        \"synchrose\": \"シンクローズ\",\n        \"synthetic garden\": \"Synthetic Garden\",\n        \"syoku\": \"SYOKU\",\n        \"syosyo yakkyoku\": \"処々薬局\",\n        \"syoujyo complete\": \"少女コンプリート\",\n        \"syounen heroine\": \"少年Heroine\",\n        \"syouryu yasui-kai\": \"昇竜安井会\",\n        \"sys3.6.3.\": \"sys3.6.3.\",\n        \"system gzzy\": \"SYSTEM GZZY\",\n        \"syukurin\": \"シュクリーン\",\n        \"syunkasyuutou iinkai\": \"春夏秋冬委員会\",\n        \"syuntyu\": \"春昼\",\n        \"t-court\": \"T-court\",\n        \"t-north\": \"T-NORTH\",\n        \"t-press\": \"T-Press\",\n        \"t-project\": \"T-Project\",\n        \"t-zone\": \"T-ZONE\",\n        \"t.a.k.k.\": \"T.A.K.K.\",\n        \"t.cop\": \"T.cop\",\n        \"t.k.h.k\": \"T・K・H・K\",\n        \"t2 unit\": \"T2 UNIT\",\n        \"t2000\": \"T2000\",\n        \"tabidori\": \"旅鳥\",\n        \"tabisuke to panda\": \"旅輔とパンダ\",\n        \"tabito\": \"旅人\",\n        \"tabitoya\": \"旅人屋\",\n        \"tablet\": \"TABLET\",\n        \"tachikawa juukougyou\": \"タチカワ重工業\",\n        \"tachimukau\": \"タチムカウ\",\n        \"tachineko miya\": \"タチネコ宮\",\n        \"tachinomi-ya\": \"立呑屋\",\n        \"tackle box\": \"たっくるぼっくす\",\n        \"tactical notes\": \"タクティカルノーツ\",\n        \"tadaichidono\": \"ただ一度の\",\n        \"tagamesou\": \"タガメ槽\",\n        \"tai kamaboko\": \"鯛かまぼこ\",\n        \"tai no okashira\": \"鯛のおかしら\",\n        \"taifuu biyori\": \"台風日和\",\n        \"taikan kyohougumi\": \"大鑑巨砲組\",\n        \"taiki ken club\": \"たいけん部!\",\n        \"taiko no tsuki\": \"太古の月\",\n        \"taiku yamori\": \"対空ヤモリ\",\n        \"taikuu works\": \"滞空ワークス\",\n        \"tail\": \"tail\",\n        \"tail of nearly\": \"てーるおぶにやりー\",\n        \"tail spot\": \"ているすぽっと\",\n        \"tailbell\": \"TailBell\",\n        \"tainaikaiki\": \"tainaikaiki\",\n        \"tainone takikomi gohan\": \"たいのね炊き込みご飯\",\n        \"taira mune suki iinkai\": \"平胸好き委員会\",\n        \"tairagi\": \"TAIRAGI\",\n        \"tairyo-tei\": \"大呂亭\",\n        \"taisenshadou kenkyuukai\": \"対戦車道研究会\",\n        \"taishokukannoirowze\": \"大食漢のいろうぜ\",\n        \"taiwan shuppan\": \"タイワン出版\",\n        \"taiyaki\": \"たいやき\",\n        \"taiyaki yaketa\": \"たいやきやけた\",\n        \"taiyako takoyaki\": \"たいやこタコヤキ\",\n        \"taiyosin\": \"太陽神\",\n        \"taiyou no megumi\": \"太陽の恵み\",\n        \"taiyoukei kaihatsu kikou\": \"太陽系開発機構\",\n        \"tak in wonderland\": \"Tak In Wonderland\",\n        \"taka no dan\": \"鷹ノ団\",\n        \"takadoya-tei\": \"たかどや亭\",\n        \"takahamaya\": \"高浜屋\",\n        \"takahashi record-ten\": \"高橋レコード店\",\n        \"takaiwerks\": \"TAKAIWERKS\",\n        \"takamagaharahouraku\": \"高天ヶ原崩落\",\n        \"takane no hanazono\": \"たかねの花園\",\n        \"takaneko\": \"たかねこ\",\n        \"takanicle\": \"てかにくる\",\n        \"takashita-ya\": \"たかした屋\",\n        \"takatans waffen-ss\": \"Takatan's Waffen-SS\",\n        \"takatobiya\": \"タカトビヤ\",\n        \"takaya\": \"たか屋\",\n        \"takayashiki kaihatsu\": \"高屋敷開発\",\n        \"take-chan island\": \"タケチャンアイランド\",\n        \"take-dake\": \"TAKE-DAKE\",\n        \"take3\": \"TAKE3\",\n        \"takeda syouten\": \"武田商店\",\n        \"takedake\": \"武田家\",\n        \"takemaruya\": \"竹○屋\",\n        \"takeout\": \"Takeout!\",\n        \"takeritake daishuukakusai\": \"猛茸大収穫祭\",\n        \"takesatorispa\": \"たけさとりすぱ\",\n        \"taketombo\": \"竹とんぼ\",\n        \"takeuma no tomo\": \"竹馬の友\",\n        \"takeya\": \"たけ家\",\n        \"takeyabu\": \"タケヤブ\",\n        \"takeyamaya\": \"茸山屋\",\n        \"takimoto doujou\": \"滝本道場\",\n        \"takion melo\": \"瀧音MELO\",\n        \"takitate\": \"炊きたて\",\n        \"takkyudou\": \"達急堂\",\n        \"takotsubo club\": \"たこつぼ倶楽部\",\n        \"takotsuboya\": \"蛸壷屋\",\n        \"takoya honpo\": \"多胡屋本舗\",\n        \"takoyaki-batake\": \"たこ焼き畑\",\n        \"taku-tama\": \"たくたま\",\n        \"takuan\": \"たくあん\",\n        \"takumi na muchi\": \"たくみなむち\",\n        \"takumiya\": \"匠屋\",\n        \"tama center\": \"たまセンター\",\n        \"tamafull\": \"tamaFull\",\n        \"tamafuwa\": \"たまふわ\",\n        \"tamagawa enema\": \"多摩川エネマ\",\n        \"tamagobou\": \"玉子房\",\n        \"tamagomura\": \"タマゴ村\",\n        \"tamakakeya\": \"たまかけ屋\",\n        \"tamakiya\": \"環屋\",\n        \"tamakuraya\": \"玖蔵屋\",\n        \"tamamo soft\": \"玉藻ソフト\",\n        \"tamaran koujou\": \"たまらん工場\",\n        \"tamarun\": \"タマラン\",\n        \"tamashii max\": \"魂MAX\",\n        \"tamashu\": \"珠秋\",\n        \"tamatebako\": \"珠手箱\",\n        \"tameshigaki\": \"ためしがき\",\n        \"tamokuteki hall\": \"たもくてきほーる\",\n        \"tamokuteki kuukan\": \"多目的空間\",\n        \"tanaka shouten\": \"田中商店\",\n        \"tanakana\": \"たなかな\",\n        \"tanaura honpo\": \"棚裏本舗\",\n        \"tanbo\": \"田圃\",\n        \"tanden shuzou\": \"丹田酒蔵\",\n        \"tanetsuke ichinengo\": \"種付け一年後\",\n        \"tange kentou club\": \"丹下拳闘倶楽部\",\n        \"tangerine\": \"Tangerine\",\n        \"tangerine ward\": \"Tangerine Ward\",\n        \"tanmatsu ijou\": \"端末異常\",\n        \"tanoma-project\": \"たのまーproject\",\n        \"tanoshiitake\": \"たのしいたけ\",\n        \"tanpanizm\": \"タンパニズム\",\n        \"tanpatsu kikaku\": \"短髪企画\",\n        \"tanpatsuism\": \"短髪イズム\",\n        \"tanpopo\": \"■■■たんぽぽ■■■\",\n        \"tanpopo suisan\": \"たんぽぽ水産\",\n        \"tansan senbei\": \"タンサンセンベイ\",\n        \"tanuki ichiba\": \"たぬき市場\",\n        \"tanuki no sato\": \"狸の里\",\n        \"tanuki no takarabako\": \"たぬきの宝箱\",\n        \"tanuki riot\": \"たぬき・らいおっと\",\n        \"tanukian\": \"たぬき庵\",\n        \"tanuking sleep\": \"たぬきんぐすりーぷ\",\n        \"taob\": \"TAOB\",\n        \"tapioca box\": \"タピオカボックス\",\n        \"tarako cream\": \"たらこクリーム\",\n        \"tarako koubou\": \"たらこ工房\",\n        \"tarakospa\": \"タラコスパ\",\n        \"taranbo\": \"タランボ\",\n        \"tarapo\": \"TARAPO\",\n        \"tarchi\": \"Tarchi\",\n        \"taromochian\": \"太呂餅庵\",\n        \"tarots\": \"TAROTS\",\n        \"tarugun\": \"たるぐん\",\n        \"tata\": \"TATA\",\n        \"tatazumai\": \"タタズマイ\",\n        \"tate\": \"殺陣\",\n        \"tate-a-tate\": \"tate-A-tate\",\n        \"tateana juukyo\": \"竪穴住居\",\n        \"tategami 5tyoume\": \"たてがみ5丁目\",\n        \"tatesima.\": \"タテシマ。\",\n        \"tateyama engineering\": \"館山エンジニアリング\",\n        \"tatintotarte\": \"たたんとたると\",\n        \"tatsu no otoshigo\": \"たつのおとしご\",\n        \"tatsumaki koutei\": \"たつまき皇帝\",\n        \"tatsunoyorozuya\": \"辰ノ万屋\",\n        \"taurin 1 oku\": \"タウリン1億\",\n        \"tax inn\": \"Tax inn\",\n        \"tayo\": \"たよ\",\n        \"tayutaya\": \"たゆた屋\",\n        \"tbk\": \"TBK\",\n        \"tcl art 178-2\": \"TCL ART 178-2\",\n        \"tcnc\": \"tcnc\",\n        \"tdtk\": \"TDTK\",\n        \"tea bullet\": \"TEA BULLET\",\n        \"teabreak scriptea\": \"混沌レディースタジオ\",\n        \"team almond\": \"Team Almond\",\n        \"team crepe sucre\": \"Team Crepe Sucre\",\n        \"team harenchi\": \"Teamはれんち\",\n        \"team ibm\": \"Team IBM\",\n        \"team inazuma\": \"Team Inazuma\",\n        \"team kihara\": \"チームキハラ\",\n        \"team oto deli\": \"Teamおと♂デリ\",\n        \"team plus-y\": \"チームプラスY\",\n        \"team princess\": \"TEAM PRINCESS\",\n        \"team sazandora\": \"チームサザンドラ\",\n        \"team shuffle\": \"TEAM SHUFFLE\",\n        \"team tanabe\": \"田辺組\",\n        \"team twin devils\": \"Team Twin Devils\",\n        \"team zero\": \"TEAM ZERO\",\n        \"team-weak tail\": \"Team-weak tail\",\n        \"team.mk\": \"Team.MK\",\n        \"teamjoker\": \"TeamJOKER\",\n        \"teamtgs\": \"teamTGs\",\n        \"tecchitecchi\": \"テッチテッチ\",\n        \"technibuster\": \"TECHNIBUSTER\",\n        \"techno break izonshou\": \"テクノブレイク依存症\",\n        \"technobrake\": \"TechnoBrake\",\n        \"technomics.\": \"てくのみくす。\",\n        \"technos a\": \"テクノスA\",\n        \"tecmet\": \"TECMET\",\n        \"tedaingu\": \"てだいんぐ\",\n        \"teddy-plaza\": \"TEDDY-PLAZA\",\n        \"teemonk\": \"てえもんく\",\n        \"tei hanpatsu purin\": \"低反発ぷりん\",\n        \"teihatu syouzyo titai\": \"剃髪少女地帯\",\n        \"teikoku uchugun\": \"帝国宇宙軍\",\n        \"teiltype\": \"TEILTYPE\",\n        \"teionyakedo\": \"低音火傷\",\n        \"teisoku sonic\": \"低速ソニック\",\n        \"teito bouei ryodan\": \"帝都防衛旅団\",\n        \"teketo\": \"TEKETO\",\n        \"tekireiki ni shokuchuudoku\": \"適齢期に食中毒\",\n        \"tekitou\": \"適当\",\n        \"tekkamaki\": \"鉄華巻\",\n        \"tekken dynamite\": \"鉄拳ダイナマイト\",\n        \"tekken neko gourmet\": \"鉄拳ねこグルメ\",\n        \"tekkou girls\": \"鉄甲ガールズ\",\n        \"tekokids\": \"てこきっず\",\n        \"telenet japan\": \"日本テレネット\",\n        \"telluru\": \"telluru\",\n        \"telomerena\": \"てろめあな\",\n        \"temaemiso-koubou\": \"手前みそ工房\",\n        \"temari cat\": \"てまりきゃっと\",\n        \"temparing\": \"テンパりんぐ\",\n        \"tempest\": \"てんぺすと\",\n        \"temple\": \"TEMPLE\",\n        \"ten\": \"TEN\",\n        \"ten no katsuraya\": \"天のカツラ屋\",\n        \"ten plus aku\": \"てん+あく\",\n        \"tenburi\": \"てんぶり\",\n        \"tenchuugumi\": \"天誅組\",\n        \"tenda\": \"TENDA\",\n        \"tendou\": \"てん堂\",\n        \"tendou kikaku\": \"天童企画\",\n        \"tendoushi\": \"天堂紙\",\n        \"tengai aku juumonji\": \"天外悪十文字\",\n        \"tengallonhat\": \"Tengallonhat\",\n        \"tengohambre\": \"tengohambre\",\n        \"tengu kotengu\": \"テングコテング\",\n        \"tengu no tsuzura\": \"天狗のつづら\",\n        \"tengu syoukougun\": \"天狗症候群\",\n        \"tengudou\": \"テング堂\",\n        \"tenguren\": \"天愚連\",\n        \"tengusa\": \"テングサ\",\n        \"tengsten\": \"テングステン\",\n        \"tenhaii\": \"天海一\",\n        \"tenjo kakuhen\": \"天井確変\",\n        \"tenjou renge\": \"天上蓮華\",\n        \"tenju-rengoku\": \"天樹恋獄\",\n        \"tenkafubu rengou\": \"天下布武連合\",\n        \"tenkigumi\": \"てんきぐみ\",\n        \"tenku-dou\": \"纏苦堂\",\n        \"tenkuu bokujou\": \"天空牧場\",\n        \"tennen doumei\": \"天然同盟\",\n        \"tennen menbou\": \"てんねん綿棒\",\n        \"tennentagayasan\": \"天然たがやさん\",\n        \"tenny le tai\": \"テニーレ隊\",\n        \"tenohira tambourine\": \"てのひらタンバリン\",\n        \"tenotsukyu\": \"天乙宮\",\n        \"tenpura kobo\": \"てんぷら工房\",\n        \"tenrake chaya\": \"てんらけ茶屋\",\n        \"tenshi syndrome\": \"天子震度籠娘\",\n        \"tenshindo\": \"天津堂\",\n        \"tentendou\": \"てんてん堂\",\n        \"tenya wanya\": \"てんやわんや\",\n        \"tenyati\": \"TenYati\",\n        \"tenzan koubou\": \"天山工房\",\n        \"terada naoko\": \"寺田尚子\",\n        \"teraoka digital works\": \"寺岡デジタルワークス\",\n        \"terebi-san\": \"てれびさん\",\n        \"terios\": \"テリオス\",\n        \"teriyaki-sabo\": \"てりやき茶房\",\n        \"terminus aqua\": \"ターミナスアクア\",\n        \"ternotte\": \"ternotte\",\n        \"terolin soft\": \"てろりんソフト\",\n        \"terralunar\": \"テラルナ\",\n        \"terrarium\": \"Terrarium\",\n        \"terrorize\": \"てららいず\",\n        \"teruo haruo\": \"てるおはるお\",\n        \"teruterubocchi\": \"てるてるぼっち\",\n        \"tesla pod\": \"てすらpod\",\n        \"tesuri no post\": \"手すりのポスト\",\n        \"tetchan hato\": \"てっちゃんハト\",\n        \"tete a tete fragile\": \"tete a tete fragile\",\n        \"tete-a-tete\": \"tete-a-tete\",\n        \"tetrapod\": \"Tetrapod\",\n        \"tetrara\": \"TETRARA\",\n        \"tetrascope\": \"TetraScope\",\n        \"tetratech\": \"テトラテック\",\n        \"tetravortex\": \"テトラボルテックス\",\n        \"tetrodotoxin\": \"TETRODOTOXIN\",\n        \"tetsu no otoshigo\": \"てつのおとしご\",\n        \"tetsugakuteki zombie\": \"哲学的ゾンビ\",\n        \"tetsukazuno ao.\": \"手つかずの青。\",\n        \"tetsukuzuya\": \"鉄屑屋\",\n        \"tex-mex\": \"TEX-MEX\",\n        \"tga\": \"TGA\",\n        \"th4\": \"Throttle/4\",\n        \"the flyers\": \"THE FLYERS\",\n        \"the fuckin toyzaras\": \"The Fuckin Toyzaras\",\n        \"the gentry\": \"The Gentry\",\n        \"the giveup pose\": \"もうだめぽ\",\n        \"the horizon\": \"The HORIZON\",\n        \"the hyperman\": \"THE HYPERMAN\",\n        \"the knight of the pants\": \"パンツ騎士団\",\n        \"the latest engine\": \"fujiyama takashi\",\n        \"the mistress of the adriatic\": \"アドリア海の女王\",\n        \"the monthly istanbul\": \"月刊イスタンブール\",\n        \"the rettoukan\": \"THE 劣等感\",\n        \"the saturn\": \"THE SATURN\",\n        \"the seventh sign\": \"The Seventh Sign\",\n        \"theeshakya\": \"ザ借家\",\n        \"the super dimension dirty empire\": \"超時空猥褻帝国\",\n        \"the world\": \"The World\",\n        \"the-franken\": \"THE・FRANKEN\",\n        \"the-paper\": \"THE-PAPER\",\n        \"theory of heaven\": \"Theory of HEAVEN\",\n        \"third brand\": \"THIRD BRAND\",\n        \"third foot\": \"サードフット\",\n        \"thisarmor\": \"ThisArmor\",\n        \"thompon\": \"とむぽん\",\n        \"three m\": \"すりーえむ\",\n        \"threecords\": \"スリーコーズ\",\n        \"threshold\": \"スレッショルド\",\n        \"thrylos\": \"Thrylos\",\n        \"thw.jp\": \"THW.jp\",\n        \"tiare\": \"ティアラ\",\n        \"tick\": \"擽—Tick—\",\n        \"tico tico\": \"TICO TICO\",\n        \"ticotico\": \"TICOTICO\",\n        \"tiger 79\": \"Tiger☆79\",\n        \"tiger roman\": \"タイガーロマン\",\n        \"timatima\": \"ちまちま\",\n        \"time-leap\": \"time-leap\",\n        \"timplu\": \"ティンプラ\",\n        \"tinkerbell\": \"てぃんかーべる\",\n        \"tinkle position\": \"Tinkle Position\",\n        \"tiny potato\": \"Tiny potato\",\n        \"tinyking\": \"TinyKing\",\n        \"tipoplaza\": \"ティポプラーザ\",\n        \"tiramisu\": \"Tiramisu\",\n        \"tiramisu tart\": \"てぃらみすたると\",\n        \"tirolcat\": \"TirolCat\",\n        \"tistrya\": \"ティシュトリ屋\",\n        \"titancolor brand\": \"チタンカラーブランド\",\n        \"titania\": \"てぃたーにあ\",\n        \"titano-makhia\": \"ティタノマキア\",\n        \"tiusan kingdom\": \"ちうさんキングダム\",\n        \"tk jesus\": \"TKジーザス\",\n        \"tk-brand\": \"TK-Brand\",\n        \"tk-bros\": \"TK-BROS\",\n        \"tkciao\": \"tkciao\",\n        \"tkspower\": \"TKSpower\",\n        \"tlg\": \"ねこのこね\",\n        \"tmg\": \"TMG\",\n        \"tmtkdou\": \"TMTK堂\",\n        \"tnc.\": \"TNC.\",\n        \"toaster\": \"トースター\",\n        \"tobatya2ke\": \"とばちゃづけ\",\n        \"tobihizageri\": \"とびひざげり\",\n        \"tobuchikara\": \"飛ぶちから\",\n        \"toculitoc\": \"とくりとっこ\",\n        \"todd special\": \"トッドスペシャル\",\n        \"tofu on fire\": \"Tofu On Fire\",\n        \"tofu soft\": \"TOFU SOFT\",\n        \"togijiru\": \"とぎじる\",\n        \"toha spiral\": \"とーはスパイラル\",\n        \"tohoippun\": \"徒歩一分\",\n        \"tohoorin\": \"TOHOORIN\",\n        \"toiro no iro\": \"といろのいろ\",\n        \"toitoikai\": \"対々会\",\n        \"tojora-men\": \"東条らーめん\",\n        \"tokachi no kuni\": \"とかちのくに\",\n        \"tokaeshina koubou\": \"トカエシナ工房\",\n        \"tokage 3gou\": \"とかげ3号\",\n        \"tokage juukou\": \"蜥蜴重工\",\n        \"tokage mori\": \"トカゲ森\",\n        \"tokage no shippo\": \"トカゲのしっぽ\",\n        \"tokei to kan co-hi-\": \"時計と缶コーヒー\",\n        \"tokemashita.\": \"とけました。\",\n        \"toketou no bansan\": \"とけとうの晩餐\",\n        \"toki nokogiri\": \"トキノコギリ\",\n        \"tokimigumi\": \"時美組\",\n        \"tokinochaya\": \"時乃茶屋\",\n        \"tokinoseisyo\": \"トキノセイショ\",\n        \"tokkuriya\": \"徳利屋\",\n        \"toko-ya\": \"床子屋\",\n        \"tokohana\": \"とこはな\",\n        \"tokonoma\": \"トコノマ\",\n        \"tokoroten\": \"ところてん\",\n        \"tokoroten house\": \"トコロテンハウス\",\n        \"toku yakusou\": \"特薬草\",\n        \"tokuda\": \"とくだ\",\n        \"tokumei tentai\": \"匿名天体\",\n        \"tokusen ohinasama\": \"特選おひなさま\",\n        \"tokyo bungeling bay yokohama\": \"東京バンゲリングベイ横浜\",\n        \"tokyo circuit\": \"Tokyoサーキット\",\n        \"tokyo continent\": \"東京大陸\",\n        \"tokyo gamachannel\": \"東京ガマチャンネル\",\n        \"tokyo glider\": \"東京グライダー\",\n        \"tokyo lemon\": \"東京檸檬\",\n        \"tokyo ponpon dou\": \"東京ポンポン堂\",\n        \"tokyo tomodachi kouen\": \"東京友達公園\",\n        \"tokyo tsunamushi land\": \"東京つなむしランド\",\n        \"tokyo-rozewomond club\": \"東京ロゼヲモンド倶楽部\",\n        \"tokyusen\": \"東九線\",\n        \"tololinco\": \"とろりんこ\",\n        \"toluene ittokan\": \"トルエン一斗缶\",\n        \"tomas\": \"TOMAS\",\n        \"tomato company\": \"TOMATO COMPANY\",\n        \"tomato kanzume\": \"トマト缶詰\",\n        \"tomato namaashi\": \"トマト生足\",\n        \"tomaya no taki\": \"苫屋の滝\",\n        \"tombstone\": \"Tombstone\",\n        \"tomcat\": \"TomCat\",\n        \"tomofuku\": \"とも福\",\n        \"ton toro\": \"とんとろ\",\n        \"tonari no dagashiya-san\": \"となりの駄菓子屋さん\",\n        \"tondemo awabihime\": \"とんでもあわび姫\",\n        \"tondesu\": \"トンデス\",\n        \"tonkotsu fuumi\": \"とんこつふうみ\",\n        \"tonkotsu yama\": \"トンコツ山\",\n        \"tonnerre gakuen\": \"トネール学園\",\n        \"tonoya\": \"との屋\",\n        \"tonpuuratei\": \"とんぷぅら亭\",\n        \"tonteki teishoku\": \"トンテキ定食\",\n        \"tonten\": \"トンテン\",\n        \"tonton byoushi\": \"とんとんびょーし\",\n        \"tontoro daiyokujou\": \"豚トロ大浴場\",\n        \"tooku no sora\": \"とおくのそら\",\n        \"toon worker\": \"トゥーンワーカー\",\n        \"tooya\": \"十矢\",\n        \"top\": \"TOP\",\n        \"topcat\": \"トップキャット\",\n        \"topgun\": \"TOPGUN\",\n        \"tora koubou\": \"寅工房\",\n        \"tora tamatama\": \"とらたまたま\",\n        \"toragoyashiki\": \"虎小屋敷\",\n        \"toraisix\": \"とらいしっくす\",\n        \"torajima-shi kouhouka\": \"寅島市広報課\",\n        \"torano ori\": \"寅乃檻\",\n        \"toranoe no makimono\": \"とらのえのまきもの\",\n        \"torara studio\": \"トララスタジオ\",\n        \"toratanuza\": \"とらたぬ座\",\n        \"toratepotto\": \"とらてぽっと\",\n        \"toraya\": \"トラ屋\",\n        \"tore\": \"蕩れ\",\n        \"torenia\": \"torenia\",\n        \"tori no oishii tokoro\": \"とりのおいしいところ\",\n        \"tori no sanpomichi\": \"トリの散歩道\",\n        \"tori no ya\": \"鳥の屋\",\n        \"toriaezu kari\": \"とりあえず(仮)\",\n        \"toriaezu nama\": \"とりあえず、生!\",\n        \"toriaridou\": \"トリ有リ堂\",\n        \"toribako\": \"toribako\",\n        \"toriihime\": \"鳥居姫\",\n        \"torimeshi\": \"とり飯\",\n        \"torinabe\": \"Tori鍋\",\n        \"toriniku seikatsu\": \"鶏肉生活\",\n        \"toriwasabi\": \"とりわさび\",\n        \"toriya\": \"トリ屋\",\n        \"toro toro resistance\": \"とろとろレジスタンス\",\n        \"torochidan\": \"とろーち団\",\n        \"toromilk\": \"トロみるく\",\n        \"toroniku yukke\": \"とろにくゆっけ\",\n        \"tororoimo\": \"とろろいも\",\n        \"tortesoft\": \"とるてそふと\",\n        \"toruneko chaya\": \"獲る猫茶屋\",\n        \"torya\": \"TORYA!\",\n        \"tosyoen\": \"凍傷炎\",\n        \"totem pole\": \"トーテムポール\",\n        \"totemo zako\": \"とても雑魚\",\n        \"toto max\": \"toto MAX\",\n        \"toto-taste\": \"ととていすと\",\n        \"totocal land\": \"ととかるLAND\",\n        \"totoki kikaku\": \"十時企画\",\n        \"totonishi\": \"ととにし\",\n        \"totoya\": \"トト屋\",\n        \"totsugasa\": \"凸傘\",\n        \"totsugeki tonarino jo-galbi\": \"突撃!となりの上カルビ\",\n        \"totsugeki wolf\": \"突撃ウルフ\",\n        \"tottemodaiji\": \"とってもだいじ\",\n        \"tottorou\": \"totto廊\",\n        \"tottototomekichi\": \"とっとととめきち\",\n        \"touch\": \"TOUCH\",\n        \"touchable\": \"TOUCHABLE\",\n        \"touchin hanten\": \"東珍飯店\",\n        \"toudori no su\": \"トウドリの巣\",\n        \"touenketsu\": \"桃园结\",\n        \"toufuya\": \"燈風屋\",\n        \"tougall kai\": \"東ガル会\",\n        \"touge mine\": \"峠峰\",\n        \"tougechaya\": \"峠茶屋\",\n        \"tougenkyo\": \"桃源郷\",\n        \"tougesakuraya\": \"峠桜屋\",\n        \"touhi kuukan\": \"逃避空間\",\n        \"touhou marupondou\": \"当方丸宝堂\",\n        \"touka biyori\": \"桃花日和\",\n        \"toukaidou\": \"東海堂\",\n        \"toumei kousoku\": \"透明光速\",\n        \"toumei tsuushin\": \"透明通信\",\n        \"tousoku chokusen undou\": \"等速直線運動\",\n        \"toutaku tuyagadou\": \"董卓艶画堂\",\n        \"touyoko surfrider\": \"東横サーフライダー\",\n        \"touyou zatsugidan\": \"東洋雑技団\",\n        \"toxic\": \"toxic\",\n        \"toxic love\": \"ときしっくらぶ\",\n        \"toxic store\": \"Toxic Store\",\n        \"toybox\": \"といぼっくす\",\n        \"tozan bu\": \"TOZAN:BU\",\n        \"tp\": \"tp!\",\n        \"tra-tama ry\": \"トラたま(略)\",\n        \"tracklisko\": \"とらっくりすこ\",\n        \"trample rigger\": \"Trample Rigger\",\n        \"tranceg\": \"TRANCEG\",\n        \"tranquility\": \"Tranquility\",\n        \"trans\": \"トランス\",\n        \"trans soft\": \"トランスソフト\",\n        \"trans tribune\": \"トランス・トリビューン\",\n        \"transgenics.\": \"遺伝子組換え\",\n        \"transient melody\": \"Transient Melody\",\n        \"transistor angel\": \"Transistor Angel\",\n        \"transistor baby\": \"トランジスタベイビィ\",\n        \"transonic\": \"TRANSONIC\",\n        \"transpot\": \"TranSpot\",\n        \"trap\": \"TRAP\",\n        \"trauma\": \"虎馬\",\n        \"trauma2g\": \"trauma2g\",\n        \"traumatize\": \"Traumatize\",\n        \"treat me nice\": \"Treat me nice\",\n        \"tree ga muttsu\": \"ツリーがむっつ\",\n        \"treetop helper\": \"TREETOP Helper\",\n        \"tremolo works\": \"トレモロワークス\",\n        \"trend kill\": \"TREND KILL\",\n        \"tri-k soft\": \"tri-k soft\",\n        \"triad\": \"TRAID\",\n        \"triage tag\": \"TRIAGE TAG\",\n        \"trial3\": \"TriaL3\",\n        \"tribo\": \"TRIBO\",\n        \"trick dream\": \"Trick Dream\",\n        \"trick-color\": \"Trick-Color\",\n        \"tricklot\": \"TrickLot\",\n        \"tridisaster\": \"Tridisaster\",\n        \"trifle\": \"とらいふる\",\n        \"triflehouse\": \"とらいフルハウス\",\n        \"triflingbook\": \"TriflingBook\",\n        \"trigger.m\": \"trigger.m\",\n        \"trinitron cg\": \"トリニトロンCG\",\n        \"trinity kyoudan\": \"トリニティ教団\",\n        \"trinitysaber\": \"トリニティセイバー\",\n        \"trip dancer\": \"TRIP DANCER\",\n        \"trip drip\": \"trip drip\",\n        \"triple luck\": \"Triple Luck\",\n        \"triple n\": \"TRIPLE N\",\n        \"triple pinch\": \"とりぷるぴんち!\",\n        \"triplebunny\": \"TripleBunny\",\n        \"troid-oh\": \"トロイ堂\",\n        \"trok\": \"TRoK\",\n        \"trompeloeil\": \"TROMPELOEILL\",\n        \"troopingout\": \"TROOPINGOUT\",\n        \"tropical sudachi\": \"トロピカルすだち\",\n        \"trough-bird\": \"Trough-Bird\",\n        \"trubka\": \"trubka\",\n        \"true ride\": \"True RIDE\",\n        \"true-bell\": \"True-Bell\",\n        \"trueblue\": \"trueblue\",\n        \"trush\": \"トラッシュ\",\n        \"truth child\": \"Truth Child\",\n        \"tryset break\": \"TRYSET Break\",\n        \"ts naienki\": \"TS内燃機\",\n        \"ts revolver\": \"TSリボルバー\",\n        \"ts-complex2nd\": \"ts-complex2nd\",\n        \"tsk\": \"TSK\",\n        \"tsk-bar\": \"TSK-BAR\",\n        \"tsm\": \"TSM\",\n        \"tsu ga mittsu.\": \"「つ」がみっつ。\",\n        \"tsubo\": \"TSUBO\",\n        \"tsubo r\": \"つぼR\",\n        \"tsuboya\": \"つぼや\",\n        \"tsubuan doumei\": \"つぶあん同盟\",\n        \"tsuchinoko bokujou\": \"つちのこ牧場\",\n        \"tsuinte\": \"ついんて!\",\n        \"tsujigiri cross chop\": \"辻斬りクロスチョップ\",\n        \"tsujikaidou\": \"辻街道\",\n        \"tsukareno\": \"つかれの\",\n        \"tsukasa bullet\": \"司弾\",\n        \"tsuki no kurai bubun\": \"霸\",\n        \"tsuki no mizu kikaku\": \"月の水企画\",\n        \"tsuki to koori no\": \"ツキトコオリノ\",\n        \"tsuki wa koyoi mo kurikaesu\": \"つきはこよいもくりかえす\",\n        \"tsukigami zukan\": \"月神図鑑\",\n        \"tsukiguni\": \"月国\",\n        \"tsukikusa koubou\": \"月草工房\",\n        \"tsukimachi soft\": \"つきまちそふと\",\n        \"tsukimigusa\": \"月見草\",\n        \"tsukimitake\": \"つきみたけ\",\n        \"tsukino chikake ikoku\": \"つきのちかけいこく\",\n        \"tsukinoyuki\": \"つきのゆき\",\n        \"tsukisame koubou\": \"月鮫工房\",\n        \"tsukitake\": \"Tsukitake\",\n        \"tsukiyo no yume\": \"ツキヨノユメ\",\n        \"tsukiyogarasu\": \"月夜鴉\",\n        \"tsukkumo mattoron\": \"つっくもまっとろん!\",\n        \"tsukudani no sato\": \"つくだにの里\",\n        \"tsukune-ya\": \"つくね屋\",\n        \"tsukupare\": \"つくぱれ\",\n        \"tsumarimashita\": \"詰まりました\",\n        \"tsumasaki label\": \"ツマサキレーベル\",\n        \"tsumayoji\": \"つまようじ\",\n        \"tsundere oniku\": \"ツンデレお肉\",\n        \"tsuniverse\": \"tsuniverse\",\n        \"tsunken\": \"ツン研\",\n        \"tsupan\": \"ツパン\",\n        \"tsurezurezuki\": \"徒然月\",\n        \"tsurimura\": \"ツリムラ\",\n        \"tsurugashima heights\": \"鶴ヶ島ハイツ\",\n        \"tsurumachi\": \"鶴町\",\n        \"tsurumiku\": \"つるみく\",\n        \"tsurupeta kenkyuusho\": \"つるぺた研究所\",\n        \"tsurutsuru ippai\": \"つるつるいっぱい\",\n        \"tsurutsuru pain\": \"つるつるぱいん\",\n        \"tsutakazura mau mau\": \"ツタカズラまうまう\",\n        \"tsutsumorien\": \"筒森園\",\n        \"tsxy\": \"tsxy\",\n        \"ttsy\": \"TTSY\",\n        \"tubasa\": \"翼\",\n        \"tuck cross\": \"Tuck Cross\",\n        \"tuiteyukenuyo\": \"ついてゆけぬよ\",\n        \"tukamori club\": \"ツカモリ倶楽部\",\n        \"tukibuto\": \"TUKIBUTO\",\n        \"tukimi atelier\": \"ツキミアトリエ\",\n        \"tumble weed\": \"TUMBLE WEED\",\n        \"tuned by aiu\": \"Tuned by AIU\",\n        \"tunnel\": \"とんねる\",\n        \"tunnel love letter\": \"Tunnel Love Letter\",\n        \"turbanist\": \"たーばにすと\",\n        \"turing game\": \"Turing Game\",\n        \"turning point\": \"Turning Point\",\n        \"turtle cookies\": \"Turtle Cookies\",\n        \"twin heart\": \"TWIN HEART\",\n        \"twin magnet\": \"ツインマグネット\",\n        \"twin tail\": \"TWIN TAIL\",\n        \"twinbunny\": \"Twinbunny\",\n        \"twinkle hearts\": \"twinkle hearts\",\n        \"twinkle snows\": \"twinkle snows\",\n        \"twinkle teacher\": \"てぃんくる☆ティーチャー\",\n        \"twinklestar\": \"ティンクルスター\",\n        \"twinscatear\": \"ついんずかてぃあ\",\n        \"twintel\": \"TWINTEL\",\n        \"two tone color\": \"－・～\",\n        \"two-handed axe\": \"Two-handed Axe\",\n        \"twocraft\": \"TwoCraft\",\n        \"tyatsune\": \"茶常\",\n        \"tyongera kenkyuujo\": \"ちょんげら研究所\",\n        \"type-57\": \"TYPE-57\",\n        \"type-g\": \"Type-G\",\n        \"type-spare\": \"TYPE-SPARE\",\n        \"u-me soft\": \"U・Me SOFT\",\n        \"u-ral\": \"うーらる\",\n        \"u-room\": \"U-ROOM\",\n        \"u-type\": \"U-Type\",\n        \"u.m.e.project\": \"U.M.E.Project\",\n        \"u.r.c\": \"U.R.C\",\n        \"u.zoo\": \"U.ZOO\",\n        \"ua\": \"UA\",\n        \"ub\": \"UB\",\n        \"ubiquitous\": \"ユビキタス\",\n        \"uchinon\": \"うちのん\",\n        \"uchiwa ryou nagon\": \"団扇涼納言\",\n        \"uchizum\": \"UCHIZUM\",\n        \"uchoten\": \"有頂天\",\n        \"uchu\": \"Uchu\",\n        \"uchuu neko-juu kougyou\": \"宇宙猫獣工業\",\n        \"uchuu porta\": \"宇宙☆ポルタ\",\n        \"uchuusen shoujigou\": \"宇宙船庄司号\",\n        \"ucyu-kago\": \"宇宙カゴ\",\n        \"udon-ya\": \"うどんや\",\n        \"uzukikan\": \"卯月館\",\n        \"ueda-san.\": \"ウエダさん。\",\n        \"ugaya 74th\": \"ウガヤ74th\",\n        \"uge connection\": \"UGEコネクション\",\n        \"ugeman\": \"うげ漫\",\n        \"ugokuna pharmacy theta\": \"うごくな薬局θ\",\n        \"ugou no shuu\": \"烏合ノ衆\",\n        \"uguisu kagura\": \"ウグイスカグラ\",\n        \"uguisuya\": \"莺屋\",\n        \"uhii\": \"うひい\",\n        \"uirokai\": \"ういろうかい\",\n        \"uji\": \"蛆\",\n        \"uk-works\": \"UK-WORKS\",\n        \"ukikusaya\": \"うきくさ屋\",\n        \"ultimania\": \"アルティマニア\",\n        \"ultimate works\": \"アルティメットワークス\",\n        \"ultra one\": \"ULTRA ○NE\",\n        \"ultra siccative\": \"ウルトラシッカチーフ\",\n        \"ultra violet\": \"ULTRA Violet\",\n        \"ululun\": \"UluluN\",\n        \"uma goya\": \"UMA小屋\",\n        \"uma no are\": \"うまのあれ\",\n        \"uma no hone\": \"うまのほね\",\n        \"umakatei\": \"うまか亭\",\n        \"umami zeitaku dashi\": \"うまみ贅沢出汁\",\n        \"umanori kishidan\": \"うまのり騎士団\",\n        \"umari-ya\": \"埋まり屋\",\n        \"umasugiyu\": \"うますぎゆ\",\n        \"umaya\": \"厩\",\n        \"umbrella.corp\": \"UMBRELLA.CORP\",\n        \"ume-nyan-tei\": \"うめにゃん亭\",\n        \"umeboshi\": \"梅ぼし\",\n        \"umehimeden\": \"梅姫殿\",\n        \"umekkodo\": \"うめっこ堂\",\n        \"umenonukaduke\": \"うめのぬかづけ\",\n        \"umesuke\": \"梅助\",\n        \"umigarasu madoushi dan\": \"海烏魔道士団\",\n        \"umihan\": \"うみはん\",\n        \"umikaidou\": \"海貝堂\",\n        \"uminari\": \"ウミナリ\",\n        \"uminekotei\": \"うみねこ亭\",\n        \"uminoie hamanasu\": \"海の家はまなす\",\n        \"uminouie\": \"海納家\",\n        \"umipro\": \"umiプロ\",\n        \"un gallo\": \"Un gallo\",\n        \"un-moto shoko\": \"云元書庫\",\n        \"unagi no nedoko\": \"うなぎの寝床\",\n        \"unaginobori\": \"うなぎのぼり\",\n        \"uncats\": \"UNCATS\",\n        \"unceder\": \"アンシーダー\",\n        \"undead\": \"Undead\",\n        \"undel\": \"あんでる\",\n        \"under colony\": \"Under Colony\",\n        \"under control\": \"UNDER CONTROL\",\n        \"underground campaign\": \"Underground Campaign\",\n        \"undermoon\": \"アンダームーン\",\n        \"underwhite\": \"Underwhite\",\n        \"undouken\": \"雲洞軒\",\n        \"uneune-kissa\": \"うねうね喫茶\",\n        \"unfixed\": \"UNFIXED\",\n        \"ungrofish\": \"地下魚!\",\n        \"unholy production\": \"アンホリ☆プロダクション\",\n        \"uni\": \"UNI\",\n        \"unicorn-a\": \"unicorn-a\",\n        \"unimayo chuubou\": \"ウニマヨ厨房\",\n        \"union of the snake\": \"Union of the Snake\",\n        \"unique\": \"ゆにきゅう\",\n        \"unisonshift\": \"ユニゾンシフト\",\n        \"unit cheese\": \"ゆにっとちーず\",\n        \"unitonasubi\": \"うにとなすび\",\n        \"uniuni\": \"uniuni\",\n        \"uniya\": \"雲丹屋\",\n        \"uniyaa\": \"うに屋あ\",\n        \"unizo\": \"うに蔵\",\n        \"unknown\": \"アンノウン\",\n        \"unlucky strike\": \"アンラッキーストライク\",\n        \"unmei no ikasumi\": \"運命のイカスミ\",\n        \"unnunkannun\": \"うんぬんかんぬん\",\n        \"unreal\": \"UNreal\",\n        \"unshuu sakuramochi\": \"温州桜餅\",\n        \"unyarara daihanten\": \"うにゃらら大飯店\",\n        \"uohaman\": \"魚歯満\",\n        \"uotatsu18kinshiten\": \"魚辰一八金支店\",\n        \"uozanoko\": \"うお座の子\",\n        \"upsp\": \"UPSP\",\n        \"ura fmo\": \"裏FMO\",\n        \"ura kent no himitsu kichi\": \"裏KENTの秘密基地\",\n        \"ura makura\": \"裏まくら\",\n        \"ura meshiya\": \"裏飯屋\",\n        \"ura no hikidashi\": \"うらのひきだし\",\n        \"ura no kami\": \"裏のカミ\",\n        \"ura urethan\": \"裏ウレタン\",\n        \"ura.\": \"URA.\",\n        \"urabashi seisaku\": \"裏橋製作\",\n        \"urabb28 gou\": \"uraBB28号\",\n        \"uradoori no nukemichi\": \"裏通りの抜け道\",\n        \"uradora mangan\": \"裏ドラ満貫\",\n        \"uragiri no doukutsu\": \"うらぎりのどうくつ\",\n        \"urahushigi\": \"裏不思議\",\n        \"urainutei\": \"裏イヌ亭\",\n        \"urakaryuu\": \"裏火竜\",\n        \"uraken\": \"うらけん\",\n        \"urakusog\": \"urakusoG\",\n        \"urama mejirushi\": \"裏間目印\",\n        \"uramac\": \"うらまっく\",\n        \"uraniwa\": \"ウラニワ\",\n        \"uraroji\": \"ウラロジ\",\n        \"uraryon kikaku\": \"うらりょん企画\",\n        \"urasazan\": \"うらさざん\",\n        \"urawa anime festa\": \"浦和アニメフェスタ\",\n        \"uraya\": \"ura屋\",\n        \"urban doujin magazine\": \"街中同人誌會\",\n        \"uresen\": \"熟れ専\",\n        \"uresuji awabi\": \"熟レ筋アワビ\",\n        \"ureure kaikai\": \"嬉嬉怪怪\",\n        \"uribox\": \"ウリボックス\",\n        \"urimarutei\": \"うりまる亭\",\n        \"uritz\": \"Uritz\",\n        \"uro\": \"URO\",\n        \"uropyon\": \"うろぴょん☆\",\n        \"urumin\": \"うるみん\",\n        \"ururuc\": \"URURUC\",\n        \"urusai kokuen\": \"うるさい黒鉛\",\n        \"urushiya seitai jikkenshitsu\": \"漆屋生態実験室\",\n        \"us\": \"US\",\n        \"usa gunbu\": \"USA軍部\",\n        \"usaburo\": \"うさブロ！\",\n        \"usacastle\": \"Usacastle\",\n        \"usaden\": \"うさでん\",\n        \"usagi ame\": \"うさぎあめ\",\n        \"usagi no ana\": \"ウサギの穴\",\n        \"usagi no shippo\": \"うさぎのしっぽ\",\n        \"usagi paradise\": \"うさぎパラダイス\",\n        \"usagi purin\": \"うさぎプリン\",\n        \"usagi to kame\": \"うさぎとかめ\",\n        \"usagi youchien\": \"うさぎ幼稚園\",\n        \"usagi youjinbou\": \"うさぎ用心棒\",\n        \"usagigoya\": \"うさぎ小屋\",\n        \"usagijiru\": \"うさぎじる\",\n        \"usagizadou\": \"兎座堂\",\n        \"usamimi syndrome\": \"うさみみしんどろーむ\",\n        \"usanamaco\": \"うさなまこ\",\n        \"usaneri island\": \"うさねり★アイランド\",\n        \"usendou plus 1\": \"優先度+1\",\n        \"ushichichi bokujou\": \"うしちち牧場\",\n        \"ushinokokumairi\": \"ウシノコクマイリ\",\n        \"ushitora-dou\": \"丑寅堂\",\n        \"uso\": \"噓\",\n        \"uso kara makoto\": \"うそからまこと\",\n        \"uso seisakusho\": \"うそ製作所\",\n        \"usoppu land\": \"ウソップランド\",\n        \"usotsuki honey\": \"うそつきHONEY\",\n        \"usui hon hitori roudoku kai\": \"薄い本一人朗読会\",\n        \"usukawa kintsuba\": \"薄皮きんつば\",\n        \"usume sanchi\": \"うすめ産地\",\n        \"utachan honpo\": \"ウタチャンホンポ\",\n        \"utadokei\": \"ウタドケイ\",\n        \"utage\": \"宴\",\n        \"utahime\": \"うたひめ\",\n        \"utakata gentou-ya\": \"泡沫幻燈屋\",\n        \"utakata.\": \"うたかた。\",\n        \"utaneya\": \"うたね屋\",\n        \"utanone dou\": \"うたのね堂\",\n        \"utataneyashiki\": \"転寝屋敷\",\n        \"utinotyutai\": \"ウチの中隊\",\n        \"utsumuki garden\": \"うつむきガーデン\",\n        \"utsusemi shuu\": \"空蝉衆\",\n        \"utsutsutsutsu.\": \"うつつつつ。\",\n        \"uu-zone\": \"UU-ZONE\",\n        \"uwasa no ero radiohead\": \"噂のエロレディオヘッド\",\n        \"uwd\": \"UWD\",\n        \"uxmal\": \"Uxmal\",\n        \"uzigaya\": \"氏賀屋\",\n        \"uzomzo\": \"UZOMZO\",\n        \"uzumaki shikenkan\": \"うずまき試験管\",\n        \"v. hercules\": \"V・ヘラクレス\",\n        \"v muscle\": \"Vまっする\",\n        \"v112cr\": \"ぶい112CR\",\n        \"vachicalist\": \"Vachicalist\",\n        \"vadass\": \"Vadass\",\n        \"vagina dentata\": \"有齒女陰\",\n        \"valiant\": \"VALIAN党\",\n        \"valkyria\": \"わるきゅ～れ\",\n        \"valrhona\": \"VALRHONA\",\n        \"valssu\": \"valssu\",\n        \"vampire berry\": \"Vampire*Berry\",\n        \"vanadis\": \"Vanadis\",\n        \"vanilla sky\": \"VANILLA SKY\",\n        \"vanilla tenrankai\": \"バニラ展覧会\",\n        \"vanilla type\": \"バニラタイプ\",\n        \"vanilla-dou max\": \"バニラ堂MAX\",\n        \"vanishing point.\": \"Vanishing Point.\",\n        \"vanity press\": \"Vanity Press\",\n        \"vashadow\": \"VASHADOW\",\n        \"vegas project\": \"VEGAS PROJECT\",\n        \"velvet rose\": \"Velvet Rose\",\n        \"venus\": \"VENUS\",\n        \"venuspunk\": \"VENUSPUNK\",\n        \"ver.mimizuk\": \"Ver.みみずく\",\n        \"ver9\": \"Ver9\",\n        \"verdant force\": \"Verdant Force\",\n        \"vermiculite\": \"ばーみきゅらいと\",\n        \"vermilion\": \"ばみりおん\",\n        \"verydrop\": \"Verydrop\",\n        \"veto\": \"VETO\",\n        \"viento campanilla\": \"Viento Campanilla\",\n        \"viewness\": \"Viewness\",\n        \"vincent\": \"ヴィンセント\",\n        \"vinegar mackerel\": \"Vinegar Mackerel\",\n        \"violence club\": \"ばいおれんす倶楽部\",\n        \"violet order\": \"VIOLET ORDER\",\n        \"violetstar\": \"Violetstar\",\n        \"vip games\": \"VIP Games\",\n        \"virginal\": \"VIRGINAL\",\n        \"virophilia\": \"virophilia\",\n        \"viscaria\": \"VISCARIA\",\n        \"vista\": \"VISTA\",\n        \"visual biscuits\": \"Visual Biscuits\",\n        \"vitamin gohan\": \"ビタミンごはん\",\n        \"vitamin soft\": \"ビタミン\",\n        \"viva mikinosuke\": \"ビバ・みきのすけ\",\n        \"vivid dot\": \"vivid_dot\",\n        \"vivid flag\": \"Vivid Flag\",\n        \"vivido\": \"ヴィヴィ堂\",\n        \"vm500\": \"VM500\",\n        \"vogelschwein\": \"フォーゲルシュヴァイン\",\n        \"vogue\": \"VOGUE\",\n        \"voice of flower\": \"Voice of flower\",\n        \"voisin\": \"VOISIN\",\n        \"vollmond\": \"VOLLMOND\",\n        \"voltcompany.\": \"VOLTCOMPANY.\",\n        \"volutes\": \"VOLUTES\",\n        \"volvox\": \"VOLVOX\",\n        \"vpans extasy\": \"Vパン'sエクスタシー\",\n        \"vulcannu\": \"ヴぁるかん濡\",\n        \"vulgar bull\": \"VULGAR BULL\",\n        \"vyowolf\": \"vyowolf\",\n        \"w-room\": \"W-ROOM\",\n        \"waage\": \"Waage\",\n        \"wabi sabi wasabi\": \"ワビサビワサビ\",\n        \"wag the dog\": \"Wag The Dog\",\n        \"wagamama dou\": \"我儘堂\",\n        \"wagarashiya\": \"和がらし屋\",\n        \"wagashi-ya\": \"わがし屋\",\n        \"wagaya no kurorekishi\": \"我が家の黒歴史\",\n        \"wainable\": \"ワイナブル\",\n        \"wakamaker\": \"wakamaker\",\n        \"wakayotareso\": \"わかよたれそ\",\n        \"waki waki koubou\": \"わきわき工房\",\n        \"wakusei nostalgia\": \"惑星ノスタルジー\",\n        \"wakusei-teki shukou\": \"惑星的趣向\",\n        \"wakuseiburo\": \"ワクセイブロ\",\n        \"wakuwaku shotaland\": \"わくわくショタランド\",\n        \"walpurgisnacht\": \"Walpurgisnacht\",\n        \"wamusho\": \"わむショ\",\n        \"wando wando\": \"ワンドワンド\",\n        \"wanko-tei\": \"わんこ亭\",\n        \"wankoroya\": \"わんころ屋\",\n        \"wannyan club\": \"ワンニャン倶楽部\",\n        \"wanpaku brothers\": \"わんぱくブラザーズ\",\n        \"wanpaku shoujo\": \"腕白少女\",\n        \"wanton land kumiai\": \"とわんとんランド組合\",\n        \"wanwan oukoku\": \"わんわん王国\",\n        \"wanwan teikoku\": \"わんわん帝国\",\n        \"wanwanhouse\": \"わんわんはうす\",\n        \"wanwano\": \"わんわんお\",\n        \"wappoi\": \"わっぽい\",\n        \"warainaki festa\": \"ワライナキフェスタ\",\n        \"ware pon\": \"われPON\",\n        \"wareago\": \"ワレアゴ\",\n        \"waribashi kouka\": \"割り箸効果\",\n        \"warukuriya\": \"ワルクリ屋\",\n        \"wasabi mochi\": \"わさびもち\",\n        \"wasabiberry jam\": \"Wasabiberry JAM\",\n        \"wasei nekohime\": \"和製猫姫\",\n        \"wasre kaban\": \"忘れカバン\",\n        \"wasshoi koubou\": \"ワッショイ☆工房\",\n        \"waste\": \"Waste\",\n        \"wastepapermarket\": \"WastePaperMarket\",\n        \"wasukoro\": \"わすころ\",\n        \"wasuraruru tegami\": \"忘らるる手紙\",\n        \"watanuki shinguten\": \"綿貫寝具店\",\n        \"watanuki tanuki\": \"わたぬきたぬき\",\n        \"wataridori\": \"わたりどり\",\n        \"wataridori no rakuen\": \"渡り鳥の楽園\",\n        \"watashinchi\": \"わたしンち\",\n        \"water beryl\": \"ウォーターベリル\",\n        \"water closet\": \"water closet\",\n        \"water garden\": \"水の庭\",\n        \"water valley\": \"うぉ～た～ばれ～\",\n        \"watosato\": \"ワトサト\",\n        \"wave\": \"うぇ～ぶ\",\n        \"wawomidasu\": \"和を乱su\",\n        \"wchees\": \"Wchees\",\n        \"web knight\": \"ウェブ乃藤\",\n        \"webstudioofflimits\": \"WebStudioOffLimits\",\n        \"wechselhaft\": \"ヴェクセルハフト\",\n        \"wednesday\": \"Wednesday\",\n        \"wendybell\": \"ウェンディベル\",\n        \"west island\": \"ウエストアイランド\",\n        \"west vision\": \"ウエストビジョン\",\n        \"wheel\": \"ホイール\",\n        \"whirl pool\": \"WHIRL POOL\",\n        \"white clover\": \"ほわいとくろーばー\",\n        \"white croaker\": \"White croaker\",\n        \"white cross\": \"ホワイトクロス\",\n        \"white elephant\": \"WHITE ELEPHANT\",\n        \"white garden\": \"WHITE GARDEN\",\n        \"white heart\": \"WHITE HEART\",\n        \"white identity\": \"White Identity\",\n        \"white lolita\": \"White Lolita\",\n        \"white moon\": \"WHITE MOON\",\n        \"white note\": \"ホワイトノート\",\n        \"white out\": \"WHITE OUT\",\n        \"white roots\": \"white roots\",\n        \"white sail\": \"ホワイトセイル\",\n        \"white spring\": \"White Spring\",\n        \"whiteapple\": \"whiteapple\",\n        \"whitecheese\": \"ほわいとちぃず\",\n        \"whitecute\": \"WhiteCute\",\n        \"whitemoor\": \"WhiteMoor\",\n        \"whitepink\": \"ホワイトピンク\",\n        \"whitewill\": \"WHITEWILL\",\n        \"wi-fe hacker\": \"Wi-Fe hacker\",\n        \"wild duck\": \"WILD DUCK\",\n        \"wild heart\": \"ワイルドハート\",\n        \"will be well\": \"WILL BE WELL\",\n        \"will tame\": \"ウィルテイム\",\n        \"win win\": \"win win\",\n        \"wind mail\": \"WIND MAIL\",\n        \"windfall\": \"WINDFALL\",\n        \"windmill\": \"ういんどみる\",\n        \"windmill oasis\": \"ういんどみるOasis\",\n        \"windtone\": \"うぃんどとーん\",\n        \"windwave\": \"WINDWAVE\",\n        \"windy wing\": \"WiNDY WiNG\",\n        \"wing hero\": \"ウィングヒーロー\",\n        \"wing kyanite\": \"Wing Kyanite\",\n        \"wingbinta\": \"ウイングビンタ\",\n        \"winsuka.\": \"うぃんすか。\",\n        \"winter garden\": \"Winter Garden\",\n        \"wishdou\": \"うぃっしゅ堂\",\n        \"wisteria\": \"Wisteria\",\n        \"witchflame\": \"WitchFlame\",\n        \"withdrop\": \"ウィズドロップ\",\n        \"withsoda\": \"withsoda\",\n        \"wizaldx\": \"WizaldX\",\n        \"wlc soft\": \"WLCソフト\",\n        \"wolfs tail radio station\": \"Wolf's Tail Radio Station\",\n        \"wolkenkratzer\": \"Wolkenkratzer\",\n        \"wonder fool\": \"Wonder Fool\",\n        \"wonderful life\": \"Wonderful Life\",\n        \"wonderful one\": \"WONDERFUL ONE\",\n        \"wonderia\": \"わんだりあ\",\n        \"wordgear\": \"WordGear\",\n        \"words worth\": \"ワーズワース\",\n        \"works makes evolution\": \"Works makes evolution\",\n        \"workstation r\": \"ワークステーションR\",\n        \"world box\": \"WORLD BOX\",\n        \"world lover\": \"world lover\",\n        \"woshiro\": \"をしろ\",\n        \"wotona no namae\": \"をとなのなまえ\",\n        \"woyoyo\": \"ヲヨヨ\",\n        \"wrench studio\": \"WRENCH STUDIO\",\n        \"wriggle souzeme tomonokai\": \"リグル総攻め友の会\",\n        \"ws.\": \"WS.\",\n        \"wxy comics\": \"WXY COMICS\",\n        \"x model\": \"X∞MODEL\",\n        \"x-10sion\": \"X-10SION\",\n        \"x-bangbang\": \"X-bangbang\",\n        \"x-tei\": \"えっくす亭\",\n        \"x-toys\": \"X-TOYS\",\n        \"x.t.c\": \"X.T.C\",\n        \"xain\": \"XAIN\",\n        \"xenoms\": \"Xenoms\",\n        \"xephs artwork\": \"Xeph's Artwork\",\n        \"xikyougumi\": \"賽響組\",\n        \"xpanda\": \"Xpanda\",\n        \"xration\": \"Xration\",\n        \"xuse\": \"ザウス\",\n        \"xxkorori\": \"××コロリ\",\n        \"xxx\": \"トリプルエックス\",\n        \"xyzyroh\": \"朱儒楼\",\n        \"y no shokutaku\": \"Yの食卓\",\n        \"y-nrg system\": \"Y-NRG SYSTEM\",\n        \"ya-ho-games\": \"ya-ho-games\",\n        \"ya-zy\": \"YA-ZY\",\n        \"yaboudo project\": \"野望堂PROJECT\",\n        \"yabougumi\": \"野望組\",\n        \"yabuno seisakusho\": \"やぶの製作所\",\n        \"yabure kabure\": \"やぶれかぶれ\",\n        \"yaburi dokoro\": \"破り処\",\n        \"yachan coffee\": \"やちゃん珈琲\",\n        \"yachu onsen\": \"やちゅ温泉\",\n        \"yadapot\": \"やだぽっと\",\n        \"yadokani daikaiten\": \"やどかに大回転\",\n        \"yagami hyakka\": \"八神百科\",\n        \"yagezawa bunko\": \"やげざわ文庫\",\n        \"yagiya\": \"山羊屋\",\n        \"yah-yah-doh\": \"YAH-YAH-DOH\",\n        \"yajinsei ra-men\": \"野人性ラーメン\",\n        \"yajirushi key\": \"矢印キー\",\n        \"yajiya\": \"八至屋\",\n        \"yajuu kazoku\": \"野獣家族\",\n        \"yakan hikou\": \"夜間飛行\",\n        \"yakan honpo\": \"薬缶本舗\",\n        \"yakata\": \"館\",\n        \"yaki lemon\": \"焼きレモン\",\n        \"yaki tomahawk steak\": \"烧きトマホークステーキ\",\n        \"yakihata nyuugyou\": \"焼畑乳業\",\n        \"yakihebi\": \"やきへび\",\n        \"yakimisomura\": \"ヤキミソ村\",\n        \"yakimorokoshi\": \"やきもろこし\",\n        \"yakinasu teishoku\": \"焼き茄子定食\",\n        \"yakiniku teishoku\": \"焼肉定食\",\n        \"yakinikuya yusi\": \"焼肉屋由史\",\n        \"yakisaba teishoku\": \"焼鯖定食\",\n        \"yakisaketeishoku\": \"焼鮭定食\",\n        \"yakisoba rengo\": \"やきそば連合\",\n        \"yakitate jamaica\": \"焼きたてジャマイカ\",\n        \"yakou chaofan\": \"夜光チャーハン\",\n        \"yakousei fan club\": \"夜行性ファンクラブ\",\n        \"yakouyousei\": \"夜光幼性\",\n        \"yakusoku no kaigansen\": \"約束の海岸線\",\n        \"yakutsk tokkoutai\": \"ヤクーツク特攻隊\",\n        \"yama momo kajitsu\": \"山桃果実\",\n        \"yamaboshike\": \"山星家\",\n        \"yamaburoya\": \"やまぶろ屋\",\n        \"yamada air base\": \"YAMADA AIR BASE\",\n        \"yamada factory\": \"山田ファクトリー\",\n        \"yamada ichizoku.\": \"山田一族。\",\n        \"yamada koubou\": \"山田工房\",\n        \"yamadake\": \"山田家\",\n        \"yamadaya\": \"山田屋\",\n        \"yamagarasu\": \"やまガラス\",\n        \"yamagiwa art cg studio\": \"ヤマギワアート CG STUDIO\",\n        \"yamago house\": \"山後ハウス\",\n        \"yamaguchi print\": \"やまぐちぷりんと\",\n        \"yamaguchirou\": \"やまぐち楼\",\n        \"yamakawa denenhuukei\": \"山川田園風景\",\n        \"yamami no yado\": \"やまみの宿\",\n        \"yamaori\": \"YAMAORI\",\n        \"yamato nadeshiko tei\": \"大和なでしこ亭\",\n        \"yamato soft\": \"大和ソフト\",\n        \"yamazakura\": \"山櫻\",\n        \"yami kaiten zushi\": \"闇回転寿司\",\n        \"yami ni ugomeku\": \"闇に蠢く\",\n        \"yami no naka\": \"闇の中\",\n        \"yaminabe daiichi kantai\": \"闇鍋第一艦隊\",\n        \"yamotodou rakugakiichi\": \"矢本堂落書市\",\n        \"yanagi-tei\": \"やなぎ亭\",\n        \"yanagigaeru\": \"ヤナギガエル\",\n        \"yanagisegawa\": \"柳瀬川\",\n        \"yancha club\": \"やんちゃ倶楽部\",\n        \"yaneura tv\": \"屋根裏TV\",\n        \"yanonoshiya\": \"やののし屋\",\n        \"yaoya\": \"やお屋\",\n        \"yapis company\": \"YAPIS COMPANY\",\n        \"yappari ao ga suki\": \"やっぱり青が好き\",\n        \"yappy-yappy\": \"ヤッピーヤッピー\",\n        \"yarakashidan\": \"やらかし団\",\n        \"yareba dekiru ko.\": \"やればできる娘。\",\n        \"yariiya\": \"枪衣屋\",\n        \"yaritaihodai.\": \"やりたいほうだい。\",\n        \"yasakanomagatama\": \"八坂の勾玉\",\n        \"yashiromori\": \"ヤシロモリ\",\n        \"yashiroya\": \"やしろ屋\",\n        \"yasrin-do\": \"やすりん堂\",\n        \"yasudanchi\": \"ヤスダンチ\",\n        \"yasunaoz\": \"安直Z\",\n        \"yasuomi-craft\": \"Yasuomi-Craft\",\n        \"yasutakeya\": \"ヤスタケ屋\",\n        \"yasyokutei\": \"夜食亭\",\n        \"yatagarasu\": \"八咫烏\",\n        \"yatsufusa koubou\": \"八房工房\",\n        \"yatsugami ryouriten\": \"八ツ神料理店\",\n        \"yatsukaan\": \"夜束庵\",\n        \"yawaragi bin\": \"やわらぎ瓶\",\n        \"yawaraka gate\": \"やわらかGATE\",\n        \"yawaraka kougyou\": \"やわらか工業\",\n        \"yawaraka okashiya\": \"やわらか御菓子屋\",\n        \"yawaraka taiyou\": \"やわらか太陽\",\n        \"yaya hinata-ya\": \"稍日向屋\",\n        \"yayoi fantasy zone\": \"やよいファンタジーゾーン\",\n        \"yayui\": \"やゆい\",\n        \"yeast house\": \"いーすとはうす\",\n        \"yellow apple\": \"YELLOW☆APPLE\",\n        \"yellow tag\": \"YELLOW TAG\",\n        \"yellowcotton\": \"yellowcotton\",\n        \"yes sir.\": \"Yes sir.\",\n        \"yggdrasil\": \"イグドラシル\",\n        \"ylang-ylang\": \"イランイラン\",\n        \"ymc\": \"YMC\",\n        \"ymi factory\": \"YMI factory\",\n        \"yo wa okazu wo shomou shiteoru\": \"余はおかずを所望しておる\",\n        \"yoake andon\": \"ヨアケ行燈\",\n        \"yoban left\": \"よばんれふと\",\n        \"yogurt\": \"yogurt\",\n        \"yohanemu\": \"よはねむ\",\n        \"yohitama\": \"Yohitama\",\n        \"yoidore rodeo\": \"酔いどれロデオ\",\n        \"yoidore usagitei\": \"酔いどれ兎亭\",\n        \"yoiko books\": \"よい子ブックス\",\n        \"yojouhan\": \"四畳半\",\n        \"yojouhan factory\": \"四畳半ファクトリー\",\n        \"yojouhan toshi\": \"四畳半都市\",\n        \"yokainosu\": \"ヨーカイノス\",\n        \"yokazetei\": \"夜風亭\",\n        \"yoke\": \"Yoke\",\n        \"yokohama junky\": \"Yokohama Junky\",\n        \"yokohama zza koubou\": \"横浜ZZA工房\",\n        \"yokoshima\": \"ヨコシーマ\",\n        \"yokoshimanchi.\": \"横島んち。\",\n        \"yokoyamagumi\": \"横山組\",\n        \"yokubou no tou\": \"欲望の塔\",\n        \"yolki palki\": \"ヨールキ・パールキ\",\n        \"yomamagoto\": \"夜ままごと\",\n        \"yomiji hyakki yakou\": \"黄泉路百鬼夜行\",\n        \"yomo zakkaten\": \"四方雑貨店\",\n        \"yomoda yomo japan\": \"よもだよもJAPAN\",\n        \"yomogi\": \"よもぎ\",\n        \"yomogiya\": \"よもぎや\",\n        \"yomosue doukoukai\": \"ヨモスエ同好会\",\n        \"yomosugara\": \"よもすがら\",\n        \"yomothuhirasaka\": \"黄泉比良坂\",\n        \"yomoyama sand\": \"よもやまサンド\",\n        \"yonakiya\": \"よなきや\",\n        \"yonmasuya\": \"四桝屋\",\n        \"yorimichi\": \"よりみち\",\n        \"yorozuya miyakotei\": \"よろず屋みやこ亭\",\n        \"yoru no benkyoukai\": \"夜の勉強会\",\n        \"yorugumi\": \"よるぐみ。\",\n        \"yoruyama no kyuukeijo\": \"夜山の休憩所\",\n        \"yosei yumeshiko\": \"酔セイ夢シコ\",\n        \"yoshida gorou shoukai\": \"吉田悟郎商會\",\n        \"yoshida kingdom\": \"ヨシダキングダム\",\n        \"yoshiga dokoro\": \"吉賀所\",\n        \"yoshii tech sha\": \"吉井テック社\",\n        \"yoshitakashi athletic\": \"吉丘アスレチック\",\n        \"yotayota honpo\": \"よたよた本舗\",\n        \"yotogizousi\": \"夜伽草紙\",\n        \"yotsumi works\": \"よつみわーくす\",\n        \"yottanchi\": \"よったんち\",\n        \"you you tsuushin\": \"遊遊通信\",\n        \"you2hp\": \"YOU2HP\",\n        \"youchien\": \"妖痴艶\",\n        \"yougekisya\": \"幼撃舎\",\n        \"youjo sentai loliconger\": \"幼女戦隊口リコンジャー\",\n        \"youjo teishoku\": \"Youjo定食\",\n        \"youkai ankake\": \"妖怪あんかけ\",\n        \"youmu no shio\": \"ようむのしお\",\n        \"youmusya\": \"遥夢社\",\n        \"yousei allergen\": \"幼性アレルゲン\",\n        \"yousei imagination\": \"幼性Imagination\",\n        \"youseimangasya\": \"妖精漫画社\",\n        \"youtou oniku\": \"妖刀お肉\",\n        \"youtoujirushi\": \"洋燈印\",\n        \"youtsuu rock\": \"腰痛ROCK\",\n        \"youyoumu\": \"妖幼夢\",\n        \"yozorairodrops\": \"夜空色ドロップ\",\n        \"ytoh2\": \"YtoH2\",\n        \"yu-gure yane\": \"ゆうぐれ屋根\",\n        \"yu-ta.18\": \"YU-TA.18\",\n        \"yu-topia\": \"佑とぴあ\",\n        \"yu-yake spectrum\": \"夕焼スペクトル\",\n        \"yu-yu tei\": \"YU-YU TEI\",\n        \"yu.\": \"ゆ。\",\n        \"yuasa rengou\": \"ゆあさ連合\",\n        \"yubeshi\": \"甘菓子\",\n        \"yude tamago\": \"ゆで卵\",\n        \"yudenakya nama-beer\": \"ゆでなきゃ生ビール\",\n        \"yudenonno\": \"ゆでのんの\",\n        \"yuga\": \"yuga\",\n        \"yuiumiya\": \"結海屋\",\n        \"yukagenikaga\": \"湯加減いかが?\",\n        \"yukan high zakura\": \"有閑high桜\",\n        \"yukari\": \"縁 -yukari-\",\n        \"yukarita\": \"ゆかりた\",\n        \"yukemuri froster\": \"ゆけむりフロスター\",\n        \"yukemuri inferno\": \"湯けむりインフェルノ\",\n        \"yuki mango\": \"ゆきマンゴー\",\n        \"yuki no hitohira\": \"ユキノヒトヒラ\",\n        \"yuki no iori\": \"ユキノ庵\",\n        \"yuki sumi iori\": \"雪墨庵\",\n        \"yuki-iro\": \"YuKi-IRo\",\n        \"yukidaruma kumiai\": \"ゆきだるま組合\",\n        \"yukima honpo\": \"雪間本舗\",\n        \"yukimi honpo\": \"ゆきみ本舗\",\n        \"yukimi onsen\": \"雪見温泉\",\n        \"yukirins\": \"YUKIRINS\",\n        \"yukisizuku\": \"ゆきしずく\",\n        \"yukisora\": \"ユキソラ\",\n        \"yukitenkan\": \"雪天館\",\n        \"yukyou\": \"ゆきょう\",\n        \"yukyu-kyuka\": \"悠久休暇\",\n        \"yume no kakera\": \"ユメノカケラ\",\n        \"yume no manimani\": \"夢のまにまに\",\n        \"yume no niwatori goya\": \"夢のニワトリ小屋\",\n        \"yumeiro-goromo\": \"ゆめいろごろも\",\n        \"yumeizukosya\": \"夢何処社\",\n        \"yumekakiya\": \"夢かき屋\",\n        \"yumemi\": \"yumemi\",\n        \"yumemigaoka\": \"ユメミガオカ\",\n        \"yumemigokoti\": \"夢見ごこち\",\n        \"yumemushi\": \"ユメムシ\",\n        \"yumenamakon\": \"ゆめなまこん\",\n        \"yumenekoya\": \"夢ねこ屋\",\n        \"yumeno miya\": \"夢乃宮\",\n        \"yumeoikyounouta\": \"夢追狂の謳\",\n        \"yumetoki\": \"ユメトキ\",\n        \"yumeya honpo\": \"夢屋本舗\",\n        \"yumiharizuki\": \"弓張月\",\n        \"yunomata\": \"♨ゆのまた\",\n        \"yunte\": \"yunte\",\n        \"yuraraka koubou\": \"ゆららか工房\",\n        \"yurari biyori\": \"ゆらり日和\",\n        \"yurei yashiki\": \"ゆーれーやしき\",\n        \"yureika\": \"ゆれいか\",\n        \"yurerutikuwabu\": \"ゆれるちくわぶ\",\n        \"yuri equal 18l\": \"百合=18L\",\n        \"yuririn no moto\": \"ゆりりんの素\",\n        \"yurufuwa megane\": \"ゆるふわ☆めがね\",\n        \"yuruhuwa-kinniku\": \"ゆるふわ筋肉\",\n        \"yururuka-dou\": \"ゆるるか堂\",\n        \"yurusu\": \"許す\",\n        \"yurutto pocket\": \"ゆるっとポケット\",\n        \"yusuzumi\": \"夕涼み\",\n        \"yutakadou\": \"豊堂\",\n        \"yutori-nu\": \"ゆとりーぬ\",\n        \"yuu adashino suisan\": \"(有)化野水産\",\n        \"yuu heya\": \"ゆう部屋\",\n        \"yuubeno gakuensai\": \"ユウベノ学園祭\",\n        \"yuuen floor\": \"遊園ふろあ\",\n        \"yuugai tosho kikaku\": \"有害図書企画\",\n        \"yuugatou\": \"誘蛾党\",\n        \"yuugen jikkou\": \"有言実行\",\n        \"yuugengaisha mach spin\": \"有限会社マッハスピン\",\n        \"yuugensangyou sukimakaze\": \"有限産業すきま風\",\n        \"yuuhodou\": \"遊歩堂\",\n        \"yuuhoku.\": \"ゆーほく。\",\n        \"yuuji wonder\": \"ゆうじワンダー\",\n        \"yuujiro\": \"遊字路\",\n        \"yuuk web\": \"yuuk web\",\n        \"yuukai kinshi\": \"誘拐禁止\",\n        \"yuukakumin\": \"遊廓民\",\n        \"yuukan madam\": \"勇敢マダム\",\n        \"yuukari soft\": \"ゆ～かりそふと\",\n        \"yuuki nyuugyou\": \"ゆーき乳業\",\n        \"yuuki ryu\": \"結城流\",\n        \"yuukyuu shinden\": \"悠久神殿\",\n        \"yuunagisou\": \"夕凪荘\",\n        \"yuuriko\": \"ユウリコ\",\n        \"yuusei honpo\": \"遊星本舗\",\n        \"yuuseian\": \"遊星庵\",\n        \"yuusha kandenchi\": \"勇者乾電池\",\n        \"yuusha-sama go-ikkou\": \"勇者様御一行\",\n        \"yuhshiki\": \"憂式\",\n        \"yuuyami sabou\": \"夕闇茶房\",\n        \"yuuyami tokeidai\": \"ゆうやみとけいだい\",\n        \"yuuyaminabe club\": \"夕闇鍋倶楽部\",\n        \"yuuzen animal dou\": \"友禅あにまる堂\",\n        \"yuyake box\": \"ゆうやけボックス\",\n        \"yuzucha\": \"ゆず茶\",\n        \"yuzucha biyori\": \"柚子茶日和\",\n        \"yuzuen\": \"柚子苑\",\n        \"yuzuhoge.\": \"Yuzuhoge.\",\n        \"yuzumikan\": \"ゆずみかん\",\n        \"yuzumonaka\": \"ゆずもなか\",\n        \"yuzupon\": \"YUZUPON\",\n        \"yuzuriha\": \"譲葉\",\n        \"yuzurihaya\": \"譲葉屋\",\n        \"yuzuya\": \"ゆずや\",\n        \"yuzuyu\": \"ゆず湯\",\n        \"yz plus\": \"YZ+\",\n        \"z jirushi\": \"Z印\",\n        \"z-front\": \"Z-FRONT\",\n        \"z-less\": \"Z-Less\",\n        \"z-s-e\": \"z-s-e\",\n        \"z-tabukuroneko house\": \"Zた袋猫はうす\",\n        \"zabuton makura\": \"ざぶとんまくら\",\n        \"zaclock\": \"ZacLock\",\n        \"zahhatorute\": \"ざっはとるて\",\n        \"zakkin heiki seizou koujou\": \"雑菌兵器製造工場\",\n        \"zakogoya\": \"ざこ小屋\",\n        \"zakuro an\": \"柘榴庵\",\n        \"zandaka-77yen\": \"残高77円\",\n        \"zangyaku koui teate\": \"残虐行為手当\",\n        \"zankirow\": \"斬鬼楼\",\n        \"zankoku doumei\": \"残酷同盟\",\n        \"zankoku ondo\": \"残酷音頭\",\n        \"zanmai\": \"三昧-zanmai-\",\n        \"zarigani arms\": \"ザリガニARMS\",\n        \"zashiki-neco\": \"ざしきねこ\",\n        \"zassou\": \"雑草\",\n        \"zassoubatake\": \"雑草畑\",\n        \"zatouichi\": \"座頭市\",\n        \"zatsunen koubou\": \"雑念工房\",\n        \"zatsuyou elixir\": \"雑用エリクサー\",\n        \"zattou keshiki\": \"雑踏景色\",\n        \"zawameki jambo\": \"ざわめきじゃんぼ\",\n        \"zeiniku shoujotai\": \"ぜいにく少女隊\",\n        \"zenmai-shiki kouchuusen\": \"ゼンマイ式航宙船\",\n        \"zenmain\": \"ZENMAIN\",\n        \"zennihon haeteru kai\": \"全日本生えてる會\",\n        \"zenos\": \"Zenos\",\n        \"zenpou chuugaeri kick\": \"前方宙返りキック\",\n        \"zenpou fuchuui\": \"前方不注意\",\n        \"zenpou kouenhun\": \"前方後円墳\",\n        \"zenryoku back dash\": \"全力バックダッシュ\",\n        \"zensekai yakenohara doumei\": \"全世界焼野原同盟\",\n        \"zenshuu bougyo\": \"ゼンシュウボウギョ\",\n        \"zensoku punks\": \"喘息パンクス\",\n        \"zensoku zenkai.\": \"喘息全快。\",\n        \"zensyuui\": \"全周囲\",\n        \"zero\": \"ゼロ\",\n        \"zero calorie\": \"ゼロカロリ\",\n        \"zero-sen\": \"zero戦\",\n        \"zero-xx\": \"ZERO・XX\",\n        \"zeroinfinityone\": \"0∞1\",\n        \"zeros factory\": \"零’sふぁくとりー\",\n        \"zetonpoison\": \"ゼトンポイソン\",\n        \"zettai bluenoid\": \"絶対ブルーノイド\",\n        \"zettai yarumoni\": \"絶対やるもに\",\n        \"zetubou\": \"zetubou\",\n        \"zi\": \"Zi\",\n        \"zi0topia\": \"ジ○トピア\",\n        \"ziggy star dust\": \"Ziggy STAR Dust\",\n        \"zigzag\": \"ZIGZAG\",\n        \"zigzag company\": \"ジグザグカンパニー\",\n        \"zinzin\": \"ジンジン\",\n        \"zion\": \"ZION\",\n        \"ziploc\": \"Ziploc\",\n        \"zipper wrist\": \"ジッパリスト\",\n        \"zircon prime\": \"じるこんプライム\",\n        \"zitadelle\": \"Zitadelle\",\n        \"zmey no soukutsu\": \"ズメイの巣窟\",\n        \"zng\": \"ZNG\",\n        \"znn\": \"ZNN\",\n        \"zoal\": \"ZOAL\",\n        \"zokubutsu.zip\": \"俗物.zip\",\n        \"zombie team\": \"Zombie Team\",\n        \"zooerastia\": \"ZOOERASTIA\",\n        \"zooko\": \"Zooko\",\n        \"zou no ran\": \"象の檻\",\n        \"zouri no sato\": \"ゾウリの里\",\n        \"zozalist\": \"ゾザリスト\",\n        \"zubunure lab\": \"ずぶ濡れラボ\",\n        \"zugaikotsu marudashi\": \"ズガイコツマルダシ\",\n        \"zukaishiki\": \"ずかいしき\",\n        \"zuukoku shoukai\": \"ずぅこく商会\",\n        \"zuwaigani beam\": \"ズワイガニビーム\",\n        \"zweidrei\": \"zweidrei\",\n        \"zyulokuya\": \"十録屋\",\n        \"zyx\": \"ジックス\",\n        \"ajito529\": \"アジト529\",\n        \"miomix\": \"miomix;\",\n        \"hinobashi seifukukan\": \"日野橋制服館\",\n        \"hoshii koubou\": \"星井工房\",\n        \"ascii media works\": \"ASCII Media Works\",\n        \"mitsume no mitsumame\": \"みつ目のみつ豆\",\n        \"rhf migite no tomo sha\": \"RHF=右手の友社\",\n        \"jurei no mori\": \"呪霊の杜\",\n        \"tsukitate-koubou\": \"つきたて工房\",\n        \"aramaa\": \"あらまあ\",\n        \"kazamidori\": \"かざみどり\",\n        \"m3\": \"M3\",\n        \"hiwa izumo taisha\": \"秘話出雲大社\",\n        \"caisson\": \"CAISSON\",\n        \"tuberose\": \"月化香\",\n        \"naga to yappari yukai na nakama-tachi\": \"nagaとやっぱり愉快な仲間たち\",\n        \"attakai inu no yoru de\": \"暖かい淫雨の夜で\",\n        \"nikoushikou\": \"に向思考\",\n        \"anata wa onaka ga suiteiru\": \"あなたはお腹がすいている\",\n        \"yurushite ochinti kyo\": \"許しておちんち教\",\n        \"seiheki kenkyuujo bravo han\": \"性癖研究所 ブラボー班\",\n        \"icchao murasakiimoren new\": \"いっちゃお♪紫芋れんnew\",\n        \"otokonoko de asobou\": \"男の子で遊ぼう\",\n        \"babaa no mitsuboshi restaurant\": \"ババアの三ツ星レストラン\",\n        \"mugisabou\": \"麦茶房\",\n        \"dessert soft\": \"DESSERT Soft\",\n        \"akatukiya\": \"赤月屋\",\n        \"metacorapusu\": \"めたこらぷす\",\n        \"hana q studio\": \"花Qスタジオ\",\n        \"shinsen shiboritate nama gyuunyuu.\": \"新鮮、搾りたて生牛乳。\",\n        \"shota mangaya-san\": \"ショタ漫画屋さん\",\n        \"kana note\": \"Kana Note\",\n        \"pirio destruction\": \"ピリオデストラクション\",\n        \"mauve\": \"mauve\",\n        \"tiguhagu metronome\": \"ちぐはぐメトロノーム\",\n        \"daisan-keitai\": \"第3形態\",\n        \"ray n maker\": \"Ray N' Maker\",\n        \"ijou higan sensen\": \"异常彼岸战线\",\n        \"shinkaihuyu\": \"深海浮遊\",\n        \"dull zodesadehai\": \"ダル・ゾデサデハーイ\",\n        \"fetishism pocket\": \"フェチズムポケット\",\n        \"kantou dougakai\": \"关东动画会\",\n        \"fusuma cafe\": \"ふすま喫茶\",\n        \"platinum kinoko\": \"プラチナきのこ\",\n        \"lunaberry\": \"Lunaberry\",\n        \"sakura no tomoru hie\": \"桜の灯る日へ\",\n        \"xx koubou\": \"××工房\",\n        \"hengen monogatari\": \"変幻物語\",\n        \"straight lemon kajuu 100\": \"ストレートレモン果汁100\",\n        \"gekidan 375\": \"劇団375\",\n        \"ryuuka hanten\": \"龍華飯店\",\n        \"hakumaidokoro\": \"白米所\",\n        \"dandakadan\": \"ダンダカダン\",\n        \"shikoshiko biyori\": \"しこしこ日和\",\n        \"ohige no shishimai\": \"お髭の獅子舞\",\n        \"damenahidou\": \"だめなひ堂\",\n        \"petanko bokujo\": \"ぺたんこ牧場\",\n        \"chanbara kishidan\": \"ちゃんばら騎士団\",\n        \"gensou kagetourou\": \"幻想影燈籠\",\n        \"chou rojiura gasshuukoku\": \"超路地裏合衆国\",\n        \"random footwork\": \"ランダムフットワーク\",\n        \"chabatake ni haeta takenoko\": \"茶畑に生えた筍\",\n        \"mizuyakinko\": \"水屋金库\",\n        \"namagaki\": \"生牡蛎\",\n        \"chouzankai\": \"超斩开\",\n        \"kirin planet\": \"キリンプラネット\",\n        \"sonpuushi\": \"村夫子\",\n        \"koushoku na reichourui\": \"好色な霊長類\",\n        \"yukinko okeya\": \"雪ん娘おけ屋\",\n        \"momonomi plus\": \"もものみプラス\",\n        \"metsuki warui kyoudan\": \"目つき悪い教団\",\n        \"chinpan-bu\": \"チンパン部\",\n        \"mondomura tomo no kai\": \"蒙德村友会\",\n        \"pirori kingdom\": \"PiRORI KINGDOM\",\n        \"kinomiki no mama\": \"木の幹のまま\",\n        \"raise wa futanari bishoujo\": \"来世是扶她美少女\",\n        \"kakuzatou\": \"角砂糖\",\n        \"gyuunyuu shoujo seisakusho\": \"牛乳少女制作所\",\n        \"abukumadou\": \"阿武隈堂\",\n        \"hakutamayu\": \"白玉汤\",\n        \"nodomaru biyori\": \"のどまる日和\",\n        \"itabira yasai\": \"イタビラ野菜\",\n        \"maria planet\": \"マリアプラネット\",\n        \"uishiro\": \"初代\",\n        \"140km slash h\": \"140km/h\",\n        \"shirokuma terepasu\": \"白熊テレパス\",\n        \"nipa nipa company\": \"NIPA NIPA COMPANY\",\n        \"omochi box\": \"OMOCHI BOX\",\n        \"kinokko\": \"きのっ子\",\n        \"dark horse comics\": \"黑马漫画\",\n        \"mt.sushi\": \"Mt.Sushi\",\n        \"milk lamp\": \"ミルクランプ\",\n        \"germanium detroit\": \"ゲルマニウム・デトロイト\",\n        \"suiren no yado\": \"水莲之宿\",\n        \"tariki honganji\": \"他力本愿寺\",\n        \"ebisujima misato\": \"戎島実里\",\n        \"jikahatsudensho\": \"自家発電処\",\n        \"signal violet\": \"Signal:Violet\",\n        \"me no sato\": \"芽の里\",\n        \"shuukyuu 8-ka\": \"週休8日\",\n        \"sagamiokiva\": \"さがみおきば\",\n        \"bochi bochi no ki\": \"ぼちぼちの木\",\n        \"pham\": \"PHAM!\",\n        \"henry plaza\": \"半里プラザー\",\n        \"shirokuroino\": \"白黒いの\",\n        \"riku no kotoutei\": \"陆の孤岛亭\",\n        \"kuniku no saku\": \"狗肉の策\",\n        \"taipeijin\": \"台北人\",\n        \"shinya koujou\": \"深夜工場\",\n        \"alpaca bokujou\": \"里アルパカ牧场\",\n        \"pink sakuhin okiba\": \"ピンク作品置き場\",\n        \"oden usagi\": \"おでんうさぎ\",\n        \"omochiya-san\": \"おもちやさん\",\n        \"shitsuren restaurant for men\": \"失恋レストラン FOR MEN\",\n        \"makuragi zabuton\": \"枕木ざぶとん\",\n        \"koko de chikubi o hitotsumami\": \"ここで乳首をひとつまみ\",\n        \"noumusai\": \"浓雾菜\",\n        \"nyoroman shouji\": \"にょろまん商事\",\n        \"praha keisanki\": \"プラハ計算機\",\n        \"mosoya\": \"毛想屋\",\n        \"mikamishi juukou\": \"三神氏重工\",\n        \"kudamonoichizu\": \"果物一途\",\n        \"mimitako seijin\": \"耳タコ星人\",\n        \"nukunuku jima\": \"ぬくぬく島\",\n        \"amagami honpo\": \"甘啮本铺\",\n        \"jyuu sensya usagitai\": \"重战车兔队\",\n        \"lv426\": \"LV426\",\n        \"circle mizusane\": \"サークルみづさね\",\n        \"milk farm tanaka\": \"ミルクファーム田中\",\n        \"agartha houeikyoku\": \"アガルタ放映局\",\n        \"menbou renpou\": \"めんぼーれんぽー\",\n        \"dukeyushimagurodon\": \"漬けゆしまぐろ丼\",\n        \"solo play\": \"そろぷれい\",\n        \"niji-teru\": \"虹照\",\n        \"kokumaro chousei tounyuu\": \"こくまろちょうせい豆乳\",\n        \"noya\": \"乃屋\",\n        \"touhikou\": \"陶惹好\",\n        \"yorunobando\": \"夜のバンド\",\n        \"shiba no shippo\": \"しばのしっぽ\",\n        \"futsu-no-tapioca-yasan\": \"ふつうのタピオカやさん\",\n        \"ushinomaruyaki\": \"ウシノマルヤキ\",\n        \"silver dog\": \"シルバードッグ\",\n        \"aburanabeshiki\": \"油锅式\",\n        \"gahahahahahaha\": \"がはははははは!\",\n        \"marshmalloya\": \"ましゅまろや\",\n        \"nanadou\": \"七堂\",\n        \"ayawasuca\": \"文忘蚊\",\n        \"sugomori bird\": \"巣ごもりバード\",\n        \"gensou pump\": \"幻想ポンプ\",\n        \"elizabeth collar\": \"エリザベスカラー\",\n        \"toropucchi\": \"とろぷっち\",\n        \"satou mitsu\": \"さとうみつ\",\n        \"mannen dokodoko dondodoko\": \"まんねんドコドコドンドドコ\",\n        \"uruudoki\": \"うるうどき\",\n        \"shironekoya\": \"白猫屋\",\n        \"mugen karaage\": \"無限からあげ\",\n        \"yonaka works\": \"ヨナカWorks\",\n        \"touketsu shamen\": \"卜ウケツ斜面\",\n        \"koutetsu shabon dama\": \"钢铁しゃぼん玉\",\n        \"hogeramu\": \"ほげらむ\",\n        \"mizushirazu\": \"みずしらず\",\n        \"yakitori teishoku\": \"焼きトリ定食\",\n        \"dakkoku kidoutai s.a.c\": \"脱壳机动队 S.A.C\",\n        \"mitsumitsuniku\": \"ミツミツにく\",\n        \"akirerushoujo\": \"アキレルショウジョ\",\n        \"fuzume\": \"ふずめ\",\n        \"hitakamoya\": \"ひたかもや\",\n        \"kasokuiki\": \"過疎区域\",\n        \"khaos distance\": \"カオス距離\",\n        \"tohosanhun\": \"徒歩三分\",\n        \"morunchi\": \"モルチ\",\n        \"gutsutoma\": \"ぐつとま\",\n        \"kaiten paradogs\": \"回転ParaDOGs\",\n        \"umi no sachi teishoku\": \"海の幸定食\",\n        \"tennensuidousui\": \"天然水道水\",\n        \"sorairo koubou\": \"空色工房\",\n        \"kakuran operetta\": \"攪乱オペレッタ\",\n        \"hikoushiki\": \"飞行式\",\n        \"toyoko daisyouten\": \"东横大赏典\",\n        \"maimu maimu\": \"まいむ～まいむ\",\n        \"yakimeshi modoki\": \"やきめしもどき\",\n        \"nananto\": \"ななんと\",\n        \"gogatsu souzaiten\": \"五月惣菜店\",\n        \"syunichi kansuu\": \"しゅにち関数\",\n        \"edamametei\": \"えだまめ亭\",\n        \"texteater\": \"Texteater\",\n        \"evolment tycoon\": \"EVOLMENT TYCOON\",\n        \"utsusumi onsen\": \"うつすみおんせん\",\n        \"dorayakiya\": \"どらやきや\",\n        \"kazumiya\": \"かずみ屋\",\n        \"high land\": \"HIGH:LAND\",\n        \"shibasaki shouji\": \"柴崎障子\",\n        \"ecchi ecchi daifuku\": \"えちえち大福\",\n        \"hoyhoy colo\": \"ホイホイこーろ\",\n        \"higashinodou\": \"東ノ堂\",\n        \"imagescript\": \"イメージscript\",\n        \"kawaiso nanoha nukeru\": \"かわいそうなのは抜ける\",\n        \"jinsei saboribu\": \"人生サボり部\",\n        \"mori no michi\": \"森の道\",\n        \"studio yama roman\": \"スタジオ山ロマン\",\n        \"inu ha sakana\": \"犬は鱼\",\n        \"mizukani\": \"みずかに\",\n        \"one hit wonder\": \"ONE HIT WONDER\",\n        \"fuwafuwa palette\": \"ふわふわパレット\",\n        \"marble dog\": \"MARBLE DOG\",\n        \"annbrellahouse\": \"あんぶれらはうす\",\n        \"citric acid1350\": \"クエン酸1750\",\n        \"tissue bako\": \"ティッシュ箱\",\n        \"mushoku muho\": \"無色ムホ\",\n        \"kushidatelier\": \"クシダトリエ\",\n        \"shiono room\": \"SHIONO ROOM\",\n        \"nanao heavy industries\": \"七尾重工\",\n        \"hoshoku shoujo\": \"捕食少女\",\n        \"mirakoku\": \"みら国\",\n        \"usonoki\": \"ウソノキ\",\n        \"tuyuiri kakinotane\": \"梅雨入り柿の種\",\n        \"ueshita\": \"UESHITA\",\n        \"minmintaro\": \"みんみんたろう\",\n        \"haimitsutou\": \"廃蜜灯\",\n        \"mrm lab\": \"MRMラボ\",\n        \"monkees\": \"モンキーズ\",\n        \"jalapeno chips\": \"ハラペーニョチップス\",\n        \"yattemiyou\": \"ヤッてみよう!\",\n        \"nekonokarintou\": \"ねこのかりんとう\",\n        \"chikara koso power\": \"力こそパワー\",\n        \"chachanako\": \"茶茶ナコ\",\n        \"shiro no ie\": \"シロの家\",\n        \"sankaku button\": \"三角ボタン\",\n        \"geppei bunchou\": \"月餅文蝶\",\n        \"nullspace\": \"NULLSPACE\",\n        \"sys-lila\": \"シスリラ\",\n        \"kaisendon\": \"カイセンドン\",\n        \"dandan dango\": \"段々団子\",\n        \"mobumomu ntr\": \"モブモムNTR\",\n        \"ice to choco\": \"あいすとちょこ\",\n        \"sakura suishou\": \"桜水晶\",\n        \"nekomimi to kuro mask\": \"猫耳と黒マスク\",\n        \"champion soft\": \"Champion Soft\",\n        \"dojiro books\": \"どじろーブックス\",\n        \"alwayshp1\": \"いつも死にかけ\",\n        \"shurashushushu\": \"しゅらしゅしゅしゅ\",\n        \"channel zakuro\": \"チャンネルざくろ\",\n        \"kitsune komachi\": \"きつねこまち\",\n        \"kaitendon\": \"海転丼\",\n        \"cre no monookiba\": \"シーレの物置場\",\n        \"studio park\": \"スタジオぱーく\",\n        \"donut church\": \"ドーナツ教会\",\n        \"netsuko\": \"ネツ湖\",\n        \"milkdou shoukai\": \"みるく堂商会\",\n        \"airimiash\": \"アイリミアーシュ\",\n        \"mokkorihan\": \"もっこりはん\",\n        \"zenjidou shimoneta seizou machine\": \"全自动下ネタ制造マシーン\",\n        \"shachi\": \"しゃち\",\n        \"mittsuman\": \"みっつまん\",\n        \"zyougesayuu\": \"上下左右\",\n        \"rakuenya\": \"乐园屋\",\n        \"torinoya\": \"とりの屋\",\n        \"gomikasu tarou\": \"五味滓太郎\",\n        \"kaoinshou zero\": \"顔印象零\",\n        \"yasudajuku\": \"保田塾\",\n        \"mahou no kinoko\": \"魔法のキノコ\",\n        \"suihanya\": \"炊飯屋\",\n        \"climbcrown\": \"クライムクラウン\",\n        \"takahiro no ie\": \"たかひろの家\",\n        \"shiosai\": \"潮騒\",\n        \"touzainanboku\": \"とうざいなんぼく\",\n        \"arijigoku\": \"蚁地狱\",\n        \"tianoblue\": \"ティアノブルー\",\n        \"nerimono koujou\": \"練り物工場\",\n        \"marosaan\": \"まろ茶庵\",\n        \"pachypodium\": \"ぱきぽぢうむ\",\n        \"europia\": \"ゆーろぴあ\",\n        \"iinchou no yabai yatsu\": \"委員長のやばいヤツ\",\n        \"gotarou no all night fuck\": \"ゴ太郎\",\n        \"ruri-iro special room\": \"瑠璃色特別室\",\n        \"harmonear\": \"HarmoNeaR\",\n        \"higedokoro\": \"ひげどころ\",\n        \"shinjiroya\": \"信じろや\",\n        \"pontaroya\": \"ぽんたろ家\",\n        \"watochip melonpan\": \"わとちっぷめろんぱん\",\n        \"miraiha kireini\": \"ミライハキレイニ\",\n        \"otonagokko iinkai\": \"おとなごっこ委員会\",\n        \"elica\": \"ELICA\",\n        \"gojihan\": \"五时半\",\n        \"netorare no tami\": \"ネトラレの民\",\n        \"7 rensa\": \"7连锁\",\n        \"citrusniper\": \"シトラスナイパー\",\n        \"unadon\": \"うなどぅーむ\",\n        \"torii-za\": \"鳥居座\",\n        \"sokuochi shoujo\": \"即オチ少女\",\n        \"nora nee-sama\": \"Nora姉様\",\n        \"ochaban\": \"お茶番\",\n        \"shaft\": \"SHAFT\",\n        \"kagayaku hoshizuna\": \"輝く星砂\",\n        \"chikyuujin\": \"ちきゅうじん\",\n        \"nyum production\": \"にゅむproduction\",\n        \"heppoko usagi cafe\": \"へっぽこうさぎ＊cafe\",\n        \"asakasha doujin\": \"朝花社同人\",\n        \"maisou no soko\": \"埋葬ノ底\",\n        \"kyuryo koen\": \"丘陵公園\",\n        \"chairoiyatsu\": \"ちゃいろいやつ\",\n        \"surudoiman no irutokoro\": \"するどいマンのいるところ\",\n        \"kinkai 100 kg\": \"金塊100kg\",\n        \"mukyou no utopia\": \"梦境的\",\n        \"nomiyagumi\": \"ノミヤ組\",\n        \"manaita koujou\": \"まな板工場\",\n        \"choukenkouya\": \"超健康屋\",\n        \"namekuzu\": \"なめくず\",\n        \"yuujikouji\": \"ゆうじこうじ\",\n        \"kuwaiya\": \"くわい屋\"\n    },\n    \"artist\": {\n        \"2\": \"2\",\n        \"7\": \"7\",\n        \"8\": \"8\",\n        \"13\": \"13\",\n        \"20\": \"廿\",\n        \"23\": \"23\",\n        \"24\": \"24\",\n        \"41\": \"41\",\n        \"66\": \"66\",\n        \"68\": \"68\",\n        \"76\": \"七六\",\n        \"88\": \"88\",\n        \"144\": \"144\",\n        \"222\": \"222\",\n        \"254\": \"254\",\n        \"346\": \"346\",\n        \"445\": \"445\",\n        \"543\": \"543\",\n        \"581\": \"581\",\n        \"691\": \"ムクイ\",\n        \"892\": \"八9二\",\n        \"961\": \"𝟡𝟞𝟙\",\n        \"1103\": \"1103\",\n        \"3104\": \"3104\",\n        \"7010\": \"7010\",\n        \"8000\": \"8000\",\n        \"33297\": \"33297\",\n        \"pop\": \"POP\",\n        \"oouso\": \"大嘘\",\n        \"peko\": \"ぺこ（かにビーム）\",\n        \"akaza\": \"あかざ\",\n        \"ishikei\": \"石惠\",\n        \"endou hiroto\": \"远藤弘土\",\n        \"happoubi jin\": \"八宝备仁\",\n        \"fujisaki hikari\": \"藤崎ひかり\",\n        \"ichiri\": \"イチリ\",\n        \"satou kibi\": \"さとうきび\",\n        \"nanpuu\": \"なんぷぅ\",\n        \"yukiu con\": \"雪雨こん\",\n        \"land sale\": \"兰户せる\",\n        \"emily\": \"emily\",\n        \"chiri\": \"ちり\",\n        \"kantoku\": \"监督\",\n        \"sayori\": \"Sayori\",\n        \"ideolo\": \"ideolo\",\n        \"sky\": \"SKY | Sky-FreeDom\",\n        \"m.vv\": \"M.vv\",\n        \"miyahara ayumu\": \"宫原步\",\n        \"nishikawa kou\": \"西川康\",\n        \"narusawa kei\": \"なるさわ景\",\n        \"akatsuki myuuto\": \"赤月みゅうと\",\n        \"kisaragi gunma\": \"如月群真\",\n        \"ohtomo takuji\": \"大友卓二\",\n        \"yamada no seikatu ga daiichi\": \"山田の性活が第一\",\n        \"asamura hiori\": \"朝丛志描\",\n        \"matsukawa\": \"松河\",\n        \"mmm\": \"暗黑えむ将军\",\n        \"facominn\": \"ふぁこみん\",\n        \"great mosu\": \"ぐれーともす\",\n        \"ringo sui\": \"りんご水\",\n        \"kanzaki muyu\": \"神崎むゆ\",\n        \"mizuyan\": \"みずやん\",\n        \"ranyues\": \"仴\",\n        \"horonamin\": \"ホロナミン\",\n        \"chiyami\": \"ちやみ\",\n        \"hanahanamaki\": \"花花卷\",\n        \"sousouman\": \"草草馒\",\n        \"muk\": \"MUK\",\n        \"ore p 1-gou\": \"俺P1号\",\n        \"menyoujan\": \"めんようじゃん\",\n        \"hodumi kaoru\": \"八月朔日珈瑠\",\n        \"watsuki rumi\": \"わつきるみ\",\n        \"soramoti\": \"そらモチ\",\n        \"blastbeat\": \"BLASTBEAT\",\n        \"takashina at masato\": \"高阶@圣人\",\n        \"shibayuki\": \"しばゆき\",\n        \"newmen\": \"NeWMeN\",\n        \"miyasaka miyu\": \"宫坂みゆ\",\n        \"miyasaka naco\": \"宫坂なこ\",\n        \"shimahara\": \"40原\",\n        \"hayakawa akari\": \"早川あかり\",\n        \"masaharu\": \"まさはる\",\n        \"ail\": \"あいる\",\n        \"saigado\": \"彩画堂\",\n        \"nanase meruchi\": \"ななせめるち\",\n        \"marushin\": \"丸新\",\n        \"amamiya mizuki\": \"雨宫ミズキ\",\n        \"mibu natsuki\": \"みぶなつき\",\n        \"ogata zen\": \"尾形全\",\n        \"himura kiseki\": \"比村奇石\",\n        \"cle masahiro\": \"吴マサヒロ\",\n        \"nakajima yuka\": \"なかじまゆか\",\n        \"fujima takuya\": \"藤真拓哉\",\n        \"hisasi\": \"Hisasi\",\n        \"akizora momidi\": \"秋空もみぢ\",\n        \"yuunagi sesina\": \"夕凪セシナ\",\n        \"ippongui\": \"一本杭\",\n        \"sekine hajime\": \"咳寝はじめ\",\n        \"mura osamu\": \"ムラオサム\",\n        \"sody\": \"Sody\",\n        \"fujiwara shunichi\": \"藤原俊一\",\n        \"ohigetan\": \"尾髭丹\",\n        \"kisaragi-mic\": \"如月みっく\",\n        \"kisaragi-ice\": \"如月あいす\",\n        \"takanashi rei\": \"小鸟游レイ\",\n        \"kawakami rokkaku\": \"川上六角\",\n        \"niro\": \"にろ\",\n        \"okuri banto\": \"送り万都\",\n        \"runrun\": \"るんるん\",\n        \"zonda\": \"ぞんだ\",\n        \"bekkankou\": \"べっかんこう\",\n        \"santa matsuri\": \"さんた茉莉\",\n        \"quick wiper\": \"クイック賄派\",\n        \"jigoku ouji\": \"地狱王子\",\n        \"kobayashi youkoh\": \"小林由高\",\n        \"saeki tatsuya\": \"佐伯达也\",\n        \"mamo williams\": \"まもウィリアムズ\",\n        \"koga nozomu\": \"古我望\",\n        \"shinokawa arumi\": \"篠川あるみ\",\n        \"ichio\": \"イチオ\",\n        \"shimada fumikane\": \"岛田文金\",\n        \"ryohka\": \"凉香\",\n        \"shinkai makoto\": \"新海诚\",\n        \"benet\": \"ベネット\",\n        \"ponpon\": \"ぽんぽん\",\n        \"tetsujin\": \"铁人\",\n        \"hiyoko\": \"ひよさん\",\n        \"syukurin\": \"シュクリーン\",\n        \"araki kanao\": \"あらきかなお\",\n        \"nagiyama\": \"那岐山\",\n        \"kittsu\": \"キッツ\",\n        \"neko toufu\": \"猫豆腐\",\n        \"nagare hyo-go\": \"流ひょうご\",\n        \"mizuki gyokuran\": \"瑞姬玉兰\",\n        \"tenchisouha\": \"天地争霸\",\n        \"arui ryou\": \"あるい椋\",\n        \"sasamori tomoe\": \"笹森トモエ\",\n        \"sasai saji\": \"笹井さじ\",\n        \"okazaki takeshi\": \"岡崎武士\",\n        \"harukaze soyogu\": \"春风ソヨグ\",\n        \"kasi\": \"华师\",\n        \"cheru\": \"ちぇる\",\n        \"umedama nabu\": \"梅玉奈部\",\n        \"aranmaru\": \"亚兰丸\",\n        \"tachibana omina\": \"立花オミナ\",\n        \"ibuki ren\": \"伊吹莲\",\n        \"uran\": \"URAN | 雨兰\",\n        \"billion\": \"Billion\",\n        \"nanao\": \"ななお\",\n        \"pirontan\": \"ピロンタン\",\n        \"tokyo yamane\": \"东京0ヤマネ\",\n        \"yuki higasinakano\": \"ゆーき東中野\",\n        \"nosada\": \"乃定\",\n        \"yukibuster z\": \"ユキバスターZ\",\n        \"roga\": \"RoGa\",\n        \"bonnari\": \"ぼんなり\",\n        \"komone ushio\": \"相音うしお\",\n        \"yuriko\": \"白河子\",\n        \"nanno koto\": \"南野琴\",\n        \"minazuki mikka\": \"水无月三日\",\n        \"minazuki juuzou\": \"水无月十三\",\n        \"minazuki tooru\": \"水无月彻\",\n        \"minazuki no-mu\": \"水无月のーむ\",\n        \"minazuki satoshi\": \"水无月サトシ\",\n        \"minazuki futago\": \"みなづきふたご\",\n        \"minazuki tsuyuha\": \"水无月露叶\",\n        \"minaduki kanna\": \"水无月神奈\",\n        \"karaage tarou\": \"からあげ太郎\",\n        \"okumori boy\": \"奥森ボウイ\",\n        \"sahara wataru\": \"砂原涉\",\n        \"amano kazumi\": \"天乃一水\",\n        \"ichiyo moka\": \"一叶モカ\",\n        \"naturalton\": \"なちゅらるとん\",\n        \"aono ribbon\": \"青野りぼん\",\n        \"hidaka toworu\": \"ヒダカトヲル\",\n        \"rara8\": \"らら8\",\n        \"medaka kenichi\": \"目高健一\",\n        \"kanna\": \"かん奈\",\n        \"kazabuki poni\": \"风吹ぽに\",\n        \"ouma tokiichi\": \"逢魔刻壹\",\n        \"momonoki fum\": \"百乃木富梦\",\n        \"miito shido\": \"三糸シド\",\n        \"motomiya mitsuki\": \"もとみやみつき\",\n        \"interstellar\": \"Interstellar\",\n        \"mikeou\": \"みけおう\",\n        \"hinata nao\": \"日向奈尾\",\n        \"sakurazaka tsuchiyu\": \"樱坂つちゆ\",\n        \"yamakaze ran\": \"やまかぜ嵐\",\n        \"anko\": \"あん子 | あんこ\",\n        \"kohaku.\": \"こはく。\",\n        \"kousaka jun\": \"香坂纯\",\n        \"gerotan\": \"げろたん\",\n        \"kozakura kumaneko\": \"小樱クマネコ\",\n        \"distance\": \"DISTANCE\",\n        \"kawaraya a-ta\": \"瓦屋A太\",\n        \"usou\": \"雨草\",\n        \"awayume\": \"淡梦\",\n        \"shiroo\": \"しろー\",\n        \"ryokucha\": \"绿茶\",\n        \"niimaru yuu\": \"ニイマルユウ\",\n        \"simon\": \"さいもん\",\n        \"tanaka aji\": \"田中あじ\",\n        \"unadon\": \"うな井\",\n        \"otakumin\": \"オタクミン\",\n        \"muneshiro\": \"むねしろ\",\n        \"haruki genia\": \"はるきゲにあ\",\n        \"ikegami tatsuya\": \"池上龙矢\",\n        \"pony r\": \"ポニーR\",\n        \"sakura yuu\": \"さくら★ゆう\",\n        \"yan-yam\": \"Yan-Yam\",\n        \"watanabe kenpo\": \"渡边宪法\",\n        \"kamiya zuzu\": \"神谷ズズ\",\n        \"tsumumaru hifu\": \"纺丸ひふ\",\n        \"yasakani an\": \"ヤサカニ·アン\",\n        \"ayachi\": \"あやち\",\n        \"kurori\": \"くろり\",\n        \"suwa izumo\": \"诹访出云\",\n        \"ishigami kazui\": \"石神一威\",\n        \"kamogawa tanuki\": \"鸭川狸\",\n        \"shiruka bakaudon\": \"知るかバカうどん\",\n        \"amekosame\": \"雨小雨\",\n        \"kiira\": \"きぃら～☆\",\n        \"kanoe\": \"庚\",\n        \"daichi kouta\": \"大地巧太\",\n        \"kylin\": \"Kylin\",\n        \"morishima kon\": \"森岛コン\",\n        \"mdo-h\": \"无道睿智\",\n        \"ginyou haru\": \"银曜晴\",\n        \"shiina\": \"シイナ\",\n        \"mikuta\": \"みくた\",\n        \"shibasaki syouzi\": \"柴崎しょうじ（柴崎ショージ）\",\n        \"tempo gensui\": \"天蓬元帅\",\n        \"mafuyu\": \"真冬\",\n        \"kakugari kyoudai\": \"カクガリ兄弟\",\n        \"matsumomo mahiru\": \"松百まひる\",\n        \"aoi masami\": \"苍海\",\n        \"itou life\": \"伊东life\",\n        \"taniguchi-san\": \"谷口さん\",\n        \"amou mari\": \"天羽真理\",\n        \"tsuttsu\": \"つっつ\",\n        \"minarai zouhyou\": \"见习杂兵\",\n        \"aya\": \"AYA | 蓝夜\",\n        \"oi shibako\": \"しばこ（司马淳子）\",\n        \"sato-satoru\": \"さとーさとる\",\n        \"gengorou\": \"源五郎\",\n        \"rokuyo ten\": \"六曜テン\",\n        \"mitsuru\": \"みつる\",\n        \"rage\": \"らげ\",\n        \"chouzetsu bishoujo mine\": \"超绝美少女mine\",\n        \"fried\": \"ふりいど\",\n        \"kouji\": \"孝治\",\n        \"sanada\": \"さなだ\",\n        \"shikei\": \"しけー\",\n        \"ruri\": \"ルリ | るり | 瑠璃\",\n        \"kohata tsunechika\": \"小旗つねちか\",\n        \"carn\": \"夏庵\",\n        \"okada kou\": \"冈田コウ\",\n        \"neko pantsu\": \"ねこパンツ\",\n        \"suzunone rena\": \"铃音れな\",\n        \"miyabi\": \"美矢火\",\n        \"pochi.\": \"ぽち。\",\n        \"hayami jun\": \"早见纯\",\n        \"katou chakichi\": \"加藤茶吉\",\n        \"taono kinoko\": \"汰尾乃きのこ\",\n        \"aikawa monako\": \"あいかわモナコ\",\n        \"tenma femio\": \"天马ふぇみお\",\n        \"kurusumin\": \"来须眠\",\n        \"chobi\": \"ちょび\",\n        \"norakuro nero\": \"野良黑ネロ\",\n        \"izumi yuujiro\": \"泉ゆうじろ～\",\n        \"itameshi\": \"炒饭\",\n        \"hiraoka ryuichi\": \"平冈龙一\",\n        \"maguro teikoku\": \"まぐろ帝国\",\n        \"pote\": \"ぽて\",\n        \"karakuchi choucream\": \"辛口しゅーくりーむ\",\n        \"mafen\": \"マフェン\",\n        \"kuroda kuro\": \"黑田クロ\",\n        \"ooooalikui\": \"おおおおありくい\",\n        \"juna juna juice\": \"ジュナジュナジュース\",\n        \"hiro hiroki\": \"ひろひろき\",\n        \"yone kinji\": \"与根金次\",\n        \"zankuro\": \"ザンクロー\",\n        \"wa\": \"WA\",\n        \"satou kuuki\": \"左藤空气\",\n        \"kouzuki hajime\": \"香月一花\",\n        \"furukawa remon\": \"古川れもん\",\n        \"nukunuku batten\": \"ぬくぬくばってん\",\n        \"sadokko\": \"さどっこ\",\n        \"izumi\": \"和泉\",\n        \"reizei\": \"冷泉\",\n        \"petenshi\": \"ペテン师\",\n        \"maruwa tarou\": \"丸和太郎\",\n        \"fujishima sei1go\": \"藤岛制1号\",\n        \"nanotsuki\": \"なのつき\",\n        \"norutaru\": \"のるたる\",\n        \"koi\": \"Koi\",\n        \"koishi chikasa\": \"小石ちかさ\",\n        \"koikawa minoru\": \"恋河ミノル\",\n        \"koiko irori\": \"恋小いろり\",\n        \"koi nobori\": \"Koiのぼり\",\n        \"koiken\": \"こいけん\",\n        \"koizumi hitsuji\": \"小泉ひつじ\",\n        \"hormone koijirou\": \"ホルモン恋次郎\",\n        \"koinu\": \"こいぬ\",\n        \"kinnotama\": \"またのんき▼\",\n        \"suka\": \"すか\",\n        \"amazon\": \"雨存\",\n        \"milk jam\": \"みるくジャム\",\n        \"isami nozomi\": \"伊佐美ノゾミ\",\n        \"souryuu\": \"双龙\",\n        \"umi suzume\": \"雨美すずめ\",\n        \"michiking\": \"米奇王\",\n        \"otabe sakura\": \"おたべさくら\",\n        \"ryo\": \"RYO\",\n        \"minori kenshirou\": \"实验四郎\",\n        \"umemura\": \"梅村\",\n        \"peter mitsuru\": \"ペーター・ミツル\",\n        \"tennouji kitsune\": \"天王寺狐\",\n        \"shikishima tenki\": \"敷岛天气\",\n        \"shikishima shoutarou\": \"敷岛昭太郎\",\n        \"siina yuuki\": \"椎名悠輝\",\n        \"manami tatsuya\": \"真未たつや\",\n        \"miharu\": \"美春 | ミハル\",\n        \"mush\": \"むっしゅ\",\n        \"haneinu\": \"跳犬\",\n        \"misaki takahiro\": \"三崎高博\",\n        \"sada ko-ji\": \"さだこーじ\",\n        \"mikami mika\": \"三上ミカ\",\n        \"nagare ippon\": \"流一本\",\n        \"hicoromo kyouichi\": \"绯衣响一\",\n        \"akaze kidai\": \"亚风纪代\",\n        \"yuuki\": \"悠宇树\",\n        \"ohkami ryosuke\": \"狼亮辅\",\n        \"jitsuma\": \"儿妻\",\n        \"kawaisaw\": \"可哀想\",\n        \"alpha alf layla\": \"α・アルフライラ\",\n        \"tori hrami\": \"鳥ハラミ\",\n        \"mori marimo\": \"もりまりも\",\n        \"fujisaka lyric\": \"藤坂リリック\",\n        \"mori kouichirou\": \"杜講一郎\",\n        \"sakura akami\": \"さくらあかみ\",\n        \"hatomugi munmun\": \"鳩麦月々\",\n        \"gegera toshikazu\": \"げげら俊和\",\n        \"eromame\": \"えろ豆\",\n        \"momoya chika\": \"桃屋チカ\",\n        \"ooshima tomo\": \"大岛智\",\n        \"hinemosu notari\": \"ひねもすのたり\",\n        \"kurasawa makoto\": \"倉澤まこと\",\n        \"bokujou nushi k\": \"牧场主K\",\n        \"youta\": \"夜歌 | よう太\",\n        \"tsumugi kyuuta\": \"紬きゅうた\",\n        \"minaga tsukune\": \"水賀つくね\",\n        \"cha mirai\": \"茶みらい\",\n        \"serizawa\": \"芹泽\",\n        \"toono suika\": \"远野西瓜\",\n        \"pierre yoshio\": \"ピエ～ル☆よしお\",\n        \"shinji mao\": \"真慈真雄\",\n        \"aoi manabu\": \"あおいまなぶ\",\n        \"izumi tsubasu\": \"和泉つばす\",\n        \"sakai hamachi\": \"堺はまち\",\n        \"kannazuki nem\": \"神無月ねむ\",\n        \"sakurabe notos\": \"桜部のとす\",\n        \"misaki kurehito\": \"深崎暮人\",\n        \"kuroya shinobu\": \"黑谷忍\",\n        \"san sheng wan\": \"三生万\",\n        \"el\": \"える\",\n        \"mango pudding\": \"まんごープリン\",\n        \"wakamiya santa\": \"若宫参太\",\n        \"shungiku tenudon\": \"春菊天うどん\",\n        \"mikaduki neko\": \"三日月ネコ\",\n        \"aihara shouta\": \"相原翔太\",\n        \"mimofu\": \"みもふ\",\n        \"takatuki nato\": \"鷹月ナト\",\n        \"shiratama\": \"白玉\",\n        \"nohara hiromi\": \"野原ひろみ\",\n        \"higashino mikan\": \"東野みかん\",\n        \"dr.bug\": \"Dr.阿虫\",\n        \"ameto yuki\": \"あめとゆき\",\n        \"kenkou cross\": \"健康クロス\",\n        \"yanagawa rio\": \"やながわ理央\",\n        \"kakuzatou\": \"核座头\",\n        \"kaminagi\": \"神凪\",\n        \"twinbox\": \"TwinBox\",\n        \"izuminoaru\": \"イズミノアル\",\n        \"nora shinji\": \"白野じん\",\n        \"shihachiro\": \"しはちろ\",\n        \"daikoukoku shinbun\": \"大広告新聞\",\n        \"yuuki hagure\": \"憂姫はぐれ\",\n        \"paru\": \"パル\",\n        \"rikatan\": \"利华炭☆\",\n        \"jackdempa\": \"弱电波\",\n        \"hiyama izumi\": \"火山一角\",\n        \"kazuma muramasa\": \"和马村政\",\n        \"amatsuka china\": \"天使ちな\",\n        \"denki shougun\": \"电气将军\",\n        \"gibuchoko\": \"ぎヴちょこ\",\n        \"sinbo tamaran\": \"神保玉兰\",\n        \"kaenuco\": \"かえぬこ\",\n        \"arikawa satoru\": \"有河サトル\",\n        \"yui toshiki\": \"唯登诗树\",\n        \"kitahara tomoe\": \"北原朋萌。\",\n        \"kizaki yuuri\": \"树崎祐里\",\n        \"shio kazunoko\": \"塩かずのこ\",\n        \"muska\": \"むすか\",\n        \"amaduyu tatsuki\": \"甘露树\",\n        \"kawata hisashi\": \"カワタヒサシ\",\n        \"mitsumi misato\": \"みつみ美里\",\n        \"nakamura takeshi\": \"なかむらたけし\",\n        \"minase syu\": \"水濑修\",\n        \"yoshiura kazuya\": \"由浦カズヤ\",\n        \"erect sawaru\": \"エレクトさわる\",\n        \"katsurai yoshiaki\": \"桂井よしあき\",\n        \"sanazura hiroyuki\": \"さなづらひろゆき\",\n        \"takamura wamu\": \"高村わむ\",\n        \"menoko\": \"めの子\",\n        \"tamon\": \"たもん\",\n        \"haruaki\": \"明彰\",\n        \"oomori yoshiharu\": \"おおもりよしはる\",\n        \"amedamacon\": \"飴玉コン\",\n        \"eisen\": \"英战\",\n        \"harigane shinshi\": \"针金绅士\",\n        \"kazuhiro\": \"一弘\",\n        \"lobster\": \"ロブ☆スター\",\n        \"magifuro konnyaku\": \"magifuro蒟蒻\",\n        \"ueda john\": \"うえだジョン\",\n        \"wenajii\": \"ヱナジー\",\n        \"zeno\": \"是乃\",\n        \"imizu\": \"威未図\",\n        \"shindou hajime\": \"新道一\",\n        \"type.90\": \"TYPE.90\",\n        \"bu-chan\": \"ぶーちゃん\",\n        \"sasahiro\": \"笹弘\",\n        \"haikawa hemlen\": \"灰川ヘムレン\",\n        \"harasho\": \"はらしょ\",\n        \"nishimu\": \"にしむ\",\n        \"narita koh\": \"成田コウ\",\n        \"shiden\": \"しでん\",\n        \"mira\": \"みら | 未镜\",\n        \"fuusen club\": \"風船クラブ\",\n        \"shioroku\": \"シオロク\",\n        \"kaname aomame\": \"要青豆\",\n        \"kouno yukiyo\": \"こうのゆきよ\",\n        \"seno fumiki\": \"濑野文希\",\n        \"shimuu\": \"しゃむ\",\n        \"rie-chan 14-sai\": \"りえちゃん14歳\",\n        \"fukori\": \"フコリ\",\n        \"shinyashiki\": \"新屋敷\",\n        \"kanzume\": \"KANZUME\",\n        \"kishimen\": \"きしめん\",\n        \"ken-1\": \"Ken-1\",\n        \"midoh tsukasa\": \"御堂つかさ\",\n        \"oyama yasunaga\": \"尾山泰永\",\n        \"kino hitoshi\": \"鬼ノ仁\",\n        \"tam-u\": \"Tam-U\",\n        \"lunaluku\": \"るなるく\",\n        \"shiokonbu\": \"しおこんぶ\",\n        \"mon-mon\": \"MON-MON\",\n        \"kohoshi moe\": \"小星萌\",\n        \"kurumiko\": \"胡桃子\",\n        \"hirari\": \"ひらり\",\n        \"aoi nagisa\": \"葵渚\",\n        \"alde hyde\": \"アルデヒド\",\n        \"mutsuno hexa\": \"六ツ野へきさ\",\n        \"takenokoya\": \"筍屋\",\n        \"ankoku tiger\": \"暗黒タイガー\",\n        \"kakkii\": \"かっきー\",\n        \"shizuki shuya\": \"紫月秋夜\",\n        \"himukai kyousuke\": \"日向恭介\",\n        \"fuyutugu\": \"冬嗣\",\n        \"mogudan\": \"モグダン\",\n        \"100yen locker\": \"100円ロッカー\",\n        \"hana hook\": \"华フック\",\n        \"taki minashika\": \"滝美梨香\",\n        \"hirame\": \"ヒラメ | 比目鱼\",\n        \"minakami rinka\": \"水上凛香\",\n        \"andou shuki\": \"安藤周记\",\n        \"nakata shunpei\": \"中田春平\",\n        \"kurun\": \"くるん\",\n        \"inuzumi masaki\": \"戌角柾\",\n        \"kurashima tomoyasu\": \"仓岛丈康\",\n        \"hanamo daiou\": \"はなも大王\",\n        \"mizu gokiburi\": \"水ゴキブリ\",\n        \"kazumu\": \"一梦\",\n        \"rentb\": \"Rentb\",\n        \"ren\": \"REN\",\n        \"kotera\": \"コテラ\",\n        \"fei\": \"飞燕\",\n        \"miyano kintarou\": \"宫野金太郎\",\n        \"sumino yuuji\": \"速野悠二\",\n        \"shouji ayumu\": \"小路步\",\n        \"maka fushigi\": \"魔訶不思議\",\n        \"draw2\": \"土狼弐\",\n        \"muronaga chaashuu\": \"室永叉烧\",\n        \"sawao\": \"さわお\",\n        \"kudou hiroshi\": \"工藤洋\",\n        \"tsurui\": \"鹤井\",\n        \"okiraku nic\": \"お気楽ニック\",\n        \"kanten\": \"寒天\",\n        \"usubeni sakurako\": \"うすべに桜子\",\n        \"nori\": \"糊\",\n        \"mitsugi\": \"ミツギ\",\n        \"seura isago\": \"濑浦沙悟\",\n        \"tsukudani norio\": \"佃煮のりお\",\n        \"kasugano tobari\": \"春日野トバリ\",\n        \"hisaka hazara\": \"檜坂はざら\",\n        \"sumiyao\": \"すみやお\",\n        \"ikkyuu\": \"一休\",\n        \"hasemi ryo\": \"长谷见亮\",\n        \"summer\": \"サマー\",\n        \"tokitsu mika\": \"都月十佳\",\n        \"arigase shinji\": \"ありがせしんじ\",\n        \"arisaka k\": \"有坂K\",\n        \"asakaze abyss\": \"朝風あびす\",\n        \"youki akira\": \"优希辉\",\n        \"matsuda k\": \"マツダK\",\n        \"amanatsu aki\": \"甘夏あき\",\n        \"magukappu\": \"马克杯\",\n        \"michiyon\": \"みちよん\",\n        \"hijiri tsukasa\": \"圣☆司\",\n        \"tsukino jyogi\": \"月野定规\",\n        \"gotou junji\": \"后藤润二\",\n        \"nogi makoto\": \"のぎまこと\",\n        \"shinonome ryu\": \"东云龙\",\n        \"nikusyo\": \"弐駆緒\",\n        \"shimanto youta\": \"四万十曜太\",\n        \"sugou hiroyuki\": \"菅生博倖\",\n        \"bow rei\": \"某零\",\n        \"inochi wazuka\": \"命わずか\",\n        \"hiduki yayoi\": \"ひづき夜宵\",\n        \"komori kei\": \"こもりけい\",\n        \"toyama teiji\": \"戸山テイジ\",\n        \"komiya hitoma\": \"こみやひとま\",\n        \"hitsuji takako\": \"ひつじたかこ\",\n        \"mizoro tadashi\": \"深泥正\",\n        \"q-gaku\": \"Q-Gaku\",\n        \"kemigawa mondo\": \"検見川もんど\",\n        \"tadano akira\": \"只野あきら\",\n        \"kaisen chuui\": \"开栓注意\",\n        \"ozy\": \"オジィ\",\n        \"sakurai shizuku\": \"桜井雫\",\n        \"kokutou nikke\": \"黒糖ニッケ\",\n        \"makuwauni\": \"まくわうに\",\n        \"seki\": \"赤\",\n        \"monorino\": \"モノリノ\",\n        \"tomohiro kai\": \"智弘カイ\",\n        \"kuribayashi chris\": \"栗林クリス\",\n        \"nagai wataru\": \"长井わたる\",\n        \"suzuhane suzu\": \"すずはねすず\",\n        \"tanaka decilitre\": \"田中竕\",\n        \"yahiro\": \"黑小枝\",\n        \"sabamu\": \"鲭梦\",\n        \"fujise akira\": \"藤瀬あきら\",\n        \"shouryuu\": \"升龙\",\n        \"kisaragi wataru\": \"如月わたる\",\n        \"mizone\": \"みぞね\",\n        \"herokey\": \"ヒーローキィ\",\n        \"mikanuji\": \"みかん氏\",\n        \"honda arima\": \"ほんだありま\",\n        \"oshiki hitoshi\": \"御敷仁\",\n        \"shimaji\": \"しまじ\",\n        \"tenro aya\": \"天路あや\",\n        \"meme50\": \"メメ50\",\n        \"menea the dog\": \"メネア・ザ・ドッグ\",\n        \"makibe kataru\": \"牧部かたる\",\n        \"ikeshita maue\": \"池下真上\",\n        \"ikuhana niro\": \"几花にいろ\",\n        \"c.r\": \"しーあーる\",\n        \"chimosaku\": \"ちもさく\",\n        \"otoo\": \"ぉとぉ\",\n        \"belu\": \"BeLu\",\n        \"yotsuba chika\": \"四葉チカ\",\n        \"hashimoto takashi\": \"桥本隆\",\n        \"suzuhira hiro\": \"铃平广\",\n        \"nishimata aoi\": \"西又葵\",\n        \"hadumi rio\": \"羽純りお\",\n        \"matsushita makako\": \"松下まかこ\",\n        \"sakura hanpen\": \"桜はんぺん\",\n        \"hatori piyoko\": \"羽鳥ぴよこ\",\n        \"naenae\": \"なえなえ\",\n        \"takayaki\": \"たかやKi\",\n        \"uonuma yuu\": \"うおぬまゆう\",\n        \"amamine\": \"あまみね\",\n        \"niki\": \"にき\",\n        \"rokudou itsuki\": \"六九導イツキ\",\n        \"rubi-sama\": \"るび様\",\n        \"wori\": \"ヲリ\",\n        \"mura\": \"むら\",\n        \"tsurusaki takahiro\": \"鹤崎贵大\",\n        \"fusataka sikibu\": \"ふさたか式部\",\n        \"kutani\": \"九手児\",\n        \"takei masaki\": \"竹井正树\",\n        \"yamaki rin\": \"山木铃\",\n        \"shokushu-san\": \"触手さん\",\n        \"wazakita\": \"わざきた\",\n        \"erodezain koubou\": \"エロデザイン工房\",\n        \"coffee-kizoku\": \"咖啡贵族\",\n        \"rindou\": \"龙胆\",\n        \"iruma kamiri\": \"いるまかみり\",\n        \"zakkin\": \"杂菌\",\n        \"aotsu umihito\": \"蒼津ウミヒト\",\n        \"shiina soutyou\": \"椎名总长\",\n        \"hikage eiji\": \"日阴影次\",\n        \"amakura\": \"アマクラ\",\n        \"ebi193\": \"えび193\",\n        \"shinama\": \"しなま\",\n        \"mars\": \"Mars\",\n        \"yuran\": \"ゆらん\",\n        \"toumi haruka\": \"遠海ハルカ\",\n        \"chris\": \"CHRIS\",\n        \"shiromaki mizuga\": \"みずが\",\n        \"alpine\": \"あるぴーぬ\",\n        \"yuuka nonoko\": \"夕華ののこ\",\n        \"hakuho\": \"白凤\",\n        \"ooshima ryou\": \"大嶋亮\",\n        \"aeba fuchi\": \"飨庭渊\",\n        \"hakka yuki\": \"薄荷ゆき\",\n        \"derauea\": \"でらうえあ\",\n        \"rurukichi\": \"るるキチ\",\n        \"unasaka\": \"うなさか\",\n        \"anmi\": \"Anmi\",\n        \"kishizuka kenji\": \"木静谦二\",\n        \"kanenomori sentarou\": \"金ノ森銭太郎\",\n        \"hazuki kaoru\": \"八月薫\",\n        \"kenzaki mikuri\": \"犬崎みくり\",\n        \"kofunami\": \"こふなみ\",\n        \"touma itsuki\": \"东磨树\",\n        \"asaba yuu\": \"浅葉ゆう\",\n        \"akizuki ryou\": \"秋月亮\",\n        \"nanigawa rui\": \"名仁川るい\",\n        \"ohkura kazuya\": \"大藏一也\",\n        \"psycocko\": \"碎骨子\",\n        \"hanainu\": \"花犬\",\n        \"madoutei\": \"魔童贞\",\n        \"ra\": \"RA\",\n        \"yohane\": \"ヨハネ\",\n        \"akiduki tsukasa\": \"秋月つかさ\",\n        \"hanamiya natsuka\": \"花宮なつか\",\n        \"nagayama yuunon\": \"永山ゆうのん\",\n        \"sakura denbu\": \"樱田麸\",\n        \"sin-go\": \"Sin-Go\",\n        \"tsunagami\": \"つながみ\",\n        \"yassy\": \"YASSY\",\n        \"rokuwata tomoe\": \"六羽田トモエ\",\n        \"souma\": \"相马\",\n        \"annekuma\": \"ANNEKUMA\",\n        \"108 gou\": \"108号\",\n        \"akazawa red\": \"あかざわRED\",\n        \"r-koga\": \"あ～る・こが\",\n        \"ashimoto yoika\": \"あしもと☆よいか\",\n        \"awaji himeji\": \"あわじひめじ\",\n        \"itou\": \"いトう\",\n        \"usashiro mani\": \"うさ城まに\",\n        \"ookami uo\": \"オオカミうお\",\n        \"kawady max\": \"カワディMAX\",\n        \"kimio tamako\": \"きみおたまこ\",\n        \"quzilax\": \"クジラックス\",\n        \"gorgeous takarada\": \"ゴージャス宝田\",\n        \"zaki zaraki\": \"ザキザラキ\",\n        \"tamachi yuki\": \"たまちゆき\",\n        \"bar peachpit\": \"バー・ぴぃちぴっと\",\n        \"higashiyama show\": \"东山翔\",\n        \"yoshino\": \"よしの\",\n        \"minion\": \"みにおん\",\n        \"nishikibasami\": \"二式鋏\",\n        \"onizuka naoshi\": \"鬼束直\",\n        \"hayashibara hikari\": \"林原ひかり\",\n        \"suzuki kyoutarou\": \"铃木狂太郎\",\n        \"nekogen\": \"猫玄\",\n        \"kiya shii\": \"木谷椎\",\n        \"molokonomi\": \"平屋のぼり\",\n        \"maeshima ryou\": \"前岛龙\",\n        \"yamazaki kazuma\": \"山崎かずま\",\n        \"momonosuke\": \"桃之助\",\n        \"murian\": \"无有利安\",\n        \"mutou mato\": \"武藤まと\",\n        \"kobayashi oukei\": \"小林王桂\",\n        \"tanabe kyou\": \"田边京\",\n        \"kiai neko\": \"樺島あきら\",\n        \"charu\": \"茶琉\",\n        \"tamahagane\": \"たまはがね\",\n        \"nakani\": \"なかに\",\n        \"mizuryu kei\": \"水龙敬\",\n        \"oyari ashito\": \"大枪苇人\",\n        \"hagiya masakage\": \"はぎやまさかげ\",\n        \"siina tai\": \"椎名鲷\",\n        \"greenteaneko\": \"GreenTeaNeko\",\n        \"kuroshiro neko\": \"黑白音子\",\n        \"dean\": \"ディーン\",\n        \"mizutani rin\": \"みずたにりん\",\n        \"ayakase chiyoko\": \"綾枷ちよこ\",\n        \"ayakase riberi\": \"綾枷りべり\",\n        \"yuasa\": \"ゆあさ\",\n        \"genzaburoh\": \"Genzaburoh\",\n        \"smac\": \"SMAC\",\n        \"hie himiko\": \"日枝御子\",\n        \"hisakawa tinn\": \"久川ちん\",\n        \"mizuhara yuu\": \"水原优\",\n        \"hasumi milk\": \"はすみみるく\",\n        \"karasu\": \"空巢\",\n        \"akiha at\": \"あきは@\",\n        \"amagiri mio\": \"雨雾MIO\",\n        \"bifidus\": \"ビフィダス\",\n        \"ice\": \"ICE\",\n        \"kumoemon\": \"くもえもん\",\n        \"kuro fn\": \"クロFn\",\n        \"lorica\": \"Lorica\",\n        \"nakayama tetsugaku\": \"中山哲学\",\n        \"nisepakuman-san\": \"偽パクマンさん\",\n        \"oobayashi mori\": \"大林森\",\n        \"piero\": \"PIえろ\",\n        \"saida kazuaki\": \"さいだ一明\",\n        \"sayryu\": \"性龙\",\n        \"tsukasawa\": \"塚泽\",\n        \"yukiguni omaru\": \"雪國おまる\",\n        \"asakura mitsuru\": \"朝仓满\",\n        \"hase tsubura\": \"长谷圆\",\n        \"herohero tom\": \"へろへろTom\",\n        \"hoshino ryuichi\": \"星野龙一\",\n        \"inoue nanaki\": \"井上七树\",\n        \"macaroni and cheese\": \"マカロニandチーズ\",\n        \"mozu k\": \"もずK\",\n        \"natsuka q-ya\": \"奈塚Q弥\",\n        \"sakaki utamaru\": \"榊歌丸\",\n        \"yontarou\": \"よんたろう\",\n        \"hamada yoshikadu\": \"浜田よしかづ\",\n        \"meowwithme\": \"MeowWithMe\",\n        \"nishizaki eimu\": \"西崎えいむ\",\n        \"mutsumi masato\": \"むつみまさと\",\n        \"samerupa\": \"さめるぱ\",\n        \"yumemi\": \"ゆめみ\",\n        \"watsuki ayamo\": \"わつき彩雲\",\n        \"yataro\": \"やたろー\",\n        \"poco\": \"ポコ\",\n        \"mucha\": \"むちゃ\",\n        \"fujimaru\": \"藤丸\",\n        \"gechu\": \"ゲッチュ\",\n        \"owanta\": \"Owanta\",\n        \"mikan\": \"みかん\",\n        \"amanatsu mero\": \"甘夏メロ\",\n        \"sayika\": \"Sayika\",\n        \"rihito akane\": \"りひと茜\",\n        \"abe inori\": \"阿部いのり\",\n        \"akuochisukii sensei\": \"アクオチスキー先生\",\n        \"ameyama denshin\": \"雨山电信\",\n        \"aoyama mayama\": \"青山まやま\",\n        \"bitch goigostar\": \"ビッチ☆ゴイゴスター\",\n        \"danbo\": \"ダンボ\",\n        \"dunga\": \"ドゥンガ\",\n        \"musashi daichi\": \"武蔵ダイチ\",\n        \"nukunuku orange\": \"ヌクヌクオレンジ\",\n        \"onikubo hirohisa\": \"鬼窪浩久\",\n        \"sagattoru\": \"サカッとる\",\n        \"tamaki\": \"TAMAKI\",\n        \"ahemaru\": \"アヘ丸\",\n        \"akikusa peperon\": \"秋草ぺぺろん\",\n        \"drachef\": \"ドラチェフ\",\n        \"hikage hinata\": \"日陰ひなた\",\n        \"kijima daisyarin\": \"鬼岛大车轮\",\n        \"minikoara\": \"瑞稀樱花\",\n        \"nanairo\": \"ナナイロ\",\n        \"ryuuta\": \"竜太\",\n        \"shomu\": \"しょむ\",\n        \"sunagawa tara\": \"砂川多良\",\n        \"amahara\": \"天原\",\n        \"arino hiroshi\": \"ありのひろし\",\n        \"cheewts\": \"ちいうつ\",\n        \"katsura airi\": \"桂あいり\",\n        \"koori\": \"粉织\",\n        \"red-rum\": \"RED-RUM\",\n        \"ryoh-zoh\": \"椋藏\",\n        \"shouji nigou\": \"庄司二号\",\n        \"henrybird\": \"半里バード9\",\n        \"homing\": \"ホーミング\",\n        \"kageno illyss\": \"影乃いりす\",\n        \"katou jun\": \"加藤じゅん\",\n        \"kuroda ariake\": \"黑田有明\",\n        \"miyabi tatsuto\": \"みやびたつと\",\n        \"mizuki eimu\": \"みずきえいむ\",\n        \"momon kooji\": \"ももんこーじ\",\n        \"monogusa wolf\": \"ものぐさうるふ\",\n        \"moroha\": \"乙\",\n        \"naitou satoshi\": \"乃藤悟志\",\n        \"oonuki makuri\": \"大貫まくり\",\n        \"sabashi renya\": \"左桥レンヤ\",\n        \"t.k-1\": \"T.K-1\",\n        \"tachibana surimu\": \"橘すりむ\",\n        \"takahashi kobato\": \"高橋こばと\",\n        \"takashita takashi\": \"たかしたたかし\",\n        \"yokoi rego\": \"横井レゴ\",\n        \"amayumi\": \"あまゆみ\",\n        \"ameya kirica\": \"飴屋きりか\",\n        \"arsenal\": \"アーセナル\",\n        \"asagi ryu\": \"あさぎ龍\",\n        \"hayano rinta\": \"早野りんた\",\n        \"jenigata\": \"ジェニガタ\",\n        \"mita kurumi\": \"みたくるみ\",\n        \"mutsuki\": \"睦月\",\n        \"shinobu tanei\": \"志乃武丹英\",\n        \"cuzukago\": \"くずかご\",\n        \"kojima miu\": \"儿岛未生\",\n        \"kokudakaya\": \"こくだかや\",\n        \"kuroishi ringo\": \"黒石りんご\",\n        \"mokuzou\": \"杢臓\",\n        \"suitekiya yuumin\": \"水滴家悠民\",\n        \"takasugi kou\": \"タカスギコウ\",\n        \"uramac\": \"うらまっく\",\n        \"isawa nohri\": \"いさわのーり\",\n        \"kinomoto anzu\": \"木之本杏\",\n        \"misumi tsubaki\": \"三澄ツバキ\",\n        \"nekodanshaku\": \"猫男爵\",\n        \"oosawa ofuda\": \"大沢おふだ\",\n        \"ryoumoto hatsumi\": \"岭本八美\",\n        \"salad\": \"さらだ\",\n        \"sawayaka samehada\": \"さわやか鮫肌\",\n        \"ueda yuu\": \"上田裕\",\n        \"usakun\": \"兔君\",\n        \"chiguchi miri\": \"チグチミリ\",\n        \"fuyuno mikan\": \"冬野みかん\",\n        \"hikoma hiroyuki\": \"彦馬ヒロユキ\",\n        \"imotoka tsuyuki\": \"芋とか露木\",\n        \"natsuki kiyohito\": \"夏木きよひと\",\n        \"noise\": \"Noise\",\n        \"nukkoru\": \"ぬっこる\",\n        \"ponsuke\": \"ポンスケ\",\n        \"satuyo\": \"さつよ\",\n        \"soine\": \"添い寝\",\n        \"takaoka motofumi\": \"高冈基文\",\n        \"sink\": \"SINK\",\n        \"warabino matsuri\": \"蕨野まつり\",\n        \"nandz\": \"NandZ\",\n        \"urakan\": \"U罗汉\",\n        \"shiwasu horio\": \"師走ほりお\",\n        \"pokachu\": \"ぽかちゅ\",\n        \"wasabi\": \"わさび | 和錆\",\n        \"naruko hanaharu\": \"鸣子花春\",\n        \"bosshi\": \"ぼっしぃ\",\n        \"inu\": \"犬\",\n        \"takeda hiromitsu\": \"武田弘光\",\n        \"shiwasu no okina\": \"师走之翁\",\n        \"shindol\": \"新堂エル\",\n        \"otono natsu\": \"音乃夏\",\n        \"yasui riosuke\": \"ヤスイリオスケ\",\n        \"kizuki aruchu\": \"鬼月あるちゅ\",\n        \"sameda koban\": \"さめだ小判\",\n        \"koume keito\": \"小梅京人\",\n        \"thomas\": \"藤ます\",\n        \"mutsutake\": \"睦茸\",\n        \"midori no rupe\": \"绿のルーペ\",\n        \"homunculus\": \"ホムンクルス\",\n        \"lunch\": \"らんち\",\n        \"inoue kiyoshirou\": \"胃之上奇嘉郎\",\n        \"namonashi\": \"无望菜志\",\n        \"oda non\": \"织田non\",\n        \"nemunemu\": \"ネムネム\",\n        \"makita masaki\": \"莳田真记\",\n        \"hoshiai hilo\": \"星逢ひろ\",\n        \"takase yuu\": \"鹰势优\",\n        \"hiiragi masaki\": \"柊柾葵\",\n        \"po-ju\": \"ぽ～じゅ\",\n        \"abu hyaku\": \"あぶひゃく\",\n        \"suehirogari\": \"末广雅里\",\n        \"kuritsu yoshihiro\": \"くりつよしひろ\",\n        \"guglielmo\": \"ぐりえるも\",\n        \"kusano yuu\": \"草野ゆぅ\",\n        \"matsuno susumu\": \"松野进\",\n        \"murasaki syu\": \"むらさき朱\",\n        \"nishi iori\": \"西安\",\n        \"ohara tometa\": \"小原トメ太\",\n        \"sakura koharu\": \"さくら小春\",\n        \"junkos\": \"淳子\",\n        \"hoshino lily\": \"星野リリィ\",\n        \"heriyama\": \"缘山\",\n        \"nasuyama\": \"茄子山\",\n        \"misasagi task\": \"陵たすく\",\n        \"oyu no kaori\": \"お湯の香り\",\n        \"kojima saya\": \"小岛纱\",\n        \"mitsuki sakura\": \"美月樱\",\n        \"tmzf\": \"TMZF\",\n        \"kamikaze makoto\": \"神风诚\",\n        \"saikawa akoya\": \"斎川あこや\",\n        \"saikawa yusa\": \"さいかわゆさ\",\n        \"kita kaduki\": \"北かづき\",\n        \"mach ii\": \"まぁくII\",\n        \"tatsunami youtoku\": \"辰波要徳\",\n        \"tinkle\": \"Tinkle\",\n        \"kiriyama\": \"桐山\",\n        \"takatsu\": \"高津\",\n        \"gekkoji\": \"激昂寺\",\n        \"monety\": \"もねてぃ\",\n        \"hyji\": \"灰司\",\n        \"rokuichi\": \"六壹\",\n        \"yakumi benishouga\": \"药味红生姜\",\n        \"takeyuu\": \"タケユウ\",\n        \"pokka\": \"ぽっか\",\n        \"hiroshiki\": \"宏式\",\n        \"tonda\": \"Tonda\",\n        \"matsu takeshi\": \"松武\",\n        \"matsuzaki tsukasa\": \"松崎司\",\n        \"zootan\": \"ZooTAN\",\n        \"redlight\": \"REDLIGHT\",\n        \"yukie\": \"ゆき恵\",\n        \"raven\": \"RAVEN\",\n        \"sujoyushi\": \"酢醤油氏\",\n        \"date\": \"DATE\",\n        \"kase daiki\": \"加濑大辉\",\n        \"nakamura kumarin\": \"中村くまりん\",\n        \"masago\": \"まさご\",\n        \"ron\": \"RON\",\n        \"zounose\": \"ゾウノセ\",\n        \"suzuka sakito\": \"凉加早希兔\",\n        \"sugi g\": \"すぎぢー\",\n        \"kanzaki maguro\": \"潤咲まぐろ\",\n        \"sakagaki\": \"サカガキ\",\n        \"leslie brown\": \"Leslie Brown\",\n        \"satsuki imonet\": \"皋月芋网\",\n        \"chiyoko\": \"ちよこ\",\n        \"marui maru\": \"丸居まる\",\n        \"asuhiro\": \"アスヒロ\",\n        \"bomb\": \"ボム\",\n        \"eguchi jaws\": \"江口ジョーズ\",\n        \"eno yukimi\": \"榎ゆきみ\",\n        \"esuke\": \"えーすけ\",\n        \"gintarou\": \"ぎん太郎\",\n        \"hardboiled yoshiko\": \"ハードボイルドよし子\",\n        \"hinahara emi\": \"雛原えみ\",\n        \"hitori\": \"火鸟\",\n        \"karasuma yayoi\": \"乌丸弥生\",\n        \"napata\": \"なぱた\",\n        \"nokin\": \"のきん\",\n        \"savan\": \"SAVAN\",\n        \"sugaishi\": \"すがいし\",\n        \"sumiya\": \"スミヤ\",\n        \"takashi\": \"タカシ\",\n        \"ushino kandume\": \"牛野缶诘\",\n        \"yahiro pochi\": \"八寻ぽち\",\n        \"yanyo\": \"やんよ\",\n        \"yuzuha\": \"ユズハ\",\n        \"yamagara tasuku\": \"山雀たすく\",\n        \"zumikuni\": \"ズミクニ\",\n        \"juder\": \"Juder\",\n        \"nagase yutaka\": \"长濑ゆたか\",\n        \"yumeno owari\": \"ユメのオワリ\",\n        \"kamimiya kozue\": \"神宫梢\",\n        \"anzu\": \"庵ズ\",\n        \"lu renbing\": \"路人丙\",\n        \"takei ooki\": \"タケイオーキ\",\n        \"azuma tesshin\": \"东铁神\",\n        \"akagi asahito\": \"赤城あさひと\",\n        \"benimura karu\": \"红村かる\",\n        \"bota mochito\": \"牡丹もちと\",\n        \"cuvie\": \"Cuvie\",\n        \"hazuki yuto\": \"羽月ユウト\",\n        \"hinasaki yo\": \"雏咲叶\",\n        \"naruko\": \"鸣湖（平间ひろかず）\",\n        \"hishigata tomaru\": \"ひし形とまる\",\n        \"mokufu\": \"もくふう\",\n        \"okumoto yuuta\": \"オクモト悠太\",\n        \"regdic\": \"れぐでく\",\n        \"shiba nanasei\": \"柴七世\",\n        \"shimetta seiya\": \"湿った星夜\",\n        \"tsukitokage\": \"月蜥蜴\",\n        \"izumi yuhina\": \"いずみゆひな\",\n        \"akino sora\": \"あきのそら\",\n        \"yumeno tanuki\": \"梦乃狸\",\n        \"ichinomiya\": \"一ノ宮\",\n        \"kikuchi seiji\": \"菊池政治\",\n        \"yabuki gou\": \"矢吹豪\",\n        \"sanbun kyoden\": \"山文京传\",\n        \"takunomi\": \"たくのみ\",\n        \"1-gou\": \"1号\",\n        \"kadoi aya\": \"门井亚矢\",\n        \"doumeki bararou\": \"百目鬼蔷薇郎\",\n        \"umiushi\": \"うみうし\",\n        \"samidare setsuna\": \"五月雨せつな\",\n        \"shinobe\": \"しのべ\",\n        \"kamiya\": \"Kamiya | かみや\",\n        \"aduma ren\": \"あづま煉\",\n        \"akiya akira\": \"秋谷昭\",\n        \"ashiomi masato\": \"アシオミマサト\",\n        \"hamao\": \"Hamao\",\n        \"hyocorou\": \"ひょころー\",\n        \"ichimatsu\": \"いちまつ\",\n        \"ishikawa shisuke\": \"石川シスケ\",\n        \"itou ei\": \"いとうえい\",\n        \"karma tatsurou\": \"かるま龍狼\",\n        \"kizuka kazuki\": \"きづかかずき\",\n        \"koppori nama beer\": \"こっぽり生ビール\",\n        \"mojarin\": \"もじゃりん\",\n        \"momoko\": \"ももこ\",\n        \"netoromorikon\": \"ねとろもりこん\",\n        \"okara\": \"おから\",\n        \"reco\": \"Reco\",\n        \"zanzi\": \"暂时\",\n        \"hozumi kenji\": \"ほずみけんじ\",\n        \"mel\": \"Mel\",\n        \"getty\": \"Getty\",\n        \"ramjak\": \"Ramjak\",\n        \"the jinshan\": \"The Jinshan\",\n        \"yu-ta\": \"YU-TA\",\n        \"ooba nii\": \"大庭新\",\n        \"yuuki sei\": \"结城成\",\n        \"natsume eri\": \"なつめえり\",\n        \"kuroinu juu\": \"黑犬兽\",\n        \"bakutaso\": \"爆タソ\",\n        \"mda starou\": \"MだSたろう\",\n        \"tsuchigayu\": \"土粥\",\n        \"myu-po\": \"myu-po\",\n        \"nase\": \"名濑\",\n        \"noba\": \"の歯\",\n        \"shiki takuto\": \"史鬼匠人\",\n        \"sakagami umi\": \"坂上海\",\n        \"kuno touya\": \"九野十弥\",\n        \"sakurasawa yukino\": \"さくらさわゆきの\",\n        \"inomoto rikako\": \"井之本理佳子\",\n        \"mikemono yuu\": \"神毛物由宇\",\n        \"tsukioka kirio\": \"ツキオカキリオ\",\n        \"nishi\": \"弐肆 | にし | 西\",\n        \"chachaki noriyuki\": \"清山昌\",\n        \"abe morioka\": \"あべもりおか\",\n        \"akishima shun\": \"昭嶋しゅん\",\n        \"alexi laiho\": \"荒岸来步\",\n        \"dobato\": \"ドバト\",\n        \"fuyu mikan\": \"冬みかん\",\n        \"hatch\": \"ハッチ\",\n        \"inoue yoshihisa\": \"井上よしひさ\",\n        \"ken\": \"KEN | けん\",\n        \"kimura neito\": \"木村宁都\",\n        \"kir-rin\": \"きりりん\",\n        \"ootori ryuuji\": \"おおとりりゅうじ\",\n        \"suzunone kanata\": \"音々かなた\",\n        \"terada nuki\": \"寺田ぬき\",\n        \"wakana hanabi\": \"わかなはなび\",\n        \"amecha\": \"アメちゃ\",\n        \"tamano nae\": \"珠乃なえ\",\n        \"caviar\": \"きゃびあ\",\n        \"mojyako\": \"モジャコ\",\n        \"hammer\": \"ハマー\",\n        \"sugiyuu\": \"スギユウ\",\n        \"wox yang\": \"沃克羊\",\n        \"garland\": \"があらんど\",\n        \"homare\": \"ほまれ | 誉\",\n        \"amadume ryuuta\": \"甘诘留太（A・浪漫・我慢）\",\n        \"blade\": \"BLADE\",\n        \"itou seto\": \"イトウせと\",\n        \"tanno ran\": \"タンノらん\",\n        \"junk kameyoko\": \"JUNK龟横\",\n        \"mizutenka\": \"水点下\",\n        \"maro\": \"MARO\",\n        \"eb110ss\": \"EB110SS\",\n        \"equal\": \"イコール\",\n        \"hippopotamus\": \"ひぽぽたます\",\n        \"mikan r\": \"みかんR\",\n        \"sanezaki tsukiuo\": \"志崎月鱼\",\n        \"wang-pac\": \"わんぱく\",\n        \"arai taiki\": \"新井大器\",\n        \"ayano rena\": \"綾乃れな\",\n        \"chuunen\": \"中年\",\n        \"hanafuda sakurano\": \"花札さくらの\",\n        \"kaponco taroh\": \"かぽんこたろう\",\n        \"lockheart\": \"ロックハート\",\n        \"nasipasuta\": \"なしぱすた\",\n        \"poccora\": \"ぽっこら\",\n        \"puyocha\": \"ぷよちゃ\",\n        \"rakujin\": \"らくじん\",\n        \"syuuen\": \"终焉\",\n        \"harazaki takuma\": \"はらざきたくま\",\n        \"hashimura aoki\": \"桥村青树\",\n        \"malcorond\": \"まるころんど\",\n        \"marugari santarou\": \"丸刈参太郎\",\n        \"poncocchan\": \"ぽんこっちゃん\",\n        \"tetsuna\": \"テツナ\",\n        \"kazan no you\": \"火山の楊\",\n        \"mtu\": \"MtU\",\n        \"alp\": \"あるぷ\",\n        \"chiba toshirou\": \"チバトシロウ\",\n        \"choco pahe\": \"チョコぱへ\",\n        \"hal\": \"HAL\",\n        \"haruhisky\": \"春日喜欢\",\n        \"ichinomiya yuu\": \"一宫夕羽\",\n        \"inago\": \"INAGO\",\n        \"maki daikichi\": \"牧だいきち\",\n        \"raita\": \"来太\",\n        \"sasachinn\": \"ささちん\",\n        \"soushamoku\": \"桑柘木\",\n        \"suzuki akoni\": \"鈴月あこに\",\n        \"tachibana yuu\": \"橘由宇\",\n        \"takeda aranobu\": \"武田あらのぶ\",\n        \"jinnai\": \"ジンナイ\",\n        \"dhibi\": \"ディビ\",\n        \"fuuga\": \"枫牙\",\n        \"yoshimura tatsumaki\": \"吉村龙卷\",\n        \"hinokawa jun\": \"火の川純\",\n        \"womi\": \"WOMI\",\n        \"otsumami\": \"おつまみ\",\n        \"shiramayumi\": \"白真弓\",\n        \"chiro\": \"CHIRO | チろ\",\n        \"junny\": \"JUNNY\",\n        \"wakino keibun\": \"胁乃敬文\",\n        \"suzuneco\": \"Suzu猫。\",\n        \"utakata\": \"泡沫\",\n        \"yakou\": \"夜光\",\n        \"lambda\": \"Lambda\",\n        \"pon takahanada\": \"ポン贵花田\",\n        \"kazakura\": \"夏樱\",\n        \"rikka kai\": \"リッカー改\",\n        \"matsuryu\": \"松龙\",\n        \"suzutsuki kurara\": \"涼月くらら\",\n        \"naruhodo\": \"なるほど\",\n        \"hb\": \"HB\",\n        \"yamatogawa\": \"大和川\",\n        \"obiwan\": \"obiwan\",\n        \"xin\": \"xin\",\n        \"aratamaru\": \"改多丸\",\n        \"7zu7\": \"7zu7\",\n        \"atage\": \"あたげ\",\n        \"ebina ebi\": \"海老名えび\",\n        \"kisen\": \"奇仙\",\n        \"kyockcho\": \"局长\",\n        \"maumen\": \"まうめん\",\n        \"nukunuku\": \"ぬくぬく\",\n        \"sumiyoshi\": \"すみよし\",\n        \"umeko\": \"うめ子\",\n        \"yamada yuuya\": \"ヤマダユウヤ\",\n        \"yumoteliuce\": \"ユモテリウス\",\n        \"ichihaya\": \"いちはや\",\n        \"oboro\": \"胧\",\n        \"takayanagi katsuya\": \"高柳カツヤ\",\n        \"hori hiroaki\": \"堀博昭\",\n        \"yuugiri\": \"夕雾\",\n        \"eba\": \"EBA\",\n        \"kutibue\": \"くちぶえ\",\n        \"aoi shou\": \"葵抄\",\n        \"myougi kulaganosuke\": \"妙義倉賀ノ助\",\n        \"karatakewari\": \"からたけわり\",\n        \"mifune seijirou\": \"三船诚二郎\",\n        \"natsu no oyatsu\": \"夏のおやつ\",\n        \"homura subaru\": \"焰すばる\",\n        \"dakouin saburou\": \"蛇光院三郎\",\n        \"gura nyuutou\": \"ぐら乳頭\",\n        \"inomaru\": \"いのまる\",\n        \"iori yuzuru\": \"庵让\",\n        \"itaba hiroshi\": \"板场广志\",\n        \"james hotate\": \"ジェームスほたて\",\n        \"jamming\": \"じゃみんぐ\",\n        \"mitsuki rintarou\": \"水月林太郎\",\n        \"n.o. chachamaru\": \"N.O-茶々丸\",\n        \"naga\": \"な～が\",\n        \"nakamura nishiki\": \"中村锦\",\n        \"noq\": \"NOQ（下月重吾）\",\n        \"otonashi kyousuke\": \"音无响介\",\n        \"saki urara\": \"さきうらら\",\n        \"shinogi a-suke\": \"しのぎ鋭介\",\n        \"tonami satoshi\": \"となみさとし\",\n        \"yajima index\": \"矢岛Index\",\n        \"amano yoshitaka\": \"天野喜孝\",\n        \"aoba hachi\": \"青葉はち\",\n        \"minami\": \"みなみ\",\n        \"ouji hiyoko\": \"桜路ひよこ（ひなづか凉）\",\n        \"yoshiro\": \"夜士郎\",\n        \"urushihara satoshi\": \"漆原智志\",\n        \"yukijirushi\": \"逝印\",\n        \"riichu\": \"りいちゅ\",\n        \"momo no suidousui\": \"モモの水道水\",\n        \"kamitsurugi ouka\": \"神剑樱花\",\n        \"kantaka\": \"かんたか\",\n        \"katagiri hinata\": \"片桐雏太\",\n        \"kinosaki reisui\": \"城崎冷水\",\n        \"kuwada yuuki\": \"くわだゆうき\",\n        \"mayusaki yuu\": \"茧咲悠\",\n        \"natsuhiko\": \"夏彦\",\n        \"reita\": \"rei太\",\n        \"saeki hokuto\": \"さえき北都\",\n        \"shinozuka atsuto\": \"しのづかあつと\",\n        \"yatsuha kanan\": \"八叶香南\",\n        \"hashibiro kou\": \"桥广こう\",\n        \"koutarou\": \"こうたろう\",\n        \"piririnegi\": \"ぴりりねぎ\",\n        \"spiritus tarou\": \"スピリタス太郎\",\n        \"tel\": \"朝峰テル\",\n        \"tomomimi shimon\": \"ともみみしもん\",\n        \"mitsumomo mam\": \"蜜桃まむ\",\n        \"lolisin\": \"ろりしn\",\n        \"miyako hito\": \"ミヤコヒト\",\n        \"sola bozu\": \"空坊主\",\n        \"mimonel\": \"ミモネル\",\n        \"kloah\": \"Kloah\",\n        \"chirumakuro\": \"ちるまくろ\",\n        \"fumihiko\": \"ふみひこ\",\n        \"gustav\": \"ぐすたふ\",\n        \"matsuna hitoshi\": \"松名一\",\n        \"uekan\": \"うえかん\",\n        \"koga ryouichi\": \"古贺亮一\",\n        \"sakai nayuta\": \"坂井なゆ太\",\n        \"fan no hitori\": \"煌野一人\",\n        \"yuuzu tsushiro\": \"ゆうづつしろ\",\n        \"sendou hachi\": \"仙道八\",\n        \"saeki\": \"佐伯\",\n        \"cool kyou shinja\": \"クール教信者\",\n        \"hirasaka fuyu\": \"比良坂冬\",\n        \"joy\": \"じょい\",\n        \"kasuga souichi\": \"カスガソウイチ\",\n        \"kemonono\": \"けものの★\",\n        \"mameko\": \"まめこ\",\n        \"miyoshi\": \"みよし\",\n        \"neriume\": \"ねりうめ\",\n        \"odd\": \"Odd\",\n        \"otone\": \"音音\",\n        \"sakujirou\": \"咲次朗\",\n        \"torimushi\": \"鸟莉蒸师\",\n        \"ai ha muteki\": \"愛は無敵\",\n        \"kazetani yasunari\": \"风谷安成\",\n        \"amatarou\": \"天太郎\",\n        \"aoi hitori\": \"葵ヒトリ\",\n        \"aoten\": \"青点\",\n        \"clone ningen\": \"clone人間\",\n        \"dowman sayman\": \"道满晴明\",\n        \"kagura moromi\": \"神楽もろみ\",\n        \"mikaze takashi\": \"水风天\",\n        \"kurogane kenn\": \"玄铁绚\",\n        \"momo youkan\": \"ももようかん\",\n        \"musashimaru\": \"ムサシマル\",\n        \"nixinamo lens\": \"にびなも凸面体\",\n        \"osomatsu\": \"おそまつ\",\n        \"sanagi torajirou\": \"蛹虎次郎\",\n        \"eiichirou\": \"瑛一朗\",\n        \"izawa shinichi\": \"伊泽慎壹\",\n        \"kurumiya mashimin\": \"胡桃屋ましみん\",\n        \"miura takehiro\": \"みうらたけひろ\",\n        \"sena youtarou\": \"濑奈阳太郎\",\n        \"yumesaki sanjuro\": \"夢咲三十郎\",\n        \"sakomae aichi\": \"佐古前あいち\",\n        \"bakuya\": \"ばくや\",\n        \"c.meiko\": \"C.みーこ\",\n        \"eightman\": \"えいとまん\",\n        \"henoeno\": \"へのえの\",\n        \"kurofood\": \"くろふーど\",\n        \"momozukuku\": \"ももずくく\",\n        \"pija\": \"ピジャ\",\n        \"psycho\": \"さいこ\",\n        \"rico\": \"Rico\",\n        \"tomonaga kenji\": \"友永ケンジ\",\n        \"fukuyama naoto\": \"复八磨直兔\",\n        \"kurokawa otogi\": \"黒川おとぎ\",\n        \"satou takumi\": \"佐藤匠\",\n        \"shino\": \"シノ\",\n        \"shousan bouzu\": \"しょうさん坊主\",\n        \"yamabuki zarame\": \"山吹ざらめ\",\n        \"magatama\": \"マガタマ\",\n        \"mako kujira\": \"まこくじら\",\n        \"uesugi kyoushirou\": \"上杉响士郎\",\n        \"kai hiroyuki\": \"甲斐ひろゆき\",\n        \"kihiru\": \"きひる\",\n        \"kogaku kazuya\": \"虎顎かずや\",\n        \"kokonoki nao\": \"ここのき奈緒\",\n        \"naz\": \"NAZ\",\n        \"neriwasabi\": \"ねりわさび\",\n        \"yonyon\": \"よんよん\",\n        \"yugami goosyu\": \"由上ゴーシュ\",\n        \"pedocchi\": \"ぺどっち\",\n        \"hokou kikai\": \"补讲机械\",\n        \"papermania\": \"奴隶妇人\",\n        \"kawahagitei\": \"かわはぎ亭\",\n        \"kirieppa\": \"キリエっぱ\",\n        \"shohei\": \"将兵\",\n        \"kiyose\": \"KIYOSE\",\n        \"u-tom\": \"う~とむ\",\n        \"shiramori yuse\": \"白森ゆせ\",\n        \"bak hyeong jun\": \"朴亨濬\",\n        \"yanagihara mitsuki\": \"柳原ミツキ\",\n        \"ponkotsu works\": \"ぽんこつわーくす\",\n        \"nibo\": \"にぼ\",\n        \"mightyhonk\": \"MightyHonk\",\n        \"goldendawn\": \"Goldendawn\",\n        \"fatke\": \"FatKE\",\n        \"satsuki neko\": \"五月猫\",\n        \"akinashi yuu\": \"春夏冬ゆう\",\n        \"jakou nezumi\": \"じゃこうねずみ\",\n        \"nagi yuki\": \"凪居ユキ\",\n        \"kusui aruta\": \"久水あるた\",\n        \"tamanosuke\": \"たまのすけ\",\n        \"minamihama yoriko\": \"南浜よりこ\",\n        \"butcha-u\": \"ブッチャーU\",\n        \"nekomata naomi\": \"ねこまたなおみ\",\n        \"kiichi\": \"きいち\",\n        \"norve watanabe\": \"なーべ渡辺\",\n        \"jin\": \"Jin\",\n        \"luv p\": \"Luv P\",\n        \"rozer\": \"ROZER\",\n        \"mame danuki\": \"まめだぬき\",\n        \"lolicept\": \"Belko（LOLICEPT）\",\n        \"shiduki michiru\": \"しづきみちる\",\n        \"jet yowatari\": \"ジェット世渡り\",\n        \"jigeum\": \"지금\",\n        \"oyster\": \"オイスター\",\n        \"imachi\": \"いまち\",\n        \"momiyama\": \"もみやま\",\n        \"shimantogawa\": \"四万十川\",\n        \"zhen lu\": \"珍绿\",\n        \"devilhs\": \"Devil_HS\",\n        \"aina nana\": \"愛菜奈々\",\n        \"yokoshima takemaru\": \"邪武丸\",\n        \"hawa\": \"はわ\",\n        \"tomose shunsaku\": \"トモセシュンサク\",\n        \"reiha\": \"零覇\",\n        \"chimaq\": \"チマQ\",\n        \"magaki ryouta\": \"間垣りょうた\",\n        \"yukino minato\": \"雪野みなと\",\n        \"maruchang\": \"丸ちゃん。\",\n        \"sukiyo\": \"スキヨ\",\n        \"aiue oka\": \"爱上陆\",\n        \"rustle\": \"らする\",\n        \"calipur\": \"ｶﾘﾊﾟ−\",\n        \"dokurosan\": \"どくろさん\",\n        \"rebis\": \"Rebis\",\n        \"taihei tengoku\": \"太平天极\",\n        \"hitomaru\": \"人丸\",\n        \"kurozu\": \"くろず\",\n        \"unagimaru\": \"鳗丸\",\n        \"decarabia\": \"デカラビア\",\n        \"takurou\": \"たくろう\",\n        \"tsukimoto kizuki\": \"月本筑希\",\n        \"taigiakira\": \"タイギアキラ\",\n        \"ishikawa naoya\": \"石川直哉\",\n        \"takaku nozomu\": \"高玖のぞむ\",\n        \"oni-noboru\": \"Oni-noboru\",\n        \"hamo\": \"はも\",\n        \"satsumaage\": \"さつま揚げ\",\n        \"abu\": \"アブ | ABU\",\n        \"sinntarou\": \"心太朗\",\n        \"kotoba ai\": \"コトバアイ\",\n        \"strong bana\": \"Strong Bana\",\n        \"kuroadam\": \"黒葉だむ\",\n        \"midoriiro no shinzou\": \"緑色の心臓\",\n        \"kujou danbo\": \"九条だんぼ\",\n        \"kagiyama pandora\": \"鍵山ぱんどら\",\n        \"shitto mask\": \"嫉妬マスク\",\n        \"umitsubame\": \"うみつばめ\",\n        \"nanappe\": \"七っぺ\",\n        \"akeyama kitsune\": \"绯山狐\",\n        \"sakura\": \"樱\",\n        \"yakiniku king\": \"烧肉キング\",\n        \"nekoi hikaru\": \"猫伊光\",\n        \"inanaki shiki\": \"稻鸣四季\",\n        \"tohgarashi hideyu\": \"唐辛子ひでゆ\",\n        \"shinjinkun\": \"新人君\",\n        \"barlun\": \"ばーるん\",\n        \"kiyomiya ryo\": \"清宫凉\",\n        \"higata\": \"HIGATA\",\n        \"outou chieri\": \"无洗米\",\n        \"hoshizaki hikaru\": \"星崎ひかる\",\n        \"shinoda sanjuurou\": \"篠田参重郎\",\n        \"mimi mimizu\": \"実々みみず\",\n        \"takemura sesshu\": \"竹村雪秀\",\n        \"ishigami hajime\": \"石纸一\",\n        \"kawamori misaki\": \"かわもりみさき\",\n        \"nagashima chosuke\": \"ながしま超助\",\n        \"ozaki akira\": \"尾崎晶\",\n        \"shiomaneki\": \"シオマネキ\",\n        \"takebayashi takeshi\": \"武林武士\",\n        \"umemaru\": \"うめ丸\",\n        \"eo masaka\": \"EOまさか\",\n        \"hanabi\": \"HANABi\",\n        \"kakizaki kousei\": \"垣崎コウセイ\",\n        \"miyamoto issa\": \"宫元一佐\",\n        \"murasaki nyaa\": \"紫☆にゃ～\",\n        \"okyuuri\": \"おきゅうり\",\n        \"parabola\": \"ぱらボら\",\n        \"sugar milk\": \"シュガーミルク\",\n        \"tachibana aruto\": \"橘アルト\",\n        \"yamahata rian\": \"山畑璃杏\",\n        \"muoto\": \"むおと\",\n        \"emyo\": \"えみょ\",\n        \"nazuna\": \"ナズナ\",\n        \"mitsui jun\": \"三井纯\",\n        \"tsurugi hagane\": \"蔓木钢音\",\n        \"worin\": \"Worin\",\n        \"haeilian\": \"Haeilian\",\n        \"mayui yukisaki\": \"Mayui Yukisaki\",\n        \"asan\": \"あさん\",\n        \"akahige\": \"赤髭\",\n        \"nangou jingeru\": \"南郷じんげる\",\n        \"mitsurugi aoi\": \"能都くるみ\",\n        \"kuuchuu yousai\": \"空中幼彩\",\n        \"kotomi yo-ji\": \"ことみようじ\",\n        \"hirowa nagi\": \"广轮凪\",\n        \"kanehira morihito\": \"金平守人\",\n        \"kii takashi\": \"キイタカシ\",\n        \"kouzuki rio\": \"香月りお\",\n        \"matsusaka takeshi\": \"松阪刚志\",\n        \"nagai michinori\": \"永井道纪\",\n        \"nagisa minami\": \"渚ミナミ\",\n        \"alexi\": \"アレキシ\",\n        \"benantoka\": \"Beなんとか\",\n        \"dynamite moca\": \"ダイナマイトmoca\",\n        \"sakurafubuki nel\": \"桜吹雪ねる\",\n        \"urai tami\": \"浦井民\",\n        \"yusa\": \"ゆさ\",\n        \"gyuunyuu rinda\": \"牛乳リンダ\",\n        \"usagi nagomu\": \"うさぎなごむ\",\n        \"oohira sunset\": \"太平さんせっと\",\n        \"obui\": \"おぶい\",\n        \"amazeroth\": \"Amazeroth\",\n        \"batsu\": \"ばつ\",\n        \"campbell gichou\": \"キャンベル議長\",\n        \"hinotsuki neko\": \"日月ネコ\",\n        \"jake\": \"じぇいく\",\n        \"kamaboko red\": \"かまぼこRED\",\n        \"koharu nanakusa\": \"小春七草\",\n        \"kousuke\": \"交介\",\n        \"kuronomiki\": \"黒ノ樹\",\n        \"kurosawa kiyotaka\": \"黒澤清崇\",\n        \"misaki kaho.\": \"ミサキカホ。\",\n        \"ogura shuuichi\": \"小仓修一\",\n        \"yuuki homura\": \"结城焰\",\n        \"yamamoto\": \"山本\",\n        \"yamamoto yammy\": \"山本やみー\",\n        \"murakami maki\": \"村上真纪\",\n        \"ditama bow\": \"ぢたま(某)\",\n        \"yabuki kentarou\": \"矢吹健太朗\",\n        \"clamp\": \"CLAMP\",\n        \"kinoshita rei\": \"きのした黎\",\n        \"waero\": \"西野\",\n        \"modaetei anetarou\": \"闷亭姉太郎\",\n        \"modaetei imojirou\": \"闷亭妹次郎\",\n        \"fuckuma\": \"ふぁっ熊\",\n        \"itou daiku\": \"伊藤第九\",\n        \"kaiduka\": \"かいづか\",\n        \"moketa\": \"もけ太\",\n        \"nodame\": \"nod饴\",\n        \"sage joh\": \"sage・ジョー\",\n        \"utsutsu minoru\": \"うつつ＊みのる\",\n        \"isou doubaku\": \"位相同爆\",\n        \"kenshou izanamu\": \"剣匠イザナム\",\n        \"kotobuki kazuki\": \"琴吹かづき\",\n        \"mayumi daisuke\": \"真弓大介\",\n        \"nagano noriko\": \"永野のりこ\",\n        \"protonsaurus\": \"プロトンザウルス\",\n        \"sabe\": \"SABE\",\n        \"shibata masahiro\": \"柴田昌弘\",\n        \"youkihi\": \"阳气婢\",\n        \"kinoshita ichi\": \"木下壹\",\n        \"92m\": \"92M\",\n        \"kasukabe taro\": \"春日部太郎\",\n        \"zucchini\": \"ズッキーニ\",\n        \"shirane taito\": \"白根戴斗\",\n        \"morimi ashita\": \"森见明日\",\n        \"upanishi.\": \"うぱ西。\",\n        \"shimazu isami\": \"島津いさみ\",\n        \"arumajiki\": \"或真じき\",\n        \"uru\": \"Uru\",\n        \"higashitotsuka raisuta\": \"東戸塚らいすた\",\n        \"nizimoto hirok\": \"虹元ひろk\",\n        \"kinnikku\": \"キンニック\",\n        \"takepen\": \"タケペン\",\n        \"taikou\": \"タイコウ\",\n        \"aikawa touma\": \"藍川とうま\",\n        \"tamanoi peromekuri\": \"玉乃井ぺろめくり\",\n        \"shinozuka george\": \"筱塚酿二\",\n        \"miotama\": \"みおたま\",\n        \"kido keiji\": \"城户敬司\",\n        \"terada ochiko\": \"寺田落子\",\n        \"chimi\": \"ちみ\",\n        \"haruyukiko\": \"はるゆきこ\",\n        \"horitomo\": \"ほりとも\",\n        \"jun\": \"Jun\",\n        \"marneko\": \"まる寝子\",\n        \"miyamoto liz\": \"宮本りず\",\n        \"nanase mizuho\": \"七濑瑞穗\",\n        \"satou souji\": \"佐藤想次\",\n        \"shiina kazuki\": \"しいなかずき\",\n        \"sumisuzu\": \"すみすず\",\n        \"take\": \"タケ\",\n        \"yukiusagi.\": \"ゆきうさぎ。\",\n        \"clearite\": \"くれりて\",\n        \"makuro\": \"まくろ\",\n        \"bakugatou\": \"麦芽糖\",\n        \"nekohane ryou\": \"猫羽燎\",\n        \"gamang\": \"Gamang\",\n        \"kiryu reihou\": \"桐生玲峰\",\n        \"koutaro\": \"こうたろ\",\n        \"sasaoka gungu\": \"笹岡ぐんぐ\",\n        \"mikazuki akira\": \"みかづきあきら!\",\n        \"mikoshiro honnin\": \"みこしろ本人\",\n        \"ariko youichi\": \"有子瑶一\",\n        \"taira tsukune\": \"平つくね\",\n        \"monikano\": \"モニカノ\",\n        \"kayama rim\": \"香山リム\",\n        \"tomokichi\": \"友吉\",\n        \"nagi ichi\": \"凪市\",\n        \"ponz\": \"ぽん酢\",\n        \"arekusa mahone\": \"荒草まほん\",\n        \"akasa ai\": \"あかさあい\",\n        \"mizu umi\": \"瑞海\",\n        \"hisato\": \"ひさと\",\n        \"gyuunyuu nomio\": \"牛乳乃澪\",\n        \"konkichi\": \"绀吉\",\n        \"butcherboy\": \"ButcherBOY\",\n        \"aim\": \"AIM\",\n        \"sasakuma kyouta\": \"ささくまきょうた\",\n        \"tsujizen\": \"辻善\",\n        \"mizukoshi mayu\": \"水越まゆ\",\n        \"mitaonsya\": \"MITAONSYA\",\n        \"tokumi yuiko\": \"笃见唯子\",\n        \"dantetsu\": \"断铁（干支門三十四，〇タ）\",\n        \"inuboshi\": \"犬星\",\n        \"saitou tsukasa\": \"さいとうつかさ\",\n        \"shinkaida tetsuyarou\": \"新贝田铁也郎\",\n        \"sorimura youji\": \"そりむらようじ\",\n        \"yamamoto kazue\": \"山本和枝\",\n        \"natsuo monaka\": \"なつおもなか\",\n        \"binkan argento\": \"びんかんargento\",\n        \"minagiku\": \"みなぎく\",\n        \"landolt tamaki\": \"ランドルトたまき\",\n        \"kisaragi miyu\": \"如月みゆ\",\n        \"igumox\": \"井雲くす\",\n        \"kuune rin\": \"くうねりん\",\n        \"goto-beido\": \"ゴト・ベイドー\",\n        \"morikura en\": \"森仓圆\",\n        \"af kuro\": \"アフ黒\",\n        \"kaguyuzu\": \"カグユヅ\",\n        \"dsmile\": \"DSマイル\",\n        \"monoto\": \"ものと\",\n        \"snowmi\": \"すのみ\",\n        \"dozamura\": \"どざむら\",\n        \"kiryu\": \"Kiryu\",\n        \"kozakura nanane\": \"小桜菜々音\",\n        \"hazakura momo\": \"葉桜もも\",\n        \"sakura syoji\": \"咲良将司\",\n        \"hidiri rei\": \"ヒヂリレイ\",\n        \"nadeara bukichi\": \"抚荒武吉\",\n        \"qoopie\": \"Qoopie\",\n        \"kanbe chuji\": \"かんべ忠治\",\n        \"shuten douji\": \"酒呑童子\",\n        \"murlachrot\": \"みうらっは\",\n        \"tanaha\": \"棚叶\",\n        \"sakai minato\": \"坂井みなと\",\n        \"ijima yuu\": \"伊島ユウ\",\n        \"inari\": \"稻荷\",\n        \"momo-deary\": \"Momo-Deary\",\n        \"nonaka tama\": \"のなかたま\",\n        \"chinbotsu\": \"沈没\",\n        \"teterun\": \"ててるん\",\n        \"fuetakishi\": \"フエタキシ\",\n        \"purukogi\": \"プルコギ\",\n        \"sawaki koma\": \"沢木コマ\",\n        \"ohtsuki tohru\": \"大槻とおる\",\n        \"hidebou\": \"ひでぼう\",\n        \"kiyose kaoru\": \"キヨセ薫\",\n        \"asanagi\": \"朝凪\",\n        \"kikunyi\": \"菊にぃ\",\n        \"lasto\": \"らすと～\",\n        \"yoroduya hyakuhachi\": \"万屋百八\",\n        \"takapiko\": \"たかぴこ\",\n        \"kobayashi chisato\": \"小林ちさと\",\n        \"siomidu\": \"しおみづ\",\n        \"fudou ran\": \"不动乱\",\n        \"ikuya daikokudou\": \"几夜大黑堂\",\n        \"kaduchi\": \"カヅチ\",\n        \"sakurazuki masaru\": \"桜月マサル\",\n        \"uchuu teiou\": \"宇宙帝王\",\n        \"zundarepon\": \"ズンダレぽん\",\n        \"chokoboll mukakoi.\": \"チョコボール向囲。\",\n        \"majirou\": \"まじろー\",\n        \"nemui neru\": \"眠井ねる\",\n        \"takato kurosuke\": \"高遠くろ助\",\n        \"adachi takumi\": \"安达拓实\",\n        \"asamori mizuki\": \"朝森瑞季\",\n        \"azuma taira\": \"東タイラ\",\n        \"enoki tomoyuki\": \"榎木知之\",\n        \"fujisaka kuuki\": \"藤坂空树\",\n        \"grace ishikawa\": \"グレイス石川\",\n        \"harumi chihiro\": \"ハルミチヒロ\",\n        \"hiyama shuri\": \"ヒヤマシュリ\",\n        \"izumi yoshiki\": \"いづみよしき\",\n        \"maakou\": \"雅亚公\",\n        \"tsukioka reitarou\": \"月冈丽太朗\",\n        \"kurokawa kei\": \"くろかわ京\",\n        \"itachi\": \"いたち\",\n        \"aya shachou\": \"彩社长\",\n        \"fukumaaya\": \"ふくまーや\",\n        \"higashide irodori\": \"东出彩\",\n        \"hiura r\": \"火浦R\",\n        \"karube guri\": \"軽部ぐり\",\n        \"kusatsu terunyo\": \"草津てるにょ\",\n        \"mario\": \"まりお\",\n        \"puniiyu\": \"ぷにいゆ\",\n        \"kotengu\": \"コテング\",\n        \"otare mayu\": \"おたれまゆ\",\n        \"shirouzu myuuta\": \"白水ミュウタ\",\n        \"dosent\": \"Dosent\",\n        \"fuun daiki\": \"風雲だいき\",\n        \"satou saori\": \"佐藤沙绪理\",\n        \"takashina asahi\": \"たかしな浅妃\",\n        \"bkub\": \"Bkub\",\n        \"gemu555\": \"Gemu555\",\n        \"ichiren takushou\": \"一炼托生\",\n        \"katase minami\": \"カタセミナミ\",\n        \"masamune shirow\": \"士郎正宗\",\n        \"nikusoukyuu\": \"肉そうきゅー。\",\n        \"nimu\": \"ニム\",\n        \"okayusan\": \"おかゆさん\",\n        \"wakai ikuo\": \"若井いくお\",\n        \"z-ton\": \"Zトン\",\n        \"hanpera\": \"はんぺら\",\n        \"hirono azuma\": \"広乃あずま\",\n        \"ikeda matamune\": \"池田又心\",\n        \"kon-kit\": \"蒟吉人\",\n        \"ohsaka minami\": \"逢坂ミナミ\",\n        \"raymon\": \"RAYMON\",\n        \"shiroie mika\": \"白家ミカ\",\n        \"tes-mel\": \"tes_mel\",\n        \"toba yuga\": \"跳马游鹿\",\n        \"yoshida tobio\": \"吉田鸢牡\",\n        \"zero no mono\": \"ゼロの者\",\n        \"hige masamune\": \"ひげ政宗\",\n        \"h2o\": \"H2O\",\n        \"kekemotsu\": \"けけもつ\",\n        \"yom\": \"よむ\",\n        \"yuzugin\": \"柚银\",\n        \"akatsuki hiziri\": \"あかつき聖\",\n        \"chig\": \"Chig\",\n        \"tsumugie\": \"つむじぃ\",\n        \"maimu-maimu\": \"舞六まいむ\",\n        \"kotoyoshi yumisuke\": \"琴义弓介\",\n        \"mctek\": \"MCtek\",\n        \"hidaka sora\": \"日高空\",\n        \"mamabe mami\": \"眞々部まみ\",\n        \"sakusyaaya\": \"作者文\",\n        \"ruschuto\": \"るしゅーと\",\n        \"murata range\": \"村田莲尔\",\n        \"haguhagu\": \"はぐはぐ\",\n        \"reitou mikan\": \"れいとうみかん\",\n        \"ruuen rouga\": \"龙炎狼牙\",\n        \"kisaragi nana\": \"如月なな\",\n        \"adumi kazuki\": \"あづみ一樹\",\n        \"sasagawa iko\": \"佐々川いこ\",\n        \"wancho\": \"わんちょ\",\n        \"kajishima masaki\": \"梶岛正树\",\n        \"muririn\": \"梦璃凛\",\n        \"lilithlauda\": \"リリスラウダ\",\n        \"miyase mahiro\": \"宮瀬まひろ\",\n        \"tajima yuki\": \"田岛有纪\",\n        \"nyaito\": \"にゃいと\",\n        \"hitsuka no tsukimiko\": \"ひつかのつきみこ\",\n        \"nagami yuu\": \"永深ゆう\",\n        \"oda kenichi\": \"おだけんいち\",\n        \"toranoe\": \"トラノエ\",\n        \"kinoebi\": \"KinoeBi\",\n        \"nanashi\": \"774\",\n        \"yokoyama lynch\": \"横山私刑\",\n        \"tamposa\": \"たむポ～サ（TAM）\",\n        \"tatami\": \"叠\",\n        \"hoozuki shia\": \"鬼灯しあ\",\n        \"samantha whitten\": \"Samantha Whitten\",\n        \"romi\": \"ろみ\",\n        \"kamiya maneki\": \"かみやまねき\",\n        \"rella\": \"Rella\",\n        \"apaman\": \"あぱまん\",\n        \"takamin\": \"たかみん\",\n        \"pink taro\": \"ピンク太郎\",\n        \"tendou masae\": \"天道まさえ\",\n        \"numahana\": \"ヌマハナ\",\n        \"hino toshiyuki\": \"飞野俊之\",\n        \"yokkora\": \"ヨッコラ\",\n        \"ahen\": \"AHEN\",\n        \"kirishima satoshi\": \"桐島サトシ\",\n        \"kuroiwa madoka\": \"黒磐まどか\",\n        \"nanaroba hana\": \"ななろば華\",\n        \"ouma\": \"OUMA\",\n        \"irie jyunn\": \"入江jyunn\",\n        \"komeshiro kasu\": \"米白粕\",\n        \"gotou suzuna\": \"後藤スズナ\",\n        \"pettanp\": \"ペッタンP\",\n        \"nanashi noizi\": \"ななしのいぢ\",\n        \"koori nezumi\": \"冰鼠\",\n        \"fluff kevlar\": \"Fluff-Kevlar\",\n        \"mukka\": \"Mukka\",\n        \"harenchi tomeko\": \"はれんちとめこ\",\n        \"yukiji shia\": \"雪路时爱\",\n        \"mirin fu-ka\": \"味燐ふーか\",\n        \"toroshio\": \"とろしお\",\n        \"yuzuki\": \"柚木\",\n        \"kusaka souji\": \"久坂宗次\",\n        \"izumi banya\": \"和泉万夜\",\n        \"katzchen\": \"Kätzchen\",\n        \"kanden sky\": \"感电数寄\",\n        \"heiqing langjun\": \"黑青郎君\",\n        \"darkmaya\": \"Darkmaya\",\n        \"unini seven\": \"うにに☆せぶん\",\n        \"nekometaru\": \"ねこめたる\",\n        \"naoya\": \"直哉\",\n        \"sansyoku amido.\": \"三色网户。\",\n        \"yukiyanagi\": \"ゆきやなぎ\",\n        \"fujimoto ikura\": \"藤本いくら\",\n        \"ramiya ryou\": \"兰宫凉\",\n        \"tamiya akito\": \"田宫秋人\",\n        \"joy ride\": \"JOY RIDE\",\n        \"arima natsubon\": \"ありまなつぼん\",\n        \"ebi ebi\": \"エビエビ\",\n        \"gabyonuno\": \"ガビョ布\",\n        \"heppokokun\": \"へっぽこくん\",\n        \"honda aru\": \"翻田亚流\",\n        \"hoshino fuuta\": \"ほしのふうた\",\n        \"kani kani\": \"かにかに\",\n        \"katsumata kazuki\": \"かつまたかずき\",\n        \"kirihara kotori\": \"桐原小鸟\",\n        \"kokekokko coma\": \"こけこっこ☆こま\",\n        \"nagareboshi hikaru\": \"流星ひかる\",\n        \"mihara jun\": \"みはらじゅん\",\n        \"dpc\": \"DPC\",\n        \"urase shioji\": \"浦瀬しおじ\",\n        \"yakusho\": \"やくしょ\",\n        \"kedama keito\": \"毛玉ケヰト\",\n        \"kurai nao\": \"仓井尚\",\n        \"narutaki shin\": \"鳴滝しん\",\n        \"matasabu yarou\": \"またさぶ野郎\",\n        \"kagutsuchi\": \"カグツチ\",\n        \"nyuu\": \"にゅう\",\n        \"kani club\": \"蟹俱乐部\",\n        \"tabuchi\": \"たぶち\",\n        \"nora higuma\": \"野良ヒグマ\",\n        \"tohyama eight\": \"东山エイト\",\n        \"shakuhachi nameko\": \"尺八ナメコ\",\n        \"bai asuka\": \"呗飞鸟\",\n        \"bttamako\": \"豚たま子\",\n        \"eggplantex\": \"茄子EX\",\n        \"kouno aya\": \"煌乃あや\",\n        \"uzuki haruka\": \"卯月遥佳\",\n        \"rokudenashi\": \"ロクデナシ\",\n        \"mukoujima tenro\": \"むこうじまてんろ\",\n        \"kamitsuki manmaru\": \"上月まんまる\",\n        \"kaitou yuuhi\": \"快刀雄飞\",\n        \"danevan\": \"丹·艾凡\",\n        \"kakifly\": \"kakifly\",\n        \"go-it\": \"Go-It\",\n        \"ibuki haruhi\": \"一颯はるひ\",\n        \"beauty hair\": \"ビューティ・ヘア\",\n        \"yamamoto yoshifumi\": \"山本善文\",\n        \"yamano kitsune\": \"矢间野狐\",\n        \"yamanobe kitta\": \"やまのべきった\",\n        \"shishoku gankou\": \"紫色雁行\",\n        \"nakagawa you\": \"中川优\",\n        \"matsutou tomoki\": \"松任知基\",\n        \"kamakiri\": \"カマキリ\",\n        \"kurikara\": \"倶梨伽罗\",\n        \"lazy club\": \"LAZYCLUB\",\n        \"amano koyo\": \"天乃红叶\",\n        \"hindenburg\": \"ひんでんブルグ\",\n        \"kamidera chizu\": \"神寺千寿\",\n        \"kanou soukyuu\": \"狩野苍穹\",\n        \"kurokawa mio\": \"黒河澪\",\n        \"mizukami ranmaru\": \"水上兰丸\",\n        \"ogawa kanran\": \"小川甘蓝\",\n        \"orizumeda nyoizou\": \"折诘田如意三\",\n        \"tanaka juice\": \"田中十酢\",\n        \"tom tamio\": \"都夢たみお\",\n        \"tsukamoto miei\": \"塚本ミエイ\",\n        \"unno hotaru\": \"海野萤\",\n        \"watanabe wataru\": \"わたなべわたる\",\n        \"ikegami akane\": \"池上茜\",\n        \"gujira\": \"ぐじら\",\n        \"xierra099\": \"Xierra099\",\n        \"inazuma\": \"INAZUMA\",\n        \"tomatto\": \"とまっと\",\n        \"gabri-l\": \"雅舞罹-L\",\n        \"amagaeru\": \"あまがえる\",\n        \"batta\": \"Batta\",\n        \"cyocyo\": \"ちょちょ\",\n        \"emons\": \"えもんず\",\n        \"saryuu\": \"沙流\",\n        \"tamano kedama\": \"毛玉牛乳\",\n        \"yumano yuuki\": \"有間乃ユウキ\",\n        \"kink\": \"きんく\",\n        \"kamen no hito\": \"仮面之人\",\n        \"hakuyagen\": \"白夜弦\",\n        \"kugami angning\": \"九神杏仁\",\n        \"yanagi asahi\": \"夜凪朝妃\",\n        \"tanaka shoutarou\": \"田中松太郎\",\n        \"nuko yarou\": \"ぬこやろう\",\n        \"kaniya shiku\": \"蟹屋しく\",\n        \"suzushiro atsushi\": \"铃城敦\",\n        \"denjarasu yamada\": \"やまだ\",\n        \"sakura puchilo\": \"さくらぷちろー\",\n        \"shuko\": \"SHUKO\",\n        \"todoroki\": \"轰\",\n        \"kitamura kouichi\": \"奇田村光一\",\n        \"jabara tornado\": \"蛇腹トルネード\",\n        \"kuroda mutu\": \"黑田陆奥\",\n        \"hoyoyo\": \"ほよよ\",\n        \"aoi tiduru\": \"葵井ちづる\",\n        \"agawa ryo\": \"阿川椋\",\n        \"nise kurosaki\": \"偽くろさき\",\n        \"catapult\": \"かたぱると\",\n        \"kizuki akizuki\": \"きづきあきづき\",\n        \"low\": \"Low\",\n        \"murakami takashi\": \"村上隆史\",\n        \"natsukawa fuyu\": \"夏川冬\",\n        \"tetsu\": \"てつ\",\n        \"fuji shinobu\": \"藤忍\",\n        \"himehachi\": \"ひめはち\",\n        \"kurita yuugo\": \"栗田勇午\",\n        \"mihoshi kurage\": \"海星海月\",\n        \"mikage baku\": \"御影獏\",\n        \"sakurai uta\": \"樱井U太\",\n        \"ayase mai\": \"あやせまい\",\n        \"kishibe\": \"岸边\",\n        \"sake\": \"鲑\",\n        \"takizawa naia\": \"滝沢ナイア\",\n        \"hirugohan\": \"昼ごはん\",\n        \"izumi rin\": \"和泉凛\",\n        \"kamijou noboru\": \"上上上\",\n        \"matsutaka zon\": \"松鷹ぞん\",\n        \"mukaibi aoi\": \"向井弥・葵\",\n        \"takane nohana\": \"たかねのはな\",\n        \"yokoyama chicha\": \"よこやまちちゃ\",\n        \"yuuma\": \"祐马 | ゆーま\",\n        \"koide nao\": \"小出奈央\",\n        \"ueyama you\": \"Ueyama You\",\n        \"umino luka\": \"海野留珈\",\n        \"kabocha\": \"南瓜\",\n        \"kaidou kazuki\": \"海道阔毅\",\n        \"nishikawa kouto\": \"西川孔人\",\n        \"torosawa\": \"とろさわ\",\n        \"sekira ame\": \"せきらあめ\",\n        \"koayako\": \"コアヤアコ\",\n        \"yagami shuuichi\": \"八神秋一\",\n        \"aimaitei umami\": \"愛昧亭うまみ\",\n        \"ohara hiroki\": \"绪原博绮\",\n        \"hanaduka ryouji\": \"华塚良治\",\n        \"komine tsubasa\": \"小峯つばさ\",\n        \"arikawa katokichi\": \"ありかわかときち\",\n        \"branshea\": \"ブランシェア\",\n        \"hiruma kouji\": \"ひるまこうじ\",\n        \"kyon\": \"きょん\",\n        \"minami tomoko\": \"南智子\",\n        \"misaki yukihiro\": \"岬ゆきひろ\",\n        \"ajishio\": \"アジシオ\",\n        \"basara\": \"バサラ\",\n        \"terada zukeo\": \"寺田ヅケ夫\",\n        \"nekomaru\": \"猫丸\",\n        \"yuzumiya mono\": \"柚宫MoNo\",\n        \"ginhaha\": \"ぎんハハ\",\n        \"kiken shisou\": \"危险思想\",\n        \"dokokano aitsu\": \"何処乃アイツ\",\n        \"ginyoku screw\": \"銀欲スクリュー\",\n        \"hg chagawa\": \"HG茶川\",\n        \"john sitch-oh\": \"ジョン湿地王\",\n        \"kamitani\": \"カミタニ\",\n        \"nico pun nise\": \"笑花伪\",\n        \"okina saina\": \"冲那彩菜\",\n        \"sonomiya ponta\": \"想乃宮ぽん太\",\n        \"uziga waita\": \"氏賀Y太\",\n        \"araki kyouya\": \"荒木京也\",\n        \"bunchin\": \"ぶんちん\",\n        \"don shigeru\": \"DON繁\",\n        \"dorei jackie\": \"奴隷ジャッキー\",\n        \"drill murata\": \"ドリルムラタ\",\n        \"kira hiroyoshi\": \"吉良广义\",\n        \"koshow showshow\": \"故障少将\",\n        \"shiromi kazuhisa\": \"しろみかずひさ\",\n        \"yukarigawa yumiya\": \"紫川弓夜\",\n        \"eric w. schwartz\": \"Eric W. Schwartz\",\n        \"x pierrot\": \"Xぴえろ\",\n        \"minust\": \"minusT\",\n        \"irohakaede\": \"イロハカエデ\",\n        \"miwatari renge\": \"美渡れんげ\",\n        \"satofuji masato\": \"了藤诚仁\",\n        \"yoshi hyuuma\": \"吉飞雄马\",\n        \"yuri ai\": \"悠理爱\",\n        \"yamakumo\": \"山云\",\n        \"purin purin\": \"プリンプリン\",\n        \"aoki ume\": \"蒼樹うめ\",\n        \"nekosawaritai\": \"猫泽鲤鲷\",\n        \"raidon\": \"来钝\",\n        \"namaniku atk\": \"なまにくATK\",\n        \"kumaco\": \"くまこ\",\n        \"kuroshibe\": \"クロシベ\",\n        \"akise\": \"秋濑\",\n        \"fukuguri yuuto\": \"福栗悠斗\",\n        \"futaba yae\": \"双叶八重\",\n        \"koorizu\": \"コオリズ\",\n        \"kumataro\": \"隈太郎\",\n        \"mokkouyou bond\": \"木工用ボンド\",\n        \"mustang r\": \"マスタングR\",\n        \"nanakagi satoshi\": \"七键智志\",\n        \"saba ibaru\": \"佐羽いばる\",\n        \"takuwan\": \"たくわん\",\n        \"tsukiwani\": \"月わに\",\n        \"jyun\": \"JYUN\",\n        \"nokoppa\": \"のこっぱ\",\n        \"aru ra une\": \"アル・ラ・ウネ\",\n        \"aranasi\": \"新良梨\",\n        \"maki yoshitaka\": \"真木佳刚\",\n        \"kazuma g-version\": \"カズマ・G-VERSION\",\n        \"fangcat\": \"FangCat\",\n        \"wtk\": \"WTK\",\n        \"as109\": \"As109\",\n        \"jm\": \"JM\",\n        \"breakrabbit\": \"Breakrabbit\",\n        \"farg\": \"Farg\",\n        \"yamamoto zenzen\": \"山本善々\",\n        \"miyata ichimi\": \"宫田一海\",\n        \"kumak\": \"KUMAK\",\n        \"neneru\": \"ねねる\",\n        \"orange bull\": \"牛橘\",\n        \"ipuu\": \"伊菩\",\n        \"ohayou-san\": \"翁さい\",\n        \"nadeneko ponia\": \"撫狸ぽにあ\",\n        \"harukoubou norimaki\": \"春工房のりまき\",\n        \"forester\": \"ふぉれすた\",\n        \"metal owl\": \"Metal Owl\",\n        \"ozaki miray\": \"尾崎未来\",\n        \"madcat\": \"Madcat\",\n        \"shinooka homare\": \"篠岡ほまれ\",\n        \"uruujima call\": \"うるう島呼音\",\n        \"koizumi amane\": \"恋泉天音\",\n        \"stikyfinkaz\": \"StikyfinkaZ\",\n        \"shirasagi rokuwa\": \"白鹭六羽\",\n        \"sato daiji\": \"大慈\",\n        \"akeno minato\": \"绯野湊\",\n        \"hanabana tsubomi\": \"華々つぼみ\",\n        \"soyosoyo\": \"SOYOSOYO\",\n        \"sasorigatame\": \"さそりがため\",\n        \"chong wuxin\": \"虫无心\",\n        \"shiitakemiya donco\": \"椎茸宮どんこ\",\n        \"minase kuru\": \"水瀬くうる\",\n        \"miwa futaba\": \"三輪フタバ\",\n        \"arano oki\": \"荒野冲\",\n        \"nekotewi\": \"ねこてゐ\",\n        \"ohisashiburi\": \"お久しぶり\",\n        \"tsushima zan\": \"津嶋ザン\",\n        \"tsuda nanafushi\": \"津田七节\",\n        \"tokuni mirashichi\": \"戸国みらしち\",\n        \"ganari ryu\": \"がなり龍\",\n        \"ayuya\": \"あゆや\",\n        \"kagato\": \"加画都\",\n        \"ki-you\": \"贵勇\",\n        \"koujima tenro\": \"向島てんろ\",\n        \"natsume fumika\": \"夏目文花\",\n        \"potekoro\": \"ぽてころ\",\n        \"yukawa asami\": \"由河朝巳\",\n        \"alto seneka\": \"或十せねか\",\n        \"doi sakazaki\": \"土居坂崎\",\n        \"dowarukofu\": \"どわるこふ\",\n        \"isono toshiaki\": \"磯野としあき\",\n        \"kakogawa tarou\": \"加古川太郎\",\n        \"kokoromi shingon\": \"こころみ真言\",\n        \"komori ei\": \"古森詠\",\n        \"mashue\": \"Mashue\",\n        \"matsuzawa kei\": \"松沢慧\",\n        \"oohashi takayuki\": \"オオハシタカユキ\",\n        \"rollpan2\": \"Roll-Pants\",\n        \"rusty soul\": \"ラスティソウル\",\n        \"sakaki shiori\": \"さかき栞\",\n        \"shibahara gotyo\": \"しばはらごちょ\",\n        \"uyuu atsuno\": \"烏有あつの\",\n        \"iguchi sentarou\": \"井口千太郎\",\n        \"oborogumo takamitsu\": \"朧雲たかみつ\",\n        \"aoi kumiko\": \"葵久美子\",\n        \"noripachi\": \"のりパチ\",\n        \"hatokonro\": \"鳩こんろ\",\n        \"abe yoshitoshi\": \"安倍吉俊\",\n        \"son hee-joon\": \"손희준\",\n        \"herurun\": \"へるるん\",\n        \"hoshino\": \"星乃\",\n        \"zyugoya\": \"十五夜\",\n        \"yamaoka koutetsurou\": \"山冈钢铁郎\",\n        \"henreader\": \"へんりいだ\",\n        \"47agdragon\": \"47AgDragon\",\n        \"josho isamu\": \"城所委佐武\",\n        \"ogipote\": \"荻pote\",\n        \"marimofu\": \"まりもふ\",\n        \"alison\": \"ALISON\",\n        \"shimajirou\": \"岛次郎\",\n        \"kazuharu kina\": \"和遥キナ\",\n        \"ponta\": \"PoN太\",\n        \"akisora\": \"秋穹\",\n        \"tanishi mitsuru\": \"タニシミツル\",\n        \"mizuno koori\": \"水乃コオリ\",\n        \"akaiguppy\": \"全红白子\",\n        \"etuzan jakusui\": \"越山弱衰\",\n        \"eiji\": \"Eiジ\",\n        \"oryou\": \"おりょう\",\n        \"waguchi shouka\": \"和口昇火\",\n        \"tenzen miyabi\": \"天渐雅\",\n        \"windart\": \"WindArt\",\n        \"masaki kei\": \"真崎ケイ\",\n        \"mousou-kun\": \"もうそうくん\",\n        \"ooishi chuuni\": \"大石中二\",\n        \"mitsudoue\": \"みつどうえ\",\n        \"watanabe akio\": \"渡边明夫\",\n        \"kiyokawa nijiko\": \"虚川二次子\",\n        \"himuro serika\": \"冰室芹夏\",\n        \"nachisuke\": \"なちすけ\",\n        \"kasuga mayu\": \"春日まゆ\",\n        \"kirimoto yuuji\": \"桐下悠司\",\n        \"suihei sen\": \"水平线\",\n        \"yuunagi\": \"ユウナギ\",\n        \"jadenkaiba\": \"Jadenkaiba\",\n        \"legoman\": \"Legoman\",\n        \"staryume\": \"星遥ゆめ\",\n        \"kamifuji mikeko\": \"神藤みけこ\",\n        \"hekicha\": \"碧茶\",\n        \"nrr\": \"Nrr\",\n        \"inue shinsuke\": \"犬江しんすけ\",\n        \"onigirikun\": \"おにぎり君\",\n        \"nekosu\": \"ねこす\",\n        \"akahito\": \"赤人\",\n        \"hanada yanochi\": \"花田やのち\",\n        \"kinokomushi\": \"きのこむし\",\n        \"ichimura\": \"イチムラ\",\n        \"crimson\": \"クリムゾン\",\n        \"tanishi\": \"たにし\",\n        \"akizora sawayaka\": \"秋空さわやか\",\n        \"izumiya otoha\": \"いづみやおとは\",\n        \"minamida usuke\": \"南田U助\",\n        \"mizuyuki\": \"みずゆき\",\n        \"nise\": \"似せ\",\n        \"kojirou\": \"KOJIROU!\",\n        \"hidemaru\": \"英丸\",\n        \"hakkyou daioujou\": \"发狂大往生\",\n        \"blackshirtboy\": \"Blackshirtboy\",\n        \"xpray\": \"Xpray\",\n        \"shika yuno\": \"椎架ゆの\",\n        \"azarashi\": \"アザラシ\",\n        \"syamonabe\": \"シャモナベ\",\n        \"tyagama\": \"茶釜\",\n        \"tkp\": \"TKP\",\n        \"yakumo ginjirou\": \"八云银次郎\",\n        \"namamo nanase\": \"なまもななせ\",\n        \"pyon-kti\": \"ぴょん吉\",\n        \"azuki yui\": \"阿月唯\",\n        \"minato itoya\": \"ミナトイトヤ\",\n        \"shiraishinsuke\": \"白石Nスケ\",\n        \"soramame-san\": \"そら豆さん\",\n        \"wabara hiro\": \"羽原ヒロ\",\n        \"synchroaki\": \"しんくろあき\",\n        \"kin no tamamushi\": \"金ノ玉虫\",\n        \"yamamoto hyugo\": \"山本ひゅーご\",\n        \"lithium\": \"Lithium\",\n        \"athu\": \"Athu\",\n        \"kawarajima koh\": \"かわらじま晃\",\n        \"focke wolf\": \"ほっけうるふ\",\n        \"rukitsura.\": \"るきつら。\",\n        \"tsuchinoshita kaeru\": \"土ノ下かえる\",\n        \"nokobeya\": \"のこべや\",\n        \"ponfaz\": \"ぽんふぁーず\",\n        \"hihumi hajime\": \"一二三始\",\n        \"momoyama jirou\": \"桃山ジロウ\",\n        \"r5\": \"R5\",\n        \"c2\": \"C2\",\n        \"shitappa\": \"したっぱ\",\n        \"kanbayashi takaki\": \"神林タカキ\",\n        \"nyx\": \"にゅくす\",\n        \"akashia\": \"アカシア\",\n        \"shigeta\": \"しげた\",\n        \"uminori\": \"うみのり\",\n        \"yopparai oni\": \"酔っ払い鬼?\",\n        \"alpaca club\": \"あるぱかくらぶ\",\n        \"berosu\": \"べろす\",\n        \"silly\": \"しりー\",\n        \"sekiri\": \"せきり\",\n        \"midorino tanuki\": \"翠野タヌキ\",\n        \"kanna hisashi\": \"かんな久\",\n        \"kitahara eiji\": \"北原エイジ\",\n        \"aoi miharu\": \"蒼井ミハル\",\n        \"arinotowatari\": \"ありのとわたり\",\n        \"dagashi\": \"駄菓子\",\n        \"e-musu aki\": \"いーむす・アキ\",\n        \"himeno komomo\": \"姫野こもも\",\n        \"kamisiro ryu\": \"神代龙\",\n        \"kerorin\": \"けろりん\",\n        \"kenji\": \"けんじ\",\n        \"knuckle curve\": \"ナックルカーブ\",\n        \"koumo\": \"コーモ\",\n        \"mikarin\": \"ミカリン\",\n        \"minagiri\": \"ミナギリ\",\n        \"nijou katame\": \"二条かため\",\n        \"ouchi kaeru\": \"楝蛙\",\n        \"sexyturkey\": \"すたーきー\",\n        \"shikkarimono no takashi-kun\": \"しっかり者のタカシくん\",\n        \"survival knife\": \"サバイバル刃\",\n        \"kishiri toworu\": \"ヲルト\",\n        \"yakitomato\": \"八木户マト\",\n        \"ban kazuyasu\": \"伴カズヤス\",\n        \"kaneko toshiaki\": \"かねことしあき\",\n        \"labui\": \"羅ぶい\",\n        \"tanaka ginji\": \"田中银二\",\n        \"tetsuyama kaya\": \"鉄山かや\",\n        \"oota takeshi\": \"大田武志\",\n        \"sora inoue\": \"いのうえ空\",\n        \"tan jiu\": \"坛九\",\n        \"shigeru\": \"しげる\",\n        \"akata izuki\": \"亚方逸树\",\n        \"matsumori shou\": \"茉森晶\",\n        \"datarou\": \"だたろう\",\n        \"miso tya\": \"みそ茶\",\n        \"eirizo\": \"エイリゾ\",\n        \"ootomo yuuki\": \"大友ゆうき\",\n        \"sorai shinya\": \"空维深夜\",\n        \"muuba\": \"梦生场\",\n        \"orukaniumu\": \"おるかにうむ\",\n        \"izayoi no kiki\": \"十六夜のキキ\",\n        \"wada rco\": \"ワダアルコ\",\n        \"agobitch nee-san\": \"アゴビッチ姉さん\",\n        \"kito sakeru\": \"鬼头サケル\",\n        \"misa wasabi\": \"三左わさび\",\n        \"momoduki suzu\": \"桃月すず\",\n        \"picao\": \"ぴかお\",\n        \"girls number\": \"Girl's Number\",\n        \"asazuki norito\": \"浅月のりと\",\n        \"nodoka\": \"长闲\",\n        \"ajiichi\": \"アジイチ\",\n        \"aoihito\": \"蒼い人\",\n        \"namusoubyou\": \"名无双描\",\n        \"marushamo\": \"まるしゃも\",\n        \"haruhonya\": \"はるほんや\",\n        \"shinya\": \"しんや\",\n        \"yonban\": \"よんばん\",\n        \"nori-haru\": \"のりはる\",\n        \"neko totora\": \"ねこトトラ\",\n        \"wulazula\": \"うらずら\",\n        \"aian\": \"あいあん\",\n        \"nmo ezago\": \"ンモ=エザゴ\",\n        \"mikuni atsuko\": \"三国あつ子\",\n        \"nekousa\": \"猫兔\",\n        \"shown\": \"ショーン\",\n        \"shimakaze\": \"岛风\",\n        \"hamatyonn\": \"ハマちょん\",\n        \"fukufukuan\": \"福々餡\",\n        \"aikawa an\": \"愛川あん\",\n        \"nao takami\": \"尚たかみ\",\n        \"okuni yoshinobu\": \"小国由喜\",\n        \"oreiro\": \"オレイロ\",\n        \"ndc\": \"NDC\",\n        \"rocket monkey\": \"ロケットモンキー\",\n        \"a-teru haito\": \"A辉废都\",\n        \"kusumoto toka\": \"楠元とうか\",\n        \"utatane hiroyuki\": \"うたたねひろゆき\",\n        \"chuuka naruto\": \"中華なると\",\n        \"area\": \"Area\",\n        \"kruth666\": \"Kruth666\",\n        \"f4u\": \"F4U\",\n        \"higenamuchi\": \"ひげなむち\",\n        \"honryo hanaru\": \"本領はなる\",\n        \"ichigain\": \"一概\",\n        \"konchiki\": \"こんちき\",\n        \"namboku\": \"南北\",\n        \"tohzai\": \"东西\",\n        \"ogadenmon\": \"オガデンモン\",\n        \"sakuma tsukasa\": \"さくま司\",\n        \"arai togami\": \"荒居栂美\",\n        \"fujitsuna\": \"フジツナ\",\n        \"fukuroumori\": \"枭森\",\n        \"yukino koreyuki\": \"之之之之\",\n        \"momio\": \"もみお\",\n        \"vivian tian zong\": \"Vivian天纵\",\n        \"sugihara\": \"すぎはら\",\n        \"minagi umihito\": \"深凪ウミヒト\",\n        \"natsu no koucha\": \"夏の紅茶\",\n        \"prime\": \"Prime\",\n        \"tatekawa mako\": \"館川まこ\",\n        \"hrd\": \"hr津\",\n        \"choco-chip\": \"チョコ・チップ\",\n        \"sakurai makoto\": \"櫻井マコト\",\n        \"kuronyan\": \"くろニャン\",\n        \"moriyama yusuke\": \"森山雄介\",\n        \"son yohsyu\": \"孙阳州\",\n        \"ray-kbys\": \"Ray-Kbys\",\n        \"potato\": \"POTATO\",\n        \"ichihara hikari z\": \"位置原光Z\",\n        \"komezawa\": \"こめざわ\",\n        \"mozu\": \"もず\",\n        \"aoiro ichigou\": \"あお色一号\",\n        \"futamine kobito\": \"二峰跨人\",\n        \"gennari\": \"ゲンナリ\",\n        \"inukami\": \"いぬかみ\",\n        \"narumiya akira\": \"成宫亨\",\n        \"oosawara sadao\": \"大童贞男\",\n        \"sugarbt\": \"sugarBt\",\n        \"sunahama nosame\": \"砂浜のさめ\",\n        \"zakotsu\": \"佐骨\",\n        \"nidy-2d-\": \"Nidy-2D-\",\n        \"urico take\": \"瓜子たけ\",\n        \"tanohito\": \"たのひと\",\n        \"kouki kuu\": \"こうきくう\",\n        \"engawa suguru\": \"エンガワ卓\",\n        \"fuji-han\": \"ふじはん\",\n        \"hayashida toranosuke\": \"林田虎之助\",\n        \"buchou chinke\": \"部長ちんけ\",\n        \"asakura kukuri\": \"アサクラククリ\",\n        \"nanao naru\": \"七尾奈留\",\n        \"kirishima ayu\": \"雾岛鲇\",\n        \"keita naruzawa\": \"Keita Naruzawa\",\n        \"amami sen\": \"天观仙\",\n        \"juujou tatami\": \"十畳たたみ\",\n        \"ermuzibu\": \"Ermuzibu\",\n        \"gingami\": \"银河味\",\n        \"makino tomoe\": \"槇野ともえ\",\n        \"teppeki kyojin\": \"铁壁巨人\",\n        \"mimiyoshi\": \"みみよし\",\n        \"jinsuke\": \"甚助\",\n        \"mushoku santaro\": \"无色三太郎\",\n        \"tawara hiryuu\": \"俵绯龙\",\n        \"marugoshi\": \"まるごし\",\n        \"missbehaviour\": \"MissBehaviour\",\n        \"funsexydragonball\": \"Funsexydragonball\",\n        \"badonion\": \"BadOnion\",\n        \"hazuki ruka\": \"羽月るか\",\n        \"eno tato\": \"江野たと\",\n        \"daiaru\": \"ダイアル\",\n        \"mokusei zaijuu\": \"木星在住\",\n        \"kaga akuru\": \"加賀あくる\",\n        \"nekoaruko\": \"ねこ＠るこ\",\n        \"hari senbon\": \"针千本\",\n        \"bang-you\": \"BANG-YOU\",\n        \"bubuzuke\": \"ぶぶづけ\",\n        \"gentle sasaki\": \"ジェントル佐々木\",\n        \"kamina koharu\": \"神无小春\",\n        \"kei.\": \"刑。\",\n        \"mikoyan\": \"みこやん\",\n        \"nuezou\": \"ヌエゾウ\",\n        \"ribyuhki\": \"リブユウキ\",\n        \"sgk\": \"SGK\",\n        \"shinkuu tatsuya\": \"しんくうたつや\",\n        \"unou\": \"右脑\",\n        \"yuuki shin\": \"悠木しん\",\n        \"harumi\": \"春海\",\n        \"mirei\": \"みれい\",\n        \"miwa yoshikazu\": \"美和美和\",\n        \"wildcat\": \"ワイルドキャット\",\n        \"fujita yukihisa\": \"藤田幸久\",\n        \"l axe\": \"L Axe\",\n        \"s.m.o.k.e.\": \"S.M.O.K.E.\",\n        \"samurai\": \"さむらい\",\n        \"kureyon\": \"くれよん\",\n        \"broccoli takeda\": \"ブロッコリーたけだ\",\n        \"maatsu\": \"ま～つ\",\n        \"toumasu\": \"とーます\",\n        \"ishikawa sae\": \"石川沙绘\",\n        \"nagihashi coko\": \"なぎはしここ\",\n        \"u-jin\": \"游人\",\n        \"piripun\": \"ぴりぷん\",\n        \"akabashi\": \"アカバシ\",\n        \"mataro\": \"魔太郎\",\n        \"kekocha\": \"けこちゃ\",\n        \"mogiki hayami\": \"十はやみ\",\n        \"the amanoja9\": \"The Amanoja9\",\n        \"fumitsuki sou\": \"二三月そう\",\n        \"fuji hyorone\": \"藤ひょろね\",\n        \"hibimegane\": \"ヒビメガネ\",\n        \"dekosuke 18gou\": \"デコ助18号\",\n        \"geso smith\": \"ゲソスミス\",\n        \"hidarite tarou\": \"左手太郎\",\n        \"jagayamatarawo\": \"じゃが山たらヲ\",\n        \"kasei\": \"かせい\",\n        \"kayanoi ino\": \"茅乃井いの\",\n        \"kiiroi tamago\": \"黄色的蛋\",\n        \"kirihara you\": \"桐原湧\",\n        \"mdakoki\": \"M田K樹\",\n        \"ooyoko yamaame\": \"大横山饴\",\n        \"ryokuchaism\": \"緑茶イズム\",\n        \"shiden akira\": \"しでん晶\",\n        \"soborogo\": \"ソボロゴ\",\n        \"syoukaki\": \"消火器\",\n        \"1 equals 2\": \"1=2\",\n        \"zouo-san\": \"憎恶产\",\n        \"machida hiraku\": \"町田ひらく\",\n        \"mamezou\": \"まめぞう\",\n        \"yamaya oowemon\": \"山家大右卫门\",\n        \"yuizaki kazuya\": \"ユイザキカズヤ\",\n        \"shichimenchou\": \"しちめんちょう\",\n        \"bigshine\": \"ビッグシャイン\",\n        \"apoidea\": \"Apoidea\",\n        \"randou\": \"乱道\",\n        \"midoriiro\": \"緑いろ\",\n        \"koukou punch\": \"高校パンチ\",\n        \"arai kogane\": \"新井コガネ\",\n        \"aoin\": \"AOIN\",\n        \"takase asagiri\": \"鷹瀬あさぎり\",\n        \"ugaromix\": \"Ugaromix\",\n        \"aizawa hiroshi\": \"あいざわひろし\",\n        \"b-ginga\": \"B-银河\",\n        \"nanami\": \"七弥\",\n        \"narumi cristear note\": \"成海クリスティアーノート\",\n        \"saku usako\": \"佐久うさこ\",\n        \"aotsu karin\": \"蒼都かりん\",\n        \"mori airi\": \"森あいり\",\n        \"mimura zaja\": \"三村ざじゃ\",\n        \"itomugi-kun\": \"糸麦くん\",\n        \"aru urara\": \"あるうらら\",\n        \"sakura saku sakura\": \"佐倉さくさくら\",\n        \"akinaro\": \"あきなろ\",\n        \"hanakawa sugar\": \"花川シュガー\",\n        \"urabi\": \"紅吊うらび\",\n        \"kichirock\": \"キチロク\",\n        \"wes heartland smith\": \"ウェス·ハートランド·スミス\",\n        \"pochincoff\": \"ポチンコフ\",\n        \"shimeji nameko\": \"しめじなめこ\",\n        \"sakibashiri jiru\": \"先走汁\",\n        \"hayashi tugumi\": \"林つぐみ\",\n        \"tamura chii\": \"田村ちい\",\n        \"jagausa\": \"じゃがうさ\",\n        \"misuroma\": \"みすろま\",\n        \"kabe umari-ko\": \"壁埋まり子\",\n        \"crowly\": \"くろうり\",\n        \"sekiya asami\": \"关谷あさみ\",\n        \"nananana\": \"ナナナナ\",\n        \"cafekun\": \"cafekun\",\n        \"hataraki ari\": \"ハタラキ有\",\n        \"kilesha\": \"きれゐしゃ\",\n        \"spec\": \"SPEC\",\n        \"gogocherry\": \"GOGOCHERRY\",\n        \"kitajima yuuki\": \"北嶋ゆうき\",\n        \"renji\": \"练慈\",\n        \"wise speak\": \"ワイズスピーク\",\n        \"ayamy\": \"あやみ\",\n        \"cekonikova\": \"Cekonikova（ぐらら）\",\n        \"ke-ta\": \"ke-ta\",\n        \"roteri\": \"ろてり\",\n        \"kannaduki kanna\": \"神無月かんな\",\n        \"endou okito\": \"袁藤沖人\",\n        \"messy\": \"メッシィ\",\n        \"aomushi\": \"あおむし\",\n        \"zheng\": \"Zheng\",\n        \"yukimoto shuuji\": \"雪本愁二\",\n        \"omaru gyuunyuu\": \"牛乳うまお\",\n        \"futami paran\": \"二見パラン\",\n        \"torajima tao\": \"虎島タオ\",\n        \"mr.takealook\": \"Mr.takealook\",\n        \"isobe maki\": \"イソベマキ\",\n        \"sensouji kinoto\": \"浅草寺きのと\",\n        \"shinozuka yuuji\": \"篠塚裕志\",\n        \"shikishiro konomi\": \"色白好\",\n        \"sakurayu hal\": \"樱汤ハル\",\n        \"nanao yukiji\": \"七尾ゆきじ\",\n        \"herio\": \"ヘリを\",\n        \"aikawa arisa\": \"相川亚利砂\",\n        \"yamaishi juhachi\": \"山石18\",\n        \"rokkaku yasosuke\": \"六角八十助\",\n        \"tomono hiro\": \"友野ヒロ\",\n        \"yonekura kengo\": \"米倉けんご\",\n        \"yosuteinu\": \"世棄犬\",\n        \"hiyoshi hana\": \"日吉ハナ\",\n        \"tabigarasu\": \"旅乌\",\n        \"tsuge yasuna\": \"つげ安奈\",\n        \"hissatsukun\": \"ひっさつくん\",\n        \"ayakawa riku\": \"あやかわりく\",\n        \"yoshida inuhito\": \"吉田犬人\",\n        \"yuyama chika\": \"湯山チカ\",\n        \"kumakiti\": \"隈吉\",\n        \"umakuchi syouyu\": \"うまくち酱油\",\n        \"tokie hirohito\": \"刻江寻人\",\n        \"yuzuki n dash\": \"柚木N’\",\n        \"itou nanami\": \"井藤ななみ\",\n        \"porutan\": \"ぽるたん\",\n        \"kaitenfude\": \"回转笔\",\n        \"tachikawa negoro\": \"立川ねごろ\",\n        \"emine kendama\": \"遠峰犬玉\",\n        \"masami chie\": \"柾见ちえ\",\n        \"ryuuki yumi\": \"りゅうき夕海\",\n        \"nakano sora\": \"中乃空\",\n        \"napo\": \"ナポ\",\n        \"kazuki misaki\": \"数木美咲\",\n        \"nakata modem\": \"中田モデム\",\n        \"anzaki moral\": \"杏咲モラル\",\n        \"brother pierrot\": \"ブラザーピエロ\",\n        \"oltlo\": \"おるとろ\",\n        \"piromizu\": \"ピロ水\",\n        \"jorori\": \"じょろり\",\n        \"abe manabu\": \"安部マナブ\",\n        \"matsunami rumi\": \"松波留美\",\n        \"narita kyousha\": \"成田香車\",\n        \"arakure\": \"あらくれ\",\n        \"seto yuuki\": \"世徒ゆうき\",\n        \"yami kota\": \"やみこた\",\n        \"kakumayu\": \"カクマユ\",\n        \"sorairo len\": \"空色れん\",\n        \"yamiochi umekichi\": \"闇堕ち梅吉\",\n        \"namaribou nayonayo\": \"铅棒なよなよ\",\n        \"amasaka takashi\": \"天坂隆志\",\n        \"kazuma\": \"和真\",\n        \"uni8\": \"うにあはと\",\n        \"denchi\": \"电池\",\n        \"ono no imoko\": \"小野妹子\",\n        \"nishieda\": \"西E田\",\n        \"gomennasai\": \"御免なさい\",\n        \"ame arare\": \"雨あられ\",\n        \"abi kamesennin\": \"俺正读\",\n        \"futayami\": \"双暗\",\n        \"deadflow\": \"Deadflow（Б）\",\n        \"yukishizuku\": \"ユキシズク\",\n        \"mappa ninatta\": \"マッパニナッタ\",\n        \"ryuuto hisashi\": \"りゅうとひさし\",\n        \"tamazatou\": \"玉砂糖\",\n        \"tanaka yuuichi\": \"田中雄一\",\n        \"nakamura kuzuyu\": \"中村葛汤\",\n        \"bekotarou\": \"ベコ太郎\",\n        \"ayuma sayu\": \"あゆま紗由\",\n        \"fumi miyabi\": \"文雅\",\n        \"masuda\": \"枡田\",\n        \"nunnu\": \"ぬんぬ\",\n        \"shimanto shisakugata\": \"40010试作型\",\n        \"yuzuna hiyo\": \"柚子奈ひよ\",\n        \"kojiki ohji\": \"古事记王子\",\n        \"tamakake\": \"たまかけ\",\n        \"shiromochi sakura\": \"白もち桜\",\n        \"shimao kazu\": \"嶋尾和\",\n        \"kanou ryuuji\": \"叶竜児\",\n        \"yatanukikey\": \"やたぬき圭\",\n        \"maihara matsuge\": \"舞原マツゲ\",\n        \"genzou kokuto\": \"幻像黒兎\",\n        \"yamashita kurowo\": \"山下クロヲ\",\n        \"yanagi yuu\": \"ヤナギユウ\",\n        \"ponite korosuke\": \"ポニテコロ介\",\n        \"azuse\": \"あずせ\",\n        \"mameojitan\": \"まめおじたん\",\n        \"giuniu\": \"ぎうにう\",\n        \"sabusuka\": \"サブスカ\",\n        \"senji\": \"煎路\",\n        \"komowata haruka\": \"こもわた遥華\",\n        \"murakami suigun\": \"村上水軍\",\n        \"takanae kyourin\": \"高苗京鈴\",\n        \"shirabe shiki\": \"調四季\",\n        \"kobuichi\": \"小舞一\",\n        \"yaneko uta\": \"弥猫うた\",\n        \"kirisaki byakko\": \"雾咲白狐\",\n        \"bareisho\": \"马铃薯\",\n        \"wakadori nikomi\": \"若鶏にこみ\",\n        \"shikitani asuka\": \"色谷あすか\",\n        \"furisuku\": \"ふりすく\",\n        \"kosuke haruhito\": \"虎助遥人\",\n        \"tomoe yousuke\": \"巴八丞\",\n        \"tokita alumi\": \"鴇田アルミ\",\n        \"poshi\": \"ぽし\",\n        \"haguruma\": \"歯車\",\n        \"kanekiyo miwa\": \"兼清みわ\",\n        \"gayarou\": \"☆画野朗\",\n        \"yashiro seika\": \"八城惺架\",\n        \"tokiwa midori\": \"常磐緑\",\n        \"tsubaki jushirou\": \"椿十四郎\",\n        \"tukinowagamo\": \"月ノ輪ガモ\",\n        \"uron rei\": \"ウーロン・レイ\",\n        \"mushanokouji shizuka\": \"武者小路静香\",\n        \"emori uki\": \"江森うき\",\n        \"shindou\": \"しんどう\",\n        \"kikurage\": \"きくらげ\",\n        \"sanom\": \"鎖ノム\",\n        \"amagasa ikuta\": \"雨暈郁太\",\n        \"sukesaburou\": \"助三郎\",\n        \"jiraiya\": \"児雷也\",\n        \"kuromotokun\": \"黑本君\",\n        \"gomano lio\": \"胡麻乃りお\",\n        \"shiratama moti\": \"白玉もち\",\n        \"shiratama yomogi\": \"しらたま よもぎ\",\n        \"yoshida iyo\": \"吉田 依世\",\n        \"sakura oriko\": \"佐倉おりこ\",\n        \"hinata yuu\": \"ひなた悠\",\n        \"odawara hakone\": \"オダワラハコネ\",\n        \"ikari\": \"いかり\",\n        \"humuyun\": \"ふむゆん\",\n        \"watagashi yui\": \"わたがしゆい\",\n        \"kohinata hoshimi\": \"小日向ほしみ\",\n        \"yudzuki hina\": \"遊月ひな\",\n        \"sakura ani\": \"桜あに\",\n        \"tsukishima yuuko\": \"月嶋ゆうこ\",\n        \"tomoshibi hidekazu\": \"赤提灯\",\n        \"kamisyakujii yubeshi\": \"紙石神井ゆべし\",\n        \"kurosu gatari\": \"黑巢ガタリ\",\n        \"doku denpa\": \"毒でんぱ\",\n        \"dokiyuri\": \"どきゆり\",\n        \"tamagoro\": \"たまごろー\",\n        \"mizore\": \"みぞれ\",\n        \"akure ekuto\": \"吾暮えくと\",\n        \"chacharan\": \"茶々らん\",\n        \"isuwie\": \"イスィ\",\n        \"misaoka\": \"みさおか\",\n        \"ootori mahiro\": \"鳳まひろ\",\n        \"yaya hinata\": \"稍日向\",\n        \"koeda shiro\": \"こえだしろ\",\n        \"honjou hideaki\": \"本条秀明\",\n        \"notzackforwork\": \"NotZackForWork\",\n        \"hayashizaki fumihiro\": \"林崎文博\",\n        \"hatomizu\": \"ハト水\",\n        \"hiroya\": \"广弥\",\n        \"amamiya\": \"アマミヤ\",\n        \"nedia\": \"ねでぃあ\",\n        \"aiki\": \"Aiki\",\n        \"mumei\": \"Mumei\",\n        \"tefun\": \"てふん\",\n        \"shikoripa\": \"しこりぱ\",\n        \"tani takuya\": \"谷拓也\",\n        \"maron\": \"魔龙\",\n        \"yomoyama takashi\": \"四方山贵史\",\n        \"fuji tarawi\": \"藤たらゐ\",\n        \"mousou\": \"妄想\",\n        \"yokohama inka\": \"よこはまインカ\",\n        \"hoshi\": \"ほし\",\n        \"nanamatsu kenji\": \"七松建司\",\n        \"fuumi\": \"ふーみ\",\n        \"shacho\": \"社ちょ\",\n        \"toito\": \"トイト\",\n        \"toketou\": \"とけとう\",\n        \"shisyo\": \"ししょー\",\n        \"whistlerx\": \"WhistlerX\",\n        \"hagiwara asami\": \"萩原あさ美\",\n        \"itose ikuto\": \"爱濑郁人\",\n        \"osaru\": \"御猿\",\n        \"etori yuuya\": \"江鸟\",\n        \"ootsuka kotora\": \"大塚子虎\",\n        \"testa\": \"てすた\",\n        \"butachang\": \"ぶたちゃんぐ\",\n        \"sahara gensei\": \"佐原玄清\",\n        \"hino hino\": \"緋乃ひの\",\n        \"tsukuru\": \"作\",\n        \"habara meguru\": \"羽原メグル\",\n        \"hanabusa satoshi\": \"はなぶささとし\",\n        \"hado\": \"はあど\",\n        \"takemasa takeshi\": \"武将武\",\n        \"akabeko\": \"あかべこ\",\n        \"hisui\": \"翡翠石\",\n        \"sakura yuki\": \"咲良ゆき\",\n        \"suga hideo\": \"スガヒデオ\",\n        \"nadaka harutsugu\": \"南高春告（梅干）\",\n        \"hatori you\": \"葉鳥侑\",\n        \"byougaku\": \"猫額\",\n        \"yoshu ohepe\": \"養酒オヘペ\",\n        \"amanagi seiji\": \"天凪青磁\",\n        \"tsukako\": \"つかこ\",\n        \"mochi\": \"モチ\",\n        \"araiguma\": \"あらいぐま\",\n        \"2-g\": \"2-G\",\n        \"sukoyaka gyuunyuu\": \"健やか牛乳\",\n        \"saeki nao\": \"彩季なお\",\n        \"endori\": \"えんどり\",\n        \"fukuoka tarou\": \"福冈太朗\",\n        \"mafuyu hemp\": \"麻冬HEMP\",\n        \"kanno takanori\": \"南乃さざん\",\n        \"takehana note\": \"竹花ノート\",\n        \"sakuraba hikaru\": \"桜庭光\",\n        \"wolflong\": \"╰狼龍\",\n        \"toyosaki shu\": \"豊咲\",\n        \"mutou koucha\": \"无糖红茶\",\n        \"kurihara kenshirou\": \"栗原ケンシロウ\",\n        \"matsumotoke\": \"松本家御愛用\",\n        \"utamaro\": \"歌麿\",\n        \"tadima yoshikadu\": \"たぢまよしかづ\",\n        \"puuakachan\": \"プーアカちゃん\",\n        \"wataame\": \"わたあめ\",\n        \"aduki\": \"あづき\",\n        \"inui waon\": \"乾和音\",\n        \"majima shiroyuki\": \"间岛白幸\",\n        \"sougetsu nonono\": \"草月野々乃\",\n        \"wantan meo\": \"云吞めお\",\n        \"kemuri haku\": \"煙ハク\",\n        \"kani biimu\": \"かにビーム\",\n        \"watanohara\": \"わたのはら\",\n        \"kawasaki tadataka\": \"川崎直孝\",\n        \"shiraishi nagisa\": \"白石なぎさ\",\n        \"kurikimaru\": \"くりきまる\",\n        \"hinohara fuki\": \"檜原フキ\",\n        \"kobayashi kina\": \"小林キナ\",\n        \"takemitsu\": \"たけみつ\",\n        \"shiki\": \"四季\",\n        \"deyuyama\": \"でゆ山\",\n        \"namidame\": \"泪目\",\n        \"higata akatsuki\": \"阳方晶月\",\n        \"kayumidome\": \"かゆみ止め\",\n        \"naha 78\": \"ナハ78\",\n        \"getsuyou yasumi.\": \"月曜休み。\",\n        \"arumamai ayuka plus\": \"在誠舞あゆか+\",\n        \"take calcium\": \"竹刈シウム\",\n        \"aritsuno\": \"有角\",\n        \"shinova\": \"シノバ\",\n        \"mahito\": \"真人\",\n        \"anon 2-okunen\": \"あのん2億年\",\n        \"zikataro\": \"自家太郎\",\n        \"footaro\": \"辻風太郎\",\n        \"mokuzu\": \"もくず\",\n        \"mizuno kurage\": \"水乃くらげ\",\n        \"aoi\": \"あおい\",\n        \"uguisu mochi\": \"うぐいす餅\",\n        \"kirero\": \"kirero\",\n        \"hyura3\": \"ひゅらさん\",\n        \"fumituki\": \"ふみつき\",\n        \"mimi\": \"魅未\",\n        \"doru\": \"$\",\n        \"mikagami hiyori\": \"水鏡ひより\",\n        \"hisaka tooru\": \"氷坂透\",\n        \"eseneko\": \"えせねこ\",\n        \"oinari\": \"おいなり\",\n        \"kata k\": \"カタケイ\",\n        \"miisha\": \"みーしゃ\",\n        \"ichiba youichi\": \"市葉葉市\",\n        \"beni shake\": \"べにしゃけ\",\n        \"megumiya\": \"megumiya\",\n        \"aiu\": \"蓝兔\",\n        \"kobato neneko\": \"小鳩ねねこ\",\n        \"marota\": \"麻吕太\",\n        \"maineko ruru\": \"舞猫ルル\",\n        \"kanroame\": \"甘露アメ\",\n        \"shaa\": \"しゃあ\",\n        \"aka shio\": \"朱シオ\",\n        \"tomobe kinuko\": \"友部キヌコ\",\n        \"hirasaka makoto\": \"比良坂真琴\",\n        \"matsuriuta\": \"祭唄（松竜太）\",\n        \"momizi-kei\": \"紅葉-K\",\n        \"nagayori\": \"长赖\",\n        \"toosaka asagi\": \"遠坂あさぎ\",\n        \"momoco\": \"ももこ\",\n        \"ashima\": \"アシマ\",\n        \"suzumori\": \"铃森\",\n        \"kimishima ao\": \"君岛青\",\n        \"motiduki siina\": \"望月椎那\",\n        \"kino\": \"kino\",\n        \"mitha\": \"Mitha\",\n        \"tateha\": \"立羽\",\n        \"yano mitsuki\": \"夜ノみつき\",\n        \"fukahire\": \"フカヒレ\",\n        \"takano yuki\": \"鷹乃ゆき\",\n        \"suimya\": \"すいみゃ\",\n        \"shirokuma a\": \"シロクマA\",\n        \"karory\": \"karory\",\n        \"tomo\": \"ともー\",\n        \"kiba satoshi\": \"木場智士\",\n        \"ziko\": \"ziko\",\n        \"techi\": \"てち\",\n        \"koza\": \"コザ\",\n        \"mame denkyuu\": \"まめでんきゅう\",\n        \"mocha\": \"Mocha\",\n        \"teitetsu\": \"蹄铁\",\n        \"sugiura sen\": \"杉浦线\",\n        \"izumi nanase\": \"いずみななせ\",\n        \"moekibara fumitake\": \"萌木原文武\",\n        \"mizuki takehito\": \"みづきたけひと\",\n        \"takahashi tetsuya\": \"高桥哲哉\",\n        \"hiten\": \"Hiten\",\n        \"inugami kira\": \"狗神煌\",\n        \"korie riko\": \"梱枝莉子\",\n        \"hasune\": \"はすね\",\n        \"muku\": \"muku\",\n        \"kurou\": \"九郎\",\n        \"natsuki yuu\": \"なつきゆう\",\n        \"pan\": \"ぱん\",\n        \"yaman\": \"yaman**\",\n        \"anapon\": \"あなぽん\",\n        \"mashiro shirako\": \"真白しらこ\",\n        \"yagi the goat\": \"ヤギの人\",\n        \"morimiya masayuki\": \"森宫正幸\",\n        \"airandou\": \"あいらんどう\",\n        \"nishizawa 5mm\": \"西沢5ミリ\",\n        \"ninoko\": \"にの子\",\n        \"kibii mocha\": \"きびぃもか\",\n        \"ohnaka ito\": \"大仲いと\",\n        \"anzuame\": \"杏飴\",\n        \"takaharu\": \"タカハル\",\n        \"asanoha\": \"麻の葉\",\n        \"sasaki akira\": \"ささきあきら\",\n        \"asahina hikage\": \"アサヒナヒカゲ\",\n        \"piyodera mucha\": \"ぴよ寺むちゃ\",\n        \"daichi\": \"矢座だいち\",\n        \"ramchi\": \"らむち\",\n        \"mignon\": \"mignon\",\n        \"natsuki marina\": \"夏月まりな\",\n        \"watanon\": \"わたのん\",\n        \"amami mikihiro\": \"甘味みきひろ\",\n        \"mikage\": \"未影\",\n        \"mk\": \"MK\",\n        \"aria.\": \"ありあ。\",\n        \"kago\": \"加护\",\n        \"akashi rokuro\": \"明石六露\",\n        \"kuon\": \"久遠\",\n        \"miyasu risa\": \"ミヤスリサ\",\n        \"konomi\": \"konomi\",\n        \"bokkun\": \"ぼっくん\",\n        \"ikura nagisa\": \"伊倉ナギサ\",\n        \"furukawa odoro\": \"古河おどろ\",\n        \"nishiki chizu\": \"西木地図\",\n        \"konka\": \"绀菓\",\n        \"hakomaru\": \"箱。\",\n        \"makoto\": \"MAKOTO\",\n        \"iori\": \"ゐおり\",\n        \"chocoan\": \"ちょこ庵\",\n        \"hisagi\": \"ひさぎ\",\n        \"arato asato\": \"あらと安里\",\n        \"caigen\": \"菜★梗\",\n        \"maple\": \"まぷる\",\n        \"kon\": \"紺\",\n        \"shibi\": \"ShiBi\",\n        \"yamu\": \"やむっ\",\n        \"senyuu\": \"戦友\",\n        \"noukatu\": \"noukatu\",\n        \"yoyomura\": \"夜々村\",\n        \"yuhi\": \"ゆーひ\",\n        \"katase aoko\": \"片瀬蒼子\",\n        \"yuzuri ai\": \"ゆずりあい\",\n        \"tony taka\": \"Tony\",\n        \"fal maro\": \"ファルまろ\",\n        \"hiru okita\": \"昼沖太\",\n        \"marumie\": \"まるミエ\",\n        \"hiyashi mirano\": \"ひやしみらの\",\n        \"kageyama kuroto\": \"景山玄都\",\n        \"netarou\": \"ねたろう\",\n        \"itou eight\": \"伊藤エイト\",\n        \"sajipen\": \"さじペん\",\n        \"dam\": \"だむ\",\n        \"ko-yahu\": \"こーやふ\",\n        \"toufu\": \"とうふ\",\n        \"kuriyuzu kuryuu\": \"栗柚くりゅー\",\n        \"homu\": \"homu\",\n        \"kamelie\": \"Kamelie\",\n        \"nicoby\": \"にこびぃ\",\n        \"mitsuba choco\": \"三つ葉ちょこ\",\n        \"miyama\": \"箕山\",\n        \"ayagi daifuku\": \"綾城大福\",\n        \"taruhi\": \"たるひ\",\n        \"kikunosukemaru\": \"菊のすけまる\",\n        \"hamaken.\": \"はまけん。\",\n        \"konohana\": \"此花\",\n        \"hirotti\": \"ひろっち\",\n        \"rogobo\": \"ろごぼ\",\n        \"momoya show-neko\": \"桃屋しょう猫\",\n        \"mashiro yukiya\": \"真白雪夜\",\n        \"hikagi tatsuhiko\": \"绯键龙彦\",\n        \"tekehiro\": \"てけひろ\",\n        \"marumikan\": \"丸美甘\",\n        \"yamato bambies\": \"ヤマトバンビーズ\",\n        \"azuma sawayoshi\": \"アズマサワヨシ\",\n        \"oyabe ryo\": \"小矢部亮\",\n        \"naoharu\": \"直晴\",\n        \"tamashii carnival botamochi\": \"魂カーニバルぼたもち\",\n        \"arima kouichi\": \"有马纮一\",\n        \"kamochome\": \"かもちょめ\",\n        \"horny-oni\": \"Horny-Oni\",\n        \"sora ni tori ga\": \"空に鳥が\",\n        \"serebi ryousangata\": \"セレビィ量産型\",\n        \"abara heiki\": \"肋兵器\",\n        \"ukami\": \"うかみ\",\n        \"itou hachi\": \"伊藤ハチ\",\n        \"nishihata kei\": \"西畑けい\",\n        \"bon\": \"凡\",\n        \"john\": \"じょん\",\n        \"tamaki kurou\": \"鐶九朗\",\n        \"haiba\": \"灰叶\",\n        \"makita yoshiharu\": \"卷田佳春\",\n        \"asahiru yuu\": \"浅ひるゆう\",\n        \"rokumaru inami\": \"六丸いなみ\",\n        \"mogu\": \"モグ\",\n        \"cbgb\": \"CBGB\",\n        \"eretto\": \"えれっと\",\n        \"ken hultgren\": \"赓·赫尔脱格仑\",\n        \"senmu\": \"SeNMU\",\n        \"arito arayuru\": \"有都あらゆる\",\n        \"9so\": \"9SO\",\n        \"haruba negi\": \"春场葱\",\n        \"maki komura\": \"真木こむら\",\n        \"sakamata nerimono\": \"逆又练物\",\n        \"nagata maria\": \"永田まりあ\",\n        \"kinona\": \"紀奈\",\n        \"hano haruka\": \"葉乃はるか\",\n        \"shiden hiro\": \"四電ヒロ\",\n        \"kyabetsuka\": \"篝町狐懐\",\n        \"midoriha mint\": \"緑葉みんと | 洗面きぬ子\",\n        \"scott robertson\": \"斯科特·罗伯逊\",\n        \"andrew loomis\": \"安德鲁·路米斯\",\n        \"bert dodson\": \"伯特·多德森\",\n        \"kuzuya ramurin\": \"葛谷らむりん\",\n        \"taka\": \"タカ\",\n        \"sw\": \"Sw（すぅ）\",\n        \"piro\": \"Piro\",\n        \"itou noizi\": \"いとうのいぢ\",\n        \"hirose madoka\": \"広瀬まどか\",\n        \"nabe wataru\": \"名部渉\",\n        \"gaou\": \"がおう\",\n        \"umekiti\": \"うめきち\",\n        \"onaka emi\": \"小中えみ\",\n        \"bobobo\": \"ボボボ\",\n        \"okinaga umanosuke\": \"翁贺马乃助\",\n        \"yoikono tt\": \"ヨイコノtt\",\n        \"gosaiji\": \"ごさいじ\",\n        \"rokkotsu\": \"肋骨\",\n        \"akino komichi\": \"秋乃こみち\",\n        \"ido\": \"いど\",\n        \"asaki takayuki\": \"朝木贵行\",\n        \"koyanagi royal\": \"小柳ロイヤル\",\n        \"iketaki ganguten\": \"池泷玩具店\",\n        \"akagi kuro\": \"赤木クロ\",\n        \"ash yokoshima\": \"Ash横島\",\n        \"haitokukan\": \"背德汉\",\n        \"henkuma\": \"变熊\",\n        \"kawashima yoshio\": \"川島よしお\",\n        \"kanari tokusaku\": \"鹿成トクサク\",\n        \"onigiri unicorn\": \"鬼斬ゆにこーん\",\n        \"namae renraku\": \"なまえ れんらく\",\n        \"kouda tomohiro\": \"幸田朋弘\",\n        \"senbei\": \"煎饼\",\n        \"corundum\": \"こらんだむ\",\n        \"miyabe kiwi\": \"宮部キウイ\",\n        \"dendenbotch\": \"でんでんぼっち\",\n        \"redash\": \"RedAsh\",\n        \"kuroha reiji\": \"九郎\",\n        \"kirekawa\": \"きれかわ\",\n        \"taro oimo\": \"たろおいも\",\n        \"akimoto dai\": \"あきもと大\",\n        \"kumada\": \"くまのとおる（くまだ）\",\n        \"nipi\": \"nipi\",\n        \"misakana\": \"みさかな\",\n        \"cru\": \"Cru\",\n        \"garana\": \"ガラナ\",\n        \"muraimura\": \"村井村\",\n        \"murasakio\": \"紫御\",\n        \"itohana\": \"イトハナ\",\n        \"shirogane hina\": \"シロガネヒナ\",\n        \"chikuwa.\": \"ちくわ。\",\n        \"naka\": \"なか\",\n        \"midorino haru\": \"緑野はる\",\n        \"ma-sa\": \"MA-SA\",\n        \"ameno usari\": \"飴乃うさり\",\n        \"mizukaga syou\": \"水利硝\",\n        \"kudo\": \"９℃\",\n        \"sumii\": \"すみい\",\n        \"ai takurou\": \"安威拓郎\",\n        \"nagisora riku\": \"凪空りく\",\n        \"minase\": \"御奈瀬\",\n        \"niwacho\": \"niwacho\",\n        \"yasaka syu\": \"矢坂しゅう\",\n        \"nimuno\": \"にむの\",\n        \"watanore\": \"わたのれ\",\n        \"qblade\": \"blade\",\n        \"mugen no sudadokei\": \"無限の須田時計\",\n        \"omimo\": \"おみも\",\n        \"minami aomori\": \"南森\",\n        \"uo denim\": \"魚デニム\",\n        \"mitsuba minoru\": \"三叶稔\",\n        \"zeros\": \"是露巣\",\n        \"necomi\": \"necömi\",\n        \"cona kinaco\": \"小奈きなこ\",\n        \"kamioka chirol\": \"神岡ちろる\",\n        \"mikoma sanagi\": \"美驹沙名希\",\n        \"nanashiki fuka\": \"七色風香\",\n        \"ashita\": \"アシタ\",\n        \"midorinocha\": \"みどりのちゃ\",\n        \"tsurukawa yashiro\": \"鶴川社\",\n        \"samizu gumi\": \"さみずぐみ\",\n        \"seijin\": \"せーじん\",\n        \"yukisaki miale\": \"雪咲MIALE\",\n        \"shennai misha\": \"神奈弥莎\",\n        \"tsunano\": \"つなの\",\n        \"eizan\": \"影斩\",\n        \"akino kabocha\": \"秋野かぼちゃ\",\n        \"kiyu fuyuki\": \"季結ふゆき\",\n        \"ankoman\": \"あんこまん\",\n        \"highlow\": \"废狼\",\n        \"hanao.\": \"熊尾もふもふ\",\n        \"otokura ringo\": \"乙倉りんご\",\n        \"rougetu\": \"胧月\",\n        \"ryuga syo\": \"龍牙翔\",\n        \"kurage modoki\": \"くらげもどき\",\n        \"oozora wakaba\": \"大空若叶\",\n        \"nigirimeshi\": \"にぎりめし\",\n        \"minami chisato\": \"南ちさと（有澤司）\",\n        \"aotsuki shinobu\": \"蒼月しのぶ\",\n        \"oshima aki\": \"大岛あき\",\n        \"kimino tomonari\": \"君野朋成\",\n        \"sune\": \"sune\",\n        \"molgen\": \"モルゲン\",\n        \"skylader\": \"すかいれーだー\",\n        \"topia\": \"とぴあ\",\n        \"nakamura regura\": \"仲村レグラ\",\n        \"narumiya\": \"鳴海也\",\n        \"ekakibit\": \"えかきびと\",\n        \"yuki\": \"雪\",\n        \"tadano mezashi\": \"只野めざし\",\n        \"ojo\": \"おじょ\",\n        \"himino\": \"ひみの\",\n        \"6u\": \"6U☆\",\n        \"nagioka\": \"凪丘\",\n        \"yukiguni yuu\": \"雪国裕\",\n        \"jairou\": \"ジャイロウ\",\n        \"hirune\": \"昼寝\",\n        \"nanatsuda\": \"七ツ田\",\n        \"fun bo\": \"ふんぼ\",\n        \"siseki hirame\": \"芝石\",\n        \"nattou mazeo\": \"納豆まぜお\",\n        \"yamago\": \"山后\",\n        \"hamon ai\": \"波纹爱\",\n        \"misaka12003\": \"御坂12003\",\n        \"mayafufu -kakko- kashikoi\": \"まやふふ(賢)\",\n        \"yamanashi yuuya\": \"山梨ユウヤ\",\n        \"ashinoue futomomo\": \"苇上太桃\",\n        \"echigoya takeru\": \"越後屋タケル\",\n        \"kawauchi\": \"川内\",\n        \"aoi yun\": \"蒼井ゆん\",\n        \"nimoshi\": \"にもし\",\n        \"ennorei\": \"円之怜\",\n        \"yuuki sonisuke\": \"ゆうきそにすけ\",\n        \"kurororo rororo\": \"くろろろろろろ\",\n        \"junsui na fujunbutsu\": \"純粋な不純物\",\n        \"takano saku\": \"嵩乃朔\",\n        \"sikusiku\": \"シクシク\",\n        \"shiguma\": \"しぐま\",\n        \"hisona\": \"ひそな\",\n        \"nakatani nio\": \"仲谷鳰\",\n        \"crerp\": \"くれ～ぷ\",\n        \"indozou\": \"インド僧\",\n        \"itou yuuji\": \"イトウゆーじ\",\n        \"yu-ki\": \"ユーキ\",\n        \"gotoh juan\": \"后藤寿庵\",\n        \"binto\": \"瓶人\",\n        \"itaru\": \"至る\",\n        \"wasavi 8\": \"wasavi_8\",\n        \"kitahara aki\": \"北原亚希\",\n        \"satsuki itsuka\": \"五月五日\",\n        \"kawaraya\": \"瓦爺\",\n        \"kamizuki shiki\": \"守月史贵\",\n        \"ponekusan\": \"ポネクサン\",\n        \"akasa tanu\": \"赤佐たぬ\",\n        \"takeya\": \"竹や\",\n        \"makihitsuji\": \"巻羊\",\n        \"jimmy\": \"jimmy\",\n        \"healthyman\": \"ヘルシーマン\",\n        \"aokoji\": \"青こじ\",\n        \"miginohito mitsuru\": \"右の人みつる\",\n        \"hidari kagetora\": \"左カゲトラ\",\n        \"suruga kuroitsu\": \"駿河クロイツ\",\n        \"mauve\": \"Mauve\",\n        \"saeki sola\": \"佐伯ソラ\",\n        \"tange suzuki\": \"丹下スズキ\",\n        \"neji\": \"寝路\",\n        \"negom\": \"ネゴム\",\n        \"opanchu\": \"おぱんちゅ\",\n        \"xion\": \"Xion\",\n        \"tomoki tomonori\": \"ともきとものり\",\n        \"pistonring nishizawa\": \"西泽みずき\",\n        \"kokuryuugan\": \"黑龙眼\",\n        \"kazakami sudare\": \"かざかみすだれ\",\n        \"paryi\": \"帕里\",\n        \"satoh\": \"砂糖\",\n        \"amatake akewo\": \"甘竹朱郎\",\n        \"jikasei\": \"自家製\",\n        \"sakura hiyori\": \"桜ひより\",\n        \"mukyu\": \"無休\",\n        \"h2so4\": \"H2SO4\",\n        \"yamada konayuki\": \"山田コナユキ\",\n        \"mizushima sorahiko\": \"水岛空彦\",\n        \"taneno nakami\": \"種乃なかみ\",\n        \"mgmee\": \"MGMEE\",\n        \"nathaniel pennel\": \"Pennel\",\n        \"hadron9\": \"HADRON9\",\n        \"supu\": \"すぷ\",\n        \"kitaku\": \"きたく\",\n        \"shirota dai\": \"白田太\",\n        \"moyazou\": \"もや造\",\n        \"kuguri oimo\": \"九栗おいも\",\n        \"namio.h.ryuudou\": \"NAMIO.H.龍堂\",\n        \"kazawa\": \"かざわ\",\n        \"nukaji\": \"ぬかじ（wizakun）\",\n        \"negresco\": \"Negresco\",\n        \"navia\": \"なびあ\",\n        \"sagaraten\": \"纱柄天\",\n        \"naoto\": \"naoto\",\n        \"green\": \"GreeN\",\n        \"wakured\": \"和紅\",\n        \"mankai kaika\": \"满开开花\",\n        \"kumatora\": \"天空太一\",\n        \"teshima nari.\": \"手島nari\",\n        \"amashiro natsuki\": \"甘城なつき\",\n        \"tumiki akeno\": \"積木あけの\",\n        \"miwano rag\": \"美和野らぐ\",\n        \"shigure ui\": \"しぐれうい\",\n        \"nanahara fuyuki\": \"七原冬雪\",\n        \"fukuinu\": \"福犬\",\n        \"shotan\": \"しょたん\",\n        \"ezoshika\": \"エゾシカ\",\n        \"taketori zaiku\": \"竹取细工\",\n        \"harada shoutarou\": \"原田将太郎\",\n        \"kyougoku shin\": \"京極しん\",\n        \"yamamori\": \"山森\",\n        \"daki makura\": \"滝まくら\",\n        \"nagishiro mito\": \"凪白みと\",\n        \"minase nagi\": \"みなせなぎ\",\n        \"nii manabu\": \"仁井学\",\n        \"o-zicha\": \"おーじ茶\",\n        \"p19\": \"p19\",\n        \"sakuragi ren\": \"桜木蓮\",\n        \"poruno ibuki\": \"はるのいぶき\",\n        \"kenichi\": \"ケンイチ\",\n        \"mashu\": \"ましゅー\",\n        \"na-ga\": \"Na-Ga\",\n        \"sakurazawa izumi\": \"桜沢いづみ\",\n        \"hinayuki usa\": \"ヒナユキウサ\",\n        \"amamitu kousuke\": \"甘蜜こうすけ\",\n        \"atiki\": \"Aちき\",\n        \"masaru.jp\": \"まさる.jp\",\n        \"kizuki rei\": \"傷希レイ\",\n        \"arisu kazumi\": \"有栖かずみ\",\n        \"nanashiki\": \"七色\",\n        \"tokuno yuika\": \"徳之ゆいか\",\n        \"cut\": \"カット\",\n        \"taya\": \"TAYA\",\n        \"kamaboko\": \"釜ボコ\",\n        \"mountainhan\": \"山含\",\n        \"ahugan sugita\": \"アフガン杉田\",\n        \"kurebayashi asami\": \"暮林あさ美\",\n        \"oshiro\": \"阿白\",\n        \"hakaishin\": \"破坏神\",\n        \"muryotaro\": \"むりょたろ\",\n        \"stealyy\": \"すてりい\",\n        \"yamabukiiro\": \"山吹色\",\n        \"gotoh\": \"ごとー\",\n        \"casino\": \"カジノ\",\n        \"hanekoto\": \"はねこと\",\n        \"kanzaki hiro\": \"かんざきひろ\",\n        \"saki chisuzu\": \"さき千鈴\",\n        \"fujoujoshi\": \"不嬢女子\",\n        \"mikuni saho\": \"御国纱帆\",\n        \"tatsuse yumino\": \"龙濑弓乃\",\n        \"ma-kurou\": \"まー九郎\",\n        \"maitaimu\": \"舞大梦\",\n        \"kyozip\": \"狂zip\",\n        \"nishi yoshiyuki\": \"西义之\",\n        \"momonosukebe\": \"腿之助兵卫\",\n        \"torichamaru\": \"鸟茶丸\",\n        \"uonome beji\": \"魚目ベジ\",\n        \"j-kisarazu\": \"JK更津\",\n        \"greco roman\": \"暮古浪漫\",\n        \"shugao\": \"しゅがお\",\n        \"andoryu\": \"安堂流\",\n        \"commamion\": \"狐狸恩\",\n        \"numa\": \"numa | 沼\",\n        \"amagappa shoujogun\": \"雨がっぱ少女群\",\n        \"suzumi raika\": \"凉海来夏\",\n        \"aramaki echizen\": \"荒卷越前\",\n        \"nakada rumi\": \"中田瑠美\",\n        \"yuzuto sen\": \"柚十扇\",\n        \"hayashi kewi\": \"林けゐ\",\n        \"tadano saboten\": \"ただのサボテン\",\n        \"hara yui\": \"原悠衣\",\n        \"ibuki notsu\": \"伊吹のつ\",\n        \"kinako\": \"木なこ\",\n        \"shiino sera\": \"椎野せら\",\n        \"kusakabe\": \"草壁\",\n        \"kaiware\": \"かいわれ\",\n        \"nakyo\": \"なきょ\",\n        \"kutori panya\": \"九鳥ぱんや\",\n        \"chiica\": \"ちぃか\",\n        \"ushiro\": \"う白\",\n        \"yuyumatsu\": \"ゆゆまつ\",\n        \"sakura shiho\": \"紗倉シホ\",\n        \"gomzi\": \"gomzi\",\n        \"amamitsuki\": \"天三月\",\n        \"xenon\": \"世音\",\n        \"gyozanuko\": \"餃子ぬこ\",\n        \"raptor7\": \"ラプトル７\",\n        \"toshi\": \"toshi\",\n        \"taishinkokuoh anton\": \"大秦国王安敦\",\n        \"wanyanaguda\": \"完颜阿骨打\",\n        \"kaede\": \"ゆか\",\n        \"fummy\": \"ふみー\",\n        \"shobu\": \"菖蒲\",\n        \"sakayama shinta\": \"茶化山心太\",\n        \"takasaki keisuke\": \"高咲圭介\",\n        \"ushino naka\": \"うしの菜夏\",\n        \"doskoinpo\": \"doskoinpo\",\n        \"rin yuu\": \"リン☆ユウ\",\n        \"mushi\": \"小虫\",\n        \"trigger\": \"TRIGGER\",\n        \"miwabe sakura\": \"みわべさくら\",\n        \"shirisensha\": \"尻戦車\",\n        \"makabe gorou\": \"真壁吾郎\",\n        \"kakuninii\": \"角煮煮\",\n        \"tukimi daifuku\": \"月見大福\",\n        \"satou chagashi\": \"佐藤茶菓子\",\n        \"touno itsuki\": \"桐野いつき\",\n        \"gekka kaguya\": \"月下火愚夜\",\n        \"maguro shining\": \"まぐろシャイニング\",\n        \"santa\": \"santa\",\n        \"togi\": \"とぎ\",\n        \"akizuki mac\": \"秋月まく\",\n        \"fujii jun\": \"藤伊洵\",\n        \"morino bambi\": \"森乃ばんび\",\n        \"nekoi mie\": \"猫井ミィ\",\n        \"ikujinashi no fetishist\": \"いくじなしのフェティシスト\",\n        \"chomikuplus\": \"Chomikuplus\",\n        \"fuzui\": \"不随\",\n        \"tokomaya keita\": \"とこまやけいた\",\n        \"holiday yasumi\": \"堀出井靖水\",\n        \"ronrinri ronri\": \"論倫理ろんり\",\n        \"tsukueno elf\": \"机野エルフ\",\n        \"hiiragi popura\": \"柊ぽぷら\",\n        \"nogiwa kaede\": \"野際かえで\",\n        \"hitoi\": \"灯問\",\n        \"bouen\": \"ぼうえん\",\n        \"tsukudani\": \"佃煮\",\n        \"shigemiya kyouhei\": \"樹宮匡平\",\n        \"roshin\": \"炉心\",\n        \"mamemametama\": \"まめまめたま\",\n        \"nakagami takashi\": \"中上たかし\",\n        \"ukanmuri\": \"うかんむり\",\n        \"momotomato\": \"桃とまと\",\n        \"muchin\": \"むーちん\",\n        \"hou\": \"蜂様 (ほう)\",\n        \"nakamura b-ta\": \"中村べーた\",\n        \"lengsediaokafei\": \"冷色调咖啡\",\n        \"naruse hirofumi\": \"鸣濑ひろふみ\",\n        \"momose sumomo\": \"桃瀬すもも\",\n        \"nukuo\": \"ヌク男\",\n        \"sindoll\": \"シンドール\",\n        \"horikawa gorou\": \"堀川悟郎\",\n        \"kandenki\": \"感电器\",\n        \"tsukimi ruko\": \"月見ルコ\",\n        \"kameyama shiruko\": \"亀山しるこ\",\n        \"takimoto yukari\": \"瀧本ゆかり\",\n        \"sakamoto kafka\": \"阪本KAFKA\",\n        \"itsutsuse\": \"古川五势（いつつせ）\",\n        \"chiyingzai\": \"帜瑛\",\n        \"isako rokuroh\": \"井硲六郎\",\n        \"nigiri usagi\": \"にぎりうさぎ\",\n        \"mizumizuni\": \"見ず水煮\",\n        \"shinagawa mikuzu\": \"品川ミクズ\",\n        \"wakamatsu\": \"わかまつ\",\n        \"geko\": \"GEKO\",\n        \"yatosaki haru\": \"やとさきはる\",\n        \"ootsuka mahiro\": \"大塚まひろ\",\n        \"fuyuichi monme\": \"冬壱もんめ\",\n        \"momosawa\": \"ももさわ\",\n        \"sangatsu sanichi\": \"三月さんいち\",\n        \"konnyaku\": \"蒟蒻\",\n        \"yaminabe\": \"やみなべ\",\n        \"tenjo ryuka\": \"天壌りゅか\",\n        \"nekoya\": \"猫夜\",\n        \"muninshiki\": \"むにんしき\",\n        \"masayo\": \"まさよ\",\n        \"momozu komamochi\": \"桃豆こまもち\",\n        \"hoshii nasake\": \"星井情\",\n        \"amezawa koma\": \"飴沢狛\",\n        \"kanda dan\": \"館田ダン\",\n        \"mikuni mizuki\": \"みくに瑞貴\",\n        \"yamamoto naoki\": \"山本直树\",\n        \"neromashin\": \"ねろましん\",\n        \"yuugen\": \"ゆーげん\",\n        \"oshio\": \"おしお\",\n        \"torotarou\": \"トロ太郎\",\n        \"mishima kurone\": \"三岛黑音\",\n        \"himuro shunsuke\": \"氷室しゅんすけ\",\n        \"haikome\": \"灰米\",\n        \"bizen dorobune\": \"備前泥舟\",\n        \"kagura nanaki\": \"神楽七姫\",\n        \"nozomi tsubame\": \"希望つばめ\",\n        \"saba satoru\": \"佐波サトル\",\n        \"nagashiro rouge\": \"長代ルージュ\",\n        \"kuroiwa menou\": \"黑岩玛瑙\",\n        \"isorashi\": \"五十嵐唱乃\",\n        \"minato fumi\": \"三巷文\",\n        \"hashida mamoru\": \"桥田镇\",\n        \"hiryuu ran\": \"飞龙乱\",\n        \"nyoro nyorozou\": \"清炭ハリケーン\",\n        \"denkichi\": \"でん吉\",\n        \"qdou kei\": \"Q堂恵\",\n        \"hisen kaede\": \"緋仙カエデ\",\n        \"kazushiki midori\": \"一色緑\",\n        \"someoka yusura\": \"染岡ゆすら\",\n        \"haruse hiroki\": \"晴瀬ひろき\",\n        \"tenmu shinryuusai\": \"天夢森流彩\",\n        \"anza yuu\": \"あんざゆう\",\n        \"amane ruri\": \"天音るり\",\n        \"dytm\": \"DYTM\",\n        \"gentsuki\": \"ゲンツキ\",\n        \"iwasaki yuuki\": \"岩崎ユウキ\",\n        \"mashiraga aki\": \"猿駕アキ\",\n        \"midori aoi\": \"みどり葵\",\n        \"musha sabu\": \"武者サブ\",\n        \"sanjuurou\": \"三十郎\",\n        \"souji hougu\": \"扫除朋具\",\n        \"uousaoh\": \"鱼ウサ王\",\n        \"kuroharuto\": \"くろはると\",\n        \"oomori\": \"大盛り\",\n        \"yasson yoshiyuki\": \"やっそん義之\",\n        \"hiyori mizuki\": \"陽寄瑞貴\",\n        \"fushoku\": \"腐蝕\",\n        \"coupe\": \"こっぺ\",\n        \"panchira steak\": \"ぱんちらステーキ\",\n        \"saizu nitou gunsou\": \"才津二等軍曹\",\n        \"nakamura rohane\": \"中村六翅\",\n        \"nohito\": \"nohito\",\n        \"turiganesou\": \"釣鐘草\",\n        \"kyo1\": \"響樹はじめ\",\n        \"shimimaru\": \"纸鱼丸\",\n        \"arai kei\": \"荒井启\",\n        \"suzudama renri\": \"鈴玉レンリ\",\n        \"kurokoshi you\": \"黑越阳\",\n        \"inato serere\": \"稲戸せれれ\",\n        \"akitsuki itsuki\": \"秋月伊槻\",\n        \"yd\": \"yd\",\n        \"azuma yuki\": \"东由希\",\n        \"enokido\": \"エノキドォ\",\n        \"gokubuto mayuge\": \"极太眉毛\",\n        \"hakaba\": \"墓場\",\n        \"hitotsuba\": \"ひとつば\",\n        \"furyouhin\": \"不良品\",\n        \"gesundheit\": \"ゲズンタイト\",\n        \"takamichi\": \"たかみち\",\n        \"aki99\": \"aki99\",\n        \"rensyu\": \"Rensyu\",\n        \"himitsu\": \"蜜酱（ひみつ）\",\n        \"tooo\": \"tooo\",\n        \"abubu\": \"あぶぶ\",\n        \"red romanov\": \"はだぱるか\",\n        \"bubukka\": \"ぶぶっか\",\n        \"itosugi masahiro\": \"糸杉柾宏\",\n        \"a-801\": \"アニメ8OI\",\n        \"araki akira\": \"あらきあきら\",\n        \"haregama shiina\": \"晴釜椎名\",\n        \"misao.\": \"みさお。\",\n        \"yamazaki kana\": \"山崎かな\",\n        \"kanyapyi\": \"かにゃぴぃ\",\n        \"maruta\": \"MARUTA\",\n        \"ichiichi yuuna\": \"一市裕納\",\n        \"rinrin\": \"RINRIN\",\n        \"meramera jealousy\": \"メラメラジェラシー\",\n        \"miyazaki maya\": \"宫崎摩耶\",\n        \"sasakura ayato\": \"笹仓绫人\",\n        \"mori guruta\": \"森ぐる太\",\n        \"mayonnaise.\": \"まよねーず。\",\n        \"broiler\": \"broiler\",\n        \"zukiki\": \"ZUKI树\",\n        \"urute\": \"urute\",\n        \"anyanko\": \"あにゃんこ\",\n        \"inuarasi\": \"犬嵐\",\n        \"sasahara yuuki\": \"佐佐原忧树\",\n        \"wakaba kaoru\": \"わかばかおる\",\n        \"teruki kuma\": \"てるき熊\",\n        \"shitou\": \"四头\",\n        \"ryunnu\": \"りゅんぬ\",\n        \"sage\": \"Sage（りゅんぬ ）\",\n        \"hikami izuto\": \"ひかみいずと\",\n        \"e10\": \"e10\",\n        \"tawawaringo\": \"たわわりんご\",\n        \"ujiie moku\": \"氏家もく\",\n        \"urotan\": \"うろたん\",\n        \"kaishinshi\": \"怪绅士\",\n        \"kakkuu\": \"滑空\",\n        \"urajirou\": \"杉浦次郎\",\n        \"chuushin kuranosuke\": \"忠臣藏之介\",\n        \"tsukiyoshi hiroki\": \"月吉ヒロキ\",\n        \"tomozawa shou\": \"智泽渚优\",\n        \"nakamura mizumo\": \"中村みずも\",\n        \"nendo.\": \"ねんど。\",\n        \"hokama mitsuri\": \"ほかまみつり\",\n        \"horihone saizou\": \"掘骨碎三\",\n        \"toruneko\": \"获る猫\",\n        \"sirokuma shake\": \"白クマシェイク\",\n        \"mizui kaou\": \"瑞井鹿央\",\n        \"minasuki popuri\": \"みなすきぽぷり\",\n        \"hoshino shiho\": \"星野志保\",\n        \"miyashita miki\": \"宫下未纪\",\n        \"yamamoto kumoi\": \"山本云居\",\n        \"marcy dog\": \"MARCYどっぐ\",\n        \"asahina makoto\": \"朝比奈诚\",\n        \"majoccoid\": \"majoccoid\",\n        \"aogiri penta\": \"あおぎりぺんた\",\n        \"mitsuba\": \"三叶 | みつば\",\n        \"ppshex\": \"芝士糖\",\n        \"misakamitoko0903\": \"电磁炮二期\",\n        \"kimimaru\": \"きみまる（东毅）\",\n        \"softcharm\": \"SOFTCHARM\",\n        \"tsuruyama mito\": \"鶴山ミト\",\n        \"tanimachi maid\": \"谷町女仆\",\n        \"bookmoun10\": \"ぶっくまうんten\",\n        \"ogataaz\": \"OgataAz\",\n        \"ayato ayari\": \"あやとあやり\",\n        \"rangetsu\": \"岚月\",\n        \"misakura nankotsu\": \"御樱软骨\",\n        \"kio seiji\": \"きお誠児\",\n        \"riyo\": \"リヨ\",\n        \"hanamaki kaeru\": \"花巻かえる\",\n        \"bennys\": \"BENNY'S\",\n        \"inaba cozy\": \"稻叶COZY\",\n        \"oie kaeru\": \"御家かえる\",\n        \"chinzurena\": \"チンズリーナ\",\n        \"palco nagashima\": \"パルコ長嶋\",\n        \"ponpon itai\": \"ぽんぽんイタイ\",\n        \"takeuchi takashi\": \"武内崇\",\n        \"takahashi keitarou\": \"高桥庆太郎\",\n        \"shima drill\": \"しまどりる\",\n        \"bunbun\": \"BUNBUN\",\n        \"abec\": \"abec\",\n        \"a-10\": \"A-10（不破大辅）\",\n        \"atori k\": \"秋尚\",\n        \"umashika\": \"うましか\",\n        \"ebifly\": \"えびふらい\",\n        \"azumawari\": \"あずまわり\",\n        \"namori\": \"Namori\",\n        \"hata kenjirou\": \"畑健二郎\",\n        \"gelatin\": \"沟口明胶\",\n        \"utahane w\": \"うたはね\",\n        \"kusano kouichi\": \"草野红壹\",\n        \"konata hyuura\": \"虎向Hyuura\",\n        \"konno azure\": \"紺野あずれ\",\n        \"sawano akira\": \"泽野明\",\n        \"shiran takashi\": \"しらんたかし\",\n        \"matra milan\": \"的良米兰\",\n        \"morisaki kurumi\": \"森崎胡桃\",\n        \"todoroki shin\": \"轰真\",\n        \"hirotake awataka\": \"粟岳高弘\",\n        \"hayake\": \"はやけ\",\n        \"hasblow cream\": \"はすぶろくりーむ\",\n        \"kagami fumio\": \"加賀美ふみを\",\n        \"kamirenjaku sanpei\": \"上连雀三平\",\n        \"kyaradain\": \"きゃらだいん\",\n        \"minna daisuki\": \"みんなだいすき\",\n        \"cloba.u\": \"Cloba・U\",\n        \"binsen\": \"びんせん\",\n        \"koari\": \"小蚁\",\n        \"toriburi\": \"トリブリ\",\n        \"osanpo suisou\": \"おさんぽ水槽\",\n        \"ohaguro dobu\": \"御歯黒溝（桜シロウ）\",\n        \"makio\": \"マキオ\",\n        \"mikaduchi\": \"みかづち\",\n        \"ogu\": \"おぐ\",\n        \"aoki kanji\": \"青木干治\",\n        \"amagi kei\": \"亚麻木硅\",\n        \"ikumo taisuke\": \"井云泰助\",\n        \"mana\": \"MANA\",\n        \"hanpen\": \"はんぺん\",\n        \"zeroshiki kouichi\": \"ぷぅ崎ぷぅ奈\",\n        \"kagono tori\": \"かごのとり\",\n        \"haga yui\": \"叶贺唯\",\n        \"shinichirou otsuka\": \"大冢真一郎\",\n        \"haniwa hao\": \"はにわはお\",\n        \"akitaka mika\": \"明贵美加\",\n        \"kanabun\": \"kanabun\",\n        \"miyasaka takaji\": \"ミヤサカタカジ\",\n        \"crowe\": \"クロエ\",\n        \"ruhika\": \"ルヒカ\",\n        \"oobanburumai\": \"オオバンブルマイ\",\n        \"shin fuzen\": \"シン 普禅\",\n        \"magekichi\": \"まげきち\",\n        \"juna\": \"JUNA\",\n        \"kotokane hajime\": \"ことかねはじめ\",\n        \"yoshitani ganjitsu\": \"义谷元日\",\n        \"kawai masaki\": \"川合正起\",\n        \"wada wau\": \"和田羽烏\",\n        \"rondonko\": \"ろんどんこ\",\n        \"pirason\": \"ぴらそん\",\n        \"zettai yarumoni\": \"絶対やるもに\",\n        \"shishi senmaru\": \"狮子千丸\",\n        \"kameyoshi ichiko\": \"亀吉いちこ\",\n        \"leonardo 16sei\": \"れオナるド16世\",\n        \"funwari rice\": \"ふんわり☆らいす\",\n        \"akao\": \"朱尾\",\n        \"omecho\": \"おめちょ\",\n        \"chicken\": \"チキン\",\n        \"uba yoshiyuki\": \"宇场义行\",\n        \"syokuyou-mogura\": \"Syokuyou-Mogura\",\n        \"nanjou asuka\": \"南条飞鸟\",\n        \"kurenai yuuji\": \"紅ゆーじ\",\n        \"kohsaka novak\": \"高坂のばく\",\n        \"osisio\": \"osisio\",\n        \"kazune haka\": \"和音ハカ\",\n        \"yatomi\": \"やとみ\",\n        \"karaage3\": \"からあげ3\",\n        \"gibachan\": \"ぎばちゃん\",\n        \"takitarou\": \"滝太郎\",\n        \"yangcong chaodasuan\": \"洋葱炒大蒜\",\n        \"tokunou shoutarou\": \"得能正太郎\",\n        \"tsugumi suzuma\": \"亚美寿真\",\n        \"kakao\": \"kakao\",\n        \"akabane\": \"アカバネ\",\n        \"miyashiro ryuutarou\": \"三夜代龙太郎\",\n        \"meganei\": \"メガねぃ\",\n        \"tamatanuki\": \"たまたぬき\",\n        \"asabi miho\": \"山葵美保\",\n        \"matsumiya kiseri\": \"茉宮祈芹\",\n        \"hirokawa\": \"広川\",\n        \"kamiya yuu\": \"榎宮祐\",\n        \"imigimuru\": \"いみぎむる\",\n        \"kise itsuki\": \"木濑树\",\n        \"shono kotaro\": \"宵野小太郎\",\n        \"rurudo\": \"rurudo\",\n        \"ashima takumi\": \"芦間拓海\",\n        \"nishigori atsushi\": \"锦织敦史\",\n        \"nanashimushi\": \"ななし虫\",\n        \"ippo\": \"ippo\",\n        \"smomo\": \"smomo\",\n        \"madoromi\": \"まどろみ\",\n        \"nishiyama yuichi\": \"にしやまゆーいち\",\n        \"azumi akitake\": \"安曇アキタケ\",\n        \"dondakei\": \"どんだけい\",\n        \"imaishi hiroyuki\": \"今石洋之\",\n        \"gilse\": \"Gilse\",\n        \"junkie\": \"千要よゆち\",\n        \"nibiirokaden\": \"鈍色家電\",\n        \"migihaji\": \"右端\",\n        \"miyoshino\": \"みよしの\",\n        \"omochi monaka\": \"おもち もなか\",\n        \"ootsuka reika\": \"大塚麗夏\",\n        \"zanka\": \"ざんか\",\n        \"ashizuki\": \"アシズキ\",\n        \"abe nattou\": \"あべなっつ\",\n        \"yuushi tessen\": \"柚子铁线\",\n        \"hitsujino\": \"羊乃\",\n        \"ancotaku\": \"餡こたく\",\n        \"shirokimochi\": \"白生もち\",\n        \"nagatukiin\": \"长月院\",\n        \"tanuma\": \"たぬま\",\n        \"chihiro\": \"Chihiro\",\n        \"soba\": \"soba\",\n        \"kaneko\": \"華猫\",\n        \"sekai saisoku no panda\": \"世界最速のパンダ\",\n        \"ayame iro\": \"絢芽いろ\",\n        \"kaiduka akuta\": \"貝塚芥\",\n        \"katsuten\": \"かつてん\",\n        \"waterring\": \"WaterRing\",\n        \"gwegwe\": \"gweda\",\n        \"nehani\": \"ねはに\",\n        \"juukyuu\": \"じゅうきゅう\",\n        \"chobipero\": \"ちょびぺろ\",\n        \"takama\": \"高天\",\n        \"pesshin\": \"ペッシン\",\n        \"tomatojigoku\": \"とまとじごく\",\n        \"midori\": \"みどり\",\n        \"ponponmaru\": \"ぽんぽんまる\",\n        \"hame dragon\": \"ハメドラゴン\",\n        \"ziran\": \"ZIRAN\",\n        \"hinamo\": \"ひなも🍀\",\n        \"keso shirou\": \"けそシロウ\",\n        \"nishimura nike\": \"西村にけ\",\n        \"ererep\": \"エレレ🌸\",\n        \"mammoth\": \"ドロンタビ\",\n        \"yonemochi akihiko\": \"米餅昭彦\",\n        \"momikocu\": \"籾殻\",\n        \"danimaru\": \"だにまる\",\n        \"reba\": \"れば☆\",\n        \"chifuyu\": \"千冬\",\n        \"itsuki kuro\": \"伊月クロ\",\n        \"tonari\": \"隣\",\n        \"sawaragi\": \"沢良宜\",\n        \"sanrokumaru\": \"さんろく丸\",\n        \"kuga mayuri\": \"久我茧莉\",\n        \"jiyu2\": \"磁油2\",\n        \"yoshida\": \"吉田\",\n        \"dokukinokozin\": \"毒茸人\",\n        \"danrenji\": \"だんれんじ\",\n        \"kiri-kiri mai\": \"ギリギリ舞\",\n        \"oshino\": \"推乃\",\n        \"shiramizu mizuchi\": \"白瑞みずち\",\n        \"majima tetsurou\": \"真島てつろー\",\n        \"super zombie\": \"すーぱーぞんび\",\n        \"seuma\": \"せうま\",\n        \"ryoma\": \"きただりょうま\",\n        \"kannko\": \"缶子\",\n        \"sencha\": \"せんちゃ\",\n        \"miyazaki hayao\": \"宫崎骏\",\n        \"amatou\": \"甘党\",\n        \"aki akane\": \"秋赤音\",\n        \"lack\": \"lack\",\n        \"morikoke\": \"もり苔\",\n        \"tansuiken\": \"淡水犬\",\n        \"yamakonbu\": \"やまこんぶ\",\n        \"crew\": \"クルー\",\n        \"toujou tsukushi\": \"東條土筆\",\n        \"yamada gogogo\": \"山田ゴゴゴ\",\n        \"g-wara\": \"爺わら\",\n        \"ibarame hisa\": \"茨芽ヒサ\",\n        \"aoyama kiiro.\": \"あおやまきいろ。\",\n        \"ushiro muki\": \"丑露ムキ\",\n        \"uono shinome\": \"魚野シノメ\",\n        \"igedoaha\": \"イゲドアハ\",\n        \"tachibana nagon\": \"立花なごん\",\n        \"takoyaki rock\": \"タコヤキロック\",\n        \"yuruchin kyouso\": \"ゆるちん教祖\",\n        \"mitsuki\": \"ミツ季\",\n        \"momono yuuca\": \"もものユーカ\",\n        \"oyama kina\": \"大山树奈\",\n        \"ronna\": \"ろんな\",\n        \"uranokyuu\": \"ウラノキュウ\",\n        \"7x2\": \"7×2\",\n        \"kurowa\": \"黒輪\",\n        \"pei\": \"ぺい\",\n        \"shimazu tekko\": \"島津鉄甲（raikoh）\",\n        \"enoki\": \"えのき\",\n        \"mizuno cho\": \"みずのちょう\",\n        \"rca\": \"rca\",\n        \"satotuki tiyo\": \"里月ちよ\",\n        \"gar\": \"ガー\",\n        \"shibaken goro\": \"柴犬五郎\",\n        \"tachibana roku\": \"タチロク（MegaPantS）\",\n        \"tang-pong\": \"Tang-Pong★\",\n        \"yamaimo tororo\": \"山芋とろろ\",\n        \"furumoto takeru\": \"降本孟\",\n        \"kayama kifumi\": \"加山きふみ（樹八ウロ）\",\n        \"tobari saru\": \"トバリ猿\",\n        \"utsusumi kio\": \"空住キオ\",\n        \"eshimoto\": \"Eシモト\",\n        \"shingo.\": \"Shingo.\",\n        \"nedokoro mitsuki\": \"ねどころみつき\",\n        \"hoshi to lucky\": \"ほしとラッキー\",\n        \"fuzichoco\": \"藤原\",\n        \"yuiga naoha\": \"由雅なおは\",\n        \"tousen\": \"冬扇\",\n        \"edogawa roman\": \"江戸川浪漫\",\n        \"kurimoti tiduru\": \"栗餅ちづる\",\n        \"the-sinner\": \"The-Sinner\",\n        \"nochanzero\": \"Nochanzero\",\n        \"10eki\": \"10駅\",\n        \"voidmaki\": \"Voidmaki\",\n        \"star chaser\": \"STAR☆CHASER\",\n        \"greko\": \"Greko🔞\",\n        \"onikun\": \"おにくん\",\n        \"c ice\": \"C_ICE\",\n        \"saitom\": \"斋藤将嗣\",\n        \"komi zumiko\": \"コミズミコ\",\n        \"kawakami masaki\": \"川上真树\",\n        \"hizuki akira\": \"绯月Akira\",\n        \"cream cod\": \"奶油鳕鱼\",\n        \"yasuyuki\": \"やすゆき\",\n        \"hisama kumako\": \"ひさまくまこ\",\n        \"mikisai\": \"みきさい\",\n        \"kisaragi yuri\": \"きさらぎゆり\",\n        \"ichikawa halu\": \"いちかわはる\",\n        \"betm\": \"杯面\",\n        \"bttn\": \"bttn\",\n        \"hao\": \"はお\",\n        \"wool\": \"うーる\",\n        \"dainyu\": \"代入\",\n        \"koshino\": \"こしの\",\n        \"haiki\": \"はいき\",\n        \"50 percent off\": \"50%OFF\",\n        \"shiba kumiko\": \"柴くみこ\",\n        \"tousaki shiina\": \"凍咲しいな\",\n        \"shiba yuuji\": \"司馬ゆうじ\",\n        \"ruki\": \"琉希\",\n        \"longbow flintlock\": \"长弓燧龙\",\n        \"milkybot\": \"Milkybot\",\n        \"kyougoku touya\": \"京极灯弥\",\n        \"ikutsuki\": \"イクツキ\",\n        \"mitarou\": \"ミタロウ\",\n        \"higuchi isami\": \"ひぐちいさみ\",\n        \"yuuki rika\": \"結城リカ\",\n        \"meicha\": \"冥茶\",\n        \"shinoda kazuhiro\": \"篠田一宏\",\n        \"cure slum\": \"キュアスラム\",\n        \"nanakichi\": \"七吉\",\n        \"yoshitama ichirou\": \"吉玉一楼\",\n        \"rifuru\": \"りふる\",\n        \"oniharigusa\": \"鬼针草\",\n        \"komota\": \"こもた\",\n        \"akamoku\": \"あかもく\",\n        \"hiyama yuki\": \"檜山ユキ\",\n        \"izumi kirifu\": \"和泉キリフ\",\n        \"suzuki nago\": \"铃木和\",\n        \"ito fleda\": \"伊藤達哉Tatsuya Ito\",\n        \"namatsui\": \"なまつい\",\n        \"mimamoriencyo\": \"みまもり園長\",\n        \"yukiyoshi mamizu\": \"ゆきよし真水\",\n        \"miyashiro sousuke\": \"宮社惣恭\",\n        \"sasaki bullet\": \"佐々木バレット\",\n        \"kuroki hidehiko\": \"黑木秀彦\",\n        \"agemo agm\": \"阿戈魔AGM\",\n        \"jackasss\": \"空蜂ミドロ（テラダ・ジャッカス）\",\n        \"izayoi seishin\": \"十六夜清心\",\n        \"dancyo\": \"だんちょ\",\n        \"ame\": \"雨\",\n        \"jp06\": \"JP06\",\n        \"kazepana\": \"かぜぱな\",\n        \"gyouza teishoku\": \"ギョウザテイショク\",\n        \"kyouichirou\": \"狂一郎\",\n        \"kuon michiyoshi\": \"久远道义\",\n        \"gorgeous mushroom\": \"绚烂的蘑菇\",\n        \"samneco\": \"寒猫\",\n        \"yakuhina\": \"yakuhina\",\n        \"kawayoi\": \"かわよい\",\n        \"nishida megane\": \"仁志田メガネ\",\n        \"furuya nagisa\": \"古矢渚\",\n        \"chouchin ankou\": \"提灯暗光\",\n        \"kantamaki yui\": \"環々唯\",\n        \"emu emuo\": \"えむえむお\",\n        \"yanagi hareta\": \"晴太\",\n        \"houkisei\": \"ほうき星\",\n        \"takahama tarou\": \"高浜太郎\",\n        \"ikezaki misa\": \"池咲弥撒\",\n        \"ikameshi\": \"乌贼饭\",\n        \"sakura romako\": \"桜ロマ子\",\n        \"moejin\": \"萌尽\",\n        \"shinjitsu\": \"真实\",\n        \"yoshiie\": \"由家\",\n        \"nikubou maranoshin\": \"肉棒魔罗之进\",\n        \"goya\": \"蜜姫モカ\",\n        \"doji ro\": \"どじろー\",\n        \"hiro\": \"博\",\n        \"inokuma shinobu\": \"猪熊忍\",\n        \"kusayarou\": \"草野郎\",\n        \"eufoniuz\": \"Eufoniuz\",\n        \"chaoroushi\": \"炒肉师\",\n        \"nikujiruc\": \"肉汁uc\",\n        \"nakadera akira\": \"中寺明良\",\n        \"kushida\": \"くしだ\",\n        \"ono kenuji\": \"尾野けぬじ\",\n        \"gotoh akira\": \"後藤晶\",\n        \"niko\": \"ニコ\",\n        \"hcwj\": \"心味觉\",\n        \"kunimoto takashi\": \"国本隆史\",\n        \"okyou\": \"おきょう\",\n        \"testame\": \"ツリサス\",\n        \"jj\": \"jj\",\n        \"sesena yau\": \"せせなやう\",\n        \"cai pi jun\": \"菜さん\",\n        \"hara\": \"へら\",\n        \"nenobi\": \"子野日\",\n        \"maki hideto\": \"牧秀人\",\n        \"sahara ikkou\": \"佐原一光\",\n        \"izumi mahiru\": \"泉まひる\",\n        \"ranou\": \"卵の黄身\",\n        \"abso lu\": \"あぶそる\",\n        \"kyuusuikei\": \"給水係\",\n        \"sr\": \"SR\",\n        \"azure\": \"あずーる\",\n        \"ishimura\": \"石村\",\n        \"random\": \"兰田梦\",\n        \"hamadamiku\": \"浜田みく\",\n        \"nanasaki\": \"七崎\",\n        \"satsuki misuzu\": \"皐月深鈴\",\n        \"haneru\": \"HaneRu\",\n        \"manbou\": \"マンボー\",\n        \"mokuseirokku\": \"木星ろっく\",\n        \"ment\": \"ment\",\n        \"nardack\": \"Nardack\",\n        \"borisu\": \"ボリス\",\n        \"kunisaki kei\": \"国崎蛍\",\n        \"torimogura\": \"とりもぐら\",\n        \"ihara asta\": \"伊原あす太\",\n        \"yasu\": \"yasu\",\n        \"akadama\": \"红玉\",\n        \"shiranami kouki\": \"白波航希\",\n        \"asaga aoi\": \"浅賀葵\",\n        \"camonome\": \"かものめ\",\n        \"shikigami kuroko\": \"式神くろ子\",\n        \"coburaco\": \"コブラノヲヤツ\",\n        \"nemu\": \"ネム\",\n        \"yoshika\": \"ヨシカ\",\n        \"uduki takeru\": \"卯月たける\",\n        \"yunagi amane\": \"憂凪あまね\",\n        \"nusmusbim\": \"ナスムスビム\",\n        \"tatsu tairagi\": \"燵成\",\n        \"doemutan\": \"どえむたん\",\n        \"ooshima towa\": \"大島永遠\",\n        \"posuimianju\": \"破碎面具\",\n        \"suzuki hinomi\": \"鈴木ひのみ\",\n        \"minamo\": \"みなも\",\n        \"ka-9\": \"ないん\",\n        \"shinjima saki\": \"心岛咲\",\n        \"riko\": \"利行\",\n        \"shinozaki rei\": \"しのざき嶺\",\n        \"mei ichi\": \"名一\",\n        \"sadakage\": \"貞影\",\n        \"akako\": \"AKAKO\",\n        \"momokumo\": \"桃云\",\n        \"umiyamasoze\": \"海山そぜ\",\n        \"cailin020\": \"Cailin020\",\n        \"yuzhou\": \"宇宙\",\n        \"tantan\": \"たん旦\",\n        \"rana yume\": \"らな夢\",\n        \"sen\": \"Sen\",\n        \"oumikun\": \"近江训\",\n        \"fukai ryousuke\": \"深井涼介\",\n        \"hmongt\": \"hmongt\",\n        \"saber01\": \"saber_01\",\n        \"tripleq\": \"TripleQ\",\n        \"kashieda subaru\": \"貸江田昴\",\n        \"uranoa\": \"うらのあ\",\n        \"tisen\": \"撥撥 (Tisen)\",\n        \"chamu\": \"雅茶木HZ\",\n        \"owari\": \"おわり\",\n        \"zoharwolf\": \"Zoharwolf\",\n        \"ushi no shita\": \"牛の舌\",\n        \"dikk0\": \"ディッコ\",\n        \"nanamoto\": \"ななもと\",\n        \"naidong\": \"奶凍\",\n        \"karan\": \"からん\",\n        \"hetaren\": \"へたれん\",\n        \"ginger shuka\": \"姜糖\",\n        \"sazaemu\": \"さざえむ\",\n        \"gunjou\": \"群青\",\n        \"takaman\": \"高馒\",\n        \"xiaoxi\": \"小西0619\",\n        \"arimura daikon\": \"有村大根\",\n        \"toyama burin\": \"遠山ブリン\",\n        \"tsukai you\": \"塚井ヨウ\",\n        \"botan m\": \"牡丹M\",\n        \"syouwaru\": \"性悪\",\n        \"indo curry\": \"印度咖喱\",\n        \"hirasawa zen\": \"平沢Zen\",\n        \"shimuro itaru\": \"至室\",\n        \"mishiro shizuku\": \"水白しずく\",\n        \"gedou danshaku\": \"外道男爵\",\n        \"nero augustus\": \"尼禄奥古斯都\",\n        \"sarena\": \"百花星彩メメちゃん\",\n        \"makari tohru\": \"魔狩十织\",\n        \"mizoguchi keiji\": \"沟口凯吉\",\n        \"bing gong asylum\": \"冰宫Asylum\",\n        \"mikimoto haruhiko\": \"美树本晴彦\",\n        \"asakura ryosuke\": \"朝仓亮介\",\n        \"b-river\": \"B-RIVER\",\n        \"katakura mikki\": \"片倉みっき\",\n        \"chichan54\": \"ちーちゃん54\",\n        \"midori niku\": \"绿肉\",\n        \"oko yomiko\": \"小神よみ子\",\n        \"umemotsuzou\": \"梅モツ蔵\",\n        \"nori gorou\": \"のり伍郎\",\n        \"0-g\": \"0-G\",\n        \"0bake\": \"0BAKE\",\n        \"0k0j0\": \"0k0j0\",\n        \"10-shion\": \"10-Shion\",\n        \"10mo\": \"10mo\",\n        \"10nin\": \"10nin\",\n        \"13.\": \"13.\",\n        \"2 equals 8\": \"2=8\",\n        \"286c\": \"286c\",\n        \"2gou\": \"2号\",\n        \"2t\": \"2T\",\n        \"322g\": \"322g\",\n        \"360mb yano\": \"360MB矢野\",\n        \"38kb\": \"38kb\",\n        \"3e\": \"さんい\",\n        \"3u\": \"3u\",\n        \"4 coulomb\": \"よんくーろん\",\n        \"45acp\": \"45ACP\",\n        \"4shi\": \"4氏\",\n        \"4why\": \"4why\",\n        \"5jack\": \"5jack\",\n        \"666zarike\": \"Contact\",\n        \"77gl\": \"77gl\",\n        \"78rr\": \"だぶるあーる\",\n        \"7c\": \"7c\",\n        \"7ten paoki\": \"7点ぱおき\",\n        \"846gou\": \"846号\",\n        \"94plum\": \"94Plum\",\n        \"9chibiru\": \"九千ビノレ\",\n        \"9law\": \"9LAW\",\n        \"a toshi\": \"Aとし\",\n        \"a-loveru\": \"A・Loveる\",\n        \"a-lucky murashige\": \"アラーキー村重\",\n        \"a-s\": \"A-S\",\n        \"a-tak\": \"A-tak\",\n        \"a.k.a.nyarot\": \"a.k.a.にゃろっと\",\n        \"a.s. hermes\": \"A.S.ヘルメス\",\n        \"a1\": \"A1\",\n        \"ababari\": \"ababari\",\n        \"abara\": \"アバラ\",\n        \"abazu red\": \"あばずRed\",\n        \"abc-pauler\": \"abc-pauler\",\n        \"abe\": \"ABE\",\n        \"abe aiko\": \"安部愛コ\",\n        \"abe ryu\": \"悪部瑠\",\n        \"abe tsukumo\": \"あべつくも\",\n        \"abeno chaco\": \"阿倍野ちゃこ\",\n        \"abi\": \"あび\",\n        \"abio\": \"あびお\",\n        \"abmayo\": \"abmayo\",\n        \"abo\": \"ABO\",\n        \"abo manten\": \"阿保満天\",\n        \"abu4\": \"あぶ4\",\n        \"aburaage\": \"柳瀬敬之\",\n        \"aburi\": \"あぶり\",\n        \"aburidashi zakuro\": \"あぶりだしざくろ\",\n        \"abutomato\": \"アブトマト\",\n        \"abzome\": \"エビゾメ\",\n        \"acbins\": \"あくびんす\",\n        \"accio\": \"あっちょ\",\n        \"ace\": \"エース\",\n        \"acht\": \"アハト\",\n        \"achumuchi\": \"あちゅむち\",\n        \"aco\": \"Aco\",\n        \"adon no aniki\": \"アドンの兄貴\",\n        \"aduma kei\": \"あづま京\",\n        \"afuro\": \"あふろ\",\n        \"agata\": \"アガタ\",\n        \"agata akira\": \"県晶\",\n        \"agemon\": \"アゲモン\",\n        \"agetama\": \"あげたま\",\n        \"ago\": \"顎\",\n        \"agro bio\": \"阿黒バイオ\",\n        \"agu\": \"あぐ\",\n        \"agumen\": \"アグ麺\",\n        \"agurecchi\": \"アグれっち\",\n        \"aguri\": \"あぐり\",\n        \"ahaha\": \"あはは\",\n        \"ahchi\": \"あぁち\",\n        \"ahe\": \"あへ\",\n        \"aheen\": \"あへーん\",\n        \"ahiru\": \"あひる\",\n        \"ahobaka\": \"AHOBAKA\",\n        \"ahorobo\": \"ahorobo\",\n        \"ahou miya\": \"阿呆宮\",\n        \"ahru.\": \"あーる。\",\n        \"ai\": \"あぃ\",\n        \"ai ni shisu\": \"愛に死す\",\n        \"aiu kaho\": \"相羽翔穂\",\n        \"aibu yue\": \"相武ゆえ\",\n        \"aichi shiho\": \"あいち志保\",\n        \"aida mai\": \"英田舞\",\n        \"aida maki\": \"あいだまき\",\n        \"aida takanobu\": \"会田孝信\",\n        \"aiiro danchi\": \"藍色団地\",\n        \"aika\": \"Aika\",\n        \"aikawa\": \"愛川\",\n        \"aikawa ruru\": \"藍川琉々\",\n        \"aikawa ryou\": \"相川りょう\",\n        \"aikawa tatsuki\": \"相川たつき\",\n        \"aikura mahiru\": \"藍倉真昼\",\n        \"aikura shuuya\": \"藍倉秋夜\",\n        \"aikuri\": \"あいくり\",\n        \"aimirucha\": \"藍海松茶\",\n        \"aimitsu\": \"あいみつ\",\n        \"aimo\": \"アイモ\",\n        \"aimy\": \"あいみ*\",\n        \"ainaryumu\": \"藍那りゅむ\",\n        \"aino\": \"あいの\",\n        \"ainu mania\": \"アイヌマニア\",\n        \"aioi aoi\": \"相生青唯\",\n        \"air\": \"air\",\n        \"aira\": \"姶良\",\n        \"aitanikov\": \"あいたにこふ\",\n        \"aito matoko\": \"あいとまとこ\",\n        \"aiuchi yoshiki\": \"あいうちよしき\",\n        \"aiueou\": \"愛飢王\",\n        \"aiyama toshikazu\": \"愛山寿一\",\n        \"aiyoshi hazuki\": \"藍吉はづき\",\n        \"aizawa\": \"相沢\",\n        \"aizawa chihiro\": \"藍沢ちひろ\",\n        \"aizawa moe\": \"相澤萌\",\n        \"aizawa sanae\": \"相沢早苗\",\n        \"aizawa shin\": \"あいざわしん\",\n        \"aizawa tetora\": \"アイザワテトラ\",\n        \"aizima atsushi\": \"相嶋敦\",\n        \"aizome gorou\": \"愛染五郎\",\n        \"aji\": \"鯵\",\n        \"aji pontarou\": \"安治ぽん太郎\",\n        \"ajino\": \"あじの\",\n        \"ajoea\": \"あじょぁ\",\n        \"aju\": \"アジュ\",\n        \"aka\": \"亚果\",\n        \"aka marl\": \"赤Marl\",\n        \"aka p\": \"赤P\",\n        \"aka satanan\": \"赤さたなん\",\n        \"aka seiryuu\": \"赤セイリュウ\",\n        \"akaboshi rika\": \"赤星りか\",\n        \"akabur\": \"Akabur\",\n        \"akadume\": \"朱爪\",\n        \"akae neo\": \"赤絵ねお\",\n        \"akae shirou\": \"朱江士朗\",\n        \"akaga hirotaka\": \"赤賀博隆\",\n        \"akage no un\": \"赤毛のUN\",\n        \"akagi gisho\": \"アカギギショウ\",\n        \"akagi rio\": \"赤木リオ\",\n        \"akaguchi yuuda\": \"赤口ユウダ\",\n        \"akahira kirin\": \"あかひらきりん\",\n        \"akai hoya\": \"赤井ほや\",\n        \"akai kagerou\": \"あかいかげろう\",\n        \"akai mato\": \"紅唯まと\",\n        \"akaiken\": \"あかいけん\",\n        \"akainu pochi\": \"赤犬ポチ\",\n        \"akairo\": \"あかゐろ\",\n        \"akaishi shiroishi\": \"あかいししろいし\",\n        \"akame\": \"あかめ\",\n        \"akamichi\": \"朱道\",\n        \"akan tare\": \"阿寒たれ\",\n        \"akanagi\": \"AKANAGI\",\n        \"akanagi youto\": \"紅薙遥兎\",\n        \"akane\": \"あかね\",\n        \"akane shuuhei\": \"茜しゅうへい\",\n        \"akane souichi\": \"明音そーいち\",\n        \"akaneman\": \"明寝マン\",\n        \"akaou\": \"赤王\",\n        \"akari\": \"アカリ\",\n        \"akari seisuke\": \"明誠助\",\n        \"akarin\": \"あかりん\",\n        \"akasaka kazuhiro\": \"赤坂かずひろ\",\n        \"akasode\": \"赤袖\",\n        \"akasya botan\": \"朱赦ぼたん\",\n        \"akatsuki\": \"あかつき\",\n        \"akatsuki akane\": \"あかつき茜\",\n        \"akatsuki johnny reitou\": \"紅月ジョニー冷凍\",\n        \"akatsuki katsuie\": \"暁勝家\",\n        \"akatsuki kochi\": \"暁月こち\",\n        \"akatsuki yakyou\": \"暁夜響\",\n        \"akatu bon\": \"赤津梵\",\n        \"akatuki\": \"アカツキ\",\n        \"akatuki tetora\": \"暁てとら\",\n        \"akaume\": \"あかうめ\",\n        \"akayoshi hajime\": \"赤善元\",\n        \"akazaki yasuma\": \"赤崎やすま\",\n        \"akazawa fuyuki\": \"赤沢冬希\",\n        \"akazukin\": \"赤ZUKIN\",\n        \"akchu\": \"akchu\",\n        \"akechi shizuku\": \"明地雫\",\n        \"akemi\": \"明美\",\n        \"aken\": \"あけん\",\n        \"akenami yasutaka\": \"明波康孝\",\n        \"akenotsuki renya\": \"朱乃月蓮夜\",\n        \"aki\": \"あき\",\n        \"aki eda\": \"秋★枝\",\n        \"aki kyouma\": \"秋恭摩\",\n        \"aki matsuri\": \"亜木・祭\",\n        \"aki suzuki\": \"秋鈴木\",\n        \"aki yuuto\": \"秋遊兎\",\n        \"akiba monaka\": \"秋葉もなか\",\n        \"akiba nagi\": \"秋葉凪樹\",\n        \"akiba ryu\": \"暁葉龍\",\n        \"akiba wataru\": \"秋葉わたる\",\n        \"akichin\": \"あきちん\",\n        \"akiduki akina\": \"秋月秋名\",\n        \"akiduki touya\": \"秋月十夜\",\n        \"akiha chiaki\": \"秋葉千秋\",\n        \"akihazama\": \"akihazama\",\n        \"akihiro\": \"旭洋\",\n        \"akishiro kiko\": \"秋城鬼子\",\n        \"akikan\": \"あきかん\",\n        \"akikaze shirakumo\": \"秋風白雲\",\n        \"akimbo\": \"Akimbo\",\n        \"akimoto akio\": \"あきもとあきお\",\n        \"akimoto kei\": \"秋元けい\",\n        \"akimoto youichi\": \"あきもとよういち\",\n        \"akimura yafumi\": \"秋村八二三\",\n        \"akina\": \"秋凪\",\n        \"akina rei\": \"秋奈伶\",\n        \"akinaie\": \"アキナイエ\",\n        \"akino hidefumi\": \"秋乃秀文\",\n        \"akino konomi\": \"秋乃このみ\",\n        \"akino melpa\": \"秋乃めるぱ\",\n        \"akino nagaame\": \"秋乃長雨\",\n        \"akino nonomi\": \"秋乃ののみ\",\n        \"akino shin\": \"あきのしん\",\n        \"akino takehiko\": \"秋乃武彦\",\n        \"akira\": \"アキラ\",\n        \"akira hajime\": \"あきら肇\",\n        \"akiru\": \"秋留\",\n        \"akisa\": \"アキサ\",\n        \"akisame ruu\": \"秋雨ルウ\",\n        \"akisamo\": \"アキサモ\",\n        \"akisawa yusi\": \"秋沢由史\",\n        \"akishima\": \"秋島\",\n        \"akisoba\": \"秋蕎麦\",\n        \"akita hika\": \"晃田ヒカ\",\n        \"akita seito\": \"秋田成都\",\n        \"akitaka\": \"あきたか\",\n        \"akitani\": \"明谷\",\n        \"akito\": \"あきと\",\n        \"akitsuki hirozumi\": \"秋月ひろずみ\",\n        \"akitsuki karasu\": \"榎本ひでひら\",\n        \"akiyama\": \"あきやま\",\n        \"akiyama kenta\": \"あきやまけんた\",\n        \"akiyama yuuzi\": \"秋山裕治\",\n        \"akiyoshi yoshiaki\": \"あきよしよしあき\",\n        \"akizuki takahiro\": \"秋月たかひろ\",\n        \"akki\": \"あっきー\",\n        \"akki gedoumaru\": \"惡鬼外導丸\",\n        \"akkii\": \"あっきー\",\n        \"ako\": \"A子\",\n        \"akoko.\": \"あここ。\",\n        \"akow kazumi\": \"亜神和美\",\n        \"aku\": \"あく\",\n        \"akuma\": \"あくま\",\n        \"akuno toujou\": \"悪の東丈\",\n        \"akushizu\": \"あくしず\",\n        \"akuta\": \"アクタ\",\n        \"akuta noe\": \"阿久多のえ\",\n        \"akutabin\": \"アクタビン\",\n        \"akutabone\": \"芥骨\",\n        \"akutagawa manbou\": \"芥川まんぼう\",\n        \"akutenkou\": \"悪天候\",\n        \"akuto\": \"あくと\",\n        \"al eas\": \"アル・イース\",\n        \"alapi\": \"あらぴ\",\n        \"alber\": \"Alber\",\n        \"albert-aet\": \"Contact\",\n        \"ganassa\": \"Ganassa\",\n        \"alex\": \"あれっくす\",\n        \"alfabravo\": \"アルファブラボー\",\n        \"ali\": \"ALI\",\n        \"alimika satomi\": \"ありみかさとみ\",\n        \"allegro\": \"アレグロ\",\n        \"alpacaeater\": \"アルパカイーター\",\n        \"alpha\": \"有葉\",\n        \"alphe\": \"あるふぇ\",\n        \"alpini\": \"あるぴに\",\n        \"alroune\": \"アルラウネ\",\n        \"alt bayern\": \"あるとばいえるん\",\n        \"alto\": \"あると\",\n        \"amaama\": \"いちこ\",\n        \"amadeusky\": \"アマデウスキー\",\n        \"amado nageru\": \"雨戸ナゲル\",\n        \"amagasa higasa\": \"雨傘日傘\",\n        \"amagi michihito\": \"あまぎみちひと\",\n        \"amagi yuuru\": \"あまぎゆうる\",\n        \"amaguri aniko\": \"甘栗あに子\",\n        \"amahara mizuho\": \"あまはらみずほ\",\n        \"amai choco\": \"甘伊ちょこ\",\n        \"amakara surume\": \"あまからするめ\",\n        \"amakase masaki\": \"天枷雅樹\",\n        \"amakawa ginga\": \"天川銀河\",\n        \"amagi kazuko\": \"天城一子\",\n        \"amakuchi\": \"甘口\",\n        \"amama\": \"あまま\",\n        \"amami fuu\": \"天海ふう\",\n        \"amami ryouko\": \"あまみりょうこ\",\n        \"amamiya iria\": \"雨宮杁亜\",\n        \"amamiya tsumugi\": \"雨宮ツムギ\",\n        \"amamiya yuki\": \"雨宮結鬼\",\n        \"amamizu\": \"amamizu\",\n        \"amamori tsuruha\": \"天森つるは\",\n        \"amanai uni\": \"天内うに\",\n        \"amanatsu\": \"あまなつ\",\n        \"amane\": \"Amane\",\n        \"amane hasuhito\": \"天音蓮人\",\n        \"amane mari\": \"天音真理\",\n        \"amane shirou\": \"あまね紫狼\",\n        \"amaniji\": \"天虹\",\n        \"amano ameno\": \"天野雨乃\",\n        \"amano chiharu\": \"天乃ちはる\",\n        \"amano hidemi\": \"天野英美\",\n        \"amano jack\": \"尼野じゃっく\",\n        \"amano kanehisa\": \"アマノカネヒサ\",\n        \"amano koori\": \"桑折二号\",\n        \"amano mitsurugi\": \"天乃御剣\",\n        \"amano ribbon\": \"天野りぼん\",\n        \"amano taiki\": \"天野大気\",\n        \"amano yosora\": \"天野よそら\",\n        \"amano youki\": \"あまの・よ～き\",\n        \"amano yuu\": \"天之有\",\n        \"amanogami dai\": \"あまのがみだい\",\n        \"amanomiya haruka\": \"天宮遥\",\n        \"amaro tamaro\": \"あまろたまろ\",\n        \"amasawa natsuhisa\": \"天沢夏久\",\n        \"amashoku\": \"あましょく\",\n        \"amassa hikae\": \"あまさひかえ\",\n        \"amasyoku jiro\": \"甘食次郎\",\n        \"amato yuuki\": \"天戸祐輝\",\n        \"amaya kan\": \"あまやかん\",\n        \"amaya kyo\": \"雨耶恭\",\n        \"amayu\": \"あまゆ\",\n        \"amazing\": \"飴井神具\",\n        \"amedama akihito\": \"雨珠秋比人\",\n        \"amedori\": \"飴鳥\",\n        \"amei sumeru\": \"あめいすめる\",\n        \"amelie\": \"amelie\",\n        \"amemiya luky\": \"雨宮ルキ\",\n        \"amemiya nyanko\": \"飴宮にゃんこ\",\n        \"ameno ringo\": \"飴乃苹果\",\n        \"ameotoko\": \"雨男\",\n        \"amesawa yagi\": \"飴沢やぎ\",\n        \"ameya kyo\": \"雨矢恭\",\n        \"amhoo\": \"amhoo!!\",\n        \"ami\": \"阿見\",\n        \"ami hideto\": \"弥舞秀人\",\n        \"ami2\": \"ami2\",\n        \"amida murasaki\": \"あみだむらさき\",\n        \"amin\": \"あみん\",\n        \"amino\": \"あみ野\",\n        \"amu\": \"あむ\",\n        \"amum\": \"amum\",\n        \"amury\": \"あむりー\",\n        \"amyuchan\": \"アミュちゃん\",\n        \"an2a\": \"An2A\",\n        \"ana\": \"穴\",\n        \"ana-chan s\": \"穴ちゃんS\",\n        \"anachans\": \"穴ちゃんS\",\n        \"anago\": \"Anago\",\n        \"anakuro\": \"あなくろ\",\n        \"anan yutaka\": \"阿南ゆたか\",\n        \"anapom\": \"あなぽん\",\n        \"anchors\": \"Anchors\",\n        \"hamaburicchi\": \"ハマブリッチ\",\n        \"andoriyu\": \"あんどりゅ～\",\n        \"andou hiroyuki\": \"安藤裕行\",\n        \"andou tomoya\": \"安藤智也\",\n        \"andouyou\": \"アンドウユウ\",\n        \"andrew\": \"Andrew\",\n        \"andy\": \"ANDY\",\n        \"ane\": \"姉\",\n        \"angel dust\": \"エンジェルダスト\",\n        \"angelica\": \"アンジェリカ\",\n        \"angie nishikawa\": \"アンジー西川\",\n        \"aniki\": \"アニキ\",\n        \"anji\": \"杏二\",\n        \"ankoromochi\": \"あんころもち\",\n        \"anma\": \"安間\",\n        \"anmitsu sou\": \"あんみつ草\",\n        \"ann\": \"Ann\",\n        \"annie\": \"あにぃ\",\n        \"annin\": \"杏仁\",\n        \"annjeria\": \"あんじぇりあ\",\n        \"annkoku daimaou\": \"暗黒大魔王\",\n        \"anohito\": \"あのひと\",\n        \"anoshabu\": \"アノシャブ\",\n        \"anparu98\": \"anparu98\",\n        \"anshin mama\": \"あんしんママ\",\n        \"anyakunin\": \"暗躍人\",\n        \"anyama takemi\": \"案山たけみ\",\n        \"anzu hime\": \"あんず姫\",\n        \"ao\": \"蒼\",\n        \"ao banana\": \"青ばなな\",\n        \"ao madousi\": \"蒼惑う子\",\n        \"aogen genda\": \"青木ゲンダ\",\n        \"aohashi ame\": \"青橋雨\",\n        \"aohashi yutaka\": \"青橋由高\",\n        \"aoi chiro\": \"碧井チロ\",\n        \"aoi hiro\": \"葵比呂\",\n        \"aoi itigo\": \"葵イチゴ\",\n        \"aoi levin\": \"あおいれびん\",\n        \"aoi mikan\": \"葵蜜柑\",\n        \"aoi mikku\": \"アオイみっく\",\n        \"aoi mizuki\": \"蒼居観月\",\n        \"aoi muramasa\": \"蒼井村正\",\n        \"aoi remi\": \"青井レミ\",\n        \"aoi runa\": \"蒼井るな\",\n        \"aoi shinji\": \"葵信次\",\n        \"aoi taishi\": \"蒼井タイシ\",\n        \"aoi takayuki\": \"蒼隆行\",\n        \"aoi tsuyukusa\": \"蒼井露草\",\n        \"aoi yumi\": \"蒼井遊美\",\n        \"aojiru\": \"あおじる\",\n        \"aoki eichi\": \"蒼木えいち\",\n        \"aoki reimu\": \"青樹零夢\",\n        \"aoko\": \"Aoko\",\n        \"aokura shou\": \"青倉ショウ\",\n        \"aomeyuu\": \"アオメユウ\",\n        \"aonaga heri\": \"青永HERI\",\n        \"aonatsusu\": \"蒼夏酢\",\n        \"aono\": \"あおの\",\n        \"aono akira\": \"蒼野アキラ\",\n        \"aono keita\": \"青野圭太\",\n        \"aono yami\": \"蒼野矢美\",\n        \"aonuma shizuma\": \"蒼沼シズマ\",\n        \"aoreyo\": \"あおれよ\",\n        \"aosusuki dakuna\": \"青薄 だくな\",\n        \"aotsuki hirotada\": \"蒼月裕忠\",\n        \"aotsuki kakka\": \"蒼月かっか\",\n        \"aotsuki ren\": \"蒼月蓮\",\n        \"aoume kaito\": \"青梅街人\",\n        \"aox\": \"あおっくす\",\n        \"aoyama reo\": \"青山怜央\",\n        \"aozame takao\": \"青雨高夫\",\n        \"aozuki ran\": \"蒼月蘭\",\n        \"apacchi\": \"アパッチ\",\n        \"apart\": \"おだねるapart\",\n        \"apita\": \"あぴ太\",\n        \"apophis str\": \"アポフィス★STR\",\n        \"aporon\": \"Aporon\",\n        \"apostle\": \"apostle\",\n        \"apple13\": \"apple13\",\n        \"apploute\": \"あっぷるーと\",\n        \"appuri ko\": \"あっぷり子\",\n        \"appyalpie\": \"あぴゃるぴえ\",\n        \"aqu\": \"亜空\",\n        \"aqua vit\": \"アクアビット\",\n        \"kosuke poke\": \"こーすけぽけ\",\n        \"aqui\": \"AQUI\",\n        \"ar-mai\": \"ar-mai\",\n        \"arabiki koshou\": \"あらびき故障\",\n        \"araco\": \"あらこー\",\n        \"aragishi\": \"あらぎし\",\n        \"arai kazuki\": \"新井和崎\",\n        \"arai nobu\": \"アライノブ\",\n        \"arai yuu\": \"新居佑\",\n        \"araki akihito\": \"荒木アキヒト\",\n        \"araki hiroaki\": \"あらきひろあき\",\n        \"araki jeccy\": \"Araki Jeccy\",\n        \"araki mitsuru\": \"荒木みつる\",\n        \"aramaki shake\": \"荒巻しゃけ\",\n        \"arami taito\": \"荒海泰人\",\n        \"arao masaki\": \"荒尾マサキ\",\n        \"araragi ayune\": \"あららぎあゆね\",\n        \"araruck\": \"あららっく\",\n        \"arashi-d-akira\": \"嵐-D-悪鬼羅\",\n        \"arashiyama tsugumoto\": \"嵐山次元\",\n        \"arata mai\": \"新米\",\n        \"aratagawa nikei\": \"荒田川にけい\",\n        \"arbuzbudesh\": \"Contact\",\n        \"arcana rude\": \"あるかな(るど)\",\n        \"arch enemy\": \"あーちえねみー\",\n        \"arciealbano\": \"arciealbano\",\n        \"arctic char\": \"Arctic char\",\n        \"are\": \"ARE\",\n        \"ari\": \"蟻\",\n        \"aria\": \"Aria\",\n        \"ariesu watanabe\": \"ありえす渡辺\",\n        \"ariga tou\": \"有賀冬\",\n        \"ariichi kyuu\": \"有一九\",\n        \"ariike tomosane\": \"有池智実\",\n        \"arikawa koba\": \"有川古葉\",\n        \"ariko\": \"亜璃子\",\n        \"arima\": \"ありま\",\n        \"arima jun\": \"有马纯\",\n        \"arima keitarou\": \"有马启太郎\",\n        \"arima you\": \"有马有\",\n        \"arima yutaka\": \"有马ゆたか\",\n        \"arimori haru\": \"在森 晴\",\n        \"arimura ario\": \"有村ありお\",\n        \"arimura shinobu\": \"有村しのぶ\",\n        \"arimura yuu\": \"有村悠\",\n        \"arinko\": \"蟻ん子\",\n        \"arisaka ako\": \"有坂あこ\",\n        \"arisato natsuki\": \"ありさと奈月\",\n        \"arisawa masaharu\": \"有沢柾春\",\n        \"arisue tsukasa\": \"有末つかさ\",\n        \"ariyas honda\": \"本田有保\",\n        \"ariyoshi gen\": \"蟻吉げん\",\n        \"ark waver\": \"あるくでんぱ\",\n        \"arkas\": \"Arkas\",\n        \"aro\": \"あろ\",\n        \"art jam\": \"Art Jam\",\n        \"afro\": \"あふろ\",\n        \"akagi\": \"赤木\",\n        \"pastel\": \"ぱすてる\",\n        \"aru\": \"ある\",\n        \"aruma\": \"あるま\",\n        \"andou jirou\": \"安藤慈朗\",\n        \"arumi\": \"あるみ\",\n        \"aruse yuuji\": \"有瀬祐志\",\n        \"aruta\": \"あるた\",\n        \"arutan\": \"あるたん\",\n        \"aruva\": \"aruva\",\n        \"as-special\": \"As-Special\",\n        \"asa\": \"あさ\",\n        \"asaba hideaki\": \"あさばひであき\",\n        \"asagi\": \"浅戯\",\n        \"asagi aya\": \"あさぎあや\",\n        \"asagi hiroshi\": \"浅葱洋\",\n        \"asagi shion\": \"浅葱しおん\",\n        \"asagi yoshimitsu\": \"あさぎよしみつ\",\n        \"asagi yukia\": \"浅樹ゆきあ\",\n        \"asagiri\": \"あさぎり\",\n        \"asagiri miyabi\": \"朝霧雅\",\n        \"asagiri rira\": \"あさぎりりら\",\n        \"asagiri tendou\": \"朝霧天道\",\n        \"asagiri.\": \"ASAGIRI.\",\n        \"asahi\": \"アサヒ\",\n        \"asahi uta\": \"あさひウタ\",\n        \"asahikawa\": \"旭川\",\n        \"asahimaru\": \"旭丸\",\n        \"asai yuuri\": \"浅井ユウリ\",\n        \"asakai mocchinu\": \"浅貝もっちぬ\",\n        \"asakawa yuki\": \"麻川由貴\",\n        \"asako\": \"あさこ\",\n        \"asakura\": \"麻倉\",\n        \"asakura blue\": \"朝倉ブルー\",\n        \"asakura gin\": \"浅倉ギン\",\n        \"asakura hina\": \"朝倉妃那\",\n        \"asakura kazuki\": \"あさくらかずき\",\n        \"asakura nao\": \"明桜なお\",\n        \"asakura ryou\": \"朝倉亮\",\n        \"asakura sakura\": \"麻倉桜\",\n        \"asama\": \"あさま\",\n        \"asamaki\": \"あさマキ\",\n        \"asamashi masashi\": \"浅増マサシ\",\n        \"asami asami\": \"浅海朝美\",\n        \"asami waka\": \"浅見わか\",\n        \"asami yumesuke\": \"朝見ユメスケ\",\n        \"asami yurumu\": \"浅湖葵天\",\n        \"asano\": \"朝野\",\n        \"asano akira\": \"浅野晃\",\n        \"asano keigo\": \"浅野けいご\",\n        \"asano maya\": \"麻野まや\",\n        \"asano shimon\": \"麻乃史門\",\n        \"asano yukino\": \"あさのゆきの\",\n        \"asanuma katsuaki\": \"浅沼克明\",\n        \"asari yoshitoo\": \"あさりよしとお\",\n        \"asaroku\": \"あさろく\",\n        \"asatsuki madoka\": \"朝月円\",\n        \"asazaki\": \"アサザキ\",\n        \"asazuki\": \"アサヅキ\",\n        \"ase\": \"汗\",\n        \"ashi o\": \"Ashi_O\",\n        \"ashiashi\": \"あしあし\",\n        \"ashisyun\": \"芦俊\",\n        \"ashita cha\": \"明日茶\",\n        \"ashling\": \"あしゅりんぐ\",\n        \"ashura kumo\": \"阿修羅クモ\",\n        \"asio\": \"アシオ\",\n        \"asitaba tomorou\": \"明日葉友婁\",\n        \"aska takuya\": \"飛鳥拓哉\",\n        \"asou\": \"阿宗\",\n        \"asou shin\": \"麻生シン\",\n        \"aspara daisuke\": \"アスパラダイスケ\",\n        \"assteka\": \"あずてか\",\n        \"asterisk\": \"＊\",\n        \"astre\": \"ASTRE\",\n        \"astroguy2\": \"ASTROGUY2\",\n        \"asu\": \"asu\",\n        \"asu oikiru\": \"明日追斬\",\n        \"asuka\": \"アスカ\",\n        \"asuka nashina\": \"飛鳥梨菜\",\n        \"asuma omi\": \"遊馬臣\",\n        \"asumi jinta\": \"明澄迅汰\",\n        \"asuoi kiru\": \"明日追斬\",\n        \"asupaka\": \"あすぱか\",\n        \"asurai masaki\": \"明日頼真咲\",\n        \"asya\": \"亞沙\",\n        \"at\": \"AT\",\n        \"atagawa\": \"あたがわ\",\n        \"atahuta\": \"atahuta\",\n        \"atai\": \"A太\",\n        \"atarime\": \"当たり目\",\n        \"ataru\": \"あたる\",\n        \"atera\": \"アテラ\",\n        \"ather birochi\": \"アザービロチ\",\n        \"atoki\": \"あとき\",\n        \"atono matsuri\": \"後野祭\",\n        \"atono maturi\": \"亜斗乃茉利\",\n        \"atori rei\": \"あとり玲\",\n        \"atp\": \"ATP\",\n        \"atsyu\": \"亞つゅ\",\n        \"atte nanakusa\": \"あって七草\",\n        \"atunabe\": \"圧鍋\",\n        \"aturn\": \"ATURN\",\n        \"atutoku\": \"あつとく\",\n        \"atyuto\": \"あちゅと\",\n        \"auauun\": \"あうあうーん\",\n        \"aula\": \"あうら\",\n        \"autumm\": \"秋\",\n        \"awa\": \"AwA\",\n        \"awamori ichitarou\": \"泡盛一太郎\",\n        \"awata mokane\": \"粟田もかね\",\n        \"aweida\": \"アウェイ田\",\n        \"aya shiina\": \"彩しーな\",\n        \"aya-cis\": \"AYA-cis\",\n        \"ayakashi\": \"アヤカシ\",\n        \"hatakeyama tohya\": \"畠山桃哉\",\n        \"ayakaze ryuushou\": \"綾風柳晶\",\n        \"ayakumo\": \"ayakumo\",\n        \"ayame\": \"アヤメ\",\n        \"ayame riyo\": \"あやめりよ\",\n        \"ayame sino\": \"彩恵紫乃\",\n        \"ayana mizuki\": \"綾那瑞奇\",\n        \"ayana rio\": \"彩奈りお\",\n        \"ayanagi gumimi\": \"彩柳グミミ\",\n        \"ayane\": \"あやね\",\n        \"ayano naoto\": \"綾野なおと\",\n        \"ayano rumi\": \"綾乃るみ\",\n        \"ayanokouji haruka\": \"綾小路はるか\",\n        \"ayasaka mitsune\": \"綾阪みつね\",\n        \"ayase\": \"綾瀬\",\n        \"ayase hazuki\": \"綾瀬はづき\",\n        \"ayase jun\": \"綾瀬純\",\n        \"ayase mako\": \"綾瀬真子\",\n        \"ayase shinomu\": \"綾瀬しのむ\",\n        \"ayase suitento\": \"綾瀬水天戸\",\n        \"ayase totsuki\": \"彩瀬とつき\",\n        \"ayase yura\": \"綾瀬ゆら\",\n        \"ayashi ayashibe\": \"妖部あやし\",\n        \"ayasugi tsubaki\": \"綾杉つばき\",\n        \"ayato\": \"綺人\",\n        \"ayatsuri-doll\": \"文釣遠瑠\",\n        \"ayu\": \"あゆ\",\n        \"ayuka\": \"あゆか\",\n        \"ayukisa\": \"アユキサ\",\n        \"azasuke\": \"AZASUKE\",\n        \"azmodan\": \"Azmodan\",\n        \"azu\": \"Azu\",\n        \"azuki\": \"アズキ\",\n        \"azuki kurenai\": \"あずき紅\",\n        \"azukiko\": \"あずきこ\",\n        \"azuma\": \"あずま\",\n        \"azuma aya\": \"あずまあや\",\n        \"azuma hirota\": \"東ひろた\",\n        \"azuma kyouto\": \"東京都\",\n        \"azuma minatu\": \"東みなつ\",\n        \"azuma seiya\": \"東聖夜\",\n        \"azumi kyohei\": \"あずみ京平\",\n        \"azusa norihee\": \"あずさのりへー\",\n        \"azuteru.\": \"あずてる。\",\n        \"b.tarou\": \"B.たろう\",\n        \"b1h\": \"B1H\",\n        \"bach\": \"Bach\",\n        \"backfischalter\": \"伸長に関する考察\",\n        \"bacon\": \"ベーコン\",\n        \"badbamboo\": \"badbamboo\",\n        \"badhand\": \"BadHanD\",\n        \"badman bastich\": \"Deceased.\",\n        \"baerun\": \"ばえるん\",\n        \"bajou takurou\": \"馬乗拓郎\",\n        \"bakedanuki\": \"バケダヌキ\",\n        \"bakko\": \"跋扈\",\n        \"bakkon tamago\": \"バッコンたまご\",\n        \"bakuchin\": \"ばくちん\",\n        \"bakudanbonbon\": \"ばくだんぼんぼん\",\n        \"bakuretsu chichihirosu\": \"爆裂チチヒロス.\",\n        \"bakusai\": \"爆砕\",\n        \"baldie\": \"BALDIE\",\n        \"balpanther\": \"ばるぱんさー\",\n        \"baltan\": \"Baltan\",\n        \"baltika\": \"ばるてぃか\",\n        \"ban\": \"ばん!\",\n        \"bancha\": \"番茶\",\n        \"bangetsu setsuka\": \"晩月雪加\",\n        \"banjaku\": \"ばんじゃく\",\n        \"bankokudou\": \"ばんこく堂\",\n        \"barbachos\": \"ばるばちょす\",\n        \"baron mori\": \"バロン森\",\n        \"baron.m\": \"BARON.M\",\n        \"bash\": \"BASH\",\n        \"bazaar\": \"ばざーる\",\n        \"bb\": \"BB\",\n        \"bbsacon\": \"bbsacon\",\n        \"bbwh\": \"bbwH\",\n        \"bea\": \"bea\",\n        \"beat-kun\": \"びーとくん\",\n        \"beater\": \"Beater\",\n        \"bebebe\": \"べべべ\",\n        \"beco\": \"Beco\",\n        \"bee\": \"bee\",\n        \"beijuu\": \"米獸\",\n        \"bekko.\": \"べっ子。\",\n        \"bekkou megane buchiko\": \"べっこうめがねぶち子\",\n        \"bell\": \"ベル\",\n        \"bells\": \"Bell’s\",\n        \"bellsuke\": \"ベル助\",\n        \"belmond uozumi\": \"ベルモンド魚住\",\n        \"ben\": \"BEN\",\n        \"ben237\": \"BEN237\",\n        \"beni bana\": \"紅花\",\n        \"benikawa akito\": \"紅川アキト\",\n        \"benimashiko\": \"べにましこ\",\n        \"benzou\": \"ベンゾウ\",\n        \"berggold\": \"バーゴ\",\n        \"berose\": \"べろせ\",\n        \"berukko\": \"べるっこ\",\n        \"beti\": \"べてぃ\",\n        \"betty\": \"べってぃ\",\n        \"bibandamu\": \"びばんだむ\",\n        \"bibi\": \"ビビ\",\n        \"big.g\": \"big.g\",\n        \"bikkle\": \"ビックル\",\n        \"binbi\": \"びん美\",\n        \"binf\": \"ななし\",\n        \"biozs\": \"バイオ前線\",\n        \"birobon\": \"ビロボン\",\n        \"bisco\": \"ビスコ\",\n        \"bismarcho\": \"ビスマルチョ\",\n        \"bitaro\": \"ビ太郎\",\n        \"bitibiti\": \"bitibiti\",\n        \"bitou\": \"微糖\",\n        \"bittsu\": \"びっつ\",\n        \"biwa\": \"枇杷\",\n        \"bizen\": \"備前\",\n        \"bkyu\": \"bkyu\",\n        \"black\": \"ぶらっく\",\n        \"blackbaka\": \"ブラック馬鹿\",\n        \"blackheart\": \"BLACKHEART\",\n        \"blacksaw\": \"BLACKSAW\",\n        \"blast\": \"Blast\",\n        \"blind\": \"ブラインド\",\n        \"blmanian\": \"ぶるまにあん\",\n        \"bloomer hogero\": \"ぶるマほげろー\",\n        \"blue blood\": \"BLUE BLOOD\",\n        \"blue gk\": \"Blue_Gk\",\n        \"blue impulse\": \"ブルーインパルス\",\n        \"blz\": \"BLZ\",\n        \"bmg\": \"bmg\",\n        \"bnr\": \"BNR\",\n        \"bob jr\": \"ボブJr\",\n        \"bob kosugi\": \"ボブ小杉\",\n        \"bob r\": \"暴武R\",\n        \"bobca\": \"ボブキャ\",\n        \"bocha\": \"ぼちゃ\",\n        \"bojore\": \"ボジョレ\",\n        \"bol\": \"bol\",\n        \"boljoy-kun\": \"ぼりじょいくん\",\n        \"boltack\": \"ぼるたっく\",\n        \"bom\": \"BOM\",\n        \"bomber grape\": \"ボンバーグレープ\",\n        \"bon-3000\": \"BON_3000\",\n        \"bond\": \"ボンド\",\n        \"bondo\": \"ぼんど\",\n        \"bonehead\": \"Bonehead\",\n        \"bonnie\": \"ぼに～\",\n        \"bono\": \"ぼの\",\n        \"bonske\": \"ぼんすけ\",\n        \"bonten\": \"梵典\",\n        \"bontenkarasu\": \"梵天鴉\",\n        \"bonyuu cheese no natsu\": \"母乳ち～ずの夏\",\n        \"bonzakashi\": \"盆座\",\n        \"booch\": \"Booch\",\n        \"boots\": \"物\",\n        \"borurun\": \"ぼるるん\",\n        \"bose\": \"bose\",\n        \"boss chin\": \"BOSS珍\",\n        \"botan\": \"牡丹\",\n        \"bottomline\": \"Bottomline\",\n        \"boudan nyuugyuu\": \"防弾乳牛\",\n        \"bouko\": \"bouko\",\n        \"bourne\": \"ボーン\",\n        \"bouto\": \"帽都\",\n        \"bov\": \"bov\",\n        \"bowalia\": \"タケユウ\",\n        \"bowcan\": \"ぼーかん\",\n        \"bowieknife\": \"ボウイナイフ\",\n        \"brave\": \"brave\",\n        \"brewstar\": \"ぶりすた\",\n        \"brilliant jijii\": \"ブリリアントじじい\",\n        \"brll\": \"BRLL\",\n        \"brokao\": \"BroKao\",\n        \"brother bob\": \"ブラザーボブ\",\n        \"bt\": \"BT\",\n        \"btk\": \"BTK\",\n        \"buaisou\": \"無愛想\",\n        \"bubonic\": \"ぶぼにっく\",\n        \"buccho\": \"ぶっちょ\",\n        \"buchimaru\": \"ぶちマル\",\n        \"buhi\": \"ぶひ\",\n        \"bukatsu\": \"ぶかつ\",\n        \"bullion\": \"ばるらいおん\",\n        \"bun\": \"ぶん\",\n        \"bun150\": \"Bun150\",\n        \"bunapi 397 yen\": \"ぶなぴー397円\",\n        \"bunbon\": \"ぶんぼん\",\n        \"bunny\": \"バニー\",\n        \"buri\": \"ブリ\",\n        \"buriki\": \"ブリキ\",\n        \"bushi\": \"BUSHI\",\n        \"butajiman\": \"豚じまん\",\n        \"butao\": \"ブタ男\",\n        \"buthikireta\": \"ぶっちぃ\",\n        \"butsuri neko\": \"物理猫\",\n        \"butter\": \"butter\",\n        \"bwell\": \"bwell\",\n        \"byoin\": \"びょーいん\",\n        \"byte\": \"Byte\",\n        \"bzsk.\": \"Bzsk.\",\n        \"c\": \"C\",\n        \"c-cake\": \"C-Cake\",\n        \"c-low\": \"C-Low\",\n        \"c-taro\": \"C-taro\",\n        \"cabayaki\": \"Cabayaki\",\n        \"caburi\": \"caburi\",\n        \"cacao\": \"cacao\",\n        \"cai\": \"cai\",\n        \"cait\": \"Cait\",\n        \"calpara\": \"calpara\",\n        \"calpish\": \"かるぴ\",\n        \"can\": \"CAN\",\n        \"canadazin\": \"カナダ人\",\n        \"canvas solaris\": \"カンバスそらりす\",\n        \"capriccio\": \"かぷりっちょ\",\n        \"capriccyo\": \"カプリッチョ\",\n        \"cara subato\": \"空すばと\",\n        \"caramel dow\": \"きゃらめる堂\",\n        \"carbon rice\": \"カーボン飯\",\n        \"carlos toshiki\": \"カルロスとしき\",\n        \"carnelian\": \"CARNELIAN\",\n        \"carrot\": \"きゃろっと\",\n        \"caruta\": \"caruta\",\n        \"cashew\": \"かしゅう\",\n        \"cashue\": \"香愁\",\n        \"cassandra\": \"かっさんどら\",\n        \"castella\": \"カステラ\",\n        \"caterpillar\": \"キャタピラ\",\n        \"cccpo\": \"cccpo\",\n        \"cel\": \"Cel\",\n        \"cesar\": \"しーざー\",\n        \"cevoy\": \"せぼい\",\n        \"chaa\": \"ちゃあ\",\n        \"chabashira tatsukichi\": \"茶柱立吉\",\n        \"chabin\": \"茶瓶\",\n        \"chabo\": \"茶鳥\",\n        \"chaccu\": \"chaccu\",\n        \"chado\": \"茶戸\",\n        \"chagata\": \"ちゃがた\",\n        \"chagu\": \"ちゃぐ\",\n        \"chaigidhiell\": \"カイギディエル\",\n        \"chakkaman\": \"チャッカマン\",\n        \"chamame\": \"茶豆\",\n        \"chameleon\": \"かめれおん\",\n        \"chan shin han\": \"chan shin han\",\n        \"chanary\": \"Chanary\",\n        \"chane\": \"ちゃね\",\n        \"chano mina\": \"茶野みな\",\n        \"chanta\": \"チャン太\",\n        \"chaos 2nd\": \"かおす二号\",\n        \"charlie nishinaka\": \"チャーリーにしなか\",\n        \"chasaracha\": \"茶皿茶\",\n        \"chataro\": \"ちゃたろー\",\n        \"chatsune\": \"ちゃつね\",\n        \"chawa\": \"ちゃわ\",\n        \"chazutsu sayu\": \"茶筒さゆ\",\n        \"cheko\": \"ちぇこ\",\n        \"chemical flow\": \"けみかるふろう\",\n        \"cherry\": \"CHERRY\",\n        \"cheruno\": \"ちぇるの\",\n        \"chesuka\": \"チェスカ\",\n        \"chiba chibasa\": \"千葉ちばさ\",\n        \"chiba dirou\": \"ちば・ぢろう\",\n        \"chiba shinji\": \"千葉進司\",\n        \"chiba shuusaku\": \"千葉秀作\",\n        \"chiba tetsutarou\": \"千葉哲太郎\",\n        \"chibibibi\": \"ちびびび\",\n        \"chibineco master\": \"ちびねこマスター\",\n        \"chibinon\": \"チビのん☆\",\n        \"chibou\": \"ちーぼう\",\n        \"chicago\": \"シカゴ\",\n        \"chicke iii\": \"Chicke III\",\n        \"chidori\": \"ちどり\",\n        \"chidori nekoro\": \"千鳥ねころ\",\n        \"chidorinu\": \"チドリヌ\",\n        \"chiebukuro ichiban\": \"知恵袋一番\",\n        \"chief\": \"ちーふ\",\n        \"chiei\": \"智英\",\n        \"chieko\": \"ちえこ\",\n        \"chigiri maru\": \"ちぎりまる\",\n        \"chihi\": \"ちひ\",\n        \"chihiro aoi\": \"葵千尋\",\n        \"chihuri\": \"ちふり\",\n        \"chii\": \"地井\",\n        \"chijiwa sawa\": \"千々石さわ\",\n        \"chika\": \"千翔\",\n        \"chikado\": \"ちかど\",\n        \"chikahii\": \"ちかひー\",\n        \"chikake\": \"ちかけー\",\n        \"chikane\": \"千鐘\",\n        \"chikasato michiru\": \"近里みちる\",\n        \"chikaya\": \"ちかや\",\n        \"chikijima\": \"ちきじま\",\n        \"chikiko\": \"チキコ\",\n        \"chikomayo\": \"ちこマヨ\",\n        \"chikotam\": \"ちこたむ\",\n        \"chiku\": \"築\",\n        \"chikubai\": \"竹梅\",\n        \"chikugen\": \"竹玄\",\n        \"chilt\": \"ちると\",\n        \"chimaro\": \"ちまろ\",\n        \"chimo\": \"チモ\",\n        \"chimple hotter\": \"チンプル堀田\",\n        \"chin\": \"chin\",\n        \"chin tokusyu\": \"珍・特集\",\n        \"china\": \"茶否\",\n        \"chinhou\": \"珍步\",\n        \"chinjao roosu\": \"ちんじゃおろおす\",\n        \"chino fumiyu\": \"稚乃ふみゆ\",\n        \"chinyoko\": \"ちんよこ\",\n        \"chipa\": \"薙派\",\n        \"chirorian\": \"ちろり庵\",\n        \"chiroru\": \"ちろる\",\n        \"chisato\": \"チサト\",\n        \"chisato kirin\": \"千里きりん\",\n        \"chisato reiri\": \"チサトレイリ\",\n        \"chita arihiro\": \"知多有洋\",\n        \"chitose\": \"ちとせ\",\n        \"chitosezaka suzu\": \"千歳坂すず\",\n        \"chiune\": \"ちうね\",\n        \"chiyo\": \"千代\",\n        \"chiyoda mikurou\": \"千代多みく郎\",\n        \"chiyomi\": \"chiYOMI\",\n        \"chizakya\": \"ちざきゃ\",\n        \"chizu\": \"ちず\",\n        \"chizuru\": \"ちづる\",\n        \"chocco coronetto\": \"チョココロネット\",\n        \"chocho\": \"チョチョ\",\n        \"choco\": \"CHOCO\",\n        \"choco coronet\": \"チョココロネット\",\n        \"chocomint\": \"ちょこみんと\",\n        \"chocore\": \"ちょこれ\",\n        \"choko yarou\": \"ちょこ野郎\",\n        \"chomes\": \"Chomes\",\n        \"chomo\": \"ちょも\",\n        \"chonko\": \"ちよんこ\",\n        \"chou creme\": \"シュークリーム\",\n        \"chou shippaisaku\": \"超失敗作\",\n        \"chouniku\": \"超肉\",\n        \"chourui\": \"鳥類\",\n        \"chouzetsu yarou\": \"超絶野朗\",\n        \"chro\": \"chro\",\n        \"chun\": \"CHuN\",\n        \"chunko\": \"ちゅんこ\",\n        \"chunrouzan\": \"春籠漸\",\n        \"chupimaro\": \"ちゅぴまろ\",\n        \"chuusuu kairo\": \"中枢回路\",\n        \"chuuta\": \"ちゅー太\",\n        \"ci\": \"Ci\",\n        \"cian yo\": \"Cian yo\",\n        \"cilica\": \"CILICA\",\n        \"cindy\": \"cindy\",\n        \"circussion\": \"circussion\",\n        \"ck j\": \"Ckj\",\n        \"ckj\": \"ckj\",\n        \"cl\": \"シーエル\",\n        \"cla\": \"Cla\",\n        \"clappy\": \"くらっぴ\",\n        \"clarin\": \"くらりん\",\n        \"clip\": \"くりっぷ\",\n        \"cloire clover\": \"Cloire Clover\",\n        \"cloth tsugutoshi\": \"黒須嗣載\",\n        \"clover\": \"clover\",\n        \"co ma\": \"Co_Ma\",\n        \"coara\": \"coara\",\n        \"coaster\": \"コースター\",\n        \"cobo\": \"こぼ\",\n        \"cock robin\": \"クックロビン\",\n        \"cocoa\": \"ここあ\",\n        \"cocolog\": \"ココローグ\",\n        \"coconoe ricoco\": \"九重リココ\",\n        \"coconoha mikage\": \"心葉御影\",\n        \"cocorono arika\": \"心野ありか\",\n        \"cocounco\": \"cocounco\",\n        \"cocoyama\": \"ココ山\",\n        \"coelacanth\": \"しーらかんす\",\n        \"cohen\": \"cohen\",\n        \"coin rand\": \"コインRAND\",\n        \"colin\": \"COLIN\",\n        \"collagen\": \"コラーゲン\",\n        \"colonel aki\": \"Colonel AKI\",\n        \"color\": \"COLOR\",\n        \"colulun\": \"こるるん\",\n        \"combat ecchu\": \"戦闘的越中\",\n        \"comeon showme\": \"花門初海\",\n        \"comizuk\": \"こみずく\",\n        \"comord\": \"コモード\",\n        \"comugico\": \"comugico\",\n        \"condessa\": \"Condessa\",\n        \"coo\": \"くー\",\n        \"copo copo\": \"こぽこぽ\",\n        \"core-suke\": \"コア助\",\n        \"cosine\": \"COSiNE\",\n        \"cosmashiva\": \"COSMASHIVA\",\n        \"cotoba\": \"COTOBA\",\n        \"cotoji\": \"琴慈\",\n        \"couch potato\": \"かうちぽてと\",\n        \"cozy\": \"コージー\",\n        \"cpk418\": \"CPK418\",\n        \"cpu\": \"CPU\",\n        \"cr-r\": \"Cr-R\",\n        \"craft\": \"くらふと\",\n        \"crataegus\": \"Crataegus\",\n        \"crazy nirin\": \"クレイジー二厘\",\n        \"crazy white\": \"クレイジーホワイト\",\n        \"cream\": \"Cream\",\n        \"creek\": \"CREEK\",\n        \"crepix\": \"シーレ\",\n        \"cross\": \"クロス\",\n        \"crossco\": \"くろすこ\",\n        \"crow\": \"CROW\",\n        \"crozu\": \"黒酢\",\n        \"crystal shoujo\": \"クリスタル少女\",\n        \"ctk\": \"CTK\",\n        \"cube\": \"キューブ\",\n        \"cube85\": \"Cube85\",\n        \"cumasyo\": \"くましょう\",\n        \"cup-chan\": \"カップちゃん\",\n        \"cura\": \"cura\",\n        \"cureryuta\": \"キュアリュータ\",\n        \"custom\": \"カスタム\",\n        \"cuteg\": \"CUTEG\",\n        \"cv1115\": \"cv1115\",\n        \"cylia-the-antelope\": \"Cylia-The-Antelope\",\n        \"cyorisuke\": \"ちょりすけ\",\n        \"cyoro suke\": \"チョロ助\",\n        \"d-2\": \"D-2\",\n        \"d-suke\": \"D-Suke\",\n        \"d.hiranuma\": \"D.HIRANUMA\",\n        \"da\": \"だ\",\n        \"daga shikashi\": \"だがしかし\",\n        \"dagasi\": \"DAGASI\",\n        \"dai\": \"Dai\",\n        \"dai pippy\": \"大ピッピ\",\n        \"daidai\": \"大々\",\n        \"daidokoro\": \"台所\",\n        \"daifuku keiji\": \"大福けーじ\",\n        \"daigo\": \"DAIGO\",\n        \"daihuku\": \"大福\",\n        \"daiji\": \"だいじ\",\n        \"daiki\": \"だいき\",\n        \"daikyojin\": \"大巨神\",\n        \"daimon\": \"大門\",\n        \"dainakishin\": \"ダイナキシン\",\n        \"dairoku tenmaou great\": \"第六天魔王グレート\",\n        \"daisaku\": \"大作\",\n        \"daitou\": \"だい唐\",\n        \"daitouchi runoru\": \"大灯地ルノル\",\n        \"dakara\": \"だかラ\",\n        \"dame neko\": \"ダメ猫\",\n        \"nakao hamu\": \"仲尾ハム\",\n        \"damii\": \"駄みぃ\",\n        \"dan\": \"ダン\",\n        \"danchino\": \"団地の\",\n        \"dandy\": \"だんでぃ\",\n        \"dangan\": \"DANGAN\",\n        \"dango\": \"団子\",\n        \"dango.\": \"だんご。\",\n        \"danna\": \"ダンナ\",\n        \"danshaku\": \"男爵\",\n        \"dantou\": \"暖冬\",\n        \"dantyo neko\": \"だんちょねこ\",\n        \"dara\": \"だら\",\n        \"darabuchi\": \"だらぶち\",\n        \"darius-kun\": \"ダライアスくん\",\n        \"darkilow\": \"DarkⅠlow\",\n        \"darkside-g\": \"DARKSIDE-G\",\n        \"darren\": \"だれん\",\n        \"daru.\": \"だる。\",\n        \"daruton\": \"怠豚\",\n        \"dash\": \"DASH\",\n        \"dashio\": \"だしお\",\n        \"dastar\": \"ダスター\",\n        \"date kazuki\": \"伊達和騎\",\n        \"date naoto\": \"ダテナオト\",\n        \"date natsuku\": \"伊達なつく\",\n        \"dawy\": \"DAWY\",\n        \"dd\": \"DD\",\n        \"ddal\": \"ddal\",\n        \"ddg160\": \"DDG160\",\n        \"de\": \"De\",\n        \"deadnoodles\": \"ゴミョン\",\n        \"dear\": \"dear\",\n        \"dearonnus\": \"Dearonnus\",\n        \"deburasu\": \"でぶらす\",\n        \"decko\": \"でっこ\",\n        \"decosuke\": \"デコスケ\",\n        \"deego\": \"ディーゴ\",\n        \"deep purple 72\": \"深紫'72\",\n        \"deep valley\": \"ディープバレー\",\n        \"dei\": \"dei\",\n        \"deibara\": \"泥原\",\n        \"dekochin hammer\": \"でこちんハンマー\",\n        \"dekoisu\": \"デコいす\",\n        \"dekosen takuji\": \"デコセンタクジ\",\n        \"delf\": \"DELF\",\n        \"delta-tsf\": \"delta-TSF\",\n        \"deme\": \"DEME\",\n        \"demio\": \"デミオ\",\n        \"den\": \"デン\",\n        \"den meka\": \"電メカ\",\n        \"denden\": \"でんでん\",\n        \"denki\": \"電鬼\",\n        \"denki biribiri\": \"電気びりびり\",\n        \"denkousekka gou\": \"電光石火轟\",\n        \"denpanic\": \"デンぱにっく\",\n        \"densetsu no shimi\": \"伝説のシミ\",\n        \"densuke\": \"電SUKE\",\n        \"deo\": \"deo\",\n        \"deshima shin\": \"出縞臣\",\n        \"detritus\": \"デトリタス掘込\",\n        \"deusa\": \"でうさ\",\n        \"devilob\": \"デビロブ\",\n        \"dha\": \"DHA\",\n        \"digdug\": \"DigDug\",\n        \"diisuke\": \"ヂイスケ\",\n        \"din\": \"DIN\",\n        \"dining\": \"ダイニング\",\n        \"diru\": \"ぢる\",\n        \"dit\": \"DIT\",\n        \"jnnkleche\": \"じんにくれーちぇ\",\n        \"dmpn\": \"dmpn\",\n        \"doburocky\": \"ドブロッキィ\",\n        \"doctor rei\": \"ドクトル零\",\n        \"dodai shouji\": \"土代昭治\",\n        \"dodomeiro mayonnaise\": \"どどめ色マヨネーズ\",\n        \"dodomori\": \"ドドもり\",\n        \"dodorian suzuki\": \"ドドリアン鈴木\",\n        \"dofib\": \"dofib\",\n        \"doga\": \"DOGA\",\n        \"doguu\": \"どぐう\",\n        \"dohi kensuke\": \"土肥けんすけ\",\n        \"doki\": \"フリピク\",\n        \"doko tetora\": \"何処テトラ\",\n        \"doku corne\": \"毒コロネ\",\n        \"doll\": \"DOLL\",\n        \"doluta\": \"ドルタ\",\n        \"dom danshaku\": \"ドM男爵\",\n        \"domoshipette\": \"どもしペッテ\",\n        \"don\": \"Don\",\n        \"jt dong-agyoku\": \"ドン・アギョク\",\n        \"donan\": \"どなん\",\n        \"donburako\": \"丼ﾌﾞﾗｺ\",\n        \"donburi\": \"丼\",\n        \"done\": \"どね\",\n        \"donguri\": \"団栗\",\n        \"donkey\": \"DONKEY\",\n        \"donki\": \"どんき\",\n        \"donson\": \"鈍村\",\n        \"dora\": \"どら\",\n        \"dorabmon\": \"DoraBmon\",\n        \"dori rumoi\": \"どり留萌\",\n        \"doro doneru\": \"泥どねる\",\n        \"doromiez\": \"泥水\",\n        \"doru riheko\": \"ドルリヘコ\",\n        \"dos\": \"どす\",\n        \"dosu\": \"どす\",\n        \"dot-r\": \"どっとあーる\",\n        \"dote kabocha\": \"どてかぼちゃ\",\n        \"dotsuco\": \"dotsuco\",\n        \"dou yutaka\": \"堂豊\",\n        \"double deck\": \"だぶるでっく\",\n        \"doudantsutsuji\": \"満天星\",\n        \"doug winger\": \"Deceased.\",\n        \"douman ao\": \"道満青\",\n        \"doumou\": \"ドウモウ\",\n        \"dousai\": \"百斎\",\n        \"dova\": \"DOVA\",\n        \"dowabako\": \"童話箱\",\n        \"dpg\": \"DPg\",\n        \"dr-man\": \"Dr-Man\",\n        \"dr. ten\": \"Dr.天\",\n        \"dr. vu\": \"ヴー博士\",\n        \"dr.momo\": \"毒桃\",\n        \"dr.p\": \"Dr.P\",\n        \"dr.q\": \"Dr.Q\",\n        \"dra\": \"Dra\",\n        \"drain\": \"drain\",\n        \"dre\": \"DRE\",\n        \"drill jill\": \"ドリル汁\",\n        \"drossel\": \"泥っせる\",\n        \"dry\": \"DRY\",\n        \"dt hone\": \"DT骨\",\n        \"dulce-q\": \"ダルシー研Q所\",\n        \"dune\": \"でゅーん\",\n        \"dura\": \"でゅら\",\n        \"dy\": \"Dy\",\n        \"dynamite kantou\": \"ダイナマイト関東\",\n        \"dyne equals gallon\": \"ダイン=ガロン\",\n        \"dyon\": \"ぢょん\",\n        \"e\": \"E\",\n        \"e-noy\": \"E-noy\",\n        \"e.snow\": \"E.Snow\",\n        \"ebgr\": \"エビグラ\",\n        \"ebi blue\": \"海老ブルー\",\n        \"ebidou\": \"えびどー\",\n        \"ebifry akita\": \"えびふらい秋田\",\n        \"ebifurya\": \"えびふりゃ\",\n        \"ebikichi\": \"えび吉\",\n        \"ebiko\": \"えびこ\",\n        \"ebimayo\": \"えびまよ\",\n        \"ebisu\": \"えびす\",\n        \"ebisubashi seizou\": \"戎橋政造\",\n        \"ebisuyu nogi\": \"戎湯のぎ\",\n        \"ebiwantan\": \"えびわんたん\",\n        \"eboshi\": \"え★\",\n        \"ech\": \"エイチ\",\n        \"echigawa ryuuka\": \"越川リューカ\",\n        \"echo jiro\": \"江高次郎\",\n        \"ed\": \"ED\",\n        \"edih\": \"Edih\",\n        \"edo\": \"い～どぅ～\",\n        \"edo shigezu\": \"江戸しげズ\",\n        \"edoya pochi\": \"江戸屋ぽち\",\n        \"efink\": \"EFINK\",\n        \"egami\": \"エガミ\",\n        \"eguchi\": \"江口\",\n        \"eguchi chibi\": \"江口ちび\",\n        \"ehime mikan\": \"江姫蜜柑\",\n        \"eho\": \"会帆\",\n        \"eigetu\": \"eigetu\",\n        \"eight\": \"エイト\",\n        \"eikichi\": \"エーキチ\",\n        \"eiko\": \"エイコ\",\n        \"eikokukan momoha\": \"英国館桃葉\",\n        \"eimu yuu\": \"影夢優\",\n        \"eiri\": \"嬰里\",\n        \"eitaisa\": \"ぇぃたいさ\",\n        \"eitarou\": \"えーたろー\",\n        \"eixen\": \"EIXIN\",\n        \"eixin\": \"Eixen\",\n        \"ekimae\": \"駅前\",\n        \"eko\": \"絵虎\",\n        \"ekz\": \"EKZ\",\n        \"electric sheep\": \"Electric Sheep\",\n        \"elf\": \"ELF\",\n        \"elf.k\": \"elf.k\",\n        \"elia\": \"Elia\",\n        \"elijah\": \"エリヤ\",\n        \"elimiko\": \"えりみこ\",\n        \"elis 120 percent\": \"エリス120%\",\n        \"eltole\": \"eltole\",\n        \"em\": \"em\",\n        \"ema20\": \"ema20\",\n        \"eman\": \"eman\",\n        \"emanon123\": \"emanon123\",\n        \"emi\": \"えみ\",\n        \"emilio\": \"えみりお\",\n        \"emina\": \"emina\",\n        \"emino\": \"えみの\",\n        \"emit\": \"えみっと\",\n        \"emori misaki\": \"江森美沙樹\",\n        \"emote\": \"えもて\",\n        \"emu\": \"ゑむ\",\n        \"emua\": \"えむあ\",\n        \"emya\": \"emya\",\n        \"en\": \"袁\",\n        \"enamizawa\": \"江波沢\",\n        \"end\": \"えんど\",\n        \"endles\": \"炎℃れす\",\n        \"endou\": \"えんどう\",\n        \"endou marin\": \"遠藤真理ん\",\n        \"endou tatsumi\": \"遠藤辰己\",\n        \"engo\": \"えんご\",\n        \"enigma\": \"えにぐま\",\n        \"enikuma\": \"えにくま\",\n        \"enishi nasa\": \"縁なさ\",\n        \"enji\": \"エンジ\",\n        \"enma koorogi\": \"エンマコオロギ\",\n        \"enno syouta\": \"縁乃生多\",\n        \"eno\": \"eno\",\n        \"enokifu\": \"えのきふ\",\n        \"enokitake yuniku\": \"榎茸ゆにく\",\n        \"enoma shinji\": \"江之間真次\",\n        \"enomoto heights\": \"榎本ハイツ\",\n        \"enomoto hidehira\": \"榎本ひでひら\",\n        \"enomoto hina\": \"榎本ひな\",\n        \"enoshima iki\": \"江ノ島行き\",\n        \"enotou\": \"えのとう\",\n        \"enoughmin\": \"イナフミン\",\n        \"enu\": \"エヌ\",\n        \"enu-yamayama\": \"えぬーやまやま\",\n        \"epuko\": \"えぷ子\",\n        \"era\": \"Era\",\n        \"ere 2 earo\": \"えれ2エアロ\",\n        \"erika\": \"えりか\",\n        \"ero kojiki\": \"エロ乞食\",\n        \"ero koutei\": \"エロ皇帝\",\n        \"ero murasaki\": \"エロムラサキ\",\n        \"erobaldo\": \"エロバルド\",\n        \"erutasuku\": \"えるたすく\",\n        \"escape\": \"えすけーぷ!\",\n        \"esora koto\": \"絵空コト\",\n        \"esukichizuru\": \"S木チズリ\",\n        \"esuo\": \"えすお\",\n        \"esupu\": \"えすぷ\",\n        \"esureki\": \"えすれき\",\n        \"et alors\": \"Et alors\",\n        \"ether\": \"ether\",\n        \"eto\": \"えと\",\n        \"etosei\": \"干支政\",\n        \"eud\": \"euD\",\n        \"eugene batten\": \"ユージン・バートン\",\n        \"eunos\": \"ゆ～のす\",\n        \"euphonia\": \"Euphonia\",\n        \"eve\": \"eve\",\n        \"exabyte\": \"Exabyte\",\n        \"excel\": \"EXCEL\",\n        \"exeter\": \"エクゼター\",\n        \"exp\": \"EXP\",\n        \"ezo renge\": \"えぞれんげ\",\n        \"f\": \"f\",\n        \"faith\": \"faith\",\n        \"fan\": \"FAN\",\n        \"fana\": \"ふぁな\",\n        \"faust\": \"FAUST\",\n        \"fct\": \"FCT\",\n        \"fe\": \"Fe\",\n        \"feccso\": \"ふぇっくそ\",\n        \"fechi\": \"ふぇっちー\",\n        \"feiren\": \"feiren\",\n        \"femto\": \"ふぇむと\",\n        \"fence 14\": \"フェンス14\",\n        \"ferdinand\": \"フェルディナン\",\n        \"feriko\": \"フェリコ\",\n        \"fes\": \"ふぇす\",\n        \"fey tas\": \"Fey Tas\",\n        \"fi-san\": \"Fi-san\",\n        \"figaro\": \"ふぃがろ\",\n        \"fight fight chiharu\": \"ファイトファイトチハル\",\n        \"fin no uta\": \"フィンの詩\",\n        \"final\": \"Final\",\n        \"fireyuki\": \"フィレユキ\",\n        \"fk696\": \"fk696\",\n        \"flanvia\": \"Flanvia\",\n        \"flat\": \"FLAT\",\n        \"flipper\": \"FLIPPER\",\n        \"flowerchild\": \"FLOWERCHILD\",\n        \"flugel\": \"Flugel\",\n        \"flyking\": \"Flyking\",\n        \"follet\": \"Follet\",\n        \"fondue\": \"フォンデュ\",\n        \"fontin\": \"ふぉんてぃん\",\n        \"foolest\": \"ふぅすりと\",\n        \"foosnow\": \"ふーすのー\",\n        \"fortythree\": \"fortythree\",\n        \"loic foster\": \"Loic Foster\",\n        \"franken n\": \"Franken N\",\n        \"frapowa\": \"ふらぽわ\",\n        \"fred kelly\": \"フレッドケリー\",\n        \"free style\": \"Free style\",\n        \"friday\": \"フライデイ\",\n        \"fried.\": \"ふらいど。\",\n        \"frunbell\": \"ふらんべる\",\n        \"fu\": \"ふぅ\",\n        \"fu-ta\": \"Fu-ta\",\n        \"fuchi\": \"fuchi\",\n        \"fudematsuri kyousuke\": \"筆祭競介\",\n        \"fudou shin\": \"不動心\",\n        \"fue\": \"Fue\",\n        \"fugetsu taku\": \"浮月たく\",\n        \"fugo\": \"FUGO\",\n        \"fuhatsu\": \"ふはつ\",\n        \"fuji fujino\": \"富士フジノ\",\n        \"fuji sangou\": \"富士参號\",\n        \"fuji yoshida\": \"藤吉田\",\n        \"fujibayashi haru\": \"フジバヤシ春\",\n        \"fujihara gacho\": \"藤原がちょ\",\n        \"fujii aya\": \"藤井あや\",\n        \"fujii chifumi\": \"藤井ちふみ\",\n        \"fujii mochi\": \"藤井もち\",\n        \"fujii rino\": \"藤井理乃\",\n        \"fujikawa daichi\": \"藤川大智\",\n        \"fujikawa riko\": \"藤川梨子\",\n        \"fujikawa satoshi\": \"不二河聡\",\n        \"fujiko\": \"ふじこ\",\n        \"fujiku yuima\": \"藤久ゆいま\",\n        \"fujikura ryune\": \"藤倉琉音\",\n        \"fujimaru arikui\": \"ふぢまるありくい\",\n        \"fujimi\": \"藤味\",\n        \"fujimi gaku\": \"富士見ガク\",\n        \"fujimiya akane\": \"藤宮茜\",\n        \"fujimiya midori\": \"藤宮緑\",\n        \"fujimiya siryu\": \"フジミヤ子龍\",\n        \"fujimiya yahiro\": \"藤宮やひろ\",\n        \"fujimon\": \"ふじもん\",\n        \"fujimori saya\": \"ふじもり沙耶\",\n        \"fujimoto gou\": \"藤本郷\",\n        \"fujimoto hideaki\": \"藤本秀明\",\n        \"fujimoto sei\": \"ふじもとせい\",\n        \"fujimura erika\": \"藤村えりか\",\n        \"fujinami arisa\": \"藤浪有沙\",\n        \"fujinari ayako\": \"藤成アヤコ\",\n        \"fujinari takumi\": \"藤也卓巳\",\n        \"fujino yoshika\": \"ふじの芳夏\",\n        \"fujinomiya yuu\": \"藤ノ宮悠\",\n        \"fujioka toki\": \"藤岡とき\",\n        \"fujirin\": \"ふじりん\",\n        \"fujisaki kou\": \"藤崎こう\",\n        \"fujisaki makoto\": \"藤咲真\",\n        \"fujisaki rei\": \"ふじさき怜\",\n        \"fujisawa tatsurou\": \"ふじさわたつろー\",\n        \"fujishima\": \"フジシマ\",\n        \"fujishiro seiki\": \"藤城成騎\",\n        \"fujita hidetoshi\": \"藤田秀俊\",\n        \"fujiwara\": \"藤原\",\n        \"fujiwara hisashi\": \"藤原ひさし\",\n        \"fujiwara warawara\": \"藤原々々\",\n        \"fujiwara yumi\": \"藤原結実\",\n        \"fujiya\": \"ふじや\",\n        \"fujiya apota\": \"不二家あぽ太\",\n        \"fujiyama\": \"富士やま\",\n        \"fujiyama takashi\": \"フジヤマタカシ\",\n        \"fuka\": \"FUKA\",\n        \"fukada takushi\": \"深田拓士\",\n        \"fukai maro\": \"ふかぃまろ\",\n        \"fukai miyabi\": \"深井雅\",\n        \"fukami naoyuki\": \"深水直行\",\n        \"fukami otoha\": \"フカミオトハ\",\n        \"fukami ryou\": \"深海リョウ\",\n        \"fukao toriko\": \"深生とり子\",\n        \"fukase ayaka\": \"深瀬アヤカ\",\n        \"fukashiba\": \"深シバ\",\n        \"fukazume\": \"ふかづめ\",\n        \"fukiko\": \"フキコ\",\n        \"fukin\": \"布巾\",\n        \"fukudahda\": \"フクダーダ\",\n        \"fukui sora\": \"福井空\",\n        \"fukumimi\": \"ふくみみ\",\n        \"fukunaga yukito\": \"福永ゆきと\",\n        \"fukunotsukuribe\": \"ふくのつくりべ\",\n        \"fukuoka kisara\": \"福岡きさら\",\n        \"fukurokouji\": \"袋小路\",\n        \"fukurou\": \"フクロウ\",\n        \"fukutarou\": \"ふくたろう\",\n        \"fukutoku saori\": \"福徳紗織\",\n        \"fukuzawa yukine\": \"福沢ゆきね\",\n        \"fume\": \"fume\",\n        \"fumi\": \"ふみ\",\n        \"fumi haru\": \"ふみはる\",\n        \"fumicha\": \"史茶\",\n        \"fumihiro\": \"ふみひろ\",\n        \"fumikage\": \"文影\",\n        \"fumikiri\": \"ふみきり\",\n        \"fumio\": \"ふみお\",\n        \"fumitani yasunori\": \"フミタニヤスノリ\",\n        \"fumiya\": \"文哉\",\n        \"fumizuki misoka\": \"文月みそか\",\n        \"fumotono mikoto\": \"梺乃みこと\",\n        \"funabori nariaki\": \"船堀斉晃\",\n        \"funakura\": \"ふなくら\",\n        \"funamushi\": \"船虫\",\n        \"funan\": \"ふなん\",\n        \"funato hitoshi\": \"船戸ひとし\",\n        \"funatsu kazuki\": \"ふなつかずき\",\n        \"funaya sakichi\": \"船弥さ吉\",\n        \"fundoshi\": \"褌\",\n        \"funeral\": \"Funeral\",\n        \"funiai riko\": \"不似合りこ\",\n        \"funky function\": \"ファンキーファンクション\",\n        \"fupe\": \"ふぺ\",\n        \"furafura\": \"ふらふら\",\n        \"furanshisu\": \"フランシス\",\n        \"furari\": \"フラリ\",\n        \"furiri\": \"ふりり\",\n        \"furo\": \"ふろ\",\n        \"furuta a.\": \"ふる太・A\",\n        \"fusa\": \"房\",\n        \"fushimori tonkatsu\": \"不死森トンカツ\",\n        \"fusisya o\": \"不死者O\",\n        \"futaba\": \"ふたば\",\n        \"futaba miwa\": \"ふたば実和\",\n        \"futaba841\": \"双葉841\",\n        \"futago\": \"双子\",\n        \"futamaro\": \"ふうたまろ\",\n        \"futami kazuha\": \"ふたみかずは\",\n        \"futami shihen\": \"双視使翩\",\n        \"futamura futon\": \"ふたむらふとん\",\n        \"futase hijiri\": \"双瀬聖\",\n        \"futase hikaru\": \"二瀬ひかる\",\n        \"futatsuki hisame\": \"双月氷雨\",\n        \"futatsuki kazuo\": \"2月かずお\",\n        \"futee\": \"ふてー\",\n        \"futomaki tamamo.\": \"太巻多摩も。\",\n        \"futoo\": \"フトー\",\n        \"futou ryouko\": \"不透りょうこ\",\n        \"fuuga utsura\": \"風雅うつら\",\n        \"fuurai\": \"風籟\",\n        \"fuurin\": \"ふぅりん\",\n        \"fuyo\": \"ふよ\",\n        \"fuyube rion\": \"冬部李穏\",\n        \"fuyukaze tsubasa\": \"冬風つばさ\",\n        \"fuyuki masato\": \"冬木真人\",\n        \"fuyunagi reku\": \"冬凪れく\",\n        \"fuyuno hitsuji\": \"冬野ひつじ\",\n        \"fuyuno yuno\": \"冬野由乃\",\n        \"fuyutarou\": \"ふゆたろう\",\n        \"fuyuwa kotatsu\": \"冬和こたつ\",\n        \"fuzai yumoto\": \"不在ゆもと\",\n        \"g zero\": \"Gゼロ\",\n        \"g-co\": \"G-co\",\n        \"g.g. kakeru\": \"G.G.翔\",\n        \"ga015\": \"ga015\",\n        \"gabagobogebe\": \"ガバゴボゲベ\",\n        \"gaburi\": \"ガブリ\",\n        \"gachonjirou\": \"がちょん次郎\",\n        \"gaden\": \"GADEN\",\n        \"gagarin kichi\": \"ガガーリン吉\",\n        \"gaiseisya\": \"凱聖者\",\n        \"gajirabute\": \"ガジラビュート\",\n        \"gakimagari\": \"ガキマガリ\",\n        \"gakugaku\": \"楽々\",\n        \"gamako\": \"ガマ子\",\n        \"gamma\": \"gamma\",\n        \"gamma chaos\": \"ガンマカオス\",\n        \"gamu\": \"がむ\",\n        \"gangi mari\": \"雁木麻理\",\n        \"ganmarei\": \"眼魔礼\",\n        \"gao\": \"gao\",\n        \"gara ayuri\": \"柄あゆり\",\n        \"garakuta sochi\": \"瓦落多装置\",\n        \"garou damenade\": \"画廊ダメナデ\",\n        \"garyou\": \"臥龍\",\n        \"gatari\": \"Gatari\",\n        \"gatling a\": \"ガトリングA\",\n        \"gattai soutou\": \"合体総統\",\n        \"gazeru\": \"GAZERU\",\n        \"gazetta masuda\": \"ガゼッタ増田\",\n        \"gb\": \"GB\",\n        \"ge-b\": \"ゲB\",\n        \"geboku\": \"下僕\",\n        \"gedo\": \"外道\",\n        \"gekato\": \"ゲカト\",\n        \"gekoge satoru\": \"ゲコゲさとる\",\n        \"gemuo\": \"げむお\",\n        \"gemurax\": \"じぇーむら\",\n        \"gemuta\": \"げむた\",\n        \"gen\": \"GEN | 源 | 舷\",\n        \"gengetsu\": \"玄月\",\n        \"genjirou\": \"言示弄\",\n        \"genjuroh\": \"元十郎\",\n        \"genka ichien\": \"原価壱円\",\n        \"genki tarou\": \"元気太郎\",\n        \"genkung\": \"Genkung\",\n        \"gennosuke\": \"源之助\",\n        \"genshi\": \"GENSHI\",\n        \"george\": \"ジョージ\",\n        \"geppei\": \"月餅\",\n        \"gero\": \"げろ\",\n        \"shimaki ika\": \"風巻いか\",\n        \"gesho ichirou\": \"げしょ一郎\",\n        \"geshop\": \"げしょぷ\",\n        \"gggg\": \"GGGG\",\n        \"ggrn\": \"GGRN\",\n        \"gia\": \"ギア\",\n        \"gida\": \"ぎだ\",\n        \"gigokku\": \"疑獄\",\n        \"gimako\": \"ぎまこ\",\n        \"gin\": \"ぎん\",\n        \"gin jyuji\": \"銀十字\",\n        \"gincha\": \"銀茶\",\n        \"ginga azuma\": \"銀河アズマ\",\n        \"gingitsune\": \"宇宙戦艦ヤマト\",\n        \"ginichi\": \"銀一\",\n        \"ginkamen\": \"銀仮面\",\n        \"ginko\": \"ginko\",\n        \"ginmugi\": \"銀麦\",\n        \"ginnosuke\": \"銀ノ助\",\n        \"gino\": \"Gino\",\n        \"ginseiou\": \"銀星王\",\n        \"ginta\": \"ぎん太\",\n        \"ginto\": \"吟人\",\n        \"ginzake\": \"ギンザケ\",\n        \"giro chinko-chan\": \"ギロ・チン子ちゃん\",\n        \"gisyo\": \"gisyo\",\n        \"giu\": \"ぎう\",\n        \"glastonbury1966\": \"グラストンベリー1966\",\n        \"glycerol takeru\": \"グリセリンたける\",\n        \"glyserin\": \"グリセ麟\",\n        \"gmkj\": \"GMKJ\",\n        \"go-1\": \"Go-1\",\n        \"goban\": \"ごばん\",\n        \"goblin\": \"ゴブリン\",\n        \"goblinboy\": \"kronn\",\n        \"gochou\": \"伍长\",\n        \"gody\": \"Gody\",\n        \"goggles\": \"goggles\",\n        \"gohan no otomo\": \"ごはんのおとも\",\n        \"goji\": \"ゴジ\",\n        \"gojou kurota\": \"五條くろた\",\n        \"gojou shino\": \"ごじょう忍\",\n        \"gokuraku jouko\": \"極楽浄子\",\n        \"gokurou\": \"ごくろう\",\n        \"golden\": \"ゴールデン\",\n        \"golgi bon\": \"ゴルジイ本\",\n        \"goma\": \"ごま\",\n        \"goma satoshi\": \"ごまさとし\",\n        \"gomabura\": \"ごまぶら\",\n        \"gomashi\": \"ごまし\",\n        \"gomatamago\": \"ゴマタマゴ\",\n        \"gomoku tsukune\": \"ごもくつくね\",\n        \"gomtang\": \"GomTang\",\n        \"gomu\": \"ゴム\",\n        \"gon\": \"ごん\",\n        \"gon heihachi\": \"ゴン平八\",\n        \"gonbuto\": \"ごんぶと\",\n        \"gonta\": \"ゴンタ\",\n        \"gonza\": \"gonza\",\n        \"gonzaburo-\": \"ゴンざぶろー\",\n        \"gorgon\": \"ゴルゴン\",\n        \"golgonzola\": \"ごるごんぞーら\",\n        \"goriyaku\": \"ごりやく\",\n        \"goro\": \"ごろ\",\n        \"gorogoro\": \"ゴロごろ\",\n        \"gorohati\": \"ごろはち\",\n        \"goro ichi\": \"五六壱\",\n        \"goroumaru\": \"五郎丸\",\n        \"gotakichi\": \"誤汰吉\",\n        \"goto-p\": \"ごとP\",\n        \"gotou\": \"ゴトウ\",\n        \"gotou sakaaki\": \"ごとうさかあき\",\n        \"gouda hakase\": \"ｺﾞｳﾀﾞﾊｶｾ\",\n        \"gouda nagi\": \"剛田ナギ\",\n        \"gouguru\": \"ゴーグル\",\n        \"goyac\": \"ごやっち\",\n        \"gozaemon\": \"御座衛門\",\n        \"gozaru\": \"ござる\",\n        \"gozen\": \"午前\",\n        \"gozen reiji\": \"御前零士\",\n        \"gozz\": \"gozz\",\n        \"gram\": \"グラム\",\n        \"great daikon\": \"グレイト大根\",\n        \"great magami\": \"グレート魔神\",\n        \"grey fisher\": \"グレイ・フィッシャー\",\n        \"grifon\": \"GRIFON\",\n        \"grimmelkin\": \"グリムメルキン\",\n        \"ground\": \"GROUND\",\n        \"grune\": \"Grune\",\n        \"gt\": \"GT\",\n        \"guchi wota\": \"愚痴ヲタ\",\n        \"gum\": \"ガム\",\n        \"gumbat\": \"Gumbat\",\n        \"gumi\": \"ぐみ\",\n        \"gun ryuusei\": \"群りゅうせい\",\n        \"gunnousa\": \"ぐんのうさ\",\n        \"gura\": \"ぐら\",\n        \"gure\": \"ぐれ\",\n        \"gurekan\": \"ぐれ缶\",\n        \"guri\": \"ぐり\",\n        \"guriko\": \"Guriko\",\n        \"guriko-san\": \"ぐりこ・さん\",\n        \"gushigushi maru\": \"ぐしぐし丸\",\n        \"gussan\": \"ぐっさん\",\n        \"gust-san\": \"ガストさん\",\n        \"guy\": \"GUY\",\n        \"gyakushuu takeshi\": \"逆襲武士\",\n        \"gyarin\": \"ぎゃりん\",\n        \"gyoko\": \"漁港\",\n        \"gyokro\": \"ぎょくろ\",\n        \"gyonikun\": \"魚肉ん\",\n        \"gyony\": \"Gyony\",\n        \"akatsuki kanten\": \"暁寒天\",\n        \"gyro amarume\": \"ジャイロ余目\",\n        \"gyunyu\": \"牛乳\",\n        \"gyuunyuuzaemon\": \"牛乳左卫门\",\n        \"gyuutei\": \"牛帝\",\n        \"h-h\": \"H・H\",\n        \"h9\": \"H9\",\n        \"ha-ru\": \"ha-ru\",\n        \"haba hirokazu\": \"幅ヒロカズ\",\n        \"habatakuhituji\": \"羽ばたく羊\",\n        \"habezamurai\": \"侍侍\",\n        \"habutae kyusetsu\": \"羽双重 毬雪\",\n        \"hacchake tarou\": \"はっちゃけ太郎\",\n        \"hachi\": \"はち\",\n        \"hachi duchi\": \"hachi_duchi\",\n        \"hachiko\": \"ハチコ\",\n        \"hachimitsu\": \"はちみつ\",\n        \"hachimitsu cute\": \"ハチミツキュート\",\n        \"hachiro\": \"ハチロ\",\n        \"hachiya mitsu\": \"蜂屋みつ\",\n        \"hacho\": \"はちょ\",\n        \"had\": \"ハディ\",\n        \"hadacra\": \"羽田暮\",\n        \"hafu\": \"HaFu\",\n        \"hagane soushi\": \"羽鐘そうし\",\n        \"hagane tetsu\": \"鋼鉄\",\n        \"haganemaru kennosuke\": \"鋼丸剣ノ介\",\n        \"hage\": \"はげ\",\n        \"hagetaka\": \"ハゲたか\",\n        \"hagure kedama\": \"はぐれけだま\",\n        \"hagure metal\": \"はぐれメタル\",\n        \"haiboku\": \"敗北\",\n        \"haida nanako\": \"灰田 ナナコ\",\n        \"haiiroguma\": \"はいいろぐま\",\n        \"haineken\": \"はいねけん\",\n        \"hairaito\": \"灰雷兎\",\n        \"haison\": \"haison\",\n        \"haito mitori\": \"灰都みとり\",\n        \"haitukun\": \"Haitukun\",\n        \"haizaki mejiro\": \"灰崎めじろ\",\n        \"haji\": \"ﾊｼﾞ\",\n        \"hajime\": \"創\",\n        \"hajime-san.\": \"はじめさん。\",\n        \"hajin\": \"Hajin\",\n        \"hakaba yodomu\": \"墓場淀夢\",\n        \"hakai taitei\": \"破坏大帝\",\n        \"hakano shinshi\": \"ハカノシンシ\",\n        \"hakiata\": \"はきあた\",\n        \"hakika\": \"はきか\",\n        \"hakkaku shikimi\": \"八角シキミ\",\n        \"hakoiri nekohime\": \"箱入猫姫\",\n        \"hakojima akane\": \"ハコジマアカネ\",\n        \"haku\": \"白\",\n        \"hakua ugetsu\": \"白亜右月\",\n        \"hakubun.\": \"はくぶん.\",\n        \"hakugi\": \"白義\",\n        \"hakui ami\": \"羽咋あみ\",\n        \"hakuma\": \"HAKUMA\",\n        \"hakumai gen\": \"白米玄\",\n        \"hakusui riko\": \"白水リコ\",\n        \"hakuto\": \"ハクト\",\n        \"hakutou\": \"白桃\",\n        \"hakuun\": \"はく雲\",\n        \"hakuzen\": \"白髯\",\n        \"halcachanel\": \"ハルカチャンネル\",\n        \"halco\": \"ハルコ\",\n        \"halcon\": \"はるこん\",\n        \"halfpricecelebr\": \"半額セレブ\",\n        \"hallelujah\": \"晴屋\",\n        \"halo\": \"HALO\",\n        \"halogen\": \"halogen\",\n        \"ham\": \"HAM\",\n        \"ham sausage\": \"公双誠二\",\n        \"hama\": \"はま\",\n        \"hama machisu\": \"濱まちす\",\n        \"hamada mari\": \"濱田麻里\",\n        \"hamahara yoshio\": \"浜原義雄\",\n        \"hamalu\": \"hamalu\",\n        \"hamanasu\": \"はまなす\",\n        \"hamano makoto\": \"ハマノマコト\",\n        \"hamaoka ponta\": \"浜岡ポン太\",\n        \"hamashima shigeo\": \"はましま薫夫\",\n        \"hamigaki shinji\": \"はみがきしんぢ\",\n        \"hamihe\": \"はみへ\",\n        \"hamiltan\": \"ハミルタン\",\n        \"hamuhamu\": \"ハムハム\",\n        \"hamunohito\": \"ハムの人\",\n        \"hamuta\": \"公タ\",\n        \"han\": \"HAN\",\n        \"hana\": \"花\",\n        \"hanabi21\": \"花火21\",\n        \"hanada hyou\": \"はなだひょう\",\n        \"hanada ranmaru\": \"花田蘭丸\",\n        \"hanamizawa q-tarou\": \"花見沢Q太郎\",\n        \"hanamoto ari\": \"花本アリ\",\n        \"hanamura shikika\": \"華村色花\",\n        \"hanamura shuuzou\": \"花村しゅーぞー\",\n        \"hanao\": \"はなぉ。\",\n        \"hanapin\": \"はなぴん\",\n        \"hanasaki\": \"華咲\",\n        \"hanasaku mahiru\": \"花咲まひる\",\n        \"hanataka retomo\": \"はなたかれとも\",\n        \"hanauna\": \"はなうな\",\n        \"hanazawa suou\": \"花澤すおう\",\n        \"hanchou\": \"班長\",\n        \"handa\": \"handa\",\n        \"handsofmidaz\": \"handsofmidaz\",\n        \"hane\": \"HANE\",\n        \"haneda ikao\": \"羽田いかお\",\n        \"hanee\": \"HANEE\",\n        \"hanekumo\": \"羽雲\",\n        \"hanemikakko\": \"ハネミカッコ\",\n        \"hanetsuki tokei\": \"羽月とけい\",\n        \"hanibi\": \"hanibi\",\n        \"hanikura un\": \"羽仁倉雲\",\n        \"hanini\": \"はにーに\",\n        \"haniwa pao\": \"埴輪ぱお\",\n        \"hankkwo\": \"H@nk²wo\",\n        \"hankotsu max\": \"反骨MAX\",\n        \"hanma akira\": \"範馬アキラ\",\n        \"hans\": \"hans\",\n        \"hansharu\": \"半しゃる\",\n        \"hanya\": \"Hanya\",\n        \"hanyw\": \"ハニュー\",\n        \"hanzaki jirou\": \"はんざきじろう\",\n        \"hanzawa 821\": \"半澤821\",\n        \"happamushi\": \"はっぱむし\",\n        \"hara sakeru\": \"はらさける\",\n        \"hara shigeyuki\": \"原茂之\",\n        \"hara-peco\": \"腹ペ娘\",\n        \"harada\": \"はらだ\",\n        \"haraita\": \"はらいた\",\n        \"harano\": \"原野\",\n        \"harasaki\": \"原崎\",\n        \"hardcrom\": \"hardcrom\",\n        \"harenochiame\": \"ハレノチアメ\",\n        \"hareya umako\": \"晴屋うまこ\",\n        \"hari\": \"hari\",\n        \"hariken hanna\": \"はりけんはんな\",\n        \"harimoji\": \"はりもじ\",\n        \"harino646\": \"harino646\",\n        \"haritama hiroki\": \"針玉ヒロキ\",\n        \"hariyu\": \"はりゆ\",\n        \"harry\": \"ハリー\",\n        \"haru\": \"春\",\n        \"haru z\": \"はるZ\",\n        \"haru.\": \"はる。\",\n        \"haruchika\": \"ハルチカ\",\n        \"haruemon\": \"ハルゑもん\",\n        \"harufumi\": \"ハルフミ\",\n        \"haruharu haruto\": \"春々春兎\",\n        \"haruhina murasaki\": \"春雛紫\",\n        \"haruichigo\": \"はるいちご\",\n        \"haruka\": \"はるか\",\n        \"harukami rio\": \"春上里央\",\n        \"harukaze do-jin\": \"春風道人\",\n        \"harukaze koucha\": \"春風紅茶\",\n        \"harukaze unipo\": \"春風うにぽ\",\n        \"haruken\": \"ハル犬\",\n        \"haruki\": \"春辉\",\n        \"haruma tokihiko\": \"ハルマ刻彦\",\n        \"harumari\": \"はるまり\",\n        \"kasane haruo\": \"かさね春緒\",\n        \"harumi jun\": \"春海潤\",\n        \"harumi zyun\": \"春海淳\",\n        \"haruna mao\": \"榛名まお\",\n        \"harunaga makito\": \"晴永牧兎\",\n        \"haruno yomogi\": \"春野蓬\",\n        \"harunori\": \"はるのり\",\n        \"harura\": \"はるら\",\n        \"harurun\": \"はるるん\",\n        \"haruruyuco\": \"はるるゆこ\",\n        \"harusame\": \"春雨\",\n        \"harusame kiruke\": \"榛雨きるけ\",\n        \"harusawa\": \"ハルサワ\",\n        \"harusuke\": \"春助\",\n        \"haruyoshi\": \"はるよし\",\n        \"haruyuki\": \"はるゆき\",\n        \"haryu\": \"ハリュー\",\n        \"hase yuu\": \"はせ☆裕\",\n        \"hasebe kazunari\": \"长谷部一成\",\n        \"hasebe mitsuhiro\": \"长谷部臣丈\",\n        \"hasebe souutsu\": \"はせべso鬱\",\n        \"hasegawa daisuke\": \"ハセガワダイスケ\",\n        \"hasegawa keita\": \"はせがわけいた\",\n        \"hasegawa yukino\": \"長谷川ユキノ\",\n        \"hasei agana\": \"ハセイアガナ\",\n        \"hasekura\": \"支倉\",\n        \"hasekura chiaki\": \"支倉ちあき\",\n        \"hasekura noise\": \"支倉ノイズ\",\n        \"hash\": \"hash\",\n        \"hashi cube\": \"土師キューブ\",\n        \"hashiba yachi\": \"端葉やち\",\n        \"hashikure\": \"はしくれ\",\n        \"hashimo yuki\": \"羽霜ゆき\",\n        \"hashimoto\": \"橋本\",\n        \"hashinoha\": \"はしのは\",\n        \"hasuke\": \"葉助\",\n        \"hasumi elan\": \"蓮見江蘭\",\n        \"hasumi hana\": \"羽純ハナ\",\n        \"hasumi hiro\": \"ハスミヒロ\",\n        \"hasumi tsuina\": \"蓮見ついな\",\n        \"hasuno\": \"ハスノ\",\n        \"hasunoue baitsu\": \"はすの上梅津\",\n        \"hata\": \"ハタ\",\n        \"hata jinshichi\": \"湊甚七\",\n        \"hatachi\": \"はたち\",\n        \"ekataraf\": \"エカタラフ\",\n        \"hatara\": \"HATARA\",\n        \"hatimoto\": \"鉢本\",\n        \"hato\": \"hato\",\n        \"hato no suisou\": \"ハトの水槽\",\n        \"hatoba\": \"はとば\",\n        \"hatoko\": \"ハトこ\",\n        \"hatomugi\": \"鳩むぎ\",\n        \"hatoya kobayashi\": \"ハトヤ小林\",\n        \"hatoya mameshichi\": \"鳩矢豆七\",\n        \"hatsuki kyou\": \"葉月京\",\n        \"hatsushio\": \"ハツ塩\",\n        \"kuzunoha hiroshi\": \"葛葉洋志\",\n        \"hattori\": \"ハットリ\",\n        \"hattori gorou\": \"はっとりゴロー\",\n        \"hattori masaki\": \"はっとりまさき\",\n        \"hattori mitsuka\": \"服部ミツカ\",\n        \"hatty\": \"はてぃ\",\n        \"haura shouhei\": \"葉浦昌平\",\n        \"hawkear\": \"ハウケア\",\n        \"hayabusa shingo\": \"はやぶさ真吾\",\n        \"hayahide\": \"ハヤヒデ\",\n        \"hayakawa halui\": \"早川ハルイ\",\n        \"hayakawa torinone\": \"はやかわトリノネ\",\n        \"hayama yuu\": \"羽山悠\",\n        \"hayami aya\": \"はやみあや\",\n        \"hayami kuro\": \"速水くろ\",\n        \"hayami osamu\": \"速水オサム\",\n        \"hayami rokusichi\": \"速水ろくしち\",\n        \"hayami sakura\": \"速水桜\",\n        \"hayasaka mebawe\": \"はやさかめばゑ\",\n        \"hayashi\": \"はやし\",\n        \"hayashi custom\": \"はやしけ\",\n        \"hayashi mario\": \"林マリオ\",\n        \"hayashi tsukasa\": \"はやしつかさ\",\n        \"hayuta\": \"はゆた\",\n        \"hazaka mau\": \"羽坂まう\",\n        \"hazaki\": \"ハザキ\",\n        \"hazio\": \"ハジオ\",\n        \"hazuki\": \"はづき\",\n        \"hazuki kyou\": \"葉月梗\",\n        \"hazuki shishimaru\": \"葉月獅子丸\",\n        \"hazuki yuu\": \"葉月祐\",\n        \"hazumi yae\": \"羽純やえ\",\n        \"hcwr\": \"HCWR\",\n        \"heat one\": \"ヒートワン\",\n        \"hebereke black\": \"へべれけBLACK\",\n        \"hechi\": \"へち\",\n        \"hechimabushi\": \"ヘチマ節\",\n        \"hechiumu\": \"ヘチウム\",\n        \"heguri\": \"へぐり\",\n        \"heibon kaeru\": \"平凡蛙\",\n        \"heigani\": \"兵蟹\",\n        \"heika\": \"HEIKA\",\n        \"heiya\": \"へぃや\",\n        \"heizo\": \"HEIZO\",\n        \"hekyu\": \"碧宇\",\n        \"hemachi\": \"hemachi\",\n        \"hemoglobina1c\": \"へもぐろびんA1C\",\n        \"henichi\": \"ヘンイチ\",\n        \"henshako\": \"ヘンシャコ\",\n        \"heppoko taro\": \"へっぽこ太郎\",\n        \"herahera\": \"へらへら\",\n        \"hermmy\": \"Hermmy\",\n        \"hertro\": \"Hertro\",\n        \"herunia ninja\": \"ヘルニア忍者\",\n        \"heshi\": \"HESHI\",\n        \"hews\": \"Hews\",\n        \"hhh\": \"HHH\",\n        \"hi-mosu\": \"ひ～もす\",\n        \"hiatari shin\": \"日辺しん\",\n        \"hibakichi\": \"ひばきち\",\n        \"hibiiro\": \"日々色\",\n        \"hibiki jun\": \"ひびき純\",\n        \"hibiki seiya\": \"響星哉\",\n        \"hibiki wataru\": \"響ワタル\",\n        \"hibino tomoki\": \"日比野友輝\",\n        \"hida\": \"火田\",\n        \"hida mari\": \"妃田マリ\",\n        \"hida tatsuo\": \"飛田竜夫\",\n        \"hidaka ryou\": \"ヒダカリョウ\",\n        \"hidari pory5n\": \"左ポリ5ン\",\n        \"hidarikiki\": \"左利き\",\n        \"hide\": \"___hide___\",\n        \"hidori\": \"日鳥\",\n        \"higashiyama sion\": \"東山しをん\",\n        \"higashizukihi sei\": \"東月陽西\",\n        \"hige\": \"ひげ\",\n        \"hige ojisan\": \"ヒゲおじさん\",\n        \"higemorigen\": \"ヒゲモリゲン\",\n        \"higetora\": \"髭寅\",\n        \"higuchi tsuyuhito\": \"樋口露仁\",\n        \"higure samon\": \"日暮さもん\",\n        \"hihiyama yokikana\": \"比比山よきかな\",\n        \"hiiaru\": \"ひいある\",\n        \"hiichan\": \"ひぃちゃん\",\n        \"hiiragi azato\": \"柊アザト\",\n        \"hiiragi hajime\": \"柊はじめ\",\n        \"hiiragi yuki\": \"柊ゆき\",\n        \"hiiro yuki\": \"緋色雪\",\n        \"hijikawa\": \"Hijikawa\",\n        \"hijiki\": \"ひじき\",\n        \"hijiri\": \"聖\",\n        \"hijiribashi chaki\": \"聖橋茶紀\",\n        \"hikabe sakuho\": \"ひかべさくほ\",\n        \"hikanyan\": \"ひかにゃん\",\n        \"hikari\": \"ひかり\",\n        \"hikawa hekiru\": \"氷川へきる\",\n        \"hikawa yuuki\": \"斐川悠希\",\n        \"hikeshi no kaze zimbabwe\": \"火消しの風ジンバブエ\",\n        \"hikitogu\": \"ひきとぐ\",\n        \"hiko\": \"ヒコ\",\n        \"hikou nabe\": \"飛行鍋\",\n        \"hima\": \"HIMA\",\n        \"himadara\": \"ひまだら\",\n        \"hime hajime\": \"ひめ はじめ\",\n        \"himei yoru\": \"ひめいよる\",\n        \"himekawa akira\": \"姫川明月\",\n        \"himekuri\": \"ヒめくり\",\n        \"himemiya aoi\": \"姫宮葵\",\n        \"himemiya aya\": \"姫宮あや\",\n        \"himemiya nina\": \"ひめみやにいな\",\n        \"himeno\": \"ひめの\",\n        \"himeoka yuki\": \"姫岡幸忌\",\n        \"himori tsukineko\": \"妃杜つきねこ\",\n        \"himukai yuji\": \"日向悠二\",\n        \"himura eiji\": \"緋村えいじ\",\n        \"himuro kouichi\": \"氷室光一\",\n        \"hina miruku\": \"未来みるく\",\n        \"hinadori\": \"雛鳥\",\n        \"hinagi rion\": \"緋凪りおん\",\n        \"hinaki\": \"ヒナキ\",\n        \"hinako yui\": \"比奈子惟\",\n        \"hinakuma\": \"ひなくま\",\n        \"hinamatsuri touko\": \"雛祭桃子\",\n        \"hinami\": \"ひなみ\",\n        \"hinamori yui\": \"ひなもりゆい\",\n        \"hinapo\": \"ヒナポ\",\n        \"hinase aya\": \"雛瀬あや\",\n        \"hinase kazusa\": \"ヒナセカズサ\",\n        \"hinata aimi\": \"日向アイミ\",\n        \"hinata aoi\": \"日向あおい\",\n        \"hinata karin\": \"ひなた夏鈴\",\n        \"hinata momo\": \"ひなたもも\",\n        \"hinata mutsuki\": \"ひなた睦月\",\n        \"hinata neru\": \"ひなたねる\",\n        \"hinata yagaki\": \"日向野牙樹\",\n        \"hinayori\": \"ヒナヨリ\",\n        \"hino\": \"ひの\",\n        \"hinoakimitu\": \"ヒノアキミツ\",\n        \"hinoe nami\": \"ヒノエナミ\",\n        \"hinoki\": \"ひのき\",\n        \"hinooka shuuji\": \"緋ノ丘シュウジ\",\n        \"hinori\": \"ひのり\",\n        \"hinoshima sora\": \"緋乃島空\",\n        \"hinoue itaru\": \"樋上いたる\",\n        \"hir\": \"Hir\",\n        \"hira\": \"平\",\n        \"hira taira\": \"ひらたいら\",\n        \"hiraizumi\": \"比良泉\",\n        \"hiraizumi kou\": \"ひらいずみこう\",\n        \"hiraki naori\": \"平木直利\",\n        \"hirame guard\": \"ひらめがーど\",\n        \"hirano kana\": \"平野かな\",\n        \"hirano kawajuu\": \"平野河重\",\n        \"hirano kouta\": \"平野耕太\",\n        \"hirano tsukiko\": \"平野月子\",\n        \"hiraru\": \"ヒラル\",\n        \"hirasato\": \"ヒラサト\",\n        \"hirase yuu\": \"平瀬ゆう\",\n        \"hiratsura masaru\": \"ひらつらまさる\",\n        \"hirayan\": \"ひらやん\",\n        \"hirno\": \"Hirno\",\n        \"hiro kari\": \"ひろ(仮)\",\n        \"hiro kazuki\": \"比呂カズキ\",\n        \"hirob816\": \"HiRoB816\",\n        \"hiroe rei\": \"広江礼威\",\n        \"hirogoori akio\": \"広郡明生\",\n        \"hiroichi\": \"ヒロイチ\",\n        \"hirokawa kouichirou\": \"広川浩一郎\",\n        \"hirokawa tomo\": \"緋呂河とも\",\n        \"hirokazukine\": \"HirokazuKine\",\n        \"hiroko\": \"ヒロ子\",\n        \"hiromaji\": \"ひろまじ\",\n        \"hirome\": \"ひろめ\",\n        \"hironii\": \"ひろにい\",\n        \"hirono\": \"Hirono\",\n        \"hirooki\": \"博海城\",\n        \"hiroshi\": \"ヒロシ\",\n        \"hirosue maron\": \"広末まろん\",\n        \"hirota masatane\": \"廣田眞胤\",\n        \"hiroto\": \"启人\",\n        \"hiroyama hiroshi\": \"广山弘\",\n        \"hiroyoshi\": \"ヒロヨシ\",\n        \"hiroyuki\": \"ヒロユキ\",\n        \"hiroyuki koto\": \"比呂之\",\n        \"hiryuu takahiro\": \"緋龍高弘\",\n        \"hisa\": \"ひさ\",\n        \"hisahiko\": \"久彦\",\n        \"hisakabe oto\": \"久壁おと\",\n        \"hisame\": \"氷雨\",\n        \"hisame genta\": \"氷雨げんた\",\n        \"hisano\": \"ひさの\",\n        \"hisaya\": \"久夜\",\n        \"hisayakiq\": \"ひさやききゅう\",\n        \"hishimori\": \"菱守\",\n        \"histamine c\": \"ヒスタミンC\",\n        \"hiten onee-ryuu\": \"飛天御姉流\",\n        \"hitohako\": \"人箱\",\n        \"hitokko\": \"ひとっこ\",\n        \"hitomasu modoru\": \"ヒトマスモドル\",\n        \"hitomi\": \"人見\",\n        \"hitomi aki\": \"人見あき\",\n        \"hitori jozu\": \"日盗りジョーズ\",\n        \"hitotose rin\": \"春夏秋冬鈴\",\n        \"hits\": \"ひっつ\",\n        \"hitsuji\": \"HITSUJI\",\n        \"hitsuji hako\": \"日辻ハコ\",\n        \"hitsujibane shinobu\": \"羊羽 忍\",\n        \"hitsujiko\": \"羊子\",\n        \"hitsujin\": \"ひつじん\",\n        \"hitsujinx\": \"ヒツジンクス\",\n        \"hitsuki\": \"ひつき\",\n        \"hiviki.n\": \"Hiviki.N\",\n        \"hiwatari rin\": \"樋渡りん\",\n        \"hiya\": \"Hiya\",\n        \"hiyama chiaki\": \"桧山千秋\",\n        \"hiyo hiyo\": \"ひよひよ\",\n        \"hiyocco\": \"hiyocco\",\n        \"hiyoko daiou\": \"ひよこ大王\",\n        \"hiyoko.\": \"ひよこ。\",\n        \"hiyokomame\": \"ひよこまめ\",\n        \"hiyou\": \"飛熊\",\n        \"hiyozakura\": \"ひよざくら\",\n        \"hizaka\": \"ひざか\",\n        \"hizaki ryuuta\": \"ひざきりゅうた\",\n        \"hjb\": \"HJB\",\n        \"hobilo\": \"Hobilo\",\n        \"hobo3\": \"ほぼ3\",\n        \"hohehohe\": \"ほへほへ\",\n        \"hoihoi\": \"hoihoi\",\n        \"hoimin\": \"ホイミン\",\n        \"hojo\": \"hojo\",\n        \"hokage\": \"ほかげ\",\n        \"hokagemio\": \"ホカゲミオ\",\n        \"hokku\": \"ホック\",\n        \"hokuna rin\": \"北那リン\",\n        \"hokuro ryuseigun\": \"ホクロ流星群\",\n        \"hokuto\": \"北斗\",\n        \"homaderi\": \"ほまでり\",\n        \"homra\": \"homra\",\n        \"honda formalin\": \"本田ホルマリン\",\n        \"honda hajime\": \"本田基\",\n        \"honda mitsuru\": \"本多みつる\",\n        \"honda naoki\": \"本田直樹\",\n        \"honda negi\": \"本田ねぎ\",\n        \"honda opon\": \"本田おぽん\",\n        \"hone\": \"ホネ\",\n        \"honebuto danshaku\": \"骨太男爵\",\n        \"honewo arukemita\": \"ホネヲ・アルケミタ\",\n        \"honey-usako\": \"はにいうさこ\",\n        \"honjou masato\": \"本庄マサト\",\n        \"honmachi keisuke\": \"本町圭祐\",\n        \"honnori\": \"ほんのり\",\n        \"honnouchi honoji\": \"本能血ホノジ\",\n        \"honoka\": \"萌香\",\n        \"honokun\": \"ほのくん\",\n        \"honoutsukai\": \"炎使\",\n        \"hontai bai\": \"本体売\",\n        \"hontoku\": \"ホン・トク\",\n        \"honya\": \"ほにゃー\",\n        \"hoono yurumu\": \"頬乃ゆるむ\",\n        \"hoosaku\": \"ほ～さく\",\n        \"hoppege\": \"ほっぺげ\",\n        \"hora\": \"法螺\",\n        \"hori hiraki\": \"堀ヒラキ\",\n        \"horie\": \"ホリエ\",\n        \"horie tankei\": \"堀江耽閨\",\n        \"horiguchi\": \"ホリグチ\",\n        \"horikawa kyo\": \"堀川◆キョウ\",\n        \"horikiri haruto\": \"堀切ハルト\",\n        \"horimoto akira\": \"ほりもとあきら\",\n        \"hormone\": \"ホルモン\",\n        \"horo makoto\": \"幌真人\",\n        \"horosuke\": \"ホロすけ\",\n        \"hosaka takemaru\": \"保坂たけまる\",\n        \"hosaka yuuichi\": \"ほさかゆーいち\",\n        \"hoshi nohara\": \"ほしのはら\",\n        \"hoshiduki akira\": \"星月晃\",\n        \"hoshiduki melon\": \"星月めろん\",\n        \"hoshieda\": \"ほしえだ\",\n        \"hoshifuri\": \"ホシフリ\",\n        \"hoshikawa atsuki\": \"星河あつき\",\n        \"hoshikawa kirara\": \"ほしかわきらら\",\n        \"hoshimoto piero\": \"星本ピエロ\",\n        \"hoshina\": \"ほしな\",\n        \"hoshino cobato\": \"星野小鳩\",\n        \"hoshino kabi\": \"ホシノカビ\",\n        \"hoshino lala\": \"星野ララ\",\n        \"hoshino nia\": \"星野ニア\",\n        \"hoshioki\": \"ホシオキ\",\n        \"hoshizaki ryuu\": \"星崎龍\",\n        \"hoshizora\": \"星空\",\n        \"hosikawa tukimi\": \"星川月海\",\n        \"hosizora mikoto\": \"星空ミコト\",\n        \"hosoi kouzou\": \"細井コウゾウ\",\n        \"hosokawa fuziemon\": \"細川ふじえもん\",\n        \"hot\": \"HOT\",\n        \"hot melon\": \"Hot Melon\",\n        \"hota.\": \"ほた。\",\n        \"hotaru\": \"蛍\",\n        \"hotarugusa\": \"ほたる草\",\n        \"hotei kazuha\": \"保汀一葉\",\n        \"hotori\": \"歩鳥\",\n        \"houga\": \"芳芽\",\n        \"houhokekiyo\": \"ホウホケキヨ\",\n        \"houmitsu\": \"方密\",\n        \"houou-tan\": \"鳳凰たん\",\n        \"houruri\": \"蓬瑠璃\",\n        \"housubaru\": \"鳳スバル\",\n        \"houtei kara\": \"法廷から\",\n        \"hozumi takashi\": \"Hozumi Takashi\",\n        \"hozumi touzi\": \"八月一日冬至\",\n        \"hplay\": \"Hplay\",\n        \"hroz\": \"ふろず\",\n        \"htg\": \"htg\",\n        \"huet\": \"Huet\",\n        \"hujinon\": \"ふじのん\",\n        \"hukidamari\": \"吹溜\",\n        \"hukokukyohei\": \"腐国狂兵\",\n        \"hukuhukuan\": \"福々餡\",\n        \"humei\": \"フメイ\",\n        \"humi\": \"ふみ\",\n        \"humiu\": \"ふみぅ\",\n        \"humizuki\": \"Humizuki\",\n        \"huracan\": \"うらかん\",\n        \"hutoshi\": \"ふとし\",\n        \"huupo\": \"フーポ\",\n        \"huyukiti\": \"冬吉\",\n        \"huzinami kaoru\": \"藤波薫\",\n        \"hyaku\": \"ヒャク\",\n        \"hyakuen\": \"hyakuen\",\n        \"hyakuhachi\": \"ひゃくはち\",\n        \"hyakushiki cheerio\": \"百式テリヲ\",\n        \"hydrant\": \"HYDRANT\",\n        \"hyouga.\": \"ひょうが。\",\n        \"hyouju issei\": \"氷樹一世\",\n        \"hyoukai\": \"氷海\",\n        \"hypar\": \"Hypar\",\n        \"hyper unko cannon\": \"ハイパーウンコキャノン\",\n        \"hypno sushi\": \"ひぷの寿司\",\n        \"hyudora\": \"ヒュドラ\",\n        \"hyung tae kim\": \"김형태\",\n        \"hyuuga azuri\": \"日向あずり\",\n        \"iapoc\": \"IAPOC\",\n        \"ibn\": \"Ibn\",\n        \"ibonnu\": \"イボンヌ\",\n        \"ibu hidekichi\": \"伊武秀吉\",\n        \"ibuki pon\": \"息吹ポン\",\n        \"ibukichi\": \"いぶきち\",\n        \"iburo.\": \"いぶろー。\",\n        \"ica\": \"ica\",\n        \"icelee\": \"IceLee\",\n        \"ichi\": \"ichi\",\n        \"ichi ume\": \"いちうめ\",\n        \"ichi-san\": \"いち\",\n        \"ichiboshi\": \"イチボシ\",\n        \"ichie ryouko\": \"一恵りょうこ\",\n        \"ichiei\": \"一栄\",\n        \"ichifuji nitaka\": \"壱藤弐鷹\",\n        \"ichigo\": \"いちご\",\n        \"ichigo mark\": \"いちごまぁく\",\n        \"ichigo.\": \"いちご。\",\n        \"ichiha\": \"いちは\",\n        \"ichihara kazuma\": \"市原和真\",\n        \"ichii akira\": \"いちい瑛\",\n        \"ichika\": \"いちか\",\n        \"ichikawa\": \"市川\",\n        \"ichikawa ichiko\": \"市川いちこ\",\n        \"ichikawa kazuhide\": \"市川和秀\",\n        \"ichikawa ryuunosuke\": \"壱河柳乃助\",\n        \"ichikawa yayoi\": \"イチカワヤヨイ\",\n        \"ichiki tomoe\": \"壱樹ともえ\",\n        \"ichimai ugou\": \"一枚烏合\",\n        \"ichimedou\": \"いちめどー\",\n        \"ichimi\": \"いちみ\",\n        \"ichimi tougarashi\": \"いちみとうがらし\",\n        \"ichimonji mutsuki\": \"一文字睦月\",\n        \"ichinashi kimi\": \"市梨きみ\",\n        \"ichino\": \"いちの\",\n        \"ichinomiya kazusa\": \"一ノ宮かずさ\",\n        \"ichinose\": \"イチノセ\",\n        \"ichiokunen wakusei\": \"1億年惑星\",\n        \"ichiro\": \"一滝\",\n        \"ichitaka\": \"いちたか\",\n        \"ichiya\": \"一夜\",\n        \"ichiya koutei\": \"いちや皇帝\",\n        \"icica\": \"いちか\",\n        \"id-ed\": \"ID-ED\",\n        \"idogawa\": \"井戸川\",\n        \"iduki\": \"いづき\",\n        \"idumi minami\": \"いづみみなみ\",\n        \"ie gami\": \"いえがみ\",\n        \"ieda kirizen\": \"家田キリゼン\",\n        \"ifnil\": \"IFNIL\",\n        \"ifpark\": \"ifpark\",\n        \"ifuji shinsen\": \"いふじシンセン\",\n        \"igakino agenasu\": \"井垣野あげなす\",\n        \"igan seijin\": \"胃がん星人\",\n        \"iganseijin\": \"胃がん星人\",\n        \"ignica\": \"ignica\",\n        \"iguchi takajin\": \"井口たかじん\",\n        \"igusa shunrou\": \"井草春朗\",\n        \"ihara tatsuya\": \"伊原達矢\",\n        \"iida toyoyuki\": \"いいだ豊雪\",\n        \"iihama daka\": \"飯浜ダカ\",\n        \"iinano\": \"いいなの\",\n        \"iino haseru\": \"イイノ　ハセル\",\n        \"iio tetsuaki\": \"飯尾鉄明\",\n        \"iio tetsuomi\": \"飯尾哲臣\",\n        \"mesiyama\": \"飯山\",\n        \"iiyo koiyo\": \"伊々代恋夜\",\n        \"iiyon\": \"いいよん\",\n        \"iizuki tasuku\": \"唯々月たすく\",\n        \"ijiro suika\": \"居城スイカ\",\n        \"ika\": \"いか\",\n        \"ikagawa shirou\": \"いかがわ四郎\",\n        \"ikanomaru\": \"イカノマル\",\n        \"ikasumi bokuju\": \"イカスミぼくじゅー\",\n        \"ikeda jun\": \"池田淳\",\n        \"ikeda shuuko\": \"池田秀子\",\n        \"ikeda usao\": \"イケダウサオ\",\n        \"ikeda yasuhiro\": \"池田靖宏\",\n        \"ikeden\": \"いけでん\",\n        \"ikelag\": \"ikelag\",\n        \"iken\": \"イケン\",\n        \"ikoma ippei\": \"伊駒一平\",\n        \"iktk\": \"イキテク\",\n        \"iku\": \"郁\",\n        \"ikue fuji\": \"幾枝風児\",\n        \"ikuhashi muiko\": \"郁橋むいこ\",\n        \"ikuma satsuki\": \"伊久間さつき\",\n        \"ikuno harusame\": \"生野ハルサメ\",\n        \"ikura gunkan\": \"いくら軍艦\",\n        \"ikurumi bill\": \"生王ビル\",\n        \"ikuta takanon\": \"いくたたかのん\",\n        \"ikuwiron\": \"イクヰロン\",\n        \"ikuyoan\": \"ikuyoan\",\n        \"illi\": \"ILLI\",\n        \"imacchi\": \"いまっち\",\n        \"imachi reki\": \"居待暦\",\n        \"imaden\": \"いまでん\",\n        \"imagawa akira\": \"今川あきら\",\n        \"imai hanako\": \"イマイ\",\n        \"imai riho\": \"今井里穂\",\n        \"imaichi\": \"居妹治\",\n        \"imaima sayuki\": \"今々沙雪\",\n        \"imaizumi atsushi\": \"いまいずみあつし\",\n        \"imaka hideki\": \"いまかひでき\",\n        \"imaki hitotose\": \"春夏秋冬\",\n        \"imari\": \"伊万里\",\n        \"imawano lem\": \"忌野Lem\",\n        \"imazon\": \"今ゾン\",\n        \"imiju\": \"寒天\",\n        \"imotarei\": \"イモタレ\",\n        \"imozuka panikuru\": \"芋塚ぱにくる\",\n        \"imperial boy\": \"帝国少年\",\n        \"inaba fuyuki\": \"稲場冬樹\",\n        \"inaba sunimi\": \"いなばすにみ\",\n        \"inaho\": \"稲穂\",\n        \"inai\": \"居内\",\n        \"iname\": \"稲芽\",\n        \"inami heil\": \"伊波ハイル\",\n        \"inari kinzou\": \"稲荷金蔵\",\n        \"inari.\": \"ゐなり。\",\n        \"inasaki shirau\": \"稲咲しらう\",\n        \"inase shinya\": \"稲瀬信也\",\n        \"inax\": \"INAX\",\n        \"inayama\": \"稲山\",\n        \"infraton\": \"インフラトン\",\n        \"ingamorugu\": \"いんがもるぐ\",\n        \"ingram 97\": \"いんぐらむ'97\",\n        \"ini\": \"イニ\",\n        \"initsukkii\": \"いにつっきー\",\n        \"inkey\": \"inkey\",\n        \"ino-ki\": \"ino-ki\",\n        \"ino.\": \"ino.\",\n        \"inode\": \"いので\",\n        \"inoino\": \"inoino\",\n        \"inono\": \"inono\",\n        \"inori\": \"いのり\",\n        \"inoshita\": \"いのした\",\n        \"inoue junichi\": \"井上純一\",\n        \"inoue kiyoshi\": \"井上清\",\n        \"inoue mitan\": \"いのうえみたん\",\n        \"inoue takuya\": \"いのうえたくや\",\n        \"inoue tommy\": \"いのうえとみい\",\n        \"inoue yuki\": \"イノウエユキ\",\n        \"inseki 3gou\": \"隕石3号\",\n        \"inu g\": \"犬G\",\n        \"inu-blade\": \"犬ブレード\",\n        \"inuboe\": \"狗吠\",\n        \"yoshino hodaka\": \"吉野ホダカ\",\n        \"inuburo\": \"いぬぶろ\",\n        \"inucreamice\": \"いぬくりぃむあいす\",\n        \"inuduka takeru\": \"犬塚毅\",\n        \"inufuro\": \"いぬふろ\",\n        \"inugahora an\": \"犬洞あん\",\n        \"inugai shin\": \"犬凱新\",\n        \"inugami johnny\": \"犬神じょにー\",\n        \"inugami naoyuki\": \"犬神尚雪\",\n        \"inugami nepia\": \"犬上ねぴあ\",\n        \"inui haruka\": \"乾はるか\",\n        \"inui nui\": \"乾ぬい\",\n        \"inui sekihiko\": \"犬威赤彦\",\n        \"inukai\": \"犬飼\",\n        \"inukkoro\": \"いぬっころ\",\n        \"inukon geek.\": \"いぬこんぎーく。\",\n        \"inumaru\": \"犬丸\",\n        \"inumimi moeta\": \"犬耳もえ太\",\n        \"inumori sayaka\": \"犬森サヤカ\",\n        \"inunare\": \"inunare\",\n        \"inuyashiki\": \"犬屋敷\",\n        \"inuzuka bouru\": \"犬塚ボウル\",\n        \"inyucchi\": \"いにゅっち\",\n        \"io takuya\": \"射尾卓弥\",\n        \"iogi juichi\": \"井荻寿一\",\n        \"ippachi\": \"いっぱち\",\n        \"ippon\": \"一本\",\n        \"iri\": \"イリ\",\n        \"irie\": \"IRIE\",\n        \"irie yamazaki\": \"IRIE YAMAZAKI\",\n        \"iripyon\": \"いりぴょん\",\n        \"iroen\": \"いろえん\",\n        \"iroha\": \"いろは\",\n        \"irohane sui\": \"彩羽スイ\",\n        \"iroito\": \"色糸\",\n        \"irotsuya\": \"いろつや\",\n        \"irua\": \"irua\",\n        \"iruka\": \"Iruka\",\n        \"isada\": \"伊佐田\",\n        \"isaki\": \"伊佐木\",\n        \"isaki uta\": \"伊咲ウタ\",\n        \"isao\": \"isao\",\n        \"isato\": \"イサト\",\n        \"ise.\": \"いせ。\",\n        \"iseki\": \"いせき\",\n        \"isemagu\": \"いせマグ\",\n        \"iseno yajin\": \"いせのやじん\",\n        \"ishibashi shingo\": \"石橋シンゴ\",\n        \"ishida masayuki\": \"石田麻茶行\",\n        \"ishigaki takashi\": \"イシガキタカシ\",\n        \"ishigana\": \"いしがな\",\n        \"ishihara kouhei\": \"石原浩平\",\n        \"ishihara souka\": \"石原そうか\",\n        \"ishikawa kingyo\": \"石川きんぎょ\",\n        \"ishikkoro\": \"石っころ\",\n        \"ishimu\": \"イシム\",\n        \"ishino kanon\": \"石野鐘音\",\n        \"ishioto\": \"Ishioto\",\n        \"ishitoku\": \"イシトク\",\n        \"ishitomo ren\": \"いしとも蓮\",\n        \"ishizuchi ginko\": \"石鎚ぎんこ\",\n        \"isiyama kosuke\": \"石山コースケ\",\n        \"island\": \"あいらんど\",\n        \"isna\": \"イスナ\",\n        \"iso nogi\": \"磯乃木\",\n        \"isogani\": \"イソガニ\",\n        \"isoroku\": \"いそろく\",\n        \"isoya kashi\": \"磯谷かし\",\n        \"isshi taira\": \"いっしたいら\",\n        \"isshiki nishiki\": \"一敷錦\",\n        \"issi-13\": \"イッシー13\",\n        \"isuke gratanity\": \"イスケ・グラタニティー\",\n        \"isutasshu\": \"イスタッシュ\",\n        \"isutoshi\": \"ISUTOSHI\",\n        \"isya\": \"isya\",\n        \"it\": \"イット\",\n        \"itachou\": \"いたちょう\",\n        \"itaku\": \"イタク\",\n        \"itami\": \"伊丹\",\n        \"itamochi\": \"板餅\",\n        \"itaya satoruno\": \"板谷さとるの\",\n        \"ithino li\": \"一ノらい\",\n        \"ito\": \"いとう\",\n        \"ito ichizo\": \"伊藤一蔵\",\n        \"ito katsumi\": \"いとう克巳\",\n        \"ito ryusei\": \"伊藤隆生\",\n        \"itoh kani\": \"伊藤蟹\",\n        \"itome\": \"糸目\",\n        \"itotin\": \"itotin\",\n        \"itou ben\": \"伊藤ベン\",\n        \"itou hiromine\": \"伊東聖峰\",\n        \"itou jin\": \"イトウヂン\",\n        \"itou makoto\": \"伊藤誠\",\n        \"itou puriso\": \"伊藤プリソ\",\n        \"itou satera\": \"伊藤サテラ\",\n        \"itou souichi\": \"伊藤宗一\",\n        \"itoyoko\": \"ITOYOKO\",\n        \"itsuki\": \"いつき\",\n        \"itsuki kousuke\": \"いつきこうすけ\",\n        \"itsuki mai\": \"イツキ舞\",\n        \"itsuki makoto\": \"いつきまこと\",\n        \"itsuki tsukune\": \"樹つくね\",\n        \"itto\": \"一十\",\n        \"iuro\": \"ゆうろ\",\n        \"iwai takeshi\": \"祝たけし\",\n        \"iwaki amami\": \"磐城あまみ\",\n        \"iwama yoshiki\": \"いわまよしき\",\n        \"iwami shouko\": \"石見翔子\",\n        \"iwano\": \"いわの\",\n        \"iwanori\": \"いわのり\",\n        \"iwao naoto\": \"岩尾尚人\",\n        \"iwasaki hiromasa\": \"岩崎啓眞\",\n        \"iwasaki takashi\": \"いわさきたかし\",\n        \"iwashita\": \"いわした\",\n        \"iwatsuki aware\": \"岩月あわれ\",\n        \"iyoda mato\": \"伊与田まと\",\n        \"iyohara kansuke\": \"伊予原勘助\",\n        \"iyutani\": \"iyutani\",\n        \"izuki jirou\": \"戌月ジロウ\",\n        \"izumi aki\": \"和泉あき\",\n        \"izumi kyouta\": \"いずみきょうた\",\n        \"izumi masashi\": \"和泉まさし\",\n        \"izumi rion\": \"和泉リオン\",\n        \"izumi tomoki\": \"泉ともき\",\n        \"izumi yakumo\": \"和泉八雲\",\n        \"izumi yayoi\": \"和泉弥生\",\n        \"izumi yoshikazu\": \"和泉美和\",\n        \"izumi yukiru\": \"和泉ゆきる\",\n        \"izumikado kou\": \"泉門コウ\",\n        \"izumimipu\": \"いずみみぷ\",\n        \"izumo kuutarou\": \"出雲空太郎\",\n        \"izumo ryo\": \"出雲りょう\",\n        \"izuna kazuki\": \"Izuna Kazuki\",\n        \"izuna masaru\": \"飯綱まさる\",\n        \"izure\": \"いづれ\",\n        \"izurumi\": \"いづるみ\",\n        \"izushi juunin\": \"出石十人\",\n        \"j\": \"ジェイ\",\n        \"j kakeru\": \"ジョウ・カケル\",\n        \"j-max japan\": \"J-MAX JAPAN\",\n        \"j.c.pandam\": \"J・C・パンダム\",\n        \"j.sairo\": \"J・さいろー\",\n        \"jack\": \"ジャック\",\n        \"jack auber\": \"ジャック・アウバー\",\n        \"rapscallion\": \"Rapscallion\",\n        \"jack hamster\": \"ジャック・ハムスター\",\n        \"jacky\": \"Jacky\",\n        \"jacky knee-san\": \"ジャッキーニーさん\",\n        \"jaguar imoko\": \"ジャガー芋子\",\n        \"jajala\": \"ジャジャラ\",\n        \"jakko\": \"じゃっこ\",\n        \"jakomaru\": \"じゃこまる\",\n        \"jakoten\": \"じゃこてん\",\n        \"jakuwa\": \"邪鍬\",\n        \"jam ouji\": \"ジャム王子\",\n        \"jambread\": \"Jambread\",\n        \"james\": \"ジェームス\",\n        \"james hardiman\": \"skunkworks\",\n        \"jas\": \"JAS\",\n        \"jason\": \"J村\",\n        \"jax2o\": \"じゃじゃお\",\n        \"jd\": \"jd\",\n        \"jean louis\": \"ジャン・ルイ\",\n        \"jellytits7\": \"JellyTits7\",\n        \"jema\": \"jema\",\n        \"jet\": \"JET\",\n        \"jeter\": \"ジーター\",\n        \"ji yuuyuu\": \"じゆうゆう\",\n        \"jiba tenko\": \"じばてんこ\",\n        \"jigoku\": \"jigoku\",\n        \"jigoku sensei hirobe\": \"地獄先生ひろべ～\",\n        \"jii\": \"ぢぃ\",\n        \"jii jii sachira\": \"じーじー☆さちら\",\n        \"jiji\": \"じじ\",\n        \"jils\": \"JILS\",\n        \"jimi sakita\": \"ジミサキタ\",\n        \"jimo\": \"じも\",\n        \"jinbaku-ryuoh\": \"神爆龍王\",\n        \"jingai modoki\": \"人外モドキ\",\n        \"jingo kajiki\": \"神護カジキ\",\n        \"jingrock\": \"甚六\",\n        \"jinkennashi tarou\": \"人権なし太郎\",\n        \"jinmu hirohito\": \"神武裕仁\",\n        \"jinnai jun\": \"陣内潤\",\n        \"jino\": \"じーの\",\n        \"jiro\": \"JIRO\",\n        \"jirou\": \"ジロウ\",\n        \"jiseki\": \"ジセキ\",\n        \"jita\": \"爺太\",\n        \"jitsuyou shinshiki\": \"実用新式\",\n        \"jjj\": \"JJJ\",\n        \"jjune\": \"JJune\",\n        \"joey hentai\": \"Contact\",\n        \"john k. pe-ta\": \"ジョン・K・ペー太\",\n        \"johnnie\": \"じょにぃ\",\n        \"johnny\": \"じょにー\",\n        \"johnson\": \"ジョンソン\",\n        \"jomae\": \"錠間江\",\n        \"jomo\": \"じょも\",\n        \"jon\": \"じょん\",\n        \"jon ozaki\": \"ジョン尾崎\",\n        \"jordi\": \"じょるでぃ\",\n        \"joumu\": \"条夢\",\n        \"jovejun.\": \"じょぶじゅん。\",\n        \"jude\": \"jude\",\n        \"jumping dogeza\": \"ジャンピング土下座\",\n        \"jungfrau\": \"Jungfrau\",\n        \"junji\": \"じゅんじぃ\",\n        \"junko\": \"淳子\",\n        \"jura\": \"樹羅\",\n        \"juri reiqa\": \"樹莉麗華\",\n        \"jusc0\": \"jusc0\",\n        \"justy\": \"Justy\",\n        \"juubaori mashumaro\": \"十羽織ましゅまろ\",\n        \"juugatsu\": \"十月\",\n        \"juuji\": \"拾次\",\n        \"juunigatsu shoujo\": \"十二月少女\",\n        \"juurouta\": \"十郎太\",\n        \"juusangatsu\": \"拾参月\",\n        \"jyom\": \"jyom\",\n        \"jyouden\": \"ジョウデン\",\n        \"jyujyo\": \"銃丈\",\n        \"jyunintoiro\": \"獣人といろ\",\n        \"jyura\": \"じゅら\",\n        \"jyuuji\": \"拾次\",\n        \"k no ji\": \"Kの字\",\n        \"k-nattou\": \"K‐なっとう\",\n        \"k-you\": \"K-you\",\n        \"k-zima\": \"圭島瞬里\",\n        \"k. k usako\": \"k.kうさこ\",\n        \"k2 dorachan\": \"K2ドラちゃん\",\n        \"k2isu\": \"ケィス\",\n        \"k3\": \"K3\",\n        \"kabaki\": \"kabaki\",\n        \"kabane\": \"カバネ\",\n        \"kabaya kosuke\": \"樺矢耕助\",\n        \"kabayaki unagi\": \"蒲焼鰻\",\n        \"kabocha head\": \"かぼちゃヘッド\",\n        \"kabocya torute\": \"南瓜とるて\",\n        \"kabotyausagi\": \"かぼちゃ兎\",\n        \"kabuki shigeyuki\": \"香吹茂之\",\n        \"kaburaya seiden\": \"鏑矢正伝\",\n        \"kachoufuugetsu\": \"花鳥風月\",\n        \"kadita\": \"かぢ太\",\n        \"kadokura tomomi\": \"門倉ともみ\",\n        \"kadomaki shinnosuke\": \"門巻森乃介\",\n        \"kadomaru tsubura\": \"角丸つぶら\",\n        \"kadota hisashi\": \"角田ひさし\",\n        \"kadou\": \"カドウ\",\n        \"kaduki\": \"かづき\",\n        \"kaduki ryo\": \"香月稜\",\n        \"kaede kaeru\": \"楓蛙\",\n        \"kaede minoru\": \"カエデミノル\",\n        \"kaen miso\": \"火炎味噌\",\n        \"kaeru\": \"小松菜屋\",\n        \"kaeru neko\": \"かえるねこ\",\n        \"kaerudon\": \"カエル丼\",\n        \"kaeruyama yoshitaka\": \"蛙山芳隆\",\n        \"kagajou hiroki\": \"加賀城ヒロキ\",\n        \"kagami\": \"嘉臥深\",\n        \"kagami mochi\": \"かがみもち\",\n        \"kagami uekusa\": \"鏡植草\",\n        \"kagari\": \"kagari\",\n        \"kagari touya\": \"篝とうや\",\n        \"kagawa tomonobu\": \"矢野たくみ\",\n        \"kage oi\": \"影追い\",\n        \"kagehara hanzou\": \"影原半蔵\",\n        \"kageira\": \"カゲイラ\",\n        \"daigaijin\": \"Daigaijin\",\n        \"kagemusya\": \"KAGEMUSYA\",\n        \"kagerou1991\": \"陽炎1991\",\n        \"kagesaki yuna\": \"影崎由那\",\n        \"kageshio\": \"カゲシオ\",\n        \"kageusu gokuto\": \"影薄獄人\",\n        \"kagiana\": \"鍵穴\",\n        \"kagimushi\": \"かぎむし\",\n        \"kagiyama ryuta\": \"鍵山りゅうた\",\n        \"kagome\": \"籠目\",\n        \"kagura\": \"神楽\",\n        \"kagura kazuto\": \"神楽一刀\",\n        \"kagura momiji\": \"神楽紅葉\",\n        \"kagura nisiki\": \"神楽弐式\",\n        \"kagura takeshi\": \"神楽武志\",\n        \"kagura tsukune\": \"神楽つくね\",\n        \"kagura yutakamaru\": \"神楽雄隆丸\",\n        \"kagura yuuki\": \"かぐらゆうき\",\n        \"kagura yuuto\": \"神楽優人\",\n        \"kagurazaka nagu\": \"神楽坂なぐ\",\n        \"kagurazaka saki\": \"神楽坂沙希\",\n        \"kahasina\": \"川科\",\n        \"kahlua suzuki\": \"カルーア鈴木\",\n        \"kai\": \"改\",\n        \"kai makoto\": \"櫂まこと\",\n        \"kaibara keiya\": \"海原圭哉\",\n        \"kaibara you\": \"海原由布\",\n        \"kaibutsu o koeta kaibutsu\": \"怪物を超えた怪物\",\n        \"kaida michi\": \"海田路\",\n        \"kaidiu\": \"かいぢう\",\n        \"kaidou\": \"海道\",\n        \"kaidou j1\": \"蚕堂j1\",\n        \"kaidou mizuki\": \"海棠深月\",\n        \"kaiga\": \"kaiga\",\n        \"kaigun santouhei\": \"怪軍三等兵\",\n        \"kaika\": \"Kaika\",\n        \"kaiko\": \"初音\",\n        \"kaim\": \"kaim\",\n        \"kaiou\": \"悔王\",\n        \"kairakuen umeka\": \"快楽園梅香\",\n        \"kairi\": \"魁李\",\n        \"kaishaku\": \"介錯\",\n        \"kaishundou\": \"回春堂\",\n        \"kaisoku babangita\": \"快足ババンギタ\",\n        \"kaito shirou\": \"海都しろー\",\n        \"kaitou pink\": \"かいとうぴんく\",\n        \"kaizu\": \"かいず\",\n        \"kaji naoki\": \"梶なおき\",\n        \"kajimura kajima\": \"かじむらカジマ\",\n        \"kajitsu\": \"果実\",\n        \"kajiura\": \"かじうら\",\n        \"kajiwara chihaya\": \"梶原千早\",\n        \"kajiyama hiroshi\": \"梶山浩\",\n        \"kaka otoko\": \"カカ男\",\n        \"kakashi asahiro\": \"かかし朝浩\",\n        \"kakei asato\": \"筧あさと\",\n        \"kakenari\": \"kakenari\",\n        \"kakenashi\": \"かけなし\",\n        \"kakeru\": \"KAKERU\",\n        \"kakiemon\": \"カキえもん\",\n        \"kakino nashiko\": \"柿野なしこ\",\n        \"kakinomoto utamaro\": \"柿ノ本歌麿\",\n        \"kakitamajiru\": \"かきたま汁\",\n        \"kakitsubata kanae\": \"杜若かなえ\",\n        \"kakitsubata tsukune\": \"杜若つくね\",\n        \"kakizaki\": \"柿崎\",\n        \"kakka hideto\": \"活火秀人\",\n        \"kakudai\": \"カクダイ\",\n        \"kakugari ani\": \"カクガリ兄\",\n        \"kakuka\": \"かくか\",\n        \"kakutou oukoku\": \"格闘王国\",\n        \"kakuzato yun\": \"角砂糖ゆん\",\n        \"kakyouin chiroru\": \"華京院ちろる\",\n        \"kamado\": \"かまど\",\n        \"kamata\": \"かまた\",\n        \"kamatori pokari\": \"かまとりぽかり\",\n        \"kame\": \"かめ\",\n        \"kamehama takeshi\": \"亀浜たけし\",\n        \"kamei\": \"仮名\",\n        \"kamei kaori\": \"亀井香里\",\n        \"kamekichi\": \"かめ吉\",\n        \"kameponde\": \"カメポンデ\",\n        \"kami\": \"kami\",\n        \"kamimiya\": \"神宮\",\n        \"kamidou haruki\": \"神堂ハルキ\",\n        \"kamiishi nyny\": \"上石ニーニー\",\n        \"kamiishi sono\": \"神石その\",\n        \"kamikaze\": \"Kamikaze\",\n        \"kamikaze miyabi\": \"神風雅\",\n        \"kamimaki enpitsu\": \"紙巻エンピツ\",\n        \"kaminaru fuyu\": \"神鳴る冬\",\n        \"kamino ryu-ya\": \"上乃龙也\",\n        \"kamio 96\": \"神尾96\",\n        \"kamiryou kaduki\": \"上嶺榎月\",\n        \"kamisae ryouya\": \"上冴良夜\",\n        \"kamisato takeharu\": \"上里竹春\",\n        \"kamishima akira\": \"剃嶋章\",\n        \"kamishima tatsuya\": \"神嶋龍矢\",\n        \"kamishima yu\": \"神島悠\",\n        \"kamishiro midorimaru\": \"カミシロ緑マル\",\n        \"kamisori\": \"かみそり\",\n        \"kamita\": \"かみ田\",\n        \"kamitou masaki\": \"上藤政樹\",\n        \"kamitsuki shion\": \"神月紫苑\",\n        \"kamiya karin sakurako\": \"神谷迦麟桜子\",\n        \"kamiya naoya\": \"神谷尚哉\",\n        \"kamiya ogawa\": \"神宮小川\",\n        \"kamiya tomoe\": \"神谷ともえ\",\n        \"kamiyama aya\": \"神山彩\",\n        \"kamiyoshi\": \"神吉\",\n        \"kamizaki yotsuba\": \"上崎よつば\",\n        \"kamizawa reiji\": \"神沢零司\",\n        \"kamizono\": \"かみぞの\",\n        \"kamotama\": \"かもたま\",\n        \"kamui aya\": \"神居あや\",\n        \"kan\": \"環\",\n        \"kan da chi\": \"かん(だ)ち\",\n        \"kan koromoya\": \"寒衣屋\",\n        \"kana\": \"カナ\",\n        \"kanade sou\": \"奏奏\",\n        \"kanae\": \"かなえ\",\n        \"kanahito\": \"かなひと\",\n        \"kanaisei jitenshasougyou\": \"家内制自転車操業\",\n        \"kaname\": \"kaname\",\n        \"kaname nagi\": \"かなめ\",\n        \"kaname.\": \"かなめ。\",\n        \"kanan asuka\": \"河南あすか\",\n        \"kanano ayu\": \"奏乃あゆ\",\n        \"kanaru\": \"かなる\",\n        \"kanbayashi chico\": \"神林ちこ\",\n        \"kanbayashi makoto\": \"上林眞\",\n        \"kanbe\": \"kanbe\",\n        \"kanchela\": \"Kanchela\",\n        \"kanda\": \"神田\",\n        \"kandagawa\": \"神田川\",\n        \"kanduki kamibukuro\": \"環月紙袋\",\n        \"kandume\": \"かんづめ\",\n        \"kaneda asao\": \"金田麻生\",\n        \"kaneda shotaro\": \"金田正太郎\",\n        \"kanei yoh\": \"鐘井楊\",\n        \"kaneko ako\": \"金子アコ\",\n        \"kaneko rin\": \"金子鈴\",\n        \"kaneneko\": \"カネ-ネコ\",\n        \"kanesada keishi\": \"兼処敬士\",\n        \"kaneta\": \"かねた\",\n        \"kanetsuki masayoshi\": \"カネツキマサヨシ\",\n        \"kangaechuu\": \"考え中\",\n        \"kani\": \"かに\",\n        \"kanibasami\": \"かにばさみ\",\n        \"kanichiri\": \"かにちり\",\n        \"kanie\": \"鹿贄\",\n        \"kanif\": \"Kanif\",\n        \"kanikama\": \"カニカマ\",\n        \"kanikoro\": \"KANIKORO\",\n        \"kanimaru\": \"かにまる\",\n        \"kanimura ebio\": \"かに村えびお\",\n        \"kanitaro\": \"かに太郎\",\n        \"kanitoon\": \"蟹丹\",\n        \"kanju\": \"kanju\",\n        \"kanka\": \"カンカ\",\n        \"kanko\": \"かんこ\",\n        \"kanmimitsu\": \"甘味みつ\",\n        \"kanmuri\": \"かんむり\",\n        \"kanna asuke\": \"神無あすけ\",\n        \"kanna satsuki\": \"神無さつき\",\n        \"kanna tetsuboku\": \"かんな鉄木\",\n        \"kannagi kyouichi\": \"巫杏壱\",\n        \"kannatsuki noboru\": \"神奈月昇\",\n        \"kannazuki akira\": \"神無月アキラ\",\n        \"kannazuki motofumi\": \"神無月元史\",\n        \"kannazuki sakyou\": \"神名月紗香\",\n        \"kanno izuka\": \"かんのいずか\",\n        \"kanno kei\": \"神乃啓\",\n        \"kannon ouji\": \"観音王子\",\n        \"kano\": \"カノ\",\n        \"kanon\": \"花音\",\n        \"kanosamu\": \"KANOSAMU\",\n        \"kanri kokka semashi\": \"管理国家せまし\",\n        \"kansuke\": \"カンスケ\",\n        \"kantarou\": \"燗汰朗\",\n        \"kantori\": \"かんとり\",\n        \"kanu\": \"カヌ\",\n        \"kanzaki gorou\": \"かんざき五郎\",\n        \"kanzaki katsumi\": \"神崎かつみ\",\n        \"kanzaki misora\": \"神崎美宙\",\n        \"kanzaki shirou\": \"神崎四郎\",\n        \"kao\": \"Kao\",\n        \"kaori\": \"かおり\",\n        \"kapa\": \"かぱ\",\n        \"kapo\": \"カポ\",\n        \"kappa\": \"かっぱ\",\n        \"kappipe\": \"かっぴぺ\",\n        \"kara\": \"から\",\n        \"karaage muchio\": \"からあげむちお\",\n        \"karaage-chan\": \"からあげチャン\",\n        \"karakuri\": \"からくり\",\n        \"karakuribee\": \"カラくりべえ\",\n        \"karakuriusagi\": \"からくりうさぎ\",\n        \"karamai\": \"空舞\",\n        \"karasawa yonjuu\": \"唐沢四十\",\n        \"karasu chan\": \"カラスちゃん\",\n        \"karasuke d\": \"カラスケD\",\n        \"karasuma amiru\": \"烏丸あみる\",\n        \"karasuma nishiki\": \"からすま弐式\",\n        \"karasuma pink\": \"烏丸ぴんく\",\n        \"karasuma renya\": \"烏丸蓮耶\",\n        \"karasumaru\": \"烏間ル\",\n        \"karateka value\": \"カラテカ・バリュー\",\n        \"karatekikku\": \"karatekikku\",\n        \"karen kyuu\": \"華蓮きゅう\",\n        \"kari\": \"かり\",\n        \"kari paku\": \"かりぱく\",\n        \"karin\": \"かりん\",\n        \"karin akira\": \"花琳晶\",\n        \"karitaka akira\": \"狩鷹明\",\n        \"karo\": \"カロ\",\n        \"karoti\": \"かろちー\",\n        \"karucho\": \"カルチョ\",\n        \"karukanko\": \"カルカン子\",\n        \"karura jun\": \"迦楼羅淳\",\n        \"karura syou\": \"華瑠羅翔\",\n        \"karutamo\": \"かるたも\",\n        \"kasai ema\": \"葛西えま\",\n        \"kasaiya\": \"カサイ屋\",\n        \"kasaran\": \"kasaran\",\n        \"kashi\": \"華師\",\n        \"kashiba toshizou\": \"樫葉歳三\",\n        \"kashimi masao\": \"樫見正央\",\n        \"kashipam\": \"仮死パン\",\n        \"kashiwamochi june\": \"柏餅ジュン\",\n        \"kashou uta\": \"嘉咲ウタ\",\n        \"kasose\": \"風合瀬\",\n        \"kasuga\": \"春日\",\n        \"kasuga naoka\": \"春日直加\",\n        \"kasuga sunao\": \"春日沙生\",\n        \"kasuga tousen\": \"春日冬扇\",\n        \"kasugai\": \"春日井\",\n        \"kasukabe akira\": \"カスカベアキラ\",\n        \"kasuki masato\": \"春日木雅人\",\n        \"kasumi ryo\": \"かすみりょう\",\n        \"kasumi\": \"カスミ\",\n        \"kat\": \"KAT\",\n        \"katagiri\": \"カタギリ\",\n        \"katagiri atsuko\": \"かたぎりあつこ、牛乳リンダ\",\n        \"katagiri chisato\": \"片桐ちさと\",\n        \"katagiri hinoka\": \"片桐火華\",\n        \"katakana\": \"カタカナ\",\n        \"katakuri komeko\": \"片栗こめこ\",\n        \"katakuri-ko\": \"片栗子\",\n        \"katanbina\": \"かたんびな\",\n        \"katari\": \"かたり\",\n        \"katase yuu\": \"片瀬ゆう\",\n        \"katatuka kouji\": \"片塚工司\",\n        \"katazaki miki\": \"かたざきみき\",\n        \"katita\": \"Katita\",\n        \"kato cobayashi\": \"カトーコバヤシ\",\n        \"kato sig\": \"加藤シグ\",\n        \"katori youichi\": \"鹿取葉一\",\n        \"katou\": \"加藤\",\n        \"katou fuguo\": \"加藤フグオ\",\n        \"katou kakashi\": \"かとうかかし\",\n        \"katou koban\": \"加藤小判\",\n        \"katou takaaki\": \"加藤天秋\",\n        \"katou teppei\": \"加藤徹平\",\n        \"katou tetsuya\": \"加糖哲哉\",\n        \"katsudansou\": \"活断層\",\n        \"katsuma rei\": \"かつまれい\",\n        \"katsuo\": \"かつお\",\n        \"katsura 24 gou\": \"桂24號\",\n        \"katsuragi maya\": \"桂騎魔夜\",\n        \"katsuragi you\": \"葛城ゆう\",\n        \"katsuto\": \"かつと\",\n        \"katte ni kappa\": \"勝手に河童\",\n        \"katutoshi\": \"かつとし\",\n        \"katuu\": \"KATUU\",\n        \"katydid keeeta\": \"KATYDID KEEETA\",\n        \"kauti\": \"かーうち\",\n        \"kawa\": \"Kawa\",\n        \"kawacchi hirohiro\": \"かわっちひろひろ\",\n        \"kawachi izumi\": \"河内和泉\",\n        \"kawachi yuki\": \"かわち雪\",\n        \"kawada shougo\": \"かわだ章吾\",\n        \"kawadu\": \"カワヅ\",\n        \"kawagishi keitarou\": \"カワギシケイタロウ\",\n        \"kawahara\": \"カワハラ\",\n        \"kawahara shin\": \"かわはらしん\",\n        \"kawai\": \"カワイ\",\n        \"kawai kenji\": \"河合健司\",\n        \"kawakami ioru\": \"川上イオル\",\n        \"kawakami kou\": \"河上康\",\n        \"kawakami takashi\": \"川上聖\",\n        \"kawamoto hiroshi\": \"河本ひろし\",\n        \"kawamoto yutsuki\": \"河本ゆつき\",\n        \"kawamura tsukasa\": \"川邑司\",\n        \"kawana\": \"かわな\",\n        \"kawanakajima\": \"川中島\",\n        \"kawanishi yuuji\": \"かわにしゆうじ\",\n        \"kawano masatoshi\": \"川乃雅慧\",\n        \"kawanuma uotsuri\": \"川沼魚釣\",\n        \"kawase marimo\": \"川瀬まりも\",\n        \"kawase seiki\": \"カワセセイキ\",\n        \"kawasemi makiko\": \"かわせみまきこ\",\n        \"kawatare\": \"かわたれ\",\n        \"kawatsu kenjiro\": \"川津健二郎\",\n        \"kawazu kento\": \"河津ケント\",\n        \"kawazuko chouji\": \"蛙子丁字\",\n        \"kaya\": \"加耶\",\n        \"kaya rio\": \"夏谷リオ\",\n        \"kayabanashi\": \"かやばなし\",\n        \"kayako\": \"かやこ\",\n        \"kayama harumizu\": \"加山春水\",\n        \"kayama ikkaku\": \"加山一角\",\n        \"kayanagi takahiro\": \"芽薙隆裕\",\n        \"kayano\": \"茅乃\",\n        \"kayanoyuki\": \"kayanoyuki\",\n        \"kayura yuka\": \"かゆらゆか\",\n        \"kaz\": \"kaz\",\n        \"kazami aki\": \"風海聡\",\n        \"kazami rei\": \"KAZAMI澪\",\n        \"kazami ruk\": \"風見るく\",\n        \"kazamik\": \"風見圭\",\n        \"kazamitiu\": \"かざみちう\",\n        \"kazasuzu\": \"風鈴\",\n        \"kaze\": \"カゼ\",\n        \"kazekawa nagi\": \"風川なぎ\",\n        \"kazet\": \"かぜっと\",\n        \"kazeya\": \"風夜\",\n        \"kazu\": \"和\",\n        \"kazuboh\": \"KAZUBOH\",\n        \"kazuha\": \"kazuha\",\n        \"kazuhito\": \"かづひと\",\n        \"kazuki hiyori\": \"かずきひより\",\n        \"kazuki kaho\": \"香月かほ\",\n        \"kazuki yuu\": \"霞月由羽\",\n        \"kazum\": \"kazum\",\n        \"kazurasui\": \"かずらすい\",\n        \"kazushi\": \"一志\",\n        \"kazushirononko\": \"カズシロノンコ\",\n        \"kazutaro\": \"かずたろ\",\n        \"kazuto\": \"和斗\",\n        \"kazuwo daisuke\": \"カズヲダイスケ\",\n        \"kazuya\": \"カズヤ\",\n        \"kcccc\": \"kcccc\",\n        \"kebabuta\": \"けばブタ\",\n        \"kedai no kokoro\": \"懈怠の心\",\n        \"kedama\": \"けだま\",\n        \"kei\": \"慧\",\n        \"kei jiei\": \"けいじえい\",\n        \"kei kei\": \"啓々\",\n        \"kei natsu\": \"景夏\",\n        \"matumoto kei\": \"松本痙\",\n        \"keigen asuka\": \"蛍幻飛鳥\",\n        \"keiji\": \"けいじ\",\n        \"keijoh ayano\": \"圭条あやの\",\n        \"keiki\": \"けーき\",\n        \"keiko\": \"K子\",\n        \"keimi\": \"けいみ\",\n        \"keiryu\": \"keiryu\",\n        \"keishiki\": \"系式\",\n        \"keisuke\": \"Keisuke\",\n        \"keita\": \"蛍汰\",\n        \"keito\": \"圭斗\",\n        \"keke\": \"ケケ\",\n        \"kemoribbon\": \"けもりぼん\",\n        \"kemukemuke\": \"けむけむけ\",\n        \"kemushi\": \"けむし\",\n        \"ken tatuki\": \"剣辰輝\",\n        \"ken tsukikage\": \"ケン月影\",\n        \"ken-sya\": \"ken-sya\",\n        \"kenbouka\": \"KENBOUKA\",\n        \"kenmochi ena\": \"剣持えな\",\n        \"kenmomen\": \"けんもめん\",\n        \"kenpi\": \"けんぴ\",\n        \"kensuke\": \"拳介\",\n        \"kent\": \"KENT\",\n        \"kenta\": \"犬太\",\n        \"kentarou\": \"けんたろう\",\n        \"keny\": \"keny\",\n        \"kenzi\": \"kenzi\",\n        \"keoko\": \"けおこ\",\n        \"keraton\": \"ケラトン\",\n        \"kereno\": \"けれの\",\n        \"keroko\": \"けろこ\",\n        \"keso\": \"keso\",\n        \"kesupu\": \"ケスープ\",\n        \"ket\": \"KET\",\n        \"keta\": \"ケタ\",\n        \"ketama\": \"けたま\",\n        \"ketarou\": \"毛太郎\",\n        \"ketsudrum\": \"ケツドラム\",\n        \"keuma\": \"希有马\",\n        \"key\": \"きい\",\n        \"keyneq\": \"きーねく\",\n        \"kh\": \"KH\",\n        \"ki equals yuu\": \"キ=ユウ\",\n        \"ki-51\": \"ki-51\",\n        \"kiasa\": \"kiasa\",\n        \"kibimoca\": \"きびもか\",\n        \"kicchan\": \"きっちゃん\",\n        \"kichihachi\": \"きちはち\",\n        \"kichijouji kitashirou\": \"吉祥寺北四郎\",\n        \"kichiku hiroshi\": \"鬼畜広子\",\n        \"kidmo\": \"Kidmo\",\n        \"kidou muichi\": \"綺堂無一\",\n        \"kidouchi kon\": \"Kidouchi_Kon\",\n        \"kiduki erika\": \"季月えりか\",\n        \"kieyza\": \"喜栄座\",\n        \"kigetu miya\": \"キゲツミヤ\",\n        \"kigisuke\": \"木々助\",\n        \"kiguchi\": \"木口\",\n        \"kihinata hiroki\": \"希日向ひろき\",\n        \"kiiro\": \"きいろ\",\n        \"kiiro kurumi\": \"きいろくるみ\",\n        \"kijima hyougo\": \"鬼嶋兵伍\",\n        \"kijinaka mahiro\": \"雉中真裕\",\n        \"kijirushi\": \"キジルシ\",\n        \"kika\": \"きか\",\n        \"kiki\": \"kiki\",\n        \"kiki ryu\": \"貴騎琉\",\n        \"kikira\": \"ききら\",\n        \"kikkawa kabao\": \"吉川かば夫\",\n        \"kikkawa ryounei\": \"季川良寧\",\n        \"kikuchi tsutomu\": \"キクチツトム\",\n        \"kikuduki taro\": \"菊月太朗\",\n        \"kikuichi monji\": \"菊一もんじ\",\n        \"kikuno\": \"きくの\",\n        \"kikusui\": \"菊水\",\n        \"kikuta kouji\": \"菊田高次\",\n        \"kilie\": \"切絵\",\n        \"kiliu\": \"きぃう\",\n        \"killcy\": \"きるし\",\n        \"kim chii\": \"KIMちー\",\n        \"kima azusa\": \"鬼魔あづさ\",\n        \"kima-gray\": \"Kima-gray\",\n        \"kimagu\": \"きまぐ\",\n        \"kimakura\": \"きまくら\",\n        \"kimarin\": \"きまりん\",\n        \"kimi\": \"黄身\",\n        \"kimidori\": \"きみどり\",\n        \"kimidori iro\": \"樹碧唯旅\",\n        \"kimino yume\": \"君乃遊女\",\n        \"kimizuka aoi\": \"きみづか葵\",\n        \"kimobusa-j\": \"KIMOBUSA-J\",\n        \"kimotani\": \"胆谷\",\n        \"kimoto kanata\": \"きもとかなた\",\n        \"kimoto rai\": \"木本らい\",\n        \"kimrin\": \"機夢倫\",\n        \"kimura naoki\": \"樹村ナオキ\",\n        \"kimuraya izumi\": \"木村屋いづみi\",\n        \"kimuti\": \"きむち\",\n        \"kimuti-g\": \"KIMUTI-G\",\n        \"kinari\": \"きなり\",\n        \"kinata\": \"葵奈太\",\n        \"kinbakuman\": \"緊縛魔\",\n        \"kindatsu\": \"きんだつ\",\n        \"kine\": \"杵\",\n        \"kingindou yumeji\": \"琴吟どう夢路\",\n        \"kinka\": \"金夏\",\n        \"kinkoumori\": \"きんこうもり\",\n        \"kinniku shinkou\": \"筋肉信仰\",\n        \"kinntarou\": \"kinntarou\",\n        \"kino ayuri\": \"きのアユリ\",\n        \"kinohara hikaru\": \"きのはらひかる\",\n        \"kinoko\": \"Kinoko\",\n        \"kinoko dake\": \"きのこダケ\",\n        \"kinokuniya kanoko\": \"キノクニヤカノコ\",\n        \"kinosaki yuki\": \"木ノ崎由貴\",\n        \"kinoshita junichi\": \"きのした順市\",\n        \"kinoshita shashinkan\": \"木下写真館\",\n        \"kinouchi ai\": \"生之内あい\",\n        \"kinryuu\": \"禽竜\",\n        \"kinta\": \"金太\",\n        \"kinta mawaru\": \"きんたまわる\",\n        \"kintarou\": \"金たロウ\",\n        \"kintoki\": \"公時\",\n        \"kinuta kouji\": \"絹田コウジ\",\n        \"kippow\": \"キッポウ\",\n        \"kira boshi\": \"綺羅星\",\n        \"kira maru\": \"綺羅丸\",\n        \"kirara\": \"きらら\",\n        \"kirara moe\": \"きらら萌\",\n        \"kiri\": \"桐\",\n        \"kirigakure takaya\": \"きりがくれたかや\",\n        \"kirigirisu\": \"きりぎりす\",\n        \"kirihara futaha\": \"桐原ふたは\",\n        \"kirihara subako\": \"霧原すばこ\",\n        \"kirii nao\": \"桐井ナオ\",\n        \"kirikaze\": \"霧風\",\n        \"kirikiriya\": \"きりきりや\",\n        \"kirimia\": \"きりみあ\",\n        \"kirimoro\": \"きりもろ\",\n        \"kirin\": \"きりん\",\n        \"kirin kakeru\": \"木铃カケル\",\n        \"kirino kyousuke\": \"桐野キョウスケ\",\n        \"kiriri takanori\": \"霧李孝徳\",\n        \"kirisaki akihito\": \"霧咲空人\",\n        \"kirisaki mocori\": \"切裂モコリ\",\n        \"kirisawa shinji\": \"桐沢しんじ\",\n        \"kirisawa tokito\": \"きりさわときと\",\n        \"kirise\": \"キリセ\",\n        \"kirise mitsuru\": \"霧瀬ミツル\",\n        \"kirishima fuuki\": \"霧島ふうき\",\n        \"kirishima riona\": \"桐島りおな\",\n        \"kirishima shiroo\": \"霧島シロー\",\n        \"kiritachi\": \"キリタチ\",\n        \"kiritomo koroha\": \"霧巴ころは\",\n        \"kiriya\": \"霧也\",\n        \"kiriyama machi\": \"桐山マチ\",\n        \"kiriyama taichi\": \"キリヤマ太一\",\n        \"kirome\": \"きろめ\",\n        \"kirsi\": \"キルシー\",\n        \"kiryuu makoto\": \"騎竜まこと\",\n        \"kiryu masumi\": \"桐生真澄\",\n        \"kiryuu mina\": \"霧生実奈\",\n        \"kisa\": \"キサ\",\n        \"kisaki\": \"后\",\n        \"kisaki nana\": \"木崎七\",\n        \"kisaki noah\": \"希咲のあ\",\n        \"kisaki saki\": \"きさきさき\",\n        \"kisamu\": \"キサム\",\n        \"kisara ai\": \"きさら藍\",\n        \"kisara shi-\": \"キサラしぃ\",\n        \"kisaradu\": \"木更津\",\n        \"kisaragi\": \"如月\",\n        \"kisaragi kanata\": \"如月かなた\",\n        \"kisaragi mizu\": \"如月水\",\n        \"kisaragi mizuka\": \"如月瑞香\",\n        \"kisaragi moyu\": \"如月モユ\",\n        \"kisaragi neon\": \"如月ねおん\",\n        \"kisaragi sara\": \"如月沙良\",\n        \"kisaragi zwei\": \"如月ツヴァヰ\",\n        \"kishi kaisei\": \"旗幟灰星\",\n        \"kishi nisen\": \"騎士二千\",\n        \"kishida mel\": \"岸田メル\",\n        \"kishiguma toragorou\": \"岸熊虎五郎\",\n        \"kishikino\": \"きしきの\",\n        \"kishimasa\": \"きしまさ\",\n        \"kishimoto daisuke\": \"岸本大介\",\n        \"kishinosato satoshi\": \"岸里さとし\",\n        \"kisia\": \"きしあ\",\n        \"kisin juki\": \"姫心重機\",\n        \"kisirian\": \"kisirian\",\n        \"kisu yoshimitsu\": \"貴須ヨシミツ\",\n        \"kisugi\": \"きすぎ\",\n        \"kisunka\": \"kisunka\",\n        \"kisyuu naoyuki\": \"紀州直行\",\n        \"kitagawa kei\": \"きたがわけい\",\n        \"kitagawa ryuu\": \"きたがわ竜\",\n        \"kitakaze tsukasa\": \"北風つかさ\",\n        \"kitamiya genbu\": \"北宮弦武\",\n        \"kitamura hato\": \"北村鳩\",\n        \"kitamura tooru\": \"きたむらとおる\",\n        \"kitani ikari\": \"希谷一光\",\n        \"kitani sai\": \"木谷さい\",\n        \"kitao taki\": \"北尾タキ\",\n        \"kitaohji guranosuke\": \"北大路倉之介\",\n        \"kitatani uni\": \"北谷うに\",\n        \"kitayori minami\": \"きたよりみなみ\",\n        \"kitazato nawoki\": \"北里ナヲキ\",\n        \"kitoen\": \"鬼頭えん\",\n        \"kitoha\": \"きとは\",\n        \"kitsune\": \"きつね\",\n        \"kitsune tsuki\": \"狐憑き\",\n        \"kitsuneko anko\": \"狐古あんこ\",\n        \"kitto shibaru\": \"吉都しばる\",\n        \"kitty\": \"キ帝ィ\",\n        \"kiu\": \"希憂\",\n        \"kiwa\": \"きわ\",\n        \"kiwata\": \"木綿\",\n        \"kiyama shiro\": \"キヤマシロ\",\n        \"kiyan\": \"喜屋武\",\n        \"kiyo mori\": \"紀世盛\",\n        \"kiyokiba miyo\": \"清木場みよ\",\n        \"kizaki\": \"キザキ\",\n        \"kizaru\": \"黄猿\",\n        \"kizoku\": \"貴族\",\n        \"kkyz13\": \"Kkyz13\",\n        \"km\": \"KM\",\n        \"kni-droid\": \"Kにぃー\",\n        \"knight\": \"ナイト\",\n        \"knsk\": \"knsk\",\n        \"ko\": \"ko\",\n        \"ko tora\": \"小虎\",\n        \"ko-ri azuki\": \"氷あずき\",\n        \"ko.darts\": \"ko.darts\",\n        \"koala\": \"こあら\",\n        \"kobaji\": \"こばじ\",\n        \"kobako\": \"KOBAKO\",\n        \"kobanya koban\": \"孤蛮屋こばん\",\n        \"kobayashi hiyoko\": \"こばやしひよこ\",\n        \"kobayashi masakazu\": \"小林正和\",\n        \"kobayashi tetsuya\": \"コバヤシテツヤ\",\n        \"kobenza\": \"コベンザ\",\n        \"kobiyuun\": \"こびゆうん\",\n        \"kobucha\": \"昆布茶\",\n        \"kobuta no shinai\": \"こぶたのしない\",\n        \"koda masanov\": \"コダマサノブ\",\n        \"kodai heiki\": \"古代兵器\",\n        \"kodamashi\": \"kodamashi\",\n        \"kodeida\": \"こでぃだ\",\n        \"kodou\": \"コドウ\",\n        \"kodou kuji\": \"巨道空二\",\n        \"kodukue\": \"こづくえ\",\n        \"koe\": \"声\",\n        \"koga chiharu\": \"古蛾千春\",\n        \"koga rejini\": \"古賀れじに\",\n        \"koga yoshihisa\": \"胡河義久\",\n        \"kogakunama itohiro\": \"こがくなまイトヒロ\",\n        \"koganemushi\": \"こがねむし\",\n        \"kogawa masayoshi\": \"こがわまさよし\",\n        \"niiyama takashi\": \"古川やすし\",\n        \"koge neko\": \"こげねこ\",\n        \"kogma pierre\": \"こぐまピエール\",\n        \"koguma no joey\": \"こぐまのジョーイ\",\n        \"koguro masami\": \"小黒正巳\",\n        \"kohachi\": \"こはち\",\n        \"kohaku q\": \"こはくQ\",\n        \"koharu\": \"小春\",\n        \"koharuko\": \"こはるこ\",\n        \"kohinata ryou\": \"小日向 諒\",\n        \"kohitsuji\": \"こひつじ\",\n        \"kohri ms\": \"こおりみず\",\n        \"koike sadaji\": \"小池定路\",\n        \"koishikawa\": \"小石川\",\n        \"koishikawa hibiki\": \"小石川響\",\n        \"kojika\": \"こじか\",\n        \"kojima\": \"kojima\",\n        \"kojima aya\": \"こじまあや\",\n        \"kojima shoutarou\": \"小島祥太朗\",\n        \"kojiro izuta\": \"神代イヅタ\",\n        \"kojou\": \"kojou\",\n        \"koke\": \"こけ\",\n        \"koken\": \"こけん\",\n        \"kokeshi men\": \"こけし☆メン\",\n        \"kokiri\": \"コキリ\",\n        \"kokka\": \"こっか\",\n        \"koko\": \"呱呱\",\n        \"kokonoe yomogi\": \"ここのえ蓬\",\n        \"kokonoka\": \"ここのか\",\n        \"kokori\": \"ここり\",\n        \"kokujin\": \"黒人\",\n        \"kokumaro\": \"こくまろ\",\n        \"kokuu rikishi\": \"虚空力士\",\n        \"kolgha\": \"コルガー\",\n        \"kom\": \"Kom\",\n        \"koma\": \"KOMA\",\n        \"komac\": \"鼓膜\",\n        \"komagata\": \"狛形\",\n        \"komaki ren\": \"小巻恋\",\n        \"komaki tamotsu\": \"小牧保\",\n        \"komakichi\": \"こまきち\",\n        \"komame\": \"こまめ\",\n        \"komamemaru\": \"こまめ丸\",\n        \"komano mako\": \"狛野まこ\",\n        \"komaru\": \"こまる\",\n        \"kome\": \"こめ\",\n        \"kome dorobou\": \"米泥棒\",\n        \"kome tsubu\": \"こめつぶ\",\n        \"komechu\": \"こめちゅー\",\n        \"komeko\": \"komeko\",\n        \"kometanuki\": \"米たぬき\",\n        \"komichi\": \"こみち\",\n        \"komihisa\": \"こみひさ\",\n        \"kominato takuya\": \"小湊拓也\",\n        \"komon\": \"コモン\",\n        \"komori kaeru\": \"小森かえる\",\n        \"komori kiyoka\": \"小森キヨカ\",\n        \"komotoda emai\": \"小本田絵舞\",\n        \"komugi\": \"こむぎ\",\n        \"komura keita\": \"こむらけいた\",\n        \"komura saki\": \"小邑紗希\",\n        \"komuro\": \"コムロ\",\n        \"komusou\": \"こむそう\",\n        \"kona\": \"KONA\",\n        \"kona matsu\": \"粉末\",\n        \"konako\": \"こなこ\",\n        \"konata gazel\": \"此方がぜる\",\n        \"konayama kata\": \"粉山カタ\",\n        \"konboi\": \"KONBOI\",\n        \"kondom\": \"昆童虫\",\n        \"konecha\": \"こね茶\",\n        \"konkon\": \"KON-KON\",\n        \"konmori\": \"こんもり\",\n        \"konno chikata\": \"紺野チカ太\",\n        \"konnyaku yukko\": \"蒟蒻ゆっこ\",\n        \"kono\": \"河野\",\n        \"konode minoru\": \"このでみのる\",\n        \"konoi iko\": \"木井いこ\",\n        \"konoma waho\": \"このま和歩\",\n        \"konshin\": \"魂神\",\n        \"konsome\": \"コンソメ\",\n        \"koohii inu\": \"珈琲犬\",\n        \"koorogi\": \"コオロギ\",\n        \"koppamu\": \"こっぱむ\",\n        \"korikku\": \"コリック\",\n        \"korikori takeya\": \"こりこりタケヤ\",\n        \"korisei\": \"孤裡精\",\n        \"korisu\": \"こりす\",\n        \"koro\": \"ころ\",\n        \"koromia\": \"ころみあ\",\n        \"koromo\": \"衣\",\n        \"korone shousa\": \"コロね少佐\",\n        \"korotasuke\": \"コロ太助\",\n        \"korotsuke\": \"コロツケ\",\n        \"koruri\": \"こるり\",\n        \"koryu misato\": \"湖竜美里\",\n        \"kosa\": \"こさ\",\n        \"kosakai\": \"kosakai\",\n        \"koshika rina\": \"小鹿りな\",\n        \"koshimura\": \"越村\",\n        \"kosuge yuutarou\": \"小菅勇太郎\",\n        \"kosugi koutarou\": \"小杉光太郎\",\n        \"kosuke\": \"小助\",\n        \"kosuzu\": \"小鈴\",\n        \"kota\": \"耕太 | コタ | こた(炬太郎) | kota´\",\n        \"kotaru\": \"瑚樽\",\n        \"kotatsu\": \"虎龍\",\n        \"kotatsu tomodachi\": \"コタツトモダチ\",\n        \"koto\": \"koto\",\n        \"kotobuki\": \"kotobuki\",\n        \"kotobuki hajime\": \"ことぶきはじめ\",\n        \"kotobuki maimu\": \"ことぶきまいむ\",\n        \"kotobuki ringo\": \"寿りんご\",\n        \"kotobuki utage\": \"寿宴\",\n        \"kotoduki z\": \"琴月絶人\",\n        \"kotoeri iroha\": \"ことえりいろは\",\n        \"kotogi raura\": \"虎兎木蘭浦\",\n        \"kotojima motoki\": \"琴島もとき\",\n        \"kotomuke fuurin\": \"平国風鈴\",\n        \"kotono wakako\": \"琴の若子\",\n        \"kotori aiko\": \"コトリアイコ\",\n        \"kotou ichigou\": \"小嶌一豪\",\n        \"kotowari\": \"理\",\n        \"kotsumudi\": \"こつむぢ\",\n        \"kou\": \"孝\",\n        \"kou1\": \"こう1\",\n        \"kouba\": \"こうば\",\n        \"kouduki miyabi\": \"神月みやび\",\n        \"koudzuki shinobu\": \"たまご\",\n        \"kouenji marimo\": \"高円寺まりも\",\n        \"kouenji rei\": \"紅園寺麗\",\n        \"kougami\": \"鴻上\",\n        \"kougi\": \"KOUGI\",\n        \"kouguchi moto\": \"工口本\",\n        \"kouhaku\": \"紅白\",\n        \"kouma hidehito\": \"慌麻秀仁\",\n        \"koume satsuki\": \"小梅さつき\",\n        \"koumorikaizin\": \"こうもり貝人\",\n        \"koumoto nami\": \"河本那美\",\n        \"kouno kei\": \"光野けい\",\n        \"kouno mai\": \"香野舞\",\n        \"kouno mizuho\": \"紅野瑞穂\",\n        \"kouno you\": \"河野曜\",\n        \"kounose akara\": \"神瀬あから\",\n        \"kounosu\": \"こうのす\",\n        \"kouri\": \"木鈴カケル\",\n        \"kousaka donten\": \"高坂曇天\",\n        \"kousaki\": \"光崎\",\n        \"kou siryou\": \"黄支亮\",\n        \"kousoku\": \"光燭\",\n        \"koutarosu\": \"コウタロス\",\n        \"koutei\": \"皇帝\",\n        \"koutei penko\": \"校庭ぺん子\",\n        \"kouyou sakaki\": \"后謡榊\",\n        \"kouzaka kouhei\": \"神坂公平\",\n        \"koyama ichi\": \"こやまいち\",\n        \"koyama tomosato\": \"こやまともさと\",\n        \"koyama unkaku\": \"小山雲鶴\",\n        \"koyasu kazu\": \"子安和\",\n        \"koyomisa\": \"こよみさ\",\n        \"kozakura botan\": \"小桜ぼたん\",\n        \"kozakura ryou\": \"小桜りょう\",\n        \"kozara\": \"小皿\",\n        \"kozi\": \"kozi\",\n        \"kozirow\": \"Kozirow\",\n        \"kozou\": \"小僧\",\n        \"kozue akari\": \"こずえあかり\",\n        \"kozy\": \"kozy\",\n        \"krohudeanna\": \"黒筆ANnA\",\n        \"ksg\": \"ksg\",\n        \"ksheera\": \"ksheera\",\n        \"kso\": \"けそ\",\n        \"kswazza\": \"くすわZZA\",\n        \"kty\": \"KTY\",\n        \"ktzw\": \"ktzw\",\n        \"ku-ba\": \"ku-ba\",\n        \"kubota chihiro\": \"久保田チヒロ\",\n        \"kubyou azami\": \"九猫あざみ\",\n        \"kudou\": \"クドウ\",\n        \"kudou shino\": \"工藤詩乃\",\n        \"kudou taizou\": \"工藤大蔵\",\n        \"kuga mingo\": \"久我みんご\",\n        \"kugayama hodai\": \"久我山砲台\",\n        \"kugelschreiber\": \"くーげるしゅれいばー\",\n        \"kujira sanbiki\": \"くじら三匹\",\n        \"kujiran\": \"くぢらん\",\n        \"kujou shirei\": \"九条志玲\",\n        \"kuju shikuro\": \"苦渋しくろ\",\n        \"kukuru\": \"KKR\",\n        \"kuloamaki\": \"黒天姫\",\n        \"kuma\": \"くま\",\n        \"kumacchi\": \"くまっち\",\n        \"kumada kazushi\": \"熊田一司\",\n        \"kumagai hachi\": \"くまがいはち\",\n        \"kumagaya nerico\": \"熊谷ネリコ\",\n        \"kumagaya shin\": \"熊谷しん\",\n        \"kumaki toshikazu\": \"熊木十志和\",\n        \"kumakichi\": \"熊吉\",\n        \"kumano kotaro\": \"くまのこたろ\",\n        \"kumao\": \"く魔王\",\n        \"kumasaku tamizou\": \"クマ作民三\",\n        \"kumashiro\": \"くましろ\",\n        \"kumatora tatsumi\": \"熊虎たつみ\",\n        \"kumatyu\": \"クマチュウ\",\n        \"kumicho\": \"くみちょー\",\n        \"kumimon\": \"kumimon\",\n        \"kumisan\": \"くみさん\",\n        \"kumoi takashi\": \"菅野タカシ\",\n        \"kunaboto\": \"クナボト\",\n        \"kuni\": \"クニ\",\n        \"kunifuto\": \"くにふと\",\n        \"kunoichi\": \"くノ壱\",\n        \"kawahara reki\": \"川原砾\",\n        \"kuonji hodaka\": \"久遠路火鷹\",\n        \"kupala\": \"Kupala\",\n        \"kura oh\": \"蔵王\",\n        \"kurabayashi\": \"倉林\",\n        \"kurada\": \"蔵田\",\n        \"kuragari\": \"くらがり\",\n        \"kuragi\": \"蔵儀\",\n        \"kuraki hiro\": \"椋木尋\",\n        \"kurakino issiki\": \"椋木野一式\",\n        \"kurakumo nue\": \"黒雲鵺\",\n        \"kuramachi bun\": \"蔵街ぶん\",\n        \"kurami\": \"蔵見\",\n        \"kuramoto keizou\": \"蔵本鶏蔵\",\n        \"kurano yuuichi\": \"倉野ユウイチ\",\n        \"kuraoka aki\": \"倉岡亜妃\",\n        \"kurasaki aya\": \"倉崎あや\",\n        \"kurasawa kyosyo\": \"倉澤京章\",\n        \"kurata ichiro\": \"倉田いち朗\",\n        \"kurata muto\": \"倉田むと\",\n        \"kurata shinji\": \"倉田シンジ\",\n        \"kuratsuka riko\": \"倉塚りこ\",\n        \"kuraya\": \"蔵屋\",\n        \"kure\": \"くれ\",\n        \"kure ichirou\": \"くれいちろう\",\n        \"kure shikure\": \"久澪しくれ\",\n        \"kureha mitsushige\": \"自遊本舗「宇」\",\n        \"kureha yosho\": \"くれは洋書\",\n        \"kurei daisuke\": \"暮井大助\",\n        \"kurenami yuuji\": \"暮浪夕時\",\n        \"kuresato yoshiaki\": \"暮里良昭\",\n        \"kureta fumiaki\": \"呉田文明\",\n        \"kureura keita\": \"暮浦鶏太\",\n        \"kuri\": \"栗\",\n        \"kurikama\": \"くりかま\",\n        \"kuriki\": \"kuriki\",\n        \"kurisu\": \"くりす\",\n        \"chris tina\": \"栗栖ティナ\",\n        \"kuro\": \"KURO\",\n        \"kuro hiyoko\": \"黒ひよこ\",\n        \"kuro itachi\": \"黒イタチ\",\n        \"kuro koshou\": \"黒胡椒\",\n        \"kuro oolong\": \"黒烏龍\",\n        \"kuro tengu\": \"黒てんぐ\",\n        \"kuro yorozu\": \"くろよろず\",\n        \"kuroama\": \"黒甘\",\n        \"kuroarama soukai\": \"黒荒馬双海\",\n        \"kurocastle\": \"黒城\",\n        \"kurocazenosora\": \"黒風ノ空\",\n        \"kuroda\": \"黒田\",\n        \"kuroda akimi\": \"黒田晶見\",\n        \"kurodou katana\": \"黒堂カタナ\",\n        \"kurogane\": \"くろがね\",\n        \"kurogane riku\": \"鐵陸\",\n        \"kurogane satsuki\": \"黒金さつき\",\n        \"kuroha nue\": \"クロハぬえ\",\n        \"kuroha rapid\": \"黒羽ラピッド\",\n        \"kurohagane\": \"クロハガネ\",\n        \"kurohekiten\": \"黒碧天\",\n        \"kuroi inu\": \"黒い犬\",\n        \"kuroi kingyo\": \"黒井きんぎょ\",\n        \"kuroi moyamoya\": \"黒井もやもや\",\n        \"kuroichiba\": \"くろいちば\",\n        \"kuroie\": \"黒家\",\n        \"kuroihi\": \"くろいひ\",\n        \"kuroinu\": \"くろ犬\",\n        \"kurokari nigou\": \"黒狩弐号\",\n        \"kurokawa girito\": \"黒川ギリト\",\n        \"kurokawa izumi\": \"黒川 IZUMI\",\n        \"kurokawa juso\": \"黒川呪詛\",\n        \"kurokawa rikuu\": \"黒川律空\",\n        \"kurokawa ryu\": \"黒川竜\",\n        \"kurokawa tasuku\": \"黒川たすく\",\n        \"kurokaze hanare\": \"黒風離零\",\n        \"kuroki bicoco\": \"黒木ビココ\",\n        \"kuroki masahiro\": \"黒木雅弘\",\n        \"kurokishi\": \"黒騎士\",\n        \"kuroko\": \"クロ子\",\n        \"kurokura eri\": \"黒倉エリ\",\n        \"kurokuro\": \"くろくろ\",\n        \"kurokuroku\": \"黒九六\",\n        \"kuromame\": \"クロマメ\",\n        \"kuromame mugicha\": \"黑豆麦茶\",\n        \"kuromi\": \"kuromi\",\n        \"kuromitu\": \"kuromitu\",\n        \"kuromiya sakana\": \"黒宮魚\",\n        \"kuromogu\": \"黒モグ\",\n        \"kuromoinu no kemono\": \"黒藻犬の獣\",\n        \"kurona\": \"くろな\",\n        \"kuroneko nigou\": \"黒猫弐号\",\n        \"kuroneko reigou\": \"黒猫零号\",\n        \"kuronezumi\": \"くろねズみ\",\n        \"kurono masakado\": \"黒乃マサカド\",\n        \"kurono rokurou\": \"黒野六郎\",\n        \"kuroore\": \"黒俺\",\n        \"kurosai\": \"黒齋\",\n        \"kurosaki bunta\": \"黒崎文太\",\n        \"kurosaki kotora\": \"黒崎仔虎\",\n        \"kurosaki mairi\": \"黒崎まいり\",\n        \"kurosaki yuuri\": \"黒崎 百利\",\n        \"kurosawa\": \"クロサワ\",\n        \"kurosawa shouhei\": \"黒沢庄平\",\n        \"kuroshiki\": \"玄式\",\n        \"kurosirogurei\": \"黒白ぐれい\",\n        \"kurosu\": \"黒須\",\n        \"kurosuke\": \"黒すけ\",\n        \"kurota\": \"くろた\",\n        \"kurota nichiru\": \"黒田にちる\",\n        \"kurotama\": \"くろたま\",\n        \"kuroto\": \"黑斗\",\n        \"kurotsuki\": \"黑月\",\n        \"kurotsuki kyouto\": \"黒月京都\",\n        \"kurouku\": \"くろーく\",\n        \"kuroya kenji\": \"黒谷賢志\",\n        \"kuroyume naoto\": \"黒夢奈音\",\n        \"kurozako\": \"くろざこ\",\n        \"kurukuru\": \"クルクル\",\n        \"kuruma\": \"くるま\",\n        \"kurumai\": \"くるまい\",\n        \"kurumi moka\": \"胡桃もか\",\n        \"kurumi riko\": \"胡桃りこ\",\n        \"kurushima\": \"くるしま\",\n        \"kurusu kanon\": \"来栖かのん\",\n        \"kurutsuki\": \"KURUTSUKI\",\n        \"kuruwa aki\": \"くるわ亜希\",\n        \"kusabi keri\": \"楔ケリ\",\n        \"kusahara kuuki\": \"草原空貴\",\n        \"kusairo kaede\": \"草色楓\",\n        \"kusaka maichi\": \"駆坂真一\",\n        \"kusakabe tsukasa\": \"日下部つかさ\",\n        \"kusakami akira\": \"草上明\",\n        \"kusanagi ryuuiti\": \"草薙龍一\",\n        \"kusanagi tonbo\": \"草凪蜻蛉\",\n        \"kusano houki\": \"草野ほうき\",\n        \"kusano tsuyuri\": \"草野つゆり\",\n        \"kushida ashura\": \"くしだあしゅら\",\n        \"kushikatsu koumei\": \"串カツ孔明\",\n        \"kushinada iruwe\": \"櫛灘ゐるゑ\",\n        \"kusnoha kaede\": \"くすのは楓\",\n        \"kusugano\": \"我野\",\n        \"kusunoki hina\": \"楠木ひな\",\n        \"kusunoki rin\": \"楠木りん\",\n        \"kusurin\": \"くすりん\",\n        \"kutsugen kanna\": \"屈原神無\",\n        \"kuurin\": \"空輪\",\n        \"kuusou\": \"空想\",\n        \"kuuya\": \"空也\",\n        \"kuwabara\": \"くわばら\",\n        \"kuwabatake kajuen\": \"桑畑果樹園\",\n        \"kuzirazio\": \"くじらジオ\",\n        \"kuzu\": \"屑\",\n        \"kuzukow\": \"屑コウ\",\n        \"kuzuya\": \"くずや\",\n        \"kuzuyama mememe\": \"屑山めめめ\",\n        \"kuzuyu\": \"葛湯\",\n        \"kuzzy\": \"くっじー\",\n        \"ky.\": \"ky.\",\n        \"kyanite\": \"Kyanite\",\n        \"kyantama\": \"きゃんたま\",\n        \"kyantaman\": \"きゃんたマン\",\n        \"kyarine\": \"きゃりね\",\n        \"kyawashuku\": \"きゃわしゅく\",\n        \"kyohei\": \"KYOHEI\",\n        \"kyokkai\": \"曲解\",\n        \"kyoko\": \"響胡\",\n        \"kyokugeiteki jiisha\": \"曲芸的自慰者\",\n        \"kyokutyo\": \"kyokutyo\",\n        \"kyolnov\": \"キョルノフ\",\n        \"kyoro\": \"きょろ\",\n        \"kyosu\": \"キョス\",\n        \"kyou\": \"kyou\",\n        \"kyou konogoro\": \"kyouこの頃\",\n        \"kyouan\": \"狭暗\",\n        \"kyouka\": \"狂華\",\n        \"kyouno aki\": \"京野秋\",\n        \"kyouta\": \"きょう太\",\n        \"kyouyuu kei\": \"叫遊佳\",\n        \"kyuri\": \"kyuri\",\n        \"kyusui\": \"吸水\",\n        \"kyuun\": \"きゅうん\",\n        \"kyuunosuke\": \"きゅうのすけ\",\n        \"kyuuri\": \"kyuuri\",\n        \"kyuuryuujousai\": \"九龍城砦\",\n        \"kyuusho tarou\": \"急所太郎\",\n        \"kyuushoku\": \"給食\",\n        \"l apple\": \"Lアップル\",\n        \"l-road\": \"エルロード\",\n        \"l-s\": \"L-S\",\n        \"la-men\": \"LA-MEN\",\n        \"lact mangan\": \"楽人満願\",\n        \"lakuhito\": \"lakuhito\",\n        \"lamb\": \"Lamb\",\n        \"lamcha\": \"ラム茶\",\n        \"langerhans\": \"ランゲルハンス\",\n        \"lantana\": \"ランタナ\",\n        \"laomeng\": \"LaoMeng\",\n        \"lapiness\": \"lapiness\",\n        \"larua\": \"ラルア\",\n        \"laserflip\": \"Laserflip\",\n        \"lassie\": \"らっしー\",\n        \"laut 2-sei\": \"ラウト2世\",\n        \"lay dragon\": \"零龍\",\n        \"lazu\": \"Lazu\",\n        \"lazuli\": \"らずり\",\n        \"lbl\": \"LBL\",\n        \"leaf\": \"Leaf\",\n        \"leafy\": \"リーフィ\",\n        \"lee\": \"LEE\",\n        \"lefleau\": \"ルフレ王\",\n        \"lefthand\": \"レフトハンド\",\n        \"leli\": \"レリ\",\n        \"lem\": \"LEM\",\n        \"lemon jiru\": \"レモン汁\",\n        \"lena a-7\": \"LENA[A-7]\",\n        \"lento\": \"蓮斗\",\n        \"leonardo\": \"れオナるド\",\n        \"leonat\": \"レオナト\",\n        \"leopard\": \"レオパルド\",\n        \"leopon\": \"れおぽん\",\n        \"level.21\": \"Level.21\",\n        \"lew\": \"レゥ\",\n        \"lewis\": \"ルイス\",\n        \"lewis mclaren\": \"るいす・まくられん\",\n        \"leymei\": \"LEYMEI\",\n        \"liang xing\": \"狼星\",\n        \"libonzu\": \"吉啓\",\n        \"lielos\": \"ゆいれそ\",\n        \"lien\": \"Lien\",\n        \"like\": \"Like\",\n        \"lilish\": \"lilish\",\n        \"lime\": \"Lime\",\n        \"lina\": \"Lina\",\n        \"lionel\": \"ライオネル\",\n        \"littlemare\": \"リトルメア\",\n        \"liveis watanabe\": \"リーバイス渡辺\",\n        \"llm\": \"LLM\",\n        \"locon\": \"locon\",\n        \"locos\": \"ろこす\",\n        \"lod\": \"Lod\",\n        \"logie\": \"路地\",\n        \"lolee\": \"炉LEE\",\n        \"loliconder\": \"ロリコンダー\",\n        \"lolie\": \"ろりえ\",\n        \"lolimoyashi\": \"ろりもやし\",\n        \"lond\": \"ろんど\",\n        \"lopez hakkinen\": \"ロペス・ハッキネン\",\n        \"loriko\": \"Loriko\",\n        \"lowhide\": \"ろーはいど\",\n        \"luchi\": \"ルーチ\",\n        \"lucie\": \"ルーシー\",\n        \"luck\": \"らっく\",\n        \"lucknight\": \"Lucknight\",\n        \"luka\": \"ルカ\",\n        \"luku\": \"る～く\",\n        \"lummy\": \"Lummy\",\n        \"lumper sheider\": \"LumperSheider\",\n        \"luphis\": \"luphis\",\n        \"lurkergg\": \"Contact\",\n        \"lutein\": \"Lutein\",\n        \"luu\": \"Luu\",\n        \"lux\": \"Lux\",\n        \"luxianne\": \"Contact\",\n        \"lvi\": \"LVI\",\n        \"m\": \"M\",\n        \"m-max\": \"M-MAX\",\n        \"m2go\": \"M2号\",\n        \"m9kndi\": \"m9kndi\",\n        \"ma-yu\": \"ma-yu\",\n        \"mabo\": \"マボ\",\n        \"maboku\": \"魔ボク\",\n        \"mabuchoko m\": \"マブチョコ M\",\n        \"mac-v\": \"MAC-V\",\n        \"macanoka\": \"マカノカ\",\n        \"macaroni\": \"まかろに\",\n        \"maccha\": \"抹茶\",\n        \"maccha chamomo\": \"抹茶ちゃもも\",\n        \"maccha neji\": \"抹茶ねじ\",\n        \"maccha vanilla\": \"抹茶バニラ\",\n        \"macchaume\": \"抹茶梅\",\n        \"macchi\": \"まっち\",\n        \"macchuu\": \"まっちゅう\",\n        \"machi\": \"マチ\",\n        \"machi gaita\": \"街凱太\",\n        \"machi machiko\": \"町マチコ\",\n        \"machigi ruru\": \"街樹るる\",\n        \"machimura komori\": \"町村こもり\",\n        \"machine head\": \"Machine Head\",\n        \"machino henmaru\": \"町野変丸\",\n        \"macho.\": \"マッチョ。\",\n        \"maclo\": \"まっ黒\",\n        \"macop\": \"Macop\",\n        \"madae thor\": \"未江達\",\n        \"madara\": \"まだら\",\n        \"madara sai\": \"まだらさい\",\n        \"mado\": \"まど\",\n        \"madohan\": \"まどはん\",\n        \"madoka hifumi\": \"まどかひふみ\",\n        \"mae\": \"前\",\n        \"maeda\": \"まえだ\",\n        \"maeda momo\": \"まえだもも\",\n        \"maeguchi syunzou\": \"前口俊三\",\n        \"maekawa hayato\": \"前川ハヤト\",\n        \"mag\": \"MAG\",\n        \"mage\": \"mage\",\n        \"magic xiang\": \"Magic_Xiang\",\n        \"magiko\": \"マギコ\",\n        \"magokoro kurage\": \"まごころくらげ\",\n        \"magorona\": \"まごろな\",\n        \"magpoppo\": \"まぐぽっぽ\",\n        \"magtan\": \"まぐたん\",\n        \"magu\": \"マグ\",\n        \"maguro ouji\": \"真黒皇子\",\n        \"maguro taishi\": \"マグロ大使\",\n        \"mahan.\": \"まはん。\",\n        \"mahimaru\": \"まひまる\",\n        \"mahiruno kagerou\": \"まひるの影郎\",\n        \"maho\": \"真秀\",\n        \"mahouya\": \"魔法屋\",\n        \"mai\": \"MAI\",\n        \"myrage\": \"舞麗辞\",\n        \"mai renjie\": \"麥人杰\",\n        \"maihara\": \"まいはら\",\n        \"maihime\": \"舞姫\",\n        \"maino\": \"マイノ\",\n        \"maino umi\": \"まいのうみ\",\n        \"maitake\": \"まいたけ\",\n        \"maji\": \"マジ\",\n        \"majiyoko\": \"まじよこ\",\n        \"maka kiseki\": \"マカキセキ\",\n        \"makano mucchi\": \"摩訶乃ムッチ\",\n        \"makarou\": \"まかろー\",\n        \"suta furachina\": \"スター不埒な＠まかそに\",\n        \"make\": \"make\",\n        \"makedon\": \"まけどん\",\n        \"maki\": \"まき\",\n        \"maki katsuya\": \"勝生真菜美\",\n        \"maki miyuki\": \"牧美雪\",\n        \"maki morun\": \"槙モルン\",\n        \"makiavery\": \"牧亜べりぃ\",\n        \"makigai ikko\": \"巻貝一ヶ\",\n        \"makimaru\": \"巻丸\",\n        \"makinaru\": \"まきなる\",\n        \"makinon tm\": \"まきのんTM\",\n        \"makinosaka shinichi\": \"牧野坂シンイチ\",\n        \"makirin\": \"まきリン\",\n        \"makishi miya\": \"槇志未夜\",\n        \"makita aoi\": \"魔北葵\",\n        \"makita miki\": \"蒔田ミキ\",\n        \"makka\": \"makka\",\n        \"makka na kedamono\": \"真っ赤なケダモノ\",\n        \"makko reader\": \"maッコ・リーダー\",\n        \"makkuro\": \"まっ黒\",\n        \"makomo ashino\": \"まこも葦乃\",\n        \"makoni\": \"makoni\",\n        \"makoto daikichi\": \"まこと大吉\",\n        \"makoushi\": \"魔公子\",\n        \"makpower\": \"Makpower\",\n        \"makui\": \"幕井\",\n        \"makuma ikeru\": \"マ熊イケル\",\n        \"makunouchi\": \"幕野内\",\n        \"makunouchi isami\": \"幕の内勇\",\n        \"makura cover\": \"枕河馬亜\",\n        \"makura no doushi\": \"まくらの同士\",\n        \"makuwa\": \"ま・くわ\",\n        \"malaia\": \"マライぁ\",\n        \"malino\": \"MALINO\",\n        \"maluball\": \"毛玉丸\",\n        \"mam melon\": \"まむめろん\",\n        \"mamaka\": \"麻々花\",\n        \"mame\": \"豆\",\n        \"mame-p\": \"まめP\",\n        \"mamedanuki\": \"まめだぬき\",\n        \"mami\": \"まみ\",\n        \"mamiya\": \"マミヤ\",\n        \"mamiya noriko\": \"間宮法子\",\n        \"mamiya poko\": \"まみやぽこ\",\n        \"mamiya shouko\": \"間宮庄子\",\n        \"mamo\": \"MAMO\",\n        \"mamoi\": \"まもぃ\",\n        \"mamono karin\": \"まものかりん\",\n        \"mamoribito\": \"守り人\",\n        \"mamuru\": \"mamuru\",\n        \"man\": \"mAn\",\n        \"manabe jouji\": \"真鍋譲治\",\n        \"manaka mizuki\": \"マナカミズキ\",\n        \"manao\": \"まなお\",\n        \"manarou\": \"まなろう\",\n        \"manatsu roco\": \"真夏ろこ\",\n        \"manboren\": \"まんぼん練\",\n        \"mance\": \"まんす\",\n        \"manekineko\": \"マネキ猫\",\n        \"mangetsu pon\": \"満月ポン\",\n        \"mangosteen\": \"マンゴスチン\",\n        \"manjiro\": \"まんじろー\",\n        \"manjuurou\": \"まんじゅうろう\",\n        \"manle\": \"マンル\",\n        \"manmosu marimo\": \"マンモスまりも\",\n        \"mao\": \"真尾\",\n        \"mao fabao\": \"猫法宝\",\n        \"mao no\": \"MAOの\",\n        \"maomi leon\": \"真臣レオン\",\n        \"map\": \"まっぷ\",\n        \"maple-go\": \"maple号\",\n        \"mappa\": \"まっぱ\",\n        \"mapputatsu\": \"マップタツ\",\n        \"marble\": \"マーブル\",\n        \"mare halberd eye\": \"メアー・ハルベルト・アイ\",\n        \"mareo\": \"まれお\",\n        \"margamoid\": \"まーがもいど\",\n        \"maria\": \"まりあ\",\n        \"marianne hanako\": \"マリアンヌ花子\",\n        \"marika\": \"まりか\",\n        \"marimo\": \"マリモ\",\n        \"marin\": \"まりる\",\n        \"marinade vinegar\": \"マリネ・ビネガー\",\n        \"mario kaneda\": \"まりお金田\",\n        \"maripyon\": \"まりぴょん\",\n        \"maririn\": \"まりりん\",\n        \"maririn anaka\": \"マリリンあなか\",\n        \"marlin\": \"まーりん\",\n        \"marron\": \"魔龍\",\n        \"martan\": \"まあたん\",\n        \"maru\": \"マル\",\n        \"maru dasshu\": \"まるだっしゅ\",\n        \"maru mary\": \"墨丸まり\",\n        \"maru mikan\": \"○蜜柑\",\n        \"maru sun\": \"まるサン\",\n        \"maru.\": \"まる。\",\n        \"marubayashi shumaru\": \"○林修○\",\n        \"marugoto ringo\": \"まるごと林檎\",\n        \"maruhage p\": \"丸禿P\",\n        \"marui\": \"まるい\",\n        \"marui ryuu\": \"まるいりゅう\",\n        \"marukidou\": \"まるキ堂\",\n        \"marukome\": \"まるこめ\",\n        \"maruma\": \"まるま\",\n        \"marumarusuke\": \"まる丸介\",\n        \"marumi\": \"丸美\",\n        \"marumu\": \"まるむ\",\n        \"maruna\": \"まるな\",\n        \"marunosuke\": \"まるのすけ\",\n        \"marupuni\": \"まるぷに\",\n        \"marurou\": \"まるろう\",\n        \"marurumi\": \"まるるみ\",\n        \"maruto\": \"Maruto!\",\n        \"maruyama kaori\": \"まるやま香里\",\n        \"maruyama kei\": \"丸山圭\",\n        \"masa\": \"将\",\n        \"masa-nii\": \"マサ兄\",\n        \"masaki\": \"MASAKI\",\n        \"masaki shisari\": \"真咲シサリ\",\n        \"masakichi\": \"まさきち\",\n        \"masama\": \"まさma\",\n        \"masamu\": \"マサムー\",\n        \"masanaga\": \"政长\",\n        \"masara\": \"まさら\",\n        \"masaya ichika\": \"磨鞘一佳\",\n        \"masayoshi tomoko\": \"まさよしともこ\",\n        \"masbe akyto\": \"まそべ晶磨\",\n        \"masha\": \"masha\",\n        \"mashikodori\": \"ましこどり\",\n        \"mashiro\": \"ましろ\",\n        \"mashitaka\": \"ましたか\",\n        \"mashu maro\": \"真朱麻呂\",\n        \"mashune\": \"MASHUNE\",\n        \"mask the j\": \"マスクザJ\",\n        \"massan\": \"まっさん\",\n        \"masuda tsuyoshi\": \"増田剛\",\n        \"masuishi kinoto\": \"桝石きのと\",\n        \"masujima kensue\": \"ますじまけんすー\",\n        \"masumasu\": \"ますます\",\n        \"masurao\": \"ますらお\",\n        \"matashita kintama\": \"股下金珠\",\n        \"matatabi\": \"またたび\",\n        \"match\": \"マッチ\",\n        \"matetsu\": \"まてつ\",\n        \"mato\": \"まと\",\n        \"matoba\": \"的場\",\n        \"maton\": \"マトン\",\n        \"matou\": \"まとう\",\n        \"matra-mica\": \"MATRA-MICA\",\n        \"matrix one\": \"ロジャー・マンゴー\",\n        \"matsubara kanabun\": \"松原かなぶん\",\n        \"matsubayashi nagana\": \"松林ながな\",\n        \"matsubayashi satoru\": \"松林悟\",\n        \"matsuda eine\": \"松田えいね\",\n        \"matsue\": \"まつえー\",\n        \"matsuka\": \"松果\",\n        \"matsukura nemu\": \"松倉ねむ\",\n        \"matsumoto akira\": \"松本英\",\n        \"matsumoto himiko\": \"松本姫美子\",\n        \"matsumoto inaki\": \"松本いなき\",\n        \"matsumoto katsuya\": \"まつもとかつや\",\n        \"matsumoto mimiko\": \"松本耳子\",\n        \"matsumoto mitohi.\": \"松本ミトヒ。\",\n        \"matsunaga garana\": \"松永がらな\",\n        \"matsunaga hijiri\": \"松永ヒジリ\",\n        \"matsunoan\": \"松之庵\",\n        \"matsuo\": \"松雄\",\n        \"matsuri\": \"まつり\",\n        \"matsuri miko\": \"まつりみこ\",\n        \"matsurino naginata\": \"祭野薙刀\",\n        \"matsurioka hideyuki\": \"祭丘ヒデユキ\",\n        \"matsushima namio\": \"松島ナオミ\",\n        \"matsuyama hayate\": \"松山はやて\",\n        \"matsuyama seiji\": \"松山せいじ\",\n        \"matsuyoshi ako\": \"松吉アコ\",\n        \"matsuyuki kabun\": \"松足嘉分\",\n        \"matsuzaka reia\": \"まつざかれいあ\",\n        \"matsuzono\": \"松園\",\n        \"matui you\": \"末井夕\",\n        \"maverick\": \"まーべりっく\",\n        \"mawaru\": \"きんたまわる\",\n        \"may\": \"MAY\",\n        \"maya gorou\": \"まゃ～吾郎\",\n        \"maya temple\": \"真夜テンプル\",\n        \"mayag\": \"MayaG\",\n        \"mayama haruji\": \"真山春二\",\n        \"mayamura aki\": \"真矢村明\",\n        \"mayao\": \"まやお\",\n        \"mayashinya\": \"真夜真夜\",\n        \"maybe\": \"めいびい\",\n        \"mayofun\": \"まよふん\",\n        \"mayohara-san\": \"マヨハラさん\",\n        \"mayu\": \"まゆ\",\n        \"mayugeyama\": \"眉毛山\",\n        \"mayuki\": \"マユキ\",\n        \"mazaki katsumi\": \"まざきかつみ\",\n        \"maze\": \"maze*\",\n        \"mcqueen\": \"mcqueen\",\n        \"mebachi maguro\": \"目鉢鮪\",\n        \"mebae\": \"mebae\",\n        \"mebura\": \"めぶら\",\n        \"mee\": \"めー\",\n        \"meem\": \"MEEM!\",\n        \"megi\": \"めぎ\",\n        \"mego\": \"めご\",\n        \"meguo\": \"メグオ\",\n        \"meguro\": \"目黒\",\n        \"meguro linu\": \"目黒霖雨\",\n        \"meguro sankichi\": \"目黒三吉\",\n        \"mei\": \"芽唯\",\n        \"meido sushi\": \"冥土すし\",\n        \"meido yomi\": \"冥土黄泉\",\n        \"meiji\": \"めいじ\",\n        \"meiji michiru\": \"明治ミチル\",\n        \"meika\": \"めいか\",\n        \"meiko\": \"めい子\",\n        \"meito\": \"星名めいと | めいと\",\n        \"meiya\": \"メイヤ\",\n        \"mekabu aji max\": \"めかぶ味MAX\",\n        \"mekuri\": \"めくり\",\n        \"romulo mancin\": \"Romulo Mancin\",\n        \"melodic core.\": \"石月めろこあ\",\n        \"melon22\": \"めろん22\",\n        \"melonleaf\": \"メロソリーフ\",\n        \"melu\": \"Melu\",\n        \"meme\": \"めめ\",\n        \"memeo\": \"女々男\",\n        \"menbo\": \"めんぼ\",\n        \"menimo\": \"めにも\",\n        \"meno\": \"meno\",\n        \"menosuke\": \"メノスケ\",\n        \"mens\": \"Men's\",\n        \"mennsuke\": \"めんスケ\",\n        \"menteiyakuna\": \"めんていやくな\",\n        \"menu.\": \"めぬ。\",\n        \"mepikari\": \"メピカリ\",\n        \"mercy rabbit\": \"マーシーラビット\",\n        \"meri\": \"めり\",\n        \"meria\": \"メリア\",\n        \"meridier\": \"Meridier\",\n        \"meriko\": \"めりこ\",\n        \"merkonig\": \"Merkonig\",\n        \"merry luna\": \"めりぃるな\",\n        \"meshi\": \"めし\",\n        \"mesousan\": \"めそうさん\",\n        \"metabond\": \"めたぼんど\",\n        \"metal gummo\": \"めたるがんも\",\n        \"meten\": \"めてん\",\n        \"meto\": \"Meto\",\n        \"mevius9\": \"mevius9\",\n        \"mezashi gohan\": \"めざしごはん\",\n        \"mhs\": \"MHS\",\n        \"mia\": \"みあ\",\n        \"mibry\": \"MIBRY\",\n        \"micchan\": \"みっちゃん\",\n        \"michael f91\": \"マイコーF91\",\n        \"michairu\": \"ミ茶いる\",\n        \"michikusa akimichi\": \"道草閑道\",\n        \"michinoku atami\": \"みちのくアタミ\",\n        \"michiyoshi\": \"ミチヨシ\",\n        \"mico\": \"蜜co\",\n        \"micopp\": \"micopp\",\n        \"midarin\": \"midarin\",\n        \"midoh torako\": \"水堂とらこ\",\n        \"midorigi mura\": \"緑木邑\",\n        \"midoriko\": \"ミドリコ\",\n        \"midou midori\": \"御堂みどり\",\n        \"midou ren\": \"御堂廉\",\n        \"midou shin\": \"魅堂真\",\n        \"miduki aki\": \"観月あき\",\n        \"miduki sho\": \"みづき翔\",\n        \"miduno kenshi\": \"みづの剣士\",\n        \"miel\": \"Miel\",\n        \"mifune yatsune\": \"三船八音\",\n        \"miga\": \"美雅\",\n        \"migchip\": \"MIGCHIP\",\n        \"migi tonari\": \"みぎ隣\",\n        \"migio moto\": \"右雄基留\",\n        \"migiwa\": \"みぎわ\",\n        \"migiyori\": \"右頼\",\n        \"migu\": \"みぐ\",\n        \"migumigu\": \"みぐみぐ\",\n        \"mihara\": \"みはら\",\n        \"mihara nori\": \"三原のり\",\n        \"miho rei\": \"御歩れい\",\n        \"mii akira\": \"美衣暁\",\n        \"miicho\": \"みーちょ\",\n        \"miiru\": \"みいる\",\n        \"miitoban\": \"みぃとばん\",\n        \"mika pikazo\": \"Mika Pikazo\",\n        \"mika sayaki\": \"みかさやき\",\n        \"mikagami mamizu\": \"水鏡まみず\",\n        \"mikagami sou\": \"水鏡想\",\n        \"mikage kirino\": \"神影霧乃\",\n        \"mikage nao\": \"みかげ尚\",\n        \"mikage sekizai\": \"御影石材\",\n        \"mikagura\": \"みかぐら\",\n        \"mikami cannon\": \"三上キャノン\",\n        \"mikami hokuto\": \"箕神北都\",\n        \"mikami sasara\": \"みかみ沙更\",\n        \"mikamikan\": \"みかみかん\",\n        \"mikan gyuunyuu\": \"みかん牛乳\",\n        \"mikan no kawa houchikai no shinsei\": \"みかんの皮放置界の新星\",\n        \"mikan.\": \"みかん。\",\n        \"mikawa\": \"み皮\",\n        \"mikawa no yummy\": \"三河のヤミー\",\n        \"mikawaya\": \"みかわや\",\n        \"mikaze\": \"みかぜ\",\n        \"mike\": \"ミケ\",\n        \"mikeko\": \"みけこ\",\n        \"mikepon\": \"みけぽん\",\n        \"miketa miekichi\": \"みけ田みい吉\",\n        \"mikihime\": \"みき姫\",\n        \"mikkoukun\": \"ミッコウクン\",\n        \"miko\": \"みこ\",\n        \"mikoita\": \"みこいた\",\n        \"mikokuno homare\": \"みこくのほまれ\",\n        \"mikorin\": \"みこりん\",\n        \"mikoto kei\": \"未琴圭\",\n        \"miku\": \"みく\",\n        \"mikuni hadzime\": \"三国ハヂメ\",\n        \"mil\": \"mil\",\n        \"milcara\": \"ミルキャラ\",\n        \"milda7\": \"Milda7\",\n        \"milele\": \"Milele\",\n        \"militia\": \"みりしゃ\",\n        \"milk panda\": \"みるくぱんだ\",\n        \"milkcow\": \"MILKCOW\",\n        \"milkexplorer\": \"MilkExplorer\",\n        \"milkshake\": \"奶昔\",\n        \"millefeuille\": \"ミル・フィーユ\",\n        \"milli\": \"ミリ\",\n        \"milts\": \"みるつ\",\n        \"mima\": \"みま\",\n        \"mimamui\": \"みまむぃ\",\n        \"mimasaka hideaki\": \"美作英明\",\n        \"mimasaka yorozu\": \"みまさかよろず\",\n        \"mimikaki\": \"みみかき\",\n        \"mimimaru\": \"耳丸\",\n        \"mimishiki\": \"耳式\",\n        \"mimisuke\": \"みみすけ\",\n        \"mimizu\": \"蚯蚓\",\n        \"mimori nahda\": \"水護難陀\",\n        \"mimoton\": \"みもとん\",\n        \"mimoza\": \"みもざ\",\n        \"mimuda ryouzou\": \"みむだ良雑\",\n        \"min\": \"ミン\",\n        \"min-naraken\": \"MIN-NARAKEN\",\n        \"minaduki haruka\": \"水月悠\",\n        \"minaduki nanana\": \"皆月ななな\",\n        \"minagata\": \"ミナガタ\",\n        \"minagi ruiji\": \"ミナギルイジ\",\n        \"minai\": \"ミナイ\",\n        \"minakami hiroki\": \"水上広樹\",\n        \"minakami kurena\": \"水上暮菜\",\n        \"minakami riku\": \"ミナカミ理久\",\n        \"minakawa haruhisa\": \"皆川晴久\",\n        \"minako nami\": \"みなこなみ\",\n        \"minakuchi takashi\": \"水口鷹志\",\n        \"minami funi.\": \"南ふに。\",\n        \"minami kohto\": \"南狡兎\",\n        \"minami kunimusu\": \"南邦結\",\n        \"minami sei\": \"みなみせい\",\n        \"minami star\": \"南☆\",\n        \"minamichou naname\": \"南町ななめ\",\n        \"minamino hazuki\": \"南乃映月\",\n        \"minamishi\": \"南嗣\",\n        \"minamoto\": \"みな本\",\n        \"minamoto jin\": \"皆素人\",\n        \"minamura haruki\": \"皆村春樹\",\n        \"minarai\": \"美奈來\",\n        \"minari\": \"minari\",\n        \"minase kaya\": \"水瀬佳也\",\n        \"minase norihiko\": \"みなせのりひこ\",\n        \"minase ruruu\": \"水瀬るるう\",\n        \"minase sizuku\": \"水瀬雫\",\n        \"minase tamaki\": \"皆瀬たまき\",\n        \"minase taruhi\": \"水無瀬たるひ\",\n        \"minase yowkow\": \"水瀬揺光\",\n        \"minase yuu\": \"水瀬結宇\",\n        \"minato akira\": \"湊晶\",\n        \"minato yoshihiro\": \"湊良弘\",\n        \"minatoya shunsaku\": \"湊谷俊作\",\n        \"minatsuki alumi\": \"水月あるみ\",\n        \"minatsuki hina\": \"みなつきひな\",\n        \"minazoi kuina\": \"水添水鶏\",\n        \"minazuki akira\": \"水無月あきら\",\n        \"minazuki ayu\": \"水無月愛勇\",\n        \"mineyuki\": \"峰之\",\n        \"mingaru\": \"ミンガル\",\n        \"miniru\": \"miniru\",\n        \"minna no haipe\": \"みんなのハイペ\",\n        \"mino kureha\": \"美濃紅葉\",\n        \"minobu gentle\": \"身延ジェントル\",\n        \"minoda kenichi\": \"みのだけんいち\",\n        \"minoh rom\": \"水尾ろむ\",\n        \"ojigi\": \"箕吉\",\n        \"minomushi\": \"みのむし\",\n        \"minor boy\": \"まいなぁぼぉい\",\n        \"minori\": \"みのり\",\n        \"minority\": \"マイノリティ\",\n        \"minpei ichigo\": \"民兵一号\",\n        \"mintice\": \"みんとあいす\",\n        \"minto\": \"みんと\",\n        \"minus a\": \"-A\",\n        \"minutati\": \"みぬたち\",\n        \"mio\": \"MIO\",\n        \"mioki koeru\": \"みおき超\",\n        \"mirai denki\": \"未来電機\",\n        \"miri\": \"ミリ\",\n        \"mirino\": \"みりの\",\n        \"miromiro mumu\": \"みろみろ☆むむ\",\n        \"miru\": \"MIRU\",\n        \"mirun\": \"ミルン\",\n        \"misa\": \"美沙\",\n        \"misagi nagomu\": \"みさぎ和\",\n        \"misaka\": \"御坂\",\n        \"misaka niumu\": \"三坂ニウム\",\n        \"misaka nyuumen\": \"みさかにゅうめん\",\n        \"misaka shou\": \"三坂晶\",\n        \"misaki\": \"御崎\",\n        \"misaki ren\": \"美咲恋\",\n        \"misaki ryo\": \"御前伶\",\n        \"misaki tou\": \"ミサキ闘 | ミサキ糖\",\n        \"misana\": \"みさな\",\n        \"misao\": \"小野ミサオ\",\n        \"misaragi\": \"みさらぎ\",\n        \"misasagi yuuya\": \"ミササギユウヤ\",\n        \"misato nana\": \"三郷なな\",\n        \"miseo\": \"みせお\",\n        \"mishibe hamata\": \"みしべハマタ\",\n        \"mishima hiroji\": \"みしまひろじ\",\n        \"misnon the great\": \"ミスノン・ザ・グレート\",\n        \"miso oden\": \"みそおでん\",\n        \"miso panda\": \"みそパンダ\",\n        \"miso poteto\": \"みそぽてと\",\n        \"misoiri\": \"味噌入り\",\n        \"misono denpachi\": \"みそのデンパ\",\n        \"misonou\": \"みそのう\",\n        \"misooden\": \"みそおでん\",\n        \"misril\": \"Misril\",\n        \"miss black\": \"MISS BLACK\",\n        \"missile228\": \"MISSILE228\",\n        \"mister\": \"ミスター\",\n        \"mister ochitsu\": \"ミスターおちつ\",\n        \"misumi natsuki\": \"水澄夏希\",\n        \"mita kazuo\": \"三田和夫\",\n        \"mita satomi\": \"みたさとみ\",\n        \"mitaka\": \"美岳\",\n        \"mitamori tatsuya\": \"みた森たつや\",\n        \"mitarai\": \"御手洗\",\n        \"mitarai yuuki\": \"御手洗佑樹\",\n        \"mitarashi kousei\": \"みたらし侯成\",\n        \"mitei\": \"未定\",\n        \"mito\": \"ミト\",\n        \"miton\": \"みとん\",\n        \"mitsu king\": \"蜜キング\",\n        \"mitsufuji kouichi\": \"みつふじこういち\",\n        \"mitsui mana\": \"みついまな\",\n        \"mitsuie\": \"みついえ\",\n        \"mitsukazu\": \"みつかず\",\n        \"mitsuki kisara\": \"観月きさら\",\n        \"mitsuki mantarou\": \"光姫満太郎\",\n        \"mitsuki ponz\": \"蜜葵ぽんず\",\n        \"mitsuki yuuya\": \"御月ユウヤ\",\n        \"mitsumaro\": \"みつまろ\",\n        \"mitsurugi tsurugi\": \"御剱剣\",\n        \"mitsuya\": \"みつや\",\n        \"mitsuyama hajime\": \"みつやまはじめ\",\n        \"mitty\": \"Mitty\",\n        \"miu\": \"みU\",\n        \"miumi\": \"みうみ\",\n        \"miura\": \"miura\",\n        \"miura jota\": \"三浦いお太\",\n        \"miya\": \"みや\",\n        \"miya9\": \"miya9\",\n        \"miyabe makoto\": \"みやべまこと\",\n        \"miyabi tsuzuru\": \"みやびつづる\",\n        \"miyabi yutaka\": \"ミヤビユタカ\",\n        \"miyabikawa sakura\": \"雅川佐倉\",\n        \"esaki tamotsu\": \"江崎惟\",\n        \"miyagi yasutomo\": \"宮城靖朋\",\n        \"miyagoe yoshitsuki\": \"宮越良月\",\n        \"miyahara mimikaki\": \"みやはらみみかき\",\n        \"miyakawa hajime\": \"美夜川はじめ\",\n        \"kyou no gohan\": \"京のごはん\",\n        \"miyama rima\": \"宮馬りま\",\n        \"miyama zero\": \"美山零\",\n        \"miyamoto ikusa\": \"みやもといくさ\",\n        \"miyamoto yuu\": \"みやもとゆう\",\n        \"miyamu\": \"みやむ\",\n        \"miyamura\": \"みやむら\",\n        \"miyane aki\": \"みやねあき\",\n        \"miyanogi jiji\": \"宮野木ジジ\",\n        \"miyanoyuki\": \"みやのゆき\",\n        \"miyashita kitsune\": \"宮下キツネ\",\n        \"miyatsuki itsuka\": \"美弥月いつか\",\n        \"miyauchi yuka\": \"宮内由香\",\n        \"miyazaki yuki\": \"宮崎ユウキ\",\n        \"miyazawa riewo\": \"宮沢りえを\",\n        \"miyoichi\": \"みよいち\",\n        \"miyu\": \"MIYU\",\n        \"miyuki\": \"深雪\",\n        \"miyuki yaya\": \"御幸やや\",\n        \"miyuma subaru\": \"未由間すばる\",\n        \"miyuu\": \"未柚\",\n        \"mizinnkosutinn\": \"みじんこすちん\",\n        \"mizo\": \"原人\",\n        \"mizoguchi kou\": \"ミゾグチコウ\",\n        \"mizu\": \"mizu\",\n        \"mizu asato\": \"水あさと\",\n        \"mizuha\": \"みずは\",\n        \"mizuhara mei\": \"水原明\",\n        \"mizuhati saru\": \"水八申\",\n        \"mizui\": \"みずい\",\n        \"mizuiro megane\": \"みずいろ めがね\",\n        \"mizujouyu\": \"水醤油\",\n        \"mizuki\": \"みずき\",\n        \"mizuki gai\": \"水樹凱\",\n        \"mizuki haruto\": \"みづき春人\",\n        \"mizuki hitoshi\": \"みずきひとし\",\n        \"miduki honey\": \"水月ハニー\",\n        \"mizuki loose\": \"みづきるうず\",\n        \"mizuki makoto\": \"観月真\",\n        \"mizuki yuu\": \"瑞紀悠\",\n        \"mizuki yuuma\": \"みずき佑真\",\n        \"mizukimaru\": \"満月◯\",\n        \"mizumidori\": \"水緑\",\n        \"mizumori omizu\": \"水森おみず\",\n        \"mizumura kaoru\": \"水村かおる\",\n        \"mizuna\": \"みづな\",\n        \"mizunashi\": \"みずなし\",\n        \"mizunezumi\": \"水鼠\",\n        \"mizuno\": \"みずの\",\n        \"mizuno haruyoshi\": \"水野珍\",\n        \"mizuno kei\": \"水野慧\",\n        \"mizuno makoto\": \"みずのまこと\",\n        \"mizuno mumomo\": \"水野むもも\",\n        \"mizuno poppo\": \"水翠野ポッポ\",\n        \"mizuno sao\": \"水野早桜\",\n        \"mizunoe nemone\": \"壬星ねもね\",\n        \"mizusaka saki\": \"水坂早希\",\n        \"mizusawa\": \"水澤\",\n        \"mizusawa mimori\": \"水沢深森\",\n        \"mizusawa nagi\": \"水沢凪\",\n        \"mizushima aru\": \"みづしま亜留\",\n        \"mizushima kero\": \"水島ケロ\",\n        \"mizushima sei\": \"みずしま聖\",\n        \"mizushina minato\": \"水科湊\",\n        \"mizushiro takuya\": \"水城たくや\",\n        \"mizutama\": \"みずたま\",\n        \"mizutani tooru\": \"水谷とおる\",\n        \"mizuto\": \"水兎\",\n        \"mizuya tiharu\": \"水夜ちはる\",\n        \"mizuyoukan\": \"水ようかん\",\n        \"mko\": \"マキオ\",\n        \"ml\": \"ML\",\n        \"mm\": \"えむえむ\",\n        \"mmmnomu\": \"むむむのム\",\n        \"mnk\": \"MNK\",\n        \"mo\": \"もっさん\",\n        \"moai tentyou\": \"モアイ店長\",\n        \"moccyi\": \"モッチィー\",\n        \"mochi ice\": \"もちアイス\",\n        \"mochi sensee\": \"もちせんせぇ\",\n        \"mochiduki nano\": \"モチヅキナノ\",\n        \"mochiji tada\": \"餅持唯\",\n        \"mochikuu usagi\": \"もちくううさぎ\",\n        \"mochimako\": \"モチマコ\",\n        \"mochinosora\": \"もちのそら\",\n        \"mochizuki nao\": \"望月なお\",\n        \"mochizuki tooya\": \"望月とーや\",\n        \"mockmock\": \"MockMock\",\n        \"moech\": \"moech\",\n        \"moeda kazukichi\": \"萌田かずきち\",\n        \"moeki yuta\": \"萌木雄太\",\n        \"moekichi.\": \"もえきち。\",\n        \"mofuriru\": \"もふりる\",\n        \"mogg\": \"mogg\",\n        \"mogi\": \"モギ\",\n        \"mogi yasunobu\": \"茂木康信\",\n        \"mogiri\": \"もぎり\",\n        \"mogo-721\": \"mogO-721\",\n        \"mogunosukes\": \"モグ乃助\",\n        \"mogupuchi.\": \"もぐぷち。\",\n        \"moiky\": \"Moiky\",\n        \"moizumi shipon\": \"茂泉しぽん\",\n        \"moja\": \"MOJA\",\n        \"mokamoka\": \"モカモカ\",\n        \"moke\": \"もけ\",\n        \"mokei\": \"百景\",\n        \"mokeke\": \"mokeke\",\n        \"mokichi\": \"茂吉\",\n        \"mokke\": \"もっけ\",\n        \"mokki\": \"もっき\",\n        \"moko\": \"もこ\",\n        \"mokokee\": \"もこけ\",\n        \"mokomoko yanakku\": \"モコモコヤナック\",\n        \"mokumokuren\": \"目目蓮\",\n        \"mokushi\": \"もくし\",\n        \"mokyu\": \"もきゅ\",\n        \"momi\": \"もみ\",\n        \"momiji\": \"もみじ\",\n        \"momiji mao\": \"もみじ真魚\",\n        \"momijizuki luna\": \"紅葉月るな\",\n        \"momizi inori\": \"紅葉いのり\",\n        \"momo\": \"もも\",\n        \"momo inu\": \"ももいぬ\",\n        \"momo iwao\": \"百々巌\",\n        \"momo no kanzume\": \"桃の缶詰\",\n        \"momoda yasuhito\": \"百田やすひと\",\n        \"momoe\": \"ももえ\",\n        \"momofuki rio\": \"桃吹リオ\",\n        \"momohime shibuki\": \"桃姫しぶき\",\n        \"momoiro retas\": \"桃色レタス\",\n        \"momokan85\": \"momokan85\",\n        \"momomitsu kinako\": \"桃蜜きなこ\",\n        \"momomo\": \"ももも\",\n        \"momonashi potato\": \"桃梨ぽてと\",\n        \"momonga\": \"桃ん画\",\n        \"momosaki\": \"桃咲\",\n        \"momose\": \"ももせ\",\n        \"momose sei\": \"百瀬せー\",\n        \"momoshiro\": \"モモシロ\",\n        \"momota momo\": \"モモタ モモ\",\n        \"mon-petit\": \"もんぷち\",\n        \"monaka\": \"最中\",\n        \"monatsu\": \"もなつ\",\n        \"monchan rev3\": \"もんちゃんrev3\",\n        \"monchy\": \"もんちぃ\",\n        \"monimitto\": \"もにみっと\",\n        \"monin\": \"もにん\",\n        \"moninna\": \"もにんな\",\n        \"monio\": \"もにお\",\n        \"monkey ni-gou\": \"悶鬼威弐号\",\n        \"monkeycandy\": \"MonkeyCandy\",\n        \"monme\": \"monme\",\n        \"monodevil\": \"ものっち\",\n        \"monou natsuki\": \"桃生夏綺\",\n        \"monsuke\": \"MONSUKE\",\n        \"monvasa\": \"モンヴァサ\",\n        \"moonlight\": \"むーんらいと\",\n        \"mor.\": \"モル\",\n        \"more\": \"モレ\",\n        \"mori\": \"森\",\n        \"mori takuya\": \"杜拓哉\",\n        \"moribell\": \"モリーベル\",\n        \"moricocco\": \"もりこっこ\",\n        \"morii\": \"MORII\",\n        \"morii fuzuki\": \"森井文月\",\n        \"morii shizuki\": \"森井しづき\",\n        \"morikawa\": \"もりかわ\",\n        \"morikawa narumi\": \"森川鳴海\",\n        \"morikurousagi\": \"森黑兎\",\n        \"warabi mochi\": \"わらびモチ\",\n        \"morina masayuki\": \"森菜雅雪\",\n        \"morinaga milk\": \"森永みるく\",\n        \"morinaga ramune\": \"森永らむね\",\n        \"morino hon\": \"もりのほん\",\n        \"morino kinoco\": \"森乃きの子\",\n        \"morino kinoko\": \"森乃きのこ\",\n        \"morino muck\": \"森野ムック\",\n        \"morinomiya maachi\": \"森ノ宮まあち\",\n        \"morisaki tirol\": \"森崎ちろる\",\n        \"morisaki yoshino\": \"杜崎淑乃\",\n        \"morishige\": \"もりしげ\",\n        \"morishima petit\": \"森嶋プチ\",\n        \"morishita kaoru\": \"モリシタカオル\",\n        \"morisoba\": \"もりそば\",\n        \"morisova\": \"morisova\",\n        \"morisugi\": \"morisugi\",\n        \"moritaka takashi\": \"もりたかたかし\",\n        \"moritake\": \"モリタケ\",\n        \"moritan\": \"もりたん\",\n        \"moriyama rikka\": \"森山六花\",\n        \"moriyama shijimi\": \"森山しじみ\",\n        \"morochin-san\": \"もろちんさん\",\n        \"morokoshitaroh\": \"morokoshitaroh\",\n        \"morota\": \"もろた\",\n        \"morozumi junka\": \"両角潤香\",\n        \"morpheus\": \"モルペウス\",\n        \"morris\": \"モリス\",\n        \"moruda\": \"もる田\",\n        \"moruga\": \"MORUGA\",\n        \"mos\": \"Mos\",\n        \"mosa\": \"モサ\",\n        \"moscow\": \"モスクワ\",\n        \"mosha\": \"もしゃ\",\n        \"mosuke\": \"mosuke\",\n        \"motchie\": \"もっちー\",\n        \"moti moti omoti\": \"餅もちお餅\",\n        \"mothica\": \"モティカ\",\n        \"moto\": \"MoTo\",\n        \"motobi\": \"もとび\",\n        \"motoe hiroya\": \"元永尋也\",\n        \"motoichi\": \"素壱\",\n        \"motomushi\": \"元虫\",\n        \"motoyon\": \"基4\",\n        \"motsu\": \"もつ\",\n        \"motsuaki\": \"もつあき\",\n        \"motti\": \"モッチー\",\n        \"mou\": \"もう\",\n        \"moukin punch\": \"猛禽パンチ\",\n        \"mountain pukuichi\": \"マウンテンプクイチ\",\n        \"moup\": \"もうぴい\",\n        \"moya\": \"moya\",\n        \"moyashi\": \"もやし\",\n        \"moyasibasto\": \"もやしばーすと\",\n        \"moyomoto lv48\": \"もょもとLV48\",\n        \"moyori\": \"moyori\",\n        \"moyuru-n\": \"MOYURU/n\",\n        \"moza\": \"もざ\",\n        \"mozuku\": \"もずく\",\n        \"mozuya murasaki\": \"もずや紫\",\n        \"mr.lostman\": \"Mr.Lostman\",\n        \"mr.sugar\": \"MR.sugar\",\n        \"mr.way\": \"Mr.way\",\n        \"mt\": \"mt\",\n        \"mt.somo\": \"Mt.somo\",\n        \"mtd\": \"mtd\",\n        \"mu mu munou\": \"66-夢王\",\n        \"mu-min\": \"夢～眠\",\n        \"mucc\": \"ムック\",\n        \"muchabou\": \"無茶坊\",\n        \"mufuru\": \"ムフル\",\n        \"mugen no ossan\": \"無限のおっさん\",\n        \"mugendai\": \"無限大\",\n        \"mugenkidou\": \"無限軌道\",\n        \"mugi\": \"MUGI\",\n        \"mugicha\": \"麦茶\",\n        \"mugichoko\": \"むぎちょこ\",\n        \"mugimaru\": \"麦丸\",\n        \"mugino hotaru\": \"麦野ほたる\",\n        \"muichimon\": \"無一文\",\n        \"mujiko\": \"むじこ\",\n        \"mujin\": \"霧迅\",\n        \"mujina\": \"むじな\",\n        \"mukai kiyoharu\": \"むかいきよはる\",\n        \"mukai masayoshi\": \"向正義\",\n        \"mukasa kouki\": \"六笠洸季\",\n        \"mukaunosato isuke\": \"イスケ・グラタニティー\",\n        \"mukeikaku\": \"夢計画\",\n        \"mukku\": \"MUKKU\",\n        \"mukouhara shiryu\": \"むこうはらしりゅう\",\n        \"mukuge\": \"毳\",\n        \"mukyuu\": \"むきゅう☆\",\n        \"mumin\": \"むみん\",\n        \"mumu\": \"MUMU\",\n        \"mumumu\": \"むむむ\",\n        \"munashimujou\": \"むなしむじょう\",\n        \"munitin\": \"むにちん\",\n        \"munomerikun\": \"ミネむら\",\n        \"munoshishi\": \"むのしし\",\n        \"munyuu\": \"むにゅう\",\n        \"murai g\": \"村井Ｇ\",\n        \"murai kei\": \"ムライケイ\",\n        \"murakami\": \"村上\",\n        \"murakami masaki\": \"村上雅貴\",\n        \"murakumo\": \"村雲\",\n        \"muramurabito\": \"村々村\",\n        \"muranako\": \"ムラナコ\",\n        \"murasaki\": \"むらさき\",\n        \"murasaki akari\": \"むらさきあかり\",\n        \"murasaki orange\": \"紫オレンジ\",\n        \"murasaki tohka\": \"村崎とーか\",\n        \"murasakiiro orange\": \"むらさきいろオレンジ\",\n        \"murasame chiaki\": \"村雨知秋\",\n        \"murasame ha\": \"村雨刃\",\n        \"murasame maru\": \"村雨丸\",\n        \"murata denji\": \"村田電磁\",\n        \"murata.\": \"ムラタ。\",\n        \"muren\": \"ムウレン\",\n        \"muro\": \"むろ\",\n        \"muryou myakudou\": \"無料脈動\",\n        \"musashino sekai\": \"ムサシノセカイ\",\n        \"musasiya chogenbo\": \"武蔵屋長元坊\",\n        \"muscleman\": \"マッスルマン\",\n        \"mushanokouji atsune\": \"武者小路あつね\",\n        \"mushiboy\": \"MUSHIBOY\",\n        \"musouduki\": \"梦双月\",\n        \"muteki soda\": \"无敌苏打\",\n        \"muten\": \"武天\",\n        \"mutou\": \"無糖\",\n        \"mutou hiroki\": \"武藤裕樹\",\n        \"mutou keiji\": \"むとうけいじ\",\n        \"mutou kurihito\": \"武藤此史\",\n        \"mutou rei\": \"武藤礼恵\",\n        \"mutsu\": \"ムツ\",\n        \"mutsu nagare\": \"陸奥流\",\n        \"mutsuki aya\": \"睦月綾\",\n        \"mutsuki ginji\": \"睦月ぎんじ\",\n        \"mutsuki haru\": \"睦月はる\",\n        \"mutsuki hiiro\": \"睦月緋色\",\n        \"mutsuki kei\": \"睦月圭\",\n        \"mutsuki lime\": \"むつき来夢\",\n        \"mutsumi\": \"むつみ\",\n        \"mutuki shin\": \"六樹しん\",\n        \"mutumi\": \"MuTuMi\",\n        \"mutunari\": \"むつなり\",\n        \"muumuu\": \"ムームー\",\n        \"muuna\": \"むーな\",\n        \"muunyan\": \"むーにゃん\",\n        \"muya\": \"むや\",\n        \"myaa\": \"みゃー\",\n        \"myake\": \"みゃけ\",\n        \"myanie\": \"宮兄\",\n        \"myouga\": \"茗荷\",\n        \"myouji namae\": \"苗字なまゑ\",\n        \"mytyl\": \"Mytyl\",\n        \"myuratch\": \"Myuratch\",\n        \"myv\": \"myv\",\n        \"mzk\": \"MZK\",\n        \"mzne\": \"mzne\",\n        \"n\": \"ん\",\n        \"n-p-katou\": \"N・P・KATOU\",\n        \"n820\": \"n820\",\n        \"na\": \"な\",\n        \"naba\": \"菜葉\",\n        \"nabe\": \"Nabe\",\n        \"nabenco\": \"なべんこ\",\n        \"nabeshiki\": \"ナベシキ\",\n        \"nabeshima mike\": \"鍋島ミケ\",\n        \"nabeya sakihana\": \"鍋谷咲花\",\n        \"nabeyu\": \"なべゆ\",\n        \"nabuu\": \"なぶぅ\",\n        \"nac\": \"Nac\",\n        \"nacha\": \"NACHA\",\n        \"nachiku\": \"なちく\",\n        \"naco\": \"なこ\",\n        \"nada haruka\": \"灘遥歌\",\n        \"nadzuka\": \"ナヅカ\",\n        \"nae\": \"なえ\",\n        \"nagai kao\": \"永井佳緒\",\n        \"nagai momiage\": \"长井もみあげ\",\n        \"nagaikusa\": \"長い草\",\n        \"nagamatsu heizo\": \"永松平蔵\",\n        \"nagami mairu\": \"長海まいる\",\n        \"nagana sayui\": \"ながな坂結\",\n        \"naganeko\": \"ながねこ\",\n        \"naganohara nis\": \"長野原にす\",\n        \"naganoon\": \"ながの～ん\",\n        \"naganoro\": \"ながのろ\",\n        \"nagare\": \"nagare\",\n        \"nagareboshi\": \"流れ星\",\n        \"nagareboshi purin\": \"流れ星☆プリン\",\n        \"nagaro\": \"ながろ\",\n        \"nagase yuuki\": \"长濑佑希\",\n        \"nagasode\": \"长そで\",\n        \"nagata tsubasa\": \"永田翼\",\n        \"nagatsuki rio\": \"长月莉绪\",\n        \"nagi mayuko\": \"凪まゆこ\",\n        \"nagi wataru\": \"那木渡\",\n        \"nagisa manoa\": \"渚まのあ\",\n        \"nagisano usagi\": \"渚乃兎\",\n        \"nagisawa you\": \"なぎさわゆう\",\n        \"naglfar\": \"なぐるふぁる\",\n        \"nago.k\": \"NAGO.K\",\n        \"nagoshi\": \"夏越\",\n        \"nagoya shachihachi\": \"名古屋鯱八\",\n        \"naguu\": \"なぐう\",\n        \"nagy\": \"ナギー\",\n        \"nagyo\": \"なぎょ\",\n        \"naha ryou\": \"那覇了\",\n        \"naik\": \"NAiK\",\n        \"naipeta\": \"ないぺた\",\n        \"naisho\": \"内緒\",\n        \"naito loveca\": \"内藤らぶか\",\n        \"naitou gura\": \"内東ぐら\",\n        \"naitou haruto\": \"内藤春人\",\n        \"naitou ryuu\": \"内藤隆\",\n        \"naizou chimuko\": \"内蔵チムコ\",\n        \"nakabe e\": \"なかべ江\",\n        \"nakafusa momo\": \"中総もも\",\n        \"nakagawa\": \"中川\",\n        \"nakagawa kei\": \"中川けい\",\n        \"nakagawa ryna\": \"中川リィナ\",\n        \"nakahata izuru\": \"仲畑いづる\",\n        \"nakai\": \"ナカイ\",\n        \"nakai kana\": \"なかいかな\",\n        \"nakajima akihiko\": \"中島秋彦\",\n        \"nakajima kotoko\": \"中島ことこ\",\n        \"nakajima rei\": \"中島零\",\n        \"nakajima tomoki\": \"なかじまともき\",\n        \"nakajou\": \"ナカジョー\",\n        \"nakami yoshikage\": \"中海美影\",\n        \"nakamura hirofumi\": \"中村博文\",\n        \"nakamura kanko\": \"中村カンコ\",\n        \"nakamura koutarou\": \"中村紅太郎\",\n        \"nakamura morris\": \"中村モリス\",\n        \"nakamura osawari kun\": \"中村おさわり君\",\n        \"nakamura rumi\": \"仲村留海\",\n        \"nakamura subaru\": \"なかむらすばる\",\n        \"nakamura syumitto\": \"中村趣味人\",\n        \"nakamura uzuki\": \"中村卯月\",\n        \"nakamura zeus\": \"中村天神\",\n        \"nakano\": \"中野\",\n        \"nakano yuu\": \"中野ゆう\",\n        \"nakanoku kurochan\": \"中野区くろちゃん\",\n        \"nakaore porkbits\": \"中折れポークビッツ\",\n        \"nakasone haiji\": \"中曽根ハイジ\",\n        \"nakasumi\": \"なかすみ\",\n        \"nakata hana\": \"なかた華\",\n        \"nakatsugawa minoru\": \"中津川みのる\",\n        \"nakaya\": \"なかや\",\n        \"nakayama miyuki\": \"中山みゆき\",\n        \"nakayuki\": \"仲雪\",\n        \"nakazawa hinoto\": \"なかざわひのと\",\n        \"nakika\": \"鳴華\",\n        \"nako\": \"なこ\",\n        \"nako mameta\": \"なこ豆太\",\n        \"nakuma meika\": \"なくま冥架\",\n        \"nakura\": \"なくら\",\n        \"nakura yumari\": \"奈倉ゆまり\",\n        \"nalvas\": \"nalvas\",\n        \"nalzo\": \"nalzo\",\n        \"namaki\": \"奈慎\",\n        \"namakura\": \"なまくら\",\n        \"namakura makibishi\": \"鈍撒菱\",\n        \"namanie\": \"生煮え\",\n        \"namao\": \"なまお\",\n        \"namazu\": \"なまず\",\n        \"name\": \"なめ\",\n        \"name john\": \"なめジョン\",\n        \"namekata fumiaki\": \"行方ふみあき\",\n        \"nametake\": \"なめ茸\",\n        \"namiri\": \"なみり\",\n        \"namita\": \"浪田\",\n        \"namusan\": \"南無三\",\n        \"nana\": \"奈々\",\n        \"nana shinshi\": \"七紳士\",\n        \"nanaca mai\": \"ななかまい\",\n        \"nanae\": \"Nanae\",\n        \"nanae juu\": \"七影愁\",\n        \"nanagami you\": \"七神優\",\n        \"nanahachi\": \"ななはち\",\n        \"nanahi tosi\": \"七比とし\",\n        \"nanahime\": \"ななひめ\",\n        \"nanahoshi nas\": \"七星なす\",\n        \"nanahoshi tento\": \"七星てんと\",\n        \"nanakawa roduka\": \"七川楼塚\",\n        \"nanaki nana\": \"ナナキナナ\",\n        \"nanaki seijyu\": \"七輝静樹\",\n        \"nanako\": \"ナナコ\",\n        \"nanakoro\": \"七転\",\n        \"nanakura nanane\": \"七座菜々音\",\n        \"nanakusa amane\": \"七草天音\",\n        \"nanakusa mutsuki\": \"七草むつき\",\n        \"nanamaru\": \"菜々丸\",\n        \"nanami ayane\": \"七海綾音\",\n        \"nanami natuki\": \"七海夏樹\",\n        \"nanami shizuka\": \"ななみ静\",\n        \"nanami yasuna\": \"ナナミヤスナ\",\n        \"nanamiya rin\": \"ななみやりん\",\n        \"nanamiya tsugumi\": \"七宫つぐ实\",\n        \"nanamo\": \"ななも\",\n        \"nanamomo rio\": \"七桃りお\",\n        \"nanana nana\": \"七名菜奈\",\n        \"nananana nanana\": \"七々ななな\",\n        \"nanao mizuho\": \"七尾瑞穂\",\n        \"nanao-kun\": \"ななおくん\",\n        \"nanase aoi\": \"七瀬葵\",\n        \"nanase masato\": \"七瀬雅人\",\n        \"nanase michiru\": \"七瀬みちる\",\n        \"nanasiro\": \"ななしろ\",\n        \"nanasumi\": \"奈々澄\",\n        \"nanatsu nemu\": \"七夏ねむ\",\n        \"nanbu arata\": \"南部新\",\n        \"nandaba\": \"ナンダバ\",\n        \"naniwadou matatabi\": \"浪花道またたび\",\n        \"nankai no sizimi\": \"南海のしぢみ\",\n        \"nankakureman\": \"なんかくれまん\",\n        \"nankin maachan\": \"南京まーちゃん\",\n        \"nannal\": \"なんなる\",\n        \"nano\": \"nano\",\n        \"nanotaro\": \"なのたろ\",\n        \"nantetsu\": \"軟鉄\",\n        \"nantomo anison\": \"なんともアニソン\",\n        \"nanzaki iku\": \"南崎いく\",\n        \"nao\": \"なお\",\n        \"nao hiren\": \"緋蓮尚\",\n        \"nao michi\": \"直通\",\n        \"naochi\": \"naochi\",\n        \"naohiro\": \"NAOHIRO\",\n        \"naokame\": \"直かめ\",\n        \"naoki\": \"なおき\",\n        \"naokichi.\": \"なおきち。\",\n        \"naoko\": \"なお子\",\n        \"naonao\": \"尚尚\",\n        \"naop\": \"naop\",\n        \"narashino zoe\": \"習志野ゾーイ\",\n        \"narcisse noir\": \"なるしすのあ～る\",\n        \"narinatsu machi\": \"成夏万智\",\n        \"nario\": \"ナリヲ\",\n        \"narita riuku\": \"成田りうく\",\n        \"narita rumi\": \"成田るみ\",\n        \"narita suguru\": \"成田すぐる\",\n        \"narukami\": \"なるかみ\",\n        \"narukami ginryu\": \"鳴神銀龍\",\n        \"narukami x\": \"鳴神X\",\n        \"narumi\": \"ナルみ\",\n        \"narumi meiko\": \"鳴海鳴子\",\n        \"narumi yuu\": \"鳴海ゆう\",\n        \"narusawa aya\": \"鳴沢綾\",\n        \"narusawa sora\": \"成沢 空\",\n        \"naruse\": \"なるせ\",\n        \"naruse makoto\": \"成瀬真琴\",\n        \"naruse mamoru\": \"成瀬守\",\n        \"naruse michi\": \"成瀬みち\",\n        \"narushima godou\": \"成岛ゴドー\",\n        \"nas\": \"NAS\",\n        \"nas-o\": \"NAS-O\",\n        \"nasake muyou\": \"なさけむよう\",\n        \"nash\": \"nash\",\n        \"nashie\": \"なしえ\",\n        \"nashinori tunnel\": \"梨憲タヌル\",\n        \"nashiru\": \"なしる\",\n        \"nassukun\": \"ナッス君\",\n        \"nasu\": \"茄子\",\n        \"nasu hanahana\": \"那須花花\",\n        \"nasukichi\": \"茄子吉\",\n        \"nasuo\": \"なすお\",\n        \"natin\": \"なてぃん\",\n        \"nato\": \"NATO\",\n        \"natsu\": \"捺\",\n        \"natsu kirin\": \"ナツキリン\",\n        \"natsufuyu denki\": \"夏冬伝季\",\n        \"natsuhara saike\": \"夏原サイケ\",\n        \"natsuhime yuran\": \"夏媛柚蘭\",\n        \"natsukawa sarasa\": \"なつかわさらさ\",\n        \"natsuki\": \"奈月\",\n        \"natsuki coco\": \"奈月ここ\",\n        \"natsuki hajime\": \"夏生一\",\n        \"natsuki shuri\": \"なつきしゅり\",\n        \"natsuki takatora\": \"なつきたかとら\",\n        \"natsume\": \"夏目\",\n        \"natsume kei\": \"夏目系\",\n        \"natsumezaka sorekara\": \"夏目坂それから\",\n        \"natsumi\": \"Natsumi\",\n        \"natsumi akira\": \"夏海あきら\",\n        \"natsumi chiharu\": \"ナツミチハル\",\n        \"natsumi kansai\": \"なつみかんさい\",\n        \"natsumikan\": \"なつみかん\",\n        \"natsumin\": \"なつみん\",\n        \"natsunagi\": \"なつなぎ\",\n        \"natsuno hareruya\": \"ナツノハレルヤ\",\n        \"natsuno maki\": \"夏野槙\",\n        \"natsuno suika\": \"なつのすいか\",\n        \"natsuo\": \"夏尾\",\n        \"natsuta kousuke\": \"夏田コウスケ\",\n        \"natsuyo\": \"ナツヨ\",\n        \"natsuzora haduki\": \"夏空葉月\",\n        \"nattaka\": \"なったか\",\n        \"nattsu\": \"なっつ\",\n        \"natumyun\": \"なつみゅん♪\",\n        \"nayoshi\": \"なよし\",\n        \"nayuta daichi\": \"那由他大地\",\n        \"nayuzaki natsumi\": \"ナユザキナツミ\",\n        \"nazca\": \"ナスカ\",\n        \"nazumi kei\": \"菜澄桂\",\n        \"neco\": \"neco\",\n        \"nectar\": \"ねくたー\",\n        \"nedoko\": \"ネドコ\",\n        \"neet\": \"にぃと\",\n        \"negitama\": \"ねぎたま\",\n        \"negitoroko\": \"ネギトロ子\",\n        \"negoya\": \"ねご屋\",\n        \"negura nao\": \"ねぐら☆なお\",\n        \"negurie\": \"ねぐりえ\",\n        \"nei chi\": \"ねいちー\",\n        \"neji-pan\": \"ネジ\",\n        \"nejiro\": \"ねじろ\",\n        \"neko bus\": \"ねこばす\",\n        \"neko denryoku\": \"ねこ電力\",\n        \"neko gohan\": \"猫御飯\",\n        \"neko manma\": \"猫御飯\",\n        \"neko maru rentarou\": \"猫丸恋太郎\",\n        \"neko na yasai\": \"猫な野菜\",\n        \"neko samurai\": \"猫サム雷\",\n        \"neko sensei\": \"猫センセイ\",\n        \"nekobuton\": \"猫布団\",\n        \"nekodel\": \"ねこでる\",\n        \"nekoga yoshiki\": \"猫賀好樹\",\n        \"nekohige\": \"ねこひげ\",\n        \"nekojima lei\": \"猫島礼\",\n        \"nekojima myu\": \"猫島みゅう\",\n        \"nekokan\": \"ねこかん\",\n        \"nekokokazuma\": \"ねここかずま\",\n        \"nekokyuu\": \"ねこきゅう\",\n        \"nekomajin\": \"ねこまじん\",\n        \"nekomanma\": \"ねこまんま\",\n        \"nekomata\": \"ねこまた\",\n        \"nekomatsuri\": \"猫祭\",\n        \"nekomi haruto\": \"猫見春人\",\n        \"nekomimi kanon\": \"猫耳花音\",\n        \"nekomura\": \"猫村\",\n        \"nekomushi\": \"ねこむし\",\n        \"nekoneko\": \"ねこねこ\",\n        \"nekoneko panchu\": \"ねこねこぱんちゅっ\",\n        \"nekonin\": \"猫忍\",\n        \"nekono lonmiy\": \"猫乃ろんみい\",\n        \"nekono matatabi\": \"猫乃またたび\",\n        \"nekono shiro\": \"ねこのしろ\",\n        \"nekono tamami\": \"猫野たまみ\",\n        \"nekonomori maririn\": \"猫守麻里鈴\",\n        \"nekonose hajime\": \"猫ノ瀬はじめ\",\n        \"nekonso\": \"ねこんそ\",\n        \"nekonta\": \"ねこんた\",\n        \"nekonyan\": \"猫にゃん\",\n        \"nekookaji tayo\": \"猫岡寺多代\",\n        \"nekoro tanuki\": \"ねころたぬき\",\n        \"nekota chihiro\": \"猫田ちひろ\",\n        \"nekota kojirow\": \"猫田小次郎\",\n        \"nekota nanami\": \"ねこたななみ\",\n        \"nekota nigra\": \"猫多にぐら\",\n        \"nekotasou\": \"ねこたそう\",\n        \"nekotsuki naoya\": \"猫月なおや\",\n        \"nekou izuru\": \"猫生いづる\",\n        \"nekoume\": \"ねこうめ\",\n        \"nekoya marble\": \"猫屋まぁぶる\",\n        \"nekoyashiki nekomaru\": \"猫屋敷ねこ丸\",\n        \"nekozawa yukari\": \"猫沢ゆかり\",\n        \"nekubila\": \"ねくびぁ\",\n        \"nelo angelo\": \"Nelo安十朗\",\n        \"nemachizuki inesu\": \"寝待月いねすー\",\n        \"nemigi tsukasa\": \"ねみぎつかさ\",\n        \"nemo\": \"ネモ\",\n        \"nemokuge\": \"ねもくげ\",\n        \"nemoto\": \"ネモト\",\n        \"nemui\": \"tintin\",\n        \"nenchi\": \"ねんち\",\n        \"nene\": \"nene\",\n        \"nenemaru\": \"音音丸\",\n        \"neno\": \"ねの\",\n        \"neo black\": \"Neo Black\",\n        \"neo kusano\": \"NEO草野\",\n        \"neon ui\": \"音遠うい\",\n        \"neoneet\": \"寝起新人\",\n        \"nepuka\": \"根深\",\n        \"nerima marine\": \"ねりままりね\",\n        \"nerio\": \"ねりお\",\n        \"nero\": \"nero\",\n        \"neropaso\": \"neropaso\",\n        \"nerotarou\": \"ねろたろう\",\n        \"nerune\": \"ねるね\",\n        \"nesuo\": \"ねすお\",\n        \"net\": \"NET\",\n        \"new\": \"新\",\n        \"new ab\": \"にゅーAB\",\n        \"neyonsan\": \"ねよんさん\",\n        \"neyuki rei\": \"根雪れい\",\n        \"nezumeta\": \"ねずメーター\",\n        \"nezumidosi\": \"ねづみどし\",\n        \"nezumin\": \"ネズミン\",\n        \"nf4\": \"nf4\",\n        \"ngng\": \"ngng\",\n        \"nibi\": \"nibi\",\n        \"nicchi sangyou\": \"ニッチサンギョウ\",\n        \"nice tack\": \"ナイスタック\",\n        \"niche\": \"ニッチ\",\n        \"nichii\": \"ニチヰ\",\n        \"nick\": \"NICK\",\n        \"nico\": \"にこ\",\n        \"nico-momo\": \"にこもも\",\n        \"nicoco\": \"nicoco\",\n        \"nicutoka\": \"nicutoka\",\n        \"nidoro\": \"nidoro\",\n        \"niea\": \"にえあ\",\n        \"nietagiru\": \"にえたぎる\",\n        \"nigakuri takeshi\": \"ニガクリタケシ\",\n        \"nigane\": \"煮鐘\",\n        \"nigesapo\": \"にげサポ\",\n        \"nightjoy\": \"Nightjoy\",\n        \"nigo\": \"にご\",\n        \"niiruma kenji\": \"にいるまけんじ\",\n        \"niisan\": \"にーさん\",\n        \"nijiden\": \"ニジデン\",\n        \"nijihashi sola\": \"にじはしそら\",\n        \"nijiru\": \"煮汁\",\n        \"nijou tayun\": \"二条たゆん\",\n        \"nijyou makoto\": \"二条マコト\",\n        \"nikaido kai\": \"二階堂改\",\n        \"nikami\": \"にかみ\",\n        \"niku\": \"にく\",\n        \"niku jill\": \"肉Jill\",\n        \"nikudanmaru\": \"肉弾丸\",\n        \"nikuname\": \"肉ネーム\",\n        \"nikuyaki\": \"ニクヤキ\",\n        \"nikyu\": \"にきゅ\",\n        \"nilitsu\": \"ニリツ\",\n        \"nilo\": \"にろ\",\n        \"nina\": \"丹娜\",\n        \"nina ryo\": \"新和涼\",\n        \"ningen\": \"にんげん\",\n        \"ninniku\": \"にんにく\",\n        \"ninnin\": \"にんにん\",\n        \"nino paru\": \"にのパル\",\n        \"ninomae kazuichi\": \"二ノ前和市\",\n        \"ninomiya hitomi\": \"二宮仁巳\",\n        \"ninomotoko\": \"ニノモトコ\",\n        \"ninroku\": \"認六\",\n        \"nio\": \"nio\",\n        \"nioti\": \"におち\",\n        \"nippa takahide\": \"新羽隆秀\",\n        \"nippori\": \"にっぽり\",\n        \"nirapii\": \"にらぴー\",\n        \"niryuu tkys\": \"にりゅうtkys\",\n        \"nishi tagame\": \"西タガメ\",\n        \"nishida\": \"西田\",\n        \"nishifuji\": \"西藤\",\n        \"nishihara atsuko\": \"弐士原あつこ\",\n        \"nishikawa coto\": \"ニシカワコト\",\n        \"nishiki meyu\": \"西樹めゆ\",\n        \"nishiki yoshimune\": \"にしき義統\",\n        \"nishimaki tohru\": \"にしまきとおる\",\n        \"nishimo\": \"にしも\",\n        \"nishimura arimi\": \"西村有未\",\n        \"nishimura takashi\": \"にしむらたかし\",\n        \"nishin\": \"ニシン\",\n        \"nishino\": \"西野\",\n        \"nishino hikodge\": \"西野彦二\",\n        \"nishinozawa kaorisuke\": \"西野沢かおり介\",\n        \"nishitsuki tsutomu\": \"西月力\",\n        \"nisin\": \"ニシン\",\n        \"nisson\": \"nisson\",\n        \"nitiba rokusaburou\": \"にちばろくさぶろう\",\n        \"nitta jun\": \"にったじゅん\",\n        \"nittakumi\": \"新匠\",\n        \"niu\": \"丹雨\",\n        \"niwa\": \"にわ\",\n        \"niwa yukari\": \"丹羽ユカリ\",\n        \"niwaka yuan\": \"丹羽香ゆあん\",\n        \"niwakaame\": \"俄雨\",\n        \"niwasane\": \"にわさね\",\n        \"niwatori gunsou\": \"にわとり軍曹\",\n        \"niyama\": \"にやま\",\n        \"nkedoshita\": \"んけどした\",\n        \"nken\": \"NKEN\",\n        \"nmasse\": \"ンマッセ\",\n        \"nme\": \"んめ\",\n        \"nmi\": \"Nみ\",\n        \"nno\": \"nno\",\n        \"no.gomes\": \"NO.ゴメス\",\n        \"noa\": \"noa\",\n        \"noah\": \"のあ\",\n        \"nobi nobita\": \"野火ノビタ\",\n        \"nobita\": \"ノビタ\",\n        \"nobu\": \"NOBU\",\n        \"nobuki chihiro\": \"のぶきちひろ\",\n        \"nobuyuki\": \"信行\",\n        \"nochita sin\": \"のちた紳\",\n        \"nogami takeshi\": \"野上武志\",\n        \"nogod\": \"NOGOD\",\n        \"noguchi masatsu\": \"野口摩擦\",\n        \"nohara monyoral\": \"野原もにょらる\",\n        \"noi\": \"のい\",\n        \"noibara kou\": \"野茨杏\",\n        \"noji\": \"ノジ\",\n        \"nokishita negio\": \"軒下ネギヲ\",\n        \"noko\": \"乃子\",\n        \"nolia\": \"NOLIA\",\n        \"nomady mao\": \"のまでぃMAO\",\n        \"nomayo\": \"野マヨ\",\n        \"nomu\": \"NOMU\",\n        \"nomura teruya\": \"野村輝弥\",\n        \"non\": \"のん\",\n        \"nonaff\": \"のんアフ\",\n        \"noname\": \"NONAME\",\n        \"noneto\": \"ノネト\",\n        \"nonnon\": \"のんのん\",\n        \"nonohachi\": \"ノノはち\",\n        \"nonoki\": \"乃軒\",\n        \"nonoko\": \"ののこ\",\n        \"nonomura hideki\": \"野々村秀樹\",\n        \"nononono\": \"のののの\",\n        \"nonta\": \"のんた\",\n        \"nooca\": \"nooca\",\n        \"noran\": \"noran\",\n        \"norasuko\": \"ノラスコ\",\n        \"nori heita\": \"海苔餅太\",\n        \"nori senbei\": \"海苔せんべい\",\n        \"norikara\": \"のりから\",\n        \"norikin\": \"海苔規\",\n        \"noriko\": \"NORIKO\",\n        \"norimatsu nanami\": \"のりまつななみ\",\n        \"norinko\": \"のりんこ\",\n        \"norio\": \"のりお\",\n        \"norita\": \"のり太\",\n        \"noritama\": \"のりたま\",\n        \"norizi\": \"のりじ\",\n        \"norte\": \"Norte\",\n        \"noruriri\": \"ノルリリ\",\n        \"nosa\": \"NOSA\",\n        \"nosekichiku\": \"野石竹\",\n        \"noshi\": \"ノシ\",\n        \"noshigami\": \"のしがみ\",\n        \"nosuke\": \"のすけ\",\n        \"noto\": \"能戸\",\n        \"noumen\": \"ノウメン\",\n        \"noumiso\": \"脳みそ\",\n        \"noumitsu\": \"のうみつ\",\n        \"nov\": \"nov\",\n        \"noyomi dx\": \"ノヨミDX\",\n        \"nozarashi satoru\": \"秋神サトル\",\n        \"nozawa yukiko\": \"野澤ゆき子\",\n        \"nozomi ayaka\": \"希望あやか\",\n        \"nozomu\": \"のぞむ\",\n        \"np\": \"NP\",\n        \"npo\": \"んぽ\",\n        \"ns\": \"NS\",\n        \"nt robo\": \"NTロボ\",\n        \"nt00\": \"NT00\",\n        \"nu-\": \"ぬー\",\n        \"nucomas\": \"ぬこマス\",\n        \"nue\": \"鵺\",\n        \"nui\": \"ぬい\",\n        \"nukiyama gaisei\": \"拔山蓋世\",\n        \"nukobao\": \"ぬこばお\",\n        \"nukoko\": \"ぬここ\",\n        \"nukui lususu\": \"ぬくい味汐\",\n        \"numada\": \"沼田\",\n        \"numata chihiro\": \"ぬまたちひろ\",\n        \"number 55\": \"number_55\",\n        \"numeko\": \"Numeko\",\n        \"numeri\": \"ぬめり\",\n        \"nun\": \"ぬん\",\n        \"nunohechima\": \"ヌノヘチマ\",\n        \"nupuryu\": \"ぬぷ竜\",\n        \"nurikabe\": \"ぬり壁\",\n        \"nuruken\": \"ぬるけん\",\n        \"nurumu\": \"ぬるむ\",\n        \"nutro\": \"nutro\",\n        \"nuu\": \"ヌゥ\",\n        \"nuyakana\": \"ぬャカな\",\n        \"nwonyo\": \"んをんよ\",\n        \"ny-o-ph\": \"NY-O-PH\",\n        \"nyagomaru\": \"にゃご丸\",\n        \"nyahu\": \"にゃふ\",\n        \"nyakaaki\": \"にゃかあき\",\n        \"nyake\": \"にゃけ\",\n        \"nyakki\": \"にゃっき\",\n        \"nyakkuru\": \"ニャックル\",\n        \"nyamal\": \"にゃまる\",\n        \"nyamota\": \"にゃもた\",\n        \"nyamu\": \"にゃむ\",\n        \"nyanbii\": \"にゃんびぃ\",\n        \"nyangorou\": \"にゃんごろー\",\n        \"nyanko\": \"猫狐\",\n        \"nyanko mic\": \"にゃんこMIC\",\n        \"nyantarou\": \"にゃん太郎\",\n        \"nyanya\": \"nyanya\",\n        \"nyanzo\": \"にゃんぞー\",\n        \"nyara\": \"nyara\",\n        \"nyarosu\": \"にゃろす\",\n        \"nylon\": \"ナイロン\",\n        \"nyoichi\": \"にょいち\",\n        \"nyonyonba tarou\": \"にょにょんば太郎\",\n        \"nyoriko\": \"にょりこ\",\n        \"nyorori\": \"にょろり\",\n        \"nyorutarou\": \"にょる太郎\",\n        \"nyu\": \"nyu\",\n        \"nyuuhin\": \"にゅーひん\",\n        \"o-bow\": \"O-bow\",\n        \"o-ji\": \"おーじ\",\n        \"o.p com\": \"おぽこむ\",\n        \"o.ri\": \"O.RI\",\n        \"oasis\": \"オアシス\",\n        \"oba yoshifumi\": \"大庭佳文\",\n        \"obakyu-taro\": \"089タロー\",\n        \"obata hiroyuki\": \"小幡寛之\",\n        \"obata yayoi\": \"おばたやよい\",\n        \"obmas\": \"obmas\",\n        \"oboroduki yamiya\": \"朧月闇夜\",\n        \"oborotsuki kakeru\": \"朧月カケル\",\n        \"obyaa\": \"おびゃー\",\n        \"ocha\": \"おちゃ\",\n        \"ochatan\": \"おちゃたん\",\n        \"ochatsumi\": \"オチャツミ\",\n        \"ochi ai\": \"越智愛\",\n        \"ochi gento\": \"越智源斗\",\n        \"ochita taiji\": \"越智多たいじ\",\n        \"ocodo\": \"おこど\",\n        \"octotaco\": \"奥藤た子\",\n        \"oda\": \"oda\",\n        \"oda akira\": \"おだ あきら\",\n        \"oda haiji\": \"織田灰至\",\n        \"oda natsuki\": \"織田夏樹\",\n        \"odabutsu\": \"おだぶつ\",\n        \"oden\": \"おデン\",\n        \"oden no shima\": \"おでんno島\",\n        \"oden70\": \"おでん70\",\n        \"oekakizuki\": \"oekakizuki\",\n        \"og\": \"Og\",\n        \"ogami kazuki\": \"拝一樹\",\n        \"ogami wolf\": \"拝狼\",\n        \"ogata\": \"Ogata\",\n        \"ogata gatarou\": \"オガタガタロー\",\n        \"ogata hiro\": \"御形紘\",\n        \"ogata mamimi\": \"緒方マミ美\",\n        \"ogata satomi\": \"緒方賢美\",\n        \"ogawa hidari\": \"小川ひだり\",\n        \"ogawa mashiro\": \"オガワマシロ\",\n        \"ogawa renji\": \"小河レンジ\",\n        \"ogiara\": \"オギアラ\",\n        \"ogino\": \"オギノ\",\n        \"oguma\": \"oguma\",\n        \"ogura anko\": \"おぐらあん子\",\n        \"oguramansai\": \"小倉萬采\",\n        \"ohakotome\": \"おはことめ\",\n        \"ohanabatake run\": \"御花畑るん\",\n        \"ohara makoto\": \"おはら誠\",\n        \"ohiensis\": \"オヒエンシス\",\n        \"ohio-shuu riki\": \"オハイオ州力\",\n        \"ohiru\": \"電SUKE\",\n        \"ohiya\": \"お冷\",\n        \"ohka\": \"おーか\",\n        \"ohma\": \"謳馬\",\n        \"ohmi\": \"近江\",\n        \"ohmi takeshi\": \"大見武士\",\n        \"ohno kanae\": \"大野かなえ\",\n        \"ohrin\": \"王林\",\n        \"ohsima kouichi\": \"大島洸一\",\n        \"ohsugi yukihiro\": \"大杉 ゆきひろ\",\n        \"ohtsuki suzuki\": \"大槻涼樹\",\n        \"oimo\": \"おいも\",\n        \"oimori yura\": \"及森ゆうら\",\n        \"oimoto jirou\": \"おいもとじろう\",\n        \"ojii\": \"おじい\",\n        \"ojii-chan\": \"おじいちゃん\",\n        \"okabayashi beru\": \"岡林べる\",\n        \"okada kojiko\": \"冈田こじ子\",\n        \"okada reimi\": \"冈田れいみ\",\n        \"okagiri shou\": \"岡霧硝\",\n        \"okama\": \"OKAMA\",\n        \"okamoto\": \"オカモト\",\n        \"okamoto fujio\": \"おかもとふじお\",\n        \"okamura hijiki\": \"岡村ひじき\",\n        \"okamura takahiro\": \"岡村孝公\",\n        \"okashira\": \"おかしら\",\n        \"okashita makoto\": \"岡下誠\",\n        \"okatora\": \"岡虎\",\n        \"okawa wataru\": \"大河渡\",\n        \"okawari\": \"OKAWARI\",\n        \"okawari jiyuu\": \"おかわり児遊\",\n        \"okaya hitsuji\": \"ヲカヤヒツジ\",\n        \"okayado\": \"オカヤド\",\n        \"okayu\": \"Okayu\",\n        \"okazaki mituki\": \"おかざきみつき\",\n        \"okazaki nao\": \"岡崎那緒\",\n        \"okazu yuuichi\": \"オカズゆういち\",\n        \"oke\": \"桶\",\n        \"okeashi chiyoko\": \"桶葭千夜子\",\n        \"oki yukao\": \"沖由佳雄\",\n        \"okidaka yuu\": \"沖高有\",\n        \"okina\": \"OKINA\",\n        \"okina naoki\": \"沖名なおき\",\n        \"okino matsushiro\": \"沖の松城\",\n        \"okino ryuuto\": \"沖野琉人\",\n        \"okita ababa\": \"沖田あばば\",\n        \"okiura\": \"okiura\",\n        \"okiyo\": \"おきよ\",\n        \"okki\": \"okki\",\n        \"okoge senbei\": \"おこげ煎餅\",\n        \"okome\": \"お米\",\n        \"okowa\": \"おこわ\",\n        \"okumura\": \"おくむら\",\n        \"okuva\": \"奥ヴぁ\",\n        \"okusan\": \"奥さん\",\n        \"okuse saki\": \"奥瀬サキ\",\n        \"om\": \"om\",\n        \"omangarl\": \"オマンガール\",\n        \"omega destroyer\": \"オメ～ガ・デストロイヤー\",\n        \"omegane\": \"御眼鏡\",\n        \"omi\": \"おみ\",\n        \"omizu\": \"おみず\",\n        \"omizu chihiro\": \"お水ちひろ\",\n        \"omochi\": \"おもち\",\n        \"omoutubo\": \"思うつぼ\",\n        \"onamaru\": \"おな丸\",\n        \"onapan\": \"おなぱん\",\n        \"onetouch\": \"わんたっち\",\n        \"onguuchi\": \"御宮内\",\n        \"oni japu\": \"鬼 ジャプ\",\n        \"oniben katze\": \"鬼遍かっつぇ\",\n        \"oniku\": \"お肉\",\n        \"oniku.\": \"お肉。\",\n        \"onineko\": \"おにねこ\",\n        \"onita\": \"歐尼鬼\",\n        \"oniyama\": \"鬼山\",\n        \"oniyuri\": \"オニユリ\",\n        \"onizuka takuto\": \"鬼塚たくと\",\n        \"onna\": \"onna\",\n        \"onnami chiyu\": \"御並千侑\",\n        \"ono misao\": \"小野ミサオ\",\n        \"ono nui\": \"小野ぬい\",\n        \"onoda sachi\": \"おのださち\",\n        \"onodera\": \"おのでら\",\n        \"onodera kazumi\": \"小野寺和海\",\n        \"onoderasan\": \"おのでらさん\",\n        \"onogawa kiwi\": \"小野川キウイ\",\n        \"onomesin\": \"オノメシン\",\n        \"onomichi\": \"Onomichi\",\n        \"onsen nakaya\": \"おんせんなかや\",\n        \"onsen no tubuyaki\": \"おんせんなかや\",\n        \"onsoku zekuu\": \"己即是空\",\n        \"onyo\": \"Onyo\",\n        \"ooba jun\": \"大刃じゅん\",\n        \"oofuji reiichirou\": \"大藤玲一郎\",\n        \"oogane\": \"大金\",\n        \"oohashi kaoru\": \"大橋薫\",\n        \"ooi hanimaru\": \"大井はに丸\",\n        \"ooi masakazu\": \"大井昌和\",\n        \"ooi sakae\": \"大井栄\",\n        \"ooiwa kenzi\": \"大岩ケンヂ\",\n        \"ooizumi daisaku\": \"大泉だいさく\",\n        \"ookami\": \"狼\",\n        \"ookami yuuki\": \"大神ゆうき\",\n        \"ooki bonta\": \"おおきぼん太\",\n        \"ookido karo\": \"大城戸カロ\",\n        \"ookubo matagi\": \"おおくぼマタギ\",\n        \"ookuma tanuki\": \"大熊狸喜\",\n        \"oomori harusame\": \"大守春雨\",\n        \"oomori makoto\": \"大森誠\",\n        \"oona mitsutoshi\": \"おおなみつとし\",\n        \"oonami youko\": \"大波耀子\",\n        \"oonita hiroyuki\": \"大仁田ヒロユキ\",\n        \"oono\": \"オオノ\",\n        \"oono tetsuya\": \"大野哲也\",\n        \"oonuma shinichi\": \"大沼信一\",\n        \"oosaka hananoko\": \"大阪花之呼\",\n        \"oosawa\": \"大沢\",\n        \"oose tsunami\": \"大瀬津波\",\n        \"oosugi kazuma\": \"大杉和馬\",\n        \"oota yuuichi\": \"大田優一\",\n        \"ootake pashio\": \"大竹パシ夫\",\n        \"ootani mikoto\": \"大谷みこと\",\n        \"ootsuka potato\": \"大塚ぽてと\",\n        \"ootsuka shirou\": \"大塚志郎\",\n        \"ootsuki wataru\": \"大月渉\",\n        \"oowada tomari\": \"大輪田泊\",\n        \"ooyake\": \"公\",\n        \"ooyama chiroru\": \"おおやまちろる\",\n        \"opaisukii\": \"オパイスキー\",\n        \"orange manbou\": \"おれんじまんぼう\",\n        \"ore\": \"ore\",\n        \"ore ebis\": \"俺エビス\",\n        \"orenchin\": \"おれんちん\",\n        \"orenuma tooko\": \"オレヌマトオコ\",\n        \"oretto\": \"おれっと\",\n        \"organico\": \"おるがにこ\",\n        \"orico\": \"オリコ\",\n        \"orihara kotone\": \"折原琴音\",\n        \"orihi chihiro\": \"織日ちひろ\",\n        \"orikawa\": \"折川\",\n        \"orikuchi hirata\": \"折口ヒラタ\",\n        \"orima inaka\": \"織間いなか\",\n        \"orimiya mai\": \"おりみや舞\",\n        \"orimoto mimana\": \"おりもとみなま\",\n        \"oris\": \"織栖\",\n        \"orishima yupopo\": \"織島ユポポ\",\n        \"orita\": \"オリタ\",\n        \"oriue wato\": \"織上ワト\",\n        \"orizen\": \"おりぜん\",\n        \"orizuru bros\": \"折鶴兄弟\",\n        \"oroneko\": \"おろねこ\",\n        \"oruna\": \"オルナ\",\n        \"oryoku\": \"おーりょく\",\n        \"os\": \"OS\",\n        \"osafune\": \"オサフネ\",\n        \"osagashi\": \"オサガシ\",\n        \"osakana\": \"ヲさかな\",\n        \"osana sumika\": \"幼菜すみか\",\n        \"osanai mujica\": \"小山内ムジカ\",\n        \"osato\": \"おさとう\",\n        \"oseron\": \"オセロン\",\n        \"oshimugi\": \"押麦\",\n        \"oshousui\": \"和尚吹\",\n        \"osora\": \"緒空\",\n        \"osterei\": \"OSTEREi\",\n        \"osuzu akiomi\": \"尾铃明臣\",\n        \"osyakana\": \"おしゃかな\",\n        \"otakehiko\": \"雄竹彦\",\n        \"othello\": \"オセロ\",\n        \"otochichi\": \"音乳\",\n        \"otogi\": \"おとぎ\",\n        \"otogi tetsurou\": \"おとぎてつろう\",\n        \"otohiko\": \"音彦\",\n        \"otohuke bonne\": \"音更ボンヌ\",\n        \"otokam\": \"オトカム\",\n        \"otokawa kazuki\": \"乙川カヅキ\",\n        \"otori\": \"おとり\",\n        \"ototo\": \"おとと\",\n        \"otou\": \"尾刀\",\n        \"otsuki miharu\": \"鳴月みはる\",\n        \"ottoman turks\": \"オスマントル子\",\n        \"otumaru\": \"乙丸\",\n        \"otyawan\": \"オチャワン\",\n        \"ou\": \"おぅ\",\n        \"oudon\": \"おうどん\",\n        \"ougi hina\": \"扇城ひな\",\n        \"ougi nozomi\": \"扇希実\",\n        \"ougon dokuro\": \"黄金髑髏\",\n        \"ouhashi\": \"おうはし\",\n        \"oujano kaze\": \"王者之風\",\n        \"ouji tsukino\": \"王子月乃\",\n        \"ouka\": \"オウカ\",\n        \"ouka sushi\": \"桜花すし\",\n        \"oukawa shiya\": \"桜川シヤ\",\n        \"ouma bunshichirou\": \"逢摩文七郎\",\n        \"oshiume nyora\": \"押梅にょら\",\n        \"oumi noe\": \"近江のえ\",\n        \"ouno\": \"奥之\",\n        \"ounwm\": \"ounwm\",\n        \"ousawa kanata\": \"桜沢かなた\",\n        \"ouse riruka\": \"桜瀬りるか\",\n        \"over line\": \"オーバーライン\",\n        \"owa\": \"尾和\",\n        \"owahu\": \"おわふ\",\n        \"owal\": \"おわる\",\n        \"oxideengine\": \"OXIDEENGINE\",\n        \"oxxo\": \"OXXO\",\n        \"oxy\": \"おきし\",\n        \"oyaji\": \"オヤジ\",\n        \"oyama robi\": \"御山ロビ\",\n        \"oyuki\": \"おゆき\",\n        \"ozaki\": \"おざき\",\n        \"ozawa akifumi\": \"織澤あきふみ\",\n        \"ozawa aoi\": \"オザワアオイ\",\n        \"ozawa hiyori\": \"小沢ひより\",\n        \"ozawa manabu\": \"緒沢まなぶ\",\n        \"ozawa reido\": \"小泽零人\",\n        \"ozawa you\": \"小沢悠\",\n        \"ozora ituki\": \"大空樹\",\n        \"ozuno mahou\": \"緒図乃真朋\",\n        \"p no ji\": \"pの字\",\n        \"p senpuki\": \"P せんぷき\",\n        \"p tag\": \"Pタグ\",\n        \"pageratta\": \"ぱげらった\",\n        \"painpa\": \"パインパ\",\n        \"paintmusume\": \"ペイント娘\",\n        \"pal maison\": \"パルめぞん\",\n        \"paleatus\": \"paleatus\",\n        \"pan koojo\": \"パン☆工場\",\n        \"pana\": \"PANA\",\n        \"panbai\": \"PANBAI 旁白\",\n        \"panda\": \"ぱんだ\",\n        \"pandacorya\": \"ぱんだこりゃ\",\n        \"pandain\": \"パンダィン\",\n        \"pandatyama\": \"ぱんだちゃま\",\n        \"pang9943\": \"pang9943\",\n        \"panimi\": \"ぱに魅\",\n        \"panpa\": \"ぱんぱー\",\n        \"panta\": \"ぱん太\",\n        \"pao\": \"パオ\",\n        \"papa papan\": \"ぱぱ・ぱぱん\",\n        \"papepoxx\": \"PAPEPOX2\",\n        \"paper\": \"ぱぺる\",\n        \"pappa\": \"パッパ\",\n        \"paprika cider\": \"パプリカサイダー\",\n        \"paradise d\": \"PARADISE“D”\",\n        \"pararan\": \"ぱららん\",\n        \"parfait\": \"ぱふぇ\",\n        \"parins\": \"Parins\",\n        \"parmiria\": \"パーミリア\",\n        \"parua\": \"ぱるあ\",\n        \"paruparu\": \"ぱるぱる\",\n        \"pasdar\": \"pasdar\",\n        \"pasera\": \"ぱせら\",\n        \"pastachin\": \"パスタチン\",\n        \"pato-chan\": \"パトちゃん\",\n        \"patori\": \"ぱとり\",\n        \"patricia\": \"パトリシア\",\n        \"patrick hateman\": \"Patrick Hateman\",\n        \"pd\": \"Pd\",\n        \"peach\": \"Peach\",\n        \"peat lock\": \"ぴーと・ろっく\",\n        \"peke\": \"ぺけ\",\n        \"pekeko\": \"ペケこ\",\n        \"penguindou\": \"筆吟堂\",\n        \"peniken\": \"ぺに健\",\n        \"pensuke\": \"ぺんすけ\",\n        \"pepe\": \"ぺぺ\",\n        \"pepo\": \"ぺぽ\",\n        \"perimaru\": \"ぺり丸\",\n        \"permille\": \"permille\",\n        \"pero\": \"ぺろ\",\n        \"personality\": \"personality\",\n        \"peruri\": \"ぺるり\",\n        \"peso\": \"ペソ\",\n        \"petag2\": \"petaG2\",\n        \"pgb\": \"pgb\",\n        \"phantom\": \"ふぁんとむ\",\n        \"philan\": \"Philan\",\n        \"philly\": \"Philly\",\n        \"phoenicia masako\": \"フェニキア雅子\",\n        \"pi-ko\": \"ぴーこ\",\n        \"pia pia\": \"Pia☆Pia\",\n        \"piano\": \"ぴあの\",\n        \"piaroo\": \"Piaroo\",\n        \"pickles\": \"ピクルス\",\n        \"picpicgram\": \"ぴこぴこぐらむ\",\n        \"pide\": \"Piで\",\n        \"pierre norano\": \"ピエールのらの\",\n        \"pihii\": \"ぴひー\",\n        \"pikachi\": \"ぴかち\",\n        \"pikachurin\": \"ピカチュリン\",\n        \"pikaichi\": \"ぴかいち\",\n        \"pikath\": \"ぴかっち\",\n        \"pikazo\": \"Pikazo\",\n        \"pikeru\": \"ピケル\",\n        \"piku star cell\": \"ぴく☆せる\",\n        \"pikupikun\": \"ピクピクン\",\n        \"pilky\": \"ぴるきー\",\n        \"pimoco\": \"pimoco\",\n        \"pin vice\": \"PIN・VICE\",\n        \"pinakes\": \"ピナケス\",\n        \"pingure\": \"ピングレ\",\n        \"pinksel\": \"Pinksel\",\n        \"pino\": \"ぴの\",\n        \"pinta\": \"PINTA\",\n        \"pip\": \"PIP\",\n        \"pipa\": \"ぴぱ\",\n        \"pira\": \"ぴら\",\n        \"pirikara syuga\": \"ピリ辛シュガー\",\n        \"pirorun\": \"ぴろるん\",\n        \"pistanya\": \"ピスターニャ\",\n        \"piston\": \"ぴすとん\",\n        \"piyo\": \"PiYo\",\n        \"piyopiyo\": \"ぴよぴよ\",\n        \"pizanuko\": \"ぴざぬこ\",\n        \"pizi2 gou\": \"pizi2号\",\n        \"pj-1\": \"PJ-1\",\n        \"plasma beach\": \"プラズマビーチ\",\n        \"plum\": \"ぷらむ\",\n        \"plus\": \"プラス\",\n        \"pocchi\": \"ぽっち\",\n        \"poin\": \"ぽいん\",\n        \"poison needle\": \"Poison Needle\",\n        \"pokke\": \"ぽっけ\",\n        \"pokochin\": \"ぽこちん\",\n        \"pokota\": \"ぽこた\",\n        \"pokurouta\": \"ポクロウタ\",\n        \"pole\": \"ポール\",\n        \"polorinken\": \"ポロリン軒\",\n        \"poma\": \"poma\",\n        \"pomimiko\": \"ぽみみ子\",\n        \"pomupomu\": \"ぽむぽむ\",\n        \"ponchi\": \"ぽんち\",\n        \"ponde\": \"ぽんで\",\n        \"ponhosikotu\": \"PON☆骨\",\n        \"poni.\": \"ぽに。\",\n        \"ponkan 8\": \"ぽんかん⑧\",\n        \"ponkichi\": \"ぽんきち\",\n        \"ponkotsu\": \"ぽんこつ\",\n        \"ponpe matkachi\": \"尾形全\",\n        \"ponyuzu\": \"ぽんゆず\",\n        \"ponzu\": \"ぽん酢\",\n        \"popo\": \"popo\",\n        \"poponko\": \"ぽぽんこ\",\n        \"popopalt\": \"ぽぽぱると\",\n        \"nishi shizumu\": \"西しずむ\",\n        \"poriko\": \"ポリ子\",\n        \"poriuretan\": \"ぽりうれたん\",\n        \"poron\": \"ぽろん\",\n        \"poronatsu\": \"ポロなつ\",\n        \"porosuke\": \"ぽろすけ\",\n        \"porurin\": \"ポルリン\",\n        \"poshushi\": \"ぽしゅ氏\",\n        \"potsu\": \"ぽつ\",\n        \"potu\": \"ぽつ\",\n        \"powaito\": \"ぽわいと\",\n        \"poyamu\": \"ぽやむ\",\n        \"poyo equals namaste\": \"ポヨ=ナマステ\",\n        \"pozesuke\": \"ポゼ助\",\n        \"ppoint\": \"Pポイント\",\n        \"preggypenny\": \"PreggyPenny\",\n        \"president-p\": \"president-p\",\n        \"prhs\": \"Prhs\",\n        \"pri\": \"ぷり\",\n        \"princess lemanko\": \"プリンセスレマン子\",\n        \"project bellerophon\": \"Project Bellerophon\",\n        \"prophecy\": \"ぷろへしぃ\",\n        \"propolisee\": \"プロポリスEE\",\n        \"psohatten\": \"psohatten\",\n        \"ptai\": \"ptai\",\n        \"pu-en\": \"pu-en\",\n        \"pu2\": \"pu2\",\n        \"pua\": \"Pua\",\n        \"pucca\": \"ぷっか\",\n        \"puchida\": \"ぷちだ\",\n        \"puchii puuchii\": \"ぷーちぃ・ぷぅちぃ\",\n        \"pukara\": \"PUKARA\",\n        \"pukkunn\": \"ぷっくん\",\n        \"punita\": \"ぷにた\",\n        \"puniyama meroro\": \"ぷにやまめろろ\",\n        \"punyon\": \"プニョン\",\n        \"puranpuman\": \"ぷらんぷまん\",\n        \"purapa\": \"ぷらぱ\",\n        \"pureinn\": \"pureinn\",\n        \"puriko\": \"プリ子\",\n        \"purin\": \"ぷりん\",\n        \"puripuri jet\": \"プリプリJET\",\n        \"puripuri kikou shidan\": \"ぷりぷり機甲師団\",\n        \"puripuri uemon\": \"ぷりぷり大佐\",\n        \"purisa\": \"purisa\",\n        \"puritei\": \"ぷりてゐ\",\n        \"purplecroudhill\": \"紫雲山頂\",\n        \"puti\": \"ぷち\",\n        \"pyouryuu\": \"彪竜\",\n        \"pyz\": \"pyz\",\n        \"q1\": \"究一\",\n        \"qiqo\": \"qiqo\",\n        \"qko\": \"Q子\",\n        \"qoom\": \"くーム\",\n        \"quanxing\": \"光星\",\n        \"qudamomo\": \"Qudamomo\",\n        \"qunami himehiko\": \"九波ヒメヒコ\",\n        \"qutouten\": \"句読点\",\n        \"quu\": \"Quu\",\n        \"qzna\": \"qzna\",\n        \"r\": \"あーる\",\n        \"r-ex\": \"R-Ex\",\n        \"ra-men\": \"らーめん\",\n        \"rabbi\": \"らび\",\n        \"rabbit\": \"Rabbit\",\n        \"racer\": \"racer\",\n        \"racket\": \"らけっと\",\n        \"radio\": \"ラジオ\",\n        \"radiohead\": \"ラヂヲヘッド\",\n        \"raemz\": \"Raemz\",\n        \"rafuro\": \"ラフロ\",\n        \"ragetsu\": \"裸月\",\n        \"rai\": \"ライ\",\n        \"raiden\": \"らいでん\",\n        \"raijin maru\": \"雷神丸\",\n        \"raika\": \"ライカ\",\n        \"raimu\": \"莱夢\",\n        \"raipa zrx\": \"雷覇ZRX\",\n        \"rairarai\": \"らいらライ\",\n        \"raitei\": \"雷丁\",\n        \"raiun\": \"らいうん\",\n        \"rajii\": \"らじー\",\n        \"rakia\": \"rakiA\",\n        \"rakko\": \"らっこ\",\n        \"rakkyo\": \"ラッキョ\",\n        \"rakuda torino\": \"楽田トリノ\",\n        \"rakuji tarahi\": \"楽時たらひ\",\n        \"rakuria\": \"ラクリア\",\n        \"rama\": \"らま\",\n        \"ramble\": \"RAMBLE\",\n        \"ramdac 300\": \"RAMDAC 300\",\n        \"ramen-penguin\": \"拉麵企鵝\",\n        \"rami\": \"らみ\",\n        \"ramii\": \"らみぃ\",\n        \"ramototu\": \"ラモトツ\",\n        \"rampant404\": \"Contact\",\n        \"ramu\": \"らむ\",\n        \"ran\": \"RAN\",\n        \"ranaecho\": \"ranaECHO\",\n        \"ranke\": \"らんけ\",\n        \"rannero\": \"RanneRo\",\n        \"rarana\": \"ららな\",\n        \"rasahan\": \"ラサハン\",\n        \"rasson\": \"らっそん\",\n        \"rasukaru\": \"らすかる\",\n        \"rate\": \"RaTe\",\n        \"rati\": \"ラティ\",\n        \"rayze\": \"瑞氏\",\n        \"razy\": \"らじー\",\n        \"razz\": \"らず\",\n        \"recaro\": \"れかろ\",\n        \"red.d\": \"Red.D\",\n        \"redhair\": \"RedHair\",\n        \"redking\": \"れっどきんぐ\",\n        \"rei\": \"REI\",\n        \"rei park\": \"れいぱぁく\",\n        \"reigamk2\": \"麗牙Mk-2\",\n        \"reiji\": \"れゐぢ\",\n        \"reika\": \"零花\",\n        \"reimei\": \"黎明\",\n        \"reine\": \"レーヌ\",\n        \"reishiki aria\": \"零式アリア\",\n        \"rekisitaihoonoji\": \"レキシタイふのじ\",\n        \"reku\": \"れく\",\n        \"rela\": \"Rela\",\n        \"relm\": \"りるむ\",\n        \"remora\": \"remora\",\n        \"remu\": \"れむ\",\n        \"ren mizuha\": \"蓮みづは\",\n        \"ren suru\": \"れんする\",\n        \"rena\": \"れな\",\n        \"renge\": \"れんげ\",\n        \"rentaichou\": \"连队长\",\n        \"rentan\": \"煉丹\",\n        \"rescar\": \"れすか\",\n        \"reso\": \"れーそ\",\n        \"retasu\": \"れたすー\",\n        \"reto\": \"れと\",\n        \"retota\": \"れと太\",\n        \"ri-ru-\": \"りーるー\",\n        \"ri.\": \"ri.\",\n        \"tajima ria\": \"立嶋りあ\",\n        \"rian\": \"りあん\",\n        \"riboshika\": \"リボシカ\",\n        \"ricca\": \"りっか\",\n        \"ricchy\": \"ricchy\",\n        \"rice oomori\": \"ライスおおもり\",\n        \"rie\": \"RiE\",\n        \"rihi\": \"りひ\",\n        \"rihitozoire\": \"リヒトゾイレ\",\n        \"rii\": \"りい\",\n        \"rikamarika\": \"rikamarika\",\n        \"rikazu\": \"rikazu\",\n        \"riki\": \"利木\",\n        \"rikka\": \"立夏\",\n        \"rikoko\": \"りここ\",\n        \"rikomaru\": \"りこ丸\",\n        \"rikose\": \"リコセ\",\n        \"riku maru\": \"りくまる\",\n        \"rikudo inuhiko\": \"六堂犬彦\",\n        \"rikudou\": \"六道\",\n        \"rikudou koushi\": \"六道神士\",\n        \"rikume\": \"rikume\",\n        \"rikusu\": \"リクス\",\n        \"rikuto\": \"六兎\",\n        \"rimukoro\": \"リムコロ\",\n        \"rimviolet\": \"rimviolet\",\n        \"rin\": \"rin\",\n        \"rindoh\": \"竜瞳\",\n        \"rindou akira\": \"りんどうあきら\",\n        \"ringo\": \"りんご\",\n        \"ringo amee\": \"林檎あめぇ\",\n        \"ringo anu\": \"りんごあぬ\",\n        \"ringo no kisetsu.\": \"りんごの季節。\",\n        \"rinku\": \"りんく\",\n        \"rinno arara\": \"りんのあらら\",\n        \"rino nymphet\": \"Rino nymphet\",\n        \"rinoko\": \"リノコ\",\n        \"rinri kazuki\": \"倫理一輝\",\n        \"rinsun\": \"リンスン\",\n        \"rinta\": \"りんた\",\n        \"rinunu\": \"りぬぬ\",\n        \"rioemon\": \"緋良雪リオ\",\n        \"rioka\": \"rioka\",\n        \"rioko\": \"りおこ\",\n        \"ripton\": \"りぷとん\",\n        \"rir\": \"RIR\",\n        \"ririmat tsuruegar\": \"リリマット・ツルーガー\",\n        \"risa.\": \"りさ。\",\n        \"risei\": \"李星\",\n        \"risuou\": \"李子昴\",\n        \"risupu\": \"risupu\",\n        \"rit.\": \"rit.\",\n        \"rittiri\": \"リッティリ\",\n        \"rityou\": \"リチョウ\",\n        \"riumu\": \"りうむ\",\n        \"riuta gao\": \"りうたがお\",\n        \"rivale\": \"RIVALE\",\n        \"riyun\": \"RiYUN\",\n        \"ro\": \"ro\",\n        \"roche\": \"Roche\",\n        \"rocket kyoudai\": \"ロケット兄弟\",\n        \"rocket okaboshi\": \"ロケット岡星\",\n        \"rockmanwjh\": \"rockmanwjh\",\n        \"roco\": \"ロコ\",\n        \"rohgun\": \"老眼\",\n        \"rojione\": \"ロジオネ\",\n        \"roki\": \"Roki\",\n        \"rokko\": \"ロッコ\",\n        \"rokomaru\": \"ロコ丸\",\n        \"roku\": \"ロク\",\n        \"rokudou ashura\": \"六道阿修羅\",\n        \"rokujyou\": \"六畳\",\n        \"rokuku\": \"ろくく\",\n        \"rokumei kanau\": \"鹿鳴叶\",\n        \"rokumonsen kako\": \"六文銭カコ\",\n        \"rokuroichi\": \"ロクロイチ\",\n        \"rokusiru\": \"六汁\",\n        \"rokusuke\": \"ろくすけ\",\n        \"rokusyou kokuu\": \"緑青黒羽\",\n        \"rollei\": \"ローライ\",\n        \"rontan\": \"ろんたん\",\n        \"root001\": \"root001\",\n        \"roreru\": \"ろれる\",\n        \"roro\": \"ロロ\",\n        \"rorochannel\": \"ろろちゃんねる\",\n        \"roromo\": \"ろろも\",\n        \"rororogi mogera\": \"露々々木もげら\",\n        \"ros\": \"ROS\",\n        \"roshuu takehiro\": \"浪州建博\",\n        \"rou\": \"rou\",\n        \"rouka\": \"ろうか\",\n        \"route39\": \"Route39\",\n        \"roy tong-koh\": \"瑞東航\",\n        \"roze\": \"ロゼ\",\n        \"rozen\": \"ロゼン\",\n        \"rq\": \"RQ\",\n        \"rt.\": \"RT.\",\n        \"rubaka\": \"Rubaka\",\n        \"rucu\": \"るく\",\n        \"rucuk\": \"るく\",\n        \"rudo\": \"Rudo\",\n        \"rudoni\": \"ルドーニ\",\n        \"ruha69\": \"ruha69\",\n        \"rui\": \"RUI\",\n        \"ruiko\": \"RUIKO\",\n        \"ruirui\": \"るいるい\",\n        \"rukichi\": \"るきち\",\n        \"rumina\": \"るみな\",\n        \"rumiya\": \"るみや\",\n        \"rumiya isasa\": \"流宮いささ\",\n        \"run\": \"ルン\",\n        \"runa\": \"runa\",\n        \"rune\": \"るね\",\n        \"ruratto\": \"るらっと\",\n        \"ruri erika\": \"瑠璃えりか\",\n        \"ruri rarako\": \"瑠璃ららこ\",\n        \"ruri tsubame\": \"瑠璃燕\",\n        \"rurimaru\": \"瑠璃丸\",\n        \"ruroo\": \"るろお\",\n        \"rururu\": \"流×3♪\",\n        \"rusher verak\": \"ラッシャーヴェラク\",\n        \"rushi\": \"るし\",\n        \"rushsoldier\": \"RushSoldier\",\n        \"russia no dassouhei\": \"ロシヤの脱走兵\",\n        \"rutubo\": \"るつぼ\",\n        \"rux\": \"rux\",\n        \"rxjx\": \"RxJx\",\n        \"ryo.k\": \"りょう・K\",\n        \"ryoattoryo\": \"りょう@涼\",\n        \"ryoji\": \"Ryoji\",\n        \"ryokunyo\": \"りょうくんよ\",\n        \"ryokuoushoku\": \"緑黄色\",\n        \"ryokusiki\": \"緑式\",\n        \"ryokutya\": \"ryokutya\",\n        \"ryomaru\": \"りょまる\",\n        \"ryome gantai\": \"両目眼帯\",\n        \"ryosuke.\": \"涼助。\",\n        \"ryouei\": \"諒英\",\n        \"ryu\": \"RYU\",\n        \"ryu shou\": \"劉祥\",\n        \"ryu-akt\": \"Ryu-Akt\",\n        \"ryujin\": \"RYUJIN\",\n        \"ryuki\": \"リュウキ\",\n        \"ryumage\": \"りう☆めいじ\",\n        \"ryuno\": \"ryuno\",\n        \"ryunosuke\": \"龍之介\",\n        \"ryutou\": \"竜湯\",\n        \"ryuudou hiromi\": \"龍堂ひろみ\",\n        \"ryuuka ryou\": \"りゅうか綾\",\n        \"konoshige\": \"コノシゲ\",\n        \"ryuuna\": \"りゅうな\",\n        \"ryuutai niku\": \"流体肉\",\n        \"s\": \"S\",\n        \"s parameter\": \"S・パラミター\",\n        \"s-ram\": \"エスラム\",\n        \"s.kosugi\": \"S.濃すぎ\",\n        \"s.shimizu\": \"S.SHIMIZU\",\n        \"s73d\": \"s73d\",\n        \"saaya\": \"さあや\",\n        \"sabahito\": \"鯖人\",\n        \"sabaku\": \"砂漠\",\n        \"sabakui\": \"食鯖獣\",\n        \"sabaneko\": \"さばねこ\",\n        \"sabanoniwatori\": \"さばのにわとり\",\n        \"sabawo\": \"サバヲ\",\n        \"sabbath\": \"Sabbath\",\n        \"sabi wasabi\": \"錆わさび\",\n        \"sabuko\": \"サブコ\",\n        \"saburou\": \"サブロー\",\n        \"sacchi\": \"さっち\",\n        \"sachito\": \"サチト\",\n        \"sachuma\": \"さちゅま\",\n        \"saco\": \"saco\",\n        \"sad\": \"SAD\",\n        \"sadagorou\": \"貞五郎\",\n        \"sadahiro\": \"定宏\",\n        \"sadakichi\": \"さだ吉\",\n        \"sado\": \"さど\",\n        \"saebashi\": \"さえばし\",\n        \"saegusa kohaku\": \"冴草こはく\",\n        \"saegusa mutsumi\": \"さえぐさ睦\",\n        \"saeki kura\": \"佐伯倉\",\n        \"saeki takao\": \"冴樹高雄\",\n        \"saemon\": \"サエモン\",\n        \"safi\": \"さふぃ\",\n        \"sagakichi\": \"さがきち\",\n        \"sagami inumaru\": \"佐上犬丸\",\n        \"sagami rin\": \"相模琳\",\n        \"sagami yoshitsune\": \"沙神よしつね\",\n        \"sagano hellmer\": \"サガノヘルマー\",\n        \"sagano yuuji\": \"サガノユウジ\",\n        \"sahara\": \"サハラ\",\n        \"sai-go\": \"sai-go\",\n        \"saiga mayu\": \"栖賀まゆ\",\n        \"saigi\": \"サイギ\",\n        \"saijo satoru\": \"西條サトル\",\n        \"saika\": \"彩霞\",\n        \"saiki\": \"斉木\",\n        \"saiki efu\": \"彩樹衛生\",\n        \"saiki makiko\": \"斉木マキコ\",\n        \"saikirider\": \"サイキライダー\",\n        \"saikyo pink\": \"才京ぴんく\",\n        \"saint shiro\": \"聖シロー\",\n        \"sainyan\": \"さいにゃん\",\n        \"saipin\": \"さいピン\",\n        \"sairi\": \"サイリ\",\n        \"saita masataka\": \"才田雅孝\",\n        \"saito\": \"才斗\",\n        \"saito sakae\": \"さいとー栄\",\n        \"saito yahu\": \"サイトウヤフ\",\n        \"saitou\": \"斎藤\",\n        \"saitou natsuki\": \"斎藤なつき\",\n        \"saitou tomoyuki\": \"斉藤友之\",\n        \"saitou yamashironokami yukihiko\": \"齋藤山城守之彦\",\n        \"saitou yuuichi\": \"斉藤祐一\",\n        \"saizuka mio\": \"祭塚澪\",\n        \"saji\": \"さじ\",\n        \"saka\": \"さか\",\n        \"sakae\": \"サカエ\",\n        \"sakai hitoshi\": \"酒井仁\",\n        \"sakai meri\": \"境メリ\",\n        \"sakai ringo\": \"坂井リンゴ\",\n        \"sakaki imasato\": \"さかきいまさと\",\n        \"sakaki maki\": \"榊MAKI\",\n        \"sakaki naomoto\": \"さかきなおもと\",\n        \"sakaki shigeru\": \"榊しげる\",\n        \"sakaki tsui\": \"さかきツイ\",\n        \"sakaki yuino\": \"榊ゆいの\",\n        \"sakakibara kaorunaoko\": \"榊原薫奈緒子\",\n        \"sakakibara keisuke\": \"榊原圭介\",\n        \"sakamoto sarutomunto nerima\": \"坂本サルトムント練馬\",\n        \"sakana\": \"魚\",\n        \"sakana tomomi\": \"魚ともみ\",\n        \"sakasana\": \"さかさな\",\n        \"sakata kintoki\": \"坂田金時\",\n        \"sakawaki herodai\": \"サカワキヒロ太\",\n        \"sakayaki\": \"月代\",\n        \"sakazuki homare\": \"酒月ほまれ\",\n        \"sakemasu\": \"サケマス\",\n        \"saketanuki\": \"酒たぬき\",\n        \"saki\": \"saki\",\n        \"saki meguru\": \"咲巡留\",\n        \"sakida saki\": \"さきだ咲紀\",\n        \"sakifox\": \"sakifox\",\n        \"sakimi\": \"さきみ\",\n        \"sakimiya\": \"sakimiya\",\n        \"sakishita senmu\": \"さきしたせんむ\",\n        \"sakisita\": \"さきした\",\n        \"sakiyamama\": \"sakiyamama\",\n        \"sakiyo cake\": \"崎由けぇき\",\n        \"sako\": \"サコ\",\n        \"sakofu\": \"さこふ\",\n        \"sakokichi\": \"さこきち\",\n        \"saku\": \"saku\",\n        \"sakuganki\": \"削顔鬼\",\n        \"sakula\": \"SAKULA\",\n        \"sakumi\": \"サクミ\",\n        \"sakumichi\": \"さくみち\",\n        \"sakuna\": \"さくな\",\n        \"sakura alta\": \"桜あるた\",\n        \"sakura ashika\": \"さくらあしか\",\n        \"sakura bunchou\": \"桜文鳥\",\n        \"sakura hanatsumi\": \"佐倉はなつみ\",\n        \"sakura hiiro\": \"さくらひいろ\",\n        \"sakura ichika\": \"桜イチカ\",\n        \"sakura kotetsu\": \"桜小鉄\",\n        \"sakura mafumi\": \"佐倉まふみ\",\n        \"sakura masachi\": \"佐倉まさち\",\n        \"sakura mkii\": \"SAKURA・mkII\",\n        \"sakura moyon\": \"桜もよん\",\n        \"sakura pino\": \"咲楽ぴの\",\n        \"sakura pochi\": \"桜ポチ\",\n        \"sakura rio\": \"佐倉りお\",\n        \"sakura ryuuken\": \"桜りゅうけん\",\n        \"sakura sawa\": \"紗久楽さわ\",\n        \"sakura yukimi\": \"桜ゆきみ\",\n        \"sakuraba yuuki\": \"桜庭友紀\",\n        \"sakuragi rian\": \"桜木李杏\",\n        \"sakurai\": \"サクライ\",\n        \"sakurai aya\": \"桜井綾\",\n        \"sakurai energy\": \"櫻井エネルギー\",\n        \"sakurai kouki\": \"桜井コウキ\",\n        \"sakuraizumi yuu\": \"桜泉ゆう\",\n        \"sakuramaru\": \"さくらまる\",\n        \"sakuramochi\": \"桜餅\",\n        \"sakurano hinako\": \"桜乃ひな子\",\n        \"sakurano ru\": \"櫻野露\",\n        \"sakurazari hotori\": \"桜去ほとり\",\n        \"sakusaku\": \"sakusaku\",\n        \"sakusha fushou\": \"作者不詳\",\n        \"sakuya tsuitachi\": \"さくやついたち\",\n        \"sakw\": \"sakw\",\n        \"salamander\": \"サラマンダ\",\n        \"salmon\": \"サーモン\",\n        \"salty\": \"ソルティ\",\n        \"salty dog\": \"ソルティドッグ\",\n        \"sam\": \"Sam\",\n        \"same\": \"さめ\",\n        \"same kamaboko\": \"鮫かまぼこ\",\n        \"samejima minoru\": \"鮫島実\",\n        \"samoko\": \"さもこ\",\n        \"samozumo tooru\": \"さもずも融\",\n        \"sanada kana\": \"真田カナ\",\n        \"sanada mike\": \"真田ミケ\",\n        \"sanada rin\": \"真田鈴\",\n        \"sanada sin-ichi\": \"真田真壱\",\n        \"sanami\": \"さなみ\",\n        \"sanase nasa\": \"真世那沙\",\n        \"sanbasou\": \"さんば挿\",\n        \"sanbu kousaku\": \"三部耕作\",\n        \"sangatsu\": \"三月\",\n        \"sangou\": \"さんごう\",\n        \"sanjou tomomi\": \"三条友美\",\n        \"sanku\": \"三九\",\n        \"sankuro\": \"三九呂\",\n        \"sannyuutei shinta\": \"三乳亭しん太\",\n        \"sano lemon\": \"さのレモン\",\n        \"sano toshihide\": \"佐野俊英\",\n        \"sanomako\": \"さのまこ\",\n        \"sanpaku\": \"三泊\",\n        \"sanpatisiki\": \"38式\",\n        \"sansyouo\": \"山椒魚\",\n        \"santos\": \"サントス\",\n        \"sanuki ami\": \"さぬき亜美\",\n        \"sanukinokami takakage\": \"讃岐守隆影\",\n        \"sanwaribiki\": \"三割引\",\n        \"sanzo\": \"三三\",\n        \"sanzui\": \"酸水\",\n        \"saogokushi\": \"さおごくし\",\n        \"saotome mokono\": \"早乙女もこ乃\",\n        \"sape\": \"さぺ\",\n        \"sapphire\": \"サファイア\",\n        \"saraki\": \"saraki\",\n        \"saranaru takami\": \"皿成高味\",\n        \"saranoki chikara\": \"沙羅木力\",\n        \"sarashina ryouichi\": \"更科了一\",\n        \"sarfata\": \"さふぁ太\",\n        \"sarikyou\": \"サリキョウ\",\n        \"saru\": \"saru\",\n        \"saru pikkoro\": \"サル・ピッコロ\",\n        \"sarujie\": \"さるぢえ\",\n        \"saruno ikigimo\": \"さるのいきぎも\",\n        \"sas\": \"SAS\",\n        \"sasa\": \"ささ\",\n        \"sasa sakuno\": \"佐々さくの\",\n        \"sasagawa nagaru\": \"笹川ながる\",\n        \"sasai\": \"些細\",\n        \"sasaki\": \"ササキ\",\n        \"sasaki kuro\": \"ささきくろ\",\n        \"sasaki maru\": \"笹木まる\",\n        \"sasaki muu\": \"佐々木無宇\",\n        \"sasaki saki\": \"ササキ サキ\",\n        \"sasaki sasa\": \"笹木ささ\",\n        \"sasaki sasasa\": \"ささき笹々\",\n        \"sasaki shinpei\": \"佐々木慎平\",\n        \"sasaki tamaru\": \"佐々木珠流\",\n        \"sasaki teron\": \"佐々木てろん\",\n        \"sasakichi\": \"ささきち\",\n        \"sasamaru\": \"笹丸\",\n        \"sasamashin\": \"ササマシン\",\n        \"sasana\": \"sasana\",\n        \"sasanoha toro\": \"笹乃葉とろ\",\n        \"sasara\": \"ささら\",\n        \"sasato\": \"笹徒\",\n        \"sasayuki\": \"SASAYUKi\",\n        \"sashimi\": \"さしみ\",\n        \"sasizume soutarou\": \"差詰そうたろう\",\n        \"sasori butter\": \"さそりバター\",\n        \"sataken\": \"佐竹犬\",\n        \"satetsu\": \"サテツ\",\n        \"sato\": \"sato\",\n        \"sato seila\": \"佐藤せいら\",\n        \"satomi\": \"里美\",\n        \"satomi hidefumi\": \"さとみひでふみ\",\n        \"satomi hinako\": \"里海ひなこ\",\n        \"satomi hiroyuki\": \"里見ひろゆき\",\n        \"satomi sato\": \"里見サト\",\n        \"satonaka chora\": \"さとなか樗良\",\n        \"satonishi\": \"サトニシ\",\n        \"satoo aki\": \"さとうあき\",\n        \"satosi\": \"Satosi\",\n        \"satou\": \"佐藤\",\n        \"satou hagane\": \"佐藤はがね\",\n        \"satou iori\": \"佐藤イオリ\",\n        \"satou kana\": \"佐藤カナ\",\n        \"satou kimiatsu\": \"さとうきみあつ\",\n        \"satou makura\": \"さとう枕\",\n        \"satou masa\": \"沙藤昌\",\n        \"satou memeko\": \"さとうメメ子\",\n        \"satou rima\": \"佐藤りま\",\n        \"satou samu\": \"佐藤36\",\n        \"satou santouhei\": \"さとう三等兵\",\n        \"satou shouji\": \"佐藤想次\",\n        \"satou tomoyuki\": \"佐藤知行\",\n        \"satou toshio\": \"佐藤登志夫\",\n        \"satouori\": \"さとうおり\",\n        \"satozaki\": \"里崎\",\n        \"satsuki\": \"朔月\",\n        \"satsuki fumi\": \"皐月フミ\",\n        \"satsuki gen\": \"皐月幻\",\n        \"satsuki haru\": \"皐月ハル\",\n        \"satsuki mikazu\": \"皐月みかず\",\n        \"satsuki suzuran\": \"皐月すずらん\",\n        \"satsuki usagi\": \"皐月ウサギ\",\n        \"satsuki yuni\": \"佐月由仁\",\n        \"sattol\": \"さっとる\",\n        \"sattsu\": \"さっつ\",\n        \"sawa\": \"さわ\",\n        \"sawada daisuke\": \"沢田大介\",\n        \"sawai delta\": \"澤井デルタ\",\n        \"sawaki saki\": \"澤木沙樹\",\n        \"sawako\": \"サワコ\",\n        \"sawamura\": \"澤村\",\n        \"sawamura ao\": \"沢村青\",\n        \"sawamura kina\": \"さわむらきな\",\n        \"sawarano goan\": \"さわらの五庵\",\n        \"sawasaki\": \"沢崎\",\n        \"sawashiro kei\": \"沢城ケイ\",\n        \"sawatari hitoshi\": \"沢渡仁司\",\n        \"sawatei\": \"さわてぃ\",\n        \"sawori\": \"サヲリ\",\n        \"sayaka\": \"紗弥香\",\n        \"sayakata katsumi\": \"茶館カツミ\",\n        \"sayoshi ayumi\": \"作吉歩允\",\n        \"sayossa\": \"さよっさ\",\n        \"sayousuke\": \"さようすけ\",\n        \"sayun\": \"さゆん\",\n        \"sazanami kazuto\": \"漣一人\",\n        \"sazanami mio\": \"さざなみみぉ\",\n        \"scarlet\": \"スカーレット\",\n        \"sch-mit\": \"シューミット\",\n        \"school izumi\": \"すくーるいずみ\",\n        \"scope cat\": \"すこぉぷCAT\",\n        \"scotch\": \"スコチ\",\n        \"sdwing\": \"SDwing\",\n        \"seanji sariel\": \"セアンジ・サリエル\",\n        \"secco\": \"Secco\",\n        \"sedra cicir\": \"sedra・cicir\",\n        \"segami daisuke\": \"瀬上大輔\",\n        \"segawa\": \"瀬川\",\n        \"seguchi takahiro\": \"瀬口たかひろ\",\n        \"sei torao\": \"瀬井虎男\",\n        \"seidenki\": \"seidenki\",\n        \"seigo\": \"せいご\",\n        \"seiha\": \"Seiha\",\n        \"seihoukei\": \"せいほうけい\",\n        \"seiichi\": \"清一\",\n        \"seijirou kagechika\": \"せいじろうかげちか\",\n        \"seiju\": \"セイジュ\",\n        \"seiryou touya\": \"青凌とうや\",\n        \"seishinja\": \"精子ンジャ\",\n        \"seito a\": \"生徒A\",\n        \"sekiguchi hiroki\": \"セキグチヒロキ\",\n        \"sekihan\": \"せきはん\",\n        \"sekihara\": \"せきはら\",\n        \"sekino takehiro\": \"関野武弘\",\n        \"sekiyu\": \"石油\",\n        \"sella\": \"せら\",\n        \"semahiro\": \"せまひろ\",\n        \"semimaru semi\": \"蝉丸せみ\",\n        \"semino yuu\": \"蝉のゆう\",\n        \"sena chifuyu\": \"瀬奈茅冬*\",\n        \"sena monaco\": \"瀬菜モナコ\",\n        \"sena rinko\": \"瀬名鈴子\",\n        \"senakagashiri\": \"背中が尻\",\n        \"senba\": \"千羽\",\n        \"senbata roh\": \"せんばた楼\",\n        \"senbon torii\": \"千本トリイ\",\n        \"senda kouji\": \"千田耕司\",\n        \"sendorikun\": \"せんどりくん\",\n        \"senga migiri\": \"旋牙闇霧\",\n        \"sengoku aky\": \"千国AKY\",\n        \"sengoku-kun\": \"戦国くん\",\n        \"senju rion\": \"千樹りおん\",\n        \"senkan yamatoni\": \"戦艦大和煮\",\n        \"senke kagero\": \"千家カゲロー\",\n        \"senkou hanabi\": \"閃光花火\",\n        \"sennomori maitake\": \"千ノ森まいたけ\",\n        \"senomoto hisashi\": \"瀬之本久史\",\n        \"senor daietsu\": \"セニョール大悦\",\n        \"senpuyaro\": \"旋風野郎\",\n        \"senrabanshou\": \"千羅万象\",\n        \"senwa\": \"センワ\",\n        \"senya yomi\": \"千夜詠\",\n        \"seo haruto\": \"瀬尾春人\",\n        \"seo tatsuya\": \"瀬尾辰也\",\n        \"sera tooru\": \"瀬良透\",\n        \"serakichi.\": \"世羅吉。\",\n        \"seres ryu\": \"セレス龍\",\n        \"seresu\": \"せれす\",\n        \"seri nazuna\": \"せりなずな\",\n        \"serika\": \"セリカ\",\n        \"serikawa kazumi\": \"芹川一海\",\n        \"serikawa saki\": \"芹川沙樹\",\n        \"serimiya ransu\": \"芹宮らんす\",\n        \"serino itsuki\": \"芹野いつき\",\n        \"serizawa anne\": \"芹沢あんね\",\n        \"serizawa katsumi\": \"芹沢克己\",\n        \"serizawa nae\": \"芹澤ナエ\",\n        \"serizawa yuuji\": \"芹沢ゆーじ\",\n        \"sesame surigoma\": \"セサミすりごま\",\n        \"seseri\": \"せせり\",\n        \"sessa takuma\": \"浙佐拓馬\",\n        \"sesso nashiko\": \"節操なし子\",\n        \"sethxzoe\": \"sethxzoe\",\n        \"setouchi\": \"瀬戸内\",\n        \"setouchi kurage\": \"瀬戸内くらげ\",\n        \"setouchi sumako\": \"せとうちすま子\",\n        \"setsuna\": \"刹那\",\n        \"setsuna yui\": \"せつな唯\",\n        \"setuna rio\": \"刹那莉織\",\n        \"sezan\": \"sezan\",\n        \"sezoku\": \"セゾク\",\n        \"shaa peipei\": \"西北々\",\n        \"shachi\": \"しゃち\",\n        \"shadow\": \"Shadow\",\n        \"shaian\": \"しゃいあん\",\n        \"shain a\": \"社員A\",\n        \"shake\": \"しゃけ\",\n        \"samon shiu\": \"左門しう\",\n        \"shakeko\": \"しゃけこ\",\n        \"shamon\": \"沙門\",\n        \"shamorock heart\": \"シャモロックハート\",\n        \"shamp samurai\": \"SHAMP侍\",\n        \"sharaku seiya\": \"写裸苦聖也\",\n        \"shark yaminabe\": \"シャーク闇鍋\",\n        \"sharpffffff\": \"sharpFFFFFF\",\n        \"shayo\": \"しゃよー\",\n        \"shen yan\": \"哂言\",\n        \"shena excel\": \"椎名エクセル\",\n        \"shian\": \"しあん\",\n        \"shiawase 1500\": \"幸せ1500\",\n        \"shiawase ninaru\": \"幸瀬になる\",\n        \"shiawase no katachi\": \"幸せのかたち\",\n        \"shiba\": \"柴\",\n        \"shibainu\": \"柴犬\",\n        \"shibame\": \"しばあめ\",\n        \"shibari kana\": \"縛夏奈\",\n        \"shibaya\": \"しばや\",\n        \"shibire hitsuji\": \"シビレヒツジ\",\n        \"shibuki oroshi\": \"飛沫おろし\",\n        \"shibusawa hayato\": \"渋沢隼人\",\n        \"shichoson\": \"市町村\",\n        \"shidaka akikuni\": \"しだかあきくに\",\n        \"shidatsu takayuki\": \"紫妲たかゆき\",\n        \"shieko\": \"しえこ\",\n        \"shift\": \"shift\",\n        \"shigaoka touki\": \"志峨丘トウキ\",\n        \"shigatake\": \"シガタケ\",\n        \"shigatsu sekito\": \"卯月赤人\",\n        \"shigehira\": \"茂平\",\n        \"shigekix\": \"しげきっくす\",\n        \"shigi azusa\": \"鴫あずさ\",\n        \"shiguchi satoshi\": \"シグチサトシ\",\n        \"shigunyan\": \"しぐにゃん\",\n        \"shigure kyou\": \"しぐれ卿\",\n        \"shigure ryuunosuke\": \"時雨龍之介\",\n        \"shihou\": \"志方\",\n        \"shii\": \"しぃ\",\n        \"shiigetsu yuu\": \"詩月雄\",\n        \"shiina nami\": \"椎名波\",\n        \"shiino yuy\": \"椎野唯\",\n        \"shijima\": \"しじま\",\n        \"shijima kiri\": \"しじま嬉吏\",\n        \"shijima yukio\": \"四島由紀夫\",\n        \"shijimi\": \"しじみ\",\n        \"shijokko\": \"しじょっこ\",\n        \"shijou mako\": \"士嬢マコ(・c_・ )\",\n        \"shijou sadafumi\": \"四条定史\",\n        \"shikage nagi\": \"しかげなぎ\",\n        \"shikanari\": \"シカナリ\",\n        \"shikata haru\": \"志方ハル\",\n        \"shikato miyo\": \"しかとみよ\",\n        \"shiki satoshi\": \"土贵智志\",\n        \"shikigami azuma\": \"しきがみあずま\",\n        \"shikimura\": \"しきむら\",\n        \"shikino\": \"シキノ\",\n        \"shikniful\": \"shikniful\",\n        \"shikojo\": \"シコジョー\",\n        \"shikunikiwa\": \"しくにきわ\",\n        \"shikuta maru\": \"シクタ丸\",\n        \"shima\": \"シマ\",\n        \"shima kyousuke\": \"志摩京佑\",\n        \"shima mitsuru\": \"志摩みつる\",\n        \"shima seiryuu\": \"嶋成龍\",\n        \"shima syu\": \"しまシュー\",\n        \"shima takashi\": \"嶌隆\",\n        \"shimachiyo\": \"しまちよ\",\n        \"shimada kazuma\": \"島田和真\",\n        \"shimada robin\": \"嶋田ロビン\",\n        \"shimagarasu\": \"嶋鴉\",\n        \"shimamoto chise\": \"しまもとちせ\",\n        \"shimamoto harumi\": \"島本晴海。\",\n        \"shimamoto utsumi\": \"嶋元うつみ\",\n        \"shimano natsume\": \"しまのなつめ\",\n        \"shimataka\": \"しまたか\",\n        \"shimazaki lem\": \"島崎れむ\",\n        \"shimeji\": \"しめじ\",\n        \"shimeko\": \"しめ子\",\n        \"shimesaba\": \"しめさば\",\n        \"shimizu kiyoshi\": \"清水清\",\n        \"shimizu naotaka\": \"志水なおたか\",\n        \"shimo yamashi\": \"下やまし\",\n        \"shimoda\": \"下田\",\n        \"shimodaira tooko\": \"下平十子\",\n        \"shimofuri oniku\": \"しもふりおにく\",\n        \"shimokata kouzou\": \"霜方降造\",\n        \"shimomura\": \"シモムラ\",\n        \"shimomura keiko\": \"シモムラ\",\n        \"shimosan\": \"シモサン\",\n        \"shimotsuka\": \"しもつか\",\n        \"shimotsuki ria\": \"しもつきりあ\",\n        \"shimoyake\": \"しもやけ\",\n        \"shimoyama giruko\": \"下山ギルコ\",\n        \"shin\": \"真\",\n        \"shin en\": \"新苑\",\n        \"shin-go\": \"シンゴ\",\n        \"shinachiku\": \"しなちく\",\n        \"shinade kuro\": \"科手黒\",\n        \"shinano yura\": \"しなのゆら\",\n        \"shinda mane\": \"Shinda Mane\",\n        \"shindoro mondoro\": \"新泥もんどろー\",\n        \"shindou mayumi\": \"シンドウマユミ\",\n        \"shindou naoto\": \"新堂なおと\",\n        \"shingata juukidou mecha\": \"新型重機動メカ\",\n        \"shingo\": \"SHINGO\",\n        \"shinichi\": \"しんいち\",\n        \"shinjiro\": \"信じろ\",\n        \"shinkai\": \"真海\",\n        \"shinma mei\": \"シンマメイ\",\n        \"shinme\": \"新芽\",\n        \"shinno kei\": \"神野けい\",\n        \"shinnosuke\": \"慎之介\",\n        \"shinobu\": \"シノブ\",\n        \"shinobu akira\": \"篠部秋良\",\n        \"ninbyo nin\": \"忍猫\",\n        \"shinobu shou\": \"哀側翔\",\n        \"shinocco\": \"しのっこ\",\n        \"shinogi kei\": \"しのぎけい\",\n        \"shinonome tarou\": \"東雲太郎\",\n        \"shinonome yuu\": \"東雲優\",\n        \"shinozaki mizu\": \"シノザキミズ\",\n        \"shinozuki kou\": \"しのづき巧\",\n        \"shinshin\": \"しんしん\",\n        \"shinsou comachi\": \"深窓小町\",\n        \"shinta\": \"シン太\",\n        \"shintani\": \"森谷\",\n        \"shio\": \"しお\",\n        \"shio604\": \"塩604\",\n        \"shiogochi\": \"シオゴチ\",\n        \"shioiri numa\": \"汐入ぬま\",\n        \"shioji miduho\": \"汐路ミヅホ\",\n        \"shioko shou\": \"塩胡しょう\",\n        \"shiomeshi\": \"塩飯\",\n        \"shiomi yuusuke\": \"士臣佑介\",\n        \"shion\": \"しおん\",\n        \"shiono etorouji\": \"塩野干支郎次\",\n        \"shiono maki\": \"塩野まき\",\n        \"shiory\": \"shiory\",\n        \"shiosaba\": \"塩鯖ッ\",\n        \"shioya maico\": \"塩屋舞子\",\n        \"shiragiku\": \"白菊\",\n        \"shiraha mato\": \"白羽まと\",\n        \"shirahata\": \"白旗\",\n        \"shiraichigo\": \"しらいちご\",\n        \"shiraishi mamim\": \"白石まみむ\",\n        \"shirakaba\": \"shirakaba\",\n        \"shirakaba masara\": \"白樺まさら\",\n        \"shirakawa yoka\": \"白河桜花\",\n        \"shirane shiratsuki\": \"白嶺白月\",\n        \"shirasagi ug\": \"しらさぎゆうじ\",\n        \"shirasaka rio\": \"白坂りお\",\n        \"shirasaki sana\": \"しらさきさな\",\n        \"shiraso\": \"しらそ\",\n        \"shirasu reiji\": \"白州礼二\",\n        \"shirasu youichi\": \"白須遙一\",\n        \"shiratama azuki\": \"白玉アズキ\",\n        \"shiratama dango\": \"白玉团子\",\n        \"shiratama1gou\": \"白玉一号\",\n        \"shiratsuki shiori\": \"白月しおり\",\n        \"shirihito\": \"尻人\",\n        \"shiritani\": \"尻谷\",\n        \"shirizou\": \"シリ蔵\",\n        \"shiro\": \"しろ\",\n        \"shiroa urang\": \"白亜卯蘭\",\n        \"shirogane\": \"城兼\",\n        \"shirogisu\": \"シロギス\",\n        \"shirogoma rai\": \"白駒らい\",\n        \"shiroi\": \"シロイ\",\n        \"shiroi gunpan\": \"白井薫範\",\n        \"shiroi hakuto\": \"しろいはくと\",\n        \"shiroi kuroneko\": \"白い黒猫\",\n        \"shiroi noria\": \"城井のりあ\",\n        \"shiroishi gatta\": \"白石ガッタ\",\n        \"shirokai mua\": \"白貝みゅあ\",\n        \"shirokarasu\": \"白からす\",\n        \"shirokitsune\": \"しろきつね\",\n        \"shiroku mako\": \"しろくまこ\",\n        \"shirokuro\": \"いれぐ白黒\",\n        \"shiromitsu daiya\": \"白蜜ダイヤ\",\n        \"shiromitsu suzaku\": \"しろみつスザク\",\n        \"shiromuu\": \"しろむー\",\n        \"shirona mikoto\": \"白奈美琴\",\n        \"shironeko haru\": \"白猫ハル\",\n        \"shironeko sanbou\": \"白猫参謀\",\n        \"shirono jia\": \"白野ジア\",\n        \"shirony\": \"しろにい\",\n        \"shiroobi\": \"しろおび\",\n        \"shiroshi\": \"しろし\",\n        \"shirosuzu\": \"しろすず\",\n        \"shirota\": \"代田\",\n        \"shirota kuronosuke\": \"白田クロノスケ\",\n        \"shirota kurota\": \"シロタクロタ\",\n        \"shirotsumekusa\": \"城爪草\",\n        \"shiroya\": \"白弥\",\n        \"shiru\": \"汁\",\n        \"shiruko jiru\": \"しるこ汁\",\n        \"shishido kurou\": \"宍戸くろう\",\n        \"shishigai\": \"シシガイ\",\n        \"shishiji\": \"ししじ\",\n        \"shishimaru\": \"獅子丸\",\n        \"shishimaru kenya\": \"ししまるけんや\",\n        \"shishiotome\": \"ししおとめ\",\n        \"shiso\": \"SHISO\",\n        \"shisui\": \"シスイ\",\n        \"shisui ao\": \"シスイ青\",\n        \"shisuka\": \"シスカ\",\n        \"shitaji mochimochi\": \"下地もちもち\",\n        \"shitori\": \"Shitori\",\n        \"shitou fumiaki\": \"志藤ふみあき\",\n        \"shitsuji kuma\": \"執事クマ\",\n        \"shiun\": \"紫雲陽\",\n        \"shiva\": \"shiva\",\n        \"shivharu\": \"シブハル\",\n        \"shiwo.\": \"しを。\",\n        \"shizaki masayuki\": \"士崎雅雪\",\n        \"shizuki shinra\": \"獅月しんら\",\n        \"shizuku\": \"しずく\",\n        \"shizuna miyuri\": \"しずなみゆり\",\n        \"shizuru\": \"シズル\",\n        \"sho-tan\": \"sho-tan\",\n        \"sho-yan\": \"しょーやん\",\n        \"shocco\": \"しょこ\",\n        \"shoco\": \"shoco\",\n        \"shocora\": \"ショコラ\",\n        \"shoda norihiro\": \"しょうだのりひろ\",\n        \"shogo\": \"shogo\",\n        \"shokora\": \"ショコラ\",\n        \"shotenin matori\": \"書店院まとり\",\n        \"shougeki no hirayama\": \"衝撃の平山\",\n        \"shouhei\": \"しょーへー\",\n        \"shouji bc\": \"庄司BC\",\n        \"shouji haruzo\": \"障子張蔵\",\n        \"shouki\": \"しょうき\",\n        \"shourin kiyoshi\": \"松林清\",\n        \"shoutarou\": \"ショウタロウ\",\n        \"show\": \"Show\",\n        \"showronpopy\": \"しょうろんぽぴー\",\n        \"shozo\": \"SHOZO\",\n        \"shri\": \"shri\",\n        \"shrine\": \"シュライン\",\n        \"shu cream\": \"シュクリム\",\n        \"shuffle\": \"shuffle\",\n        \"shuga\": \"しゅがぁ\",\n        \"shuma\": \"しゅま\",\n        \"shunjou shuusuke\": \"春城秋介\",\n        \"shunzou\": \"しゅんぞう\",\n        \"shuragyoku mami\": \"珠羅玉魔魅\",\n        \"shuu\": \"じゅう\",\n        \"shuui takahiro\": \"しゅうい☆たかひろ\",\n        \"shuurin\": \"シュウリン\",\n        \"shuuto\": \"シュウト\",\n        \"shuz\": \"shuz\",\n        \"sian\": \"しあん\",\n        \"sibamura\": \"しばむら\",\n        \"sibusawa eiki\": \"澁澤鋭樹\",\n        \"sid alice\": \"獅童ありす\",\n        \"sid daisuke\": \"士土大介\",\n        \"sieles\": \"しーるず\",\n        \"sigma rio\": \"しぐまりお\",\n        \"sigmarion\": \"シグマリオン\",\n        \"silinder\": \"silinder\",\n        \"silky\": \"しるきー\",\n        \"simama\": \"simama\",\n        \"sin\": \"sin\",\n        \"sin iti\": \"シン・イチ\",\n        \"sindo aoi\": \"新堂葵\",\n        \"sinensian\": \"Sinensian\",\n        \"sinohara sinome\": \"しのはらしのめ\",\n        \"sinori\": \"しのり\",\n        \"sinzan\": \"sinzan\",\n        \"sippufx\": \"しっぷfx\",\n        \"siratama nikukyuu\": \"しらたま肉球\",\n        \"sirazawa kousi\": \"白沢宏志\",\n        \"sirofugu\": \"白フグ\",\n        \"sirokoma\": \"白狛\",\n        \"sirokuma\": \"しろくま\",\n        \"sirou\": \"Sirou\",\n        \"siroyuki\": \"しろゆき\",\n        \"sirpent\": \"さあぺんと\",\n        \"sisakugata\": \"試咲型\",\n        \"sisei\": \"しせい\",\n        \"sisochair\": \"sisochair\",\n        \"sisui kyouko\": \"しすいきょうこ\",\n        \"siva.\": \"シヴァ。\",\n        \"sizma\": \"SIZMA\",\n        \"skemaid\": \"スケメイド\",\n        \"sknr\": \"SKNR\",\n        \"skpresents\": \"skpresents\",\n        \"sl8-all\": \"SL8-all\",\n        \"smile yuu\": \"スマイル幽\",\n        \"so-ma\": \"そーま\",\n        \"sob\": \"Sob\",\n        \"soda\": \"soda\",\n        \"soda lychee\": \"曹田らいち\",\n        \"softoof\": \"ソフトーフ\",\n        \"soga\": \"Soga\",\n        \"sohya\": \"そーや\",\n        \"soi\": \"Soi\",\n        \"soket\": \"そけっと\",\n        \"soko wa miwaku no lemon kyou\": \"そこは魅惑の檸檬郷\",\n        \"sol\": \"そる\",\n        \"sola\": \"sola\",\n        \"solar milk\": \"そらみる\",\n        \"solid lum\": \"SOLID LUM\",\n        \"solomon k\": \"そろもんK\",\n        \"solopipb\": \"ソロピップB\",\n        \"some sumiko\": \"染墨子\",\n        \"somejima\": \"ソメジマ\",\n        \"somemaru\": \"染マル\",\n        \"someya miho\": \"染谷みほ\",\n        \"son\": \"SoN\",\n        \"son palace\": \"ソンパレス\",\n        \"sonnano ari\": \"村菜野有梨\",\n        \"sono chiyoko\": \"園千代子\",\n        \"sono.\": \"その。\",\n        \"sonobe kazuaki\": \"園部一晶\",\n        \"sonohen no zako\": \"その辺のザコ\",\n        \"sonokawa sono\": \"園河ソノ\",\n        \"sonote\": \"sonote\",\n        \"sora\": \"ソラ\",\n        \"sora mame\": \"そら豆\",\n        \"zegga\": \"絶牙\",\n        \"sora tokumo\": \"空十雲\",\n        \"soraga-\": \"そらがー\",\n        \"sorami\": \"そらみ\",\n        \"sorami sio\": \"そらみしお\",\n        \"sorane miki\": \"空音美樹\",\n        \"sorani\": \"sorani\",\n        \"sorano kanata\": \"空乃カナタ\",\n        \"sorano natsumi\": \"ソラノ夏実\",\n        \"sorano umi\": \"空野海\",\n        \"soranona\": \"ソラノナ\",\n        \"sorano suzume\": \"天ノ雀\",\n        \"sorato\": \"そらと\",\n        \"sorawa reo\": \"そらわれお\",\n        \"sorono\": \"sorono\",\n        \"soso\": \"そそ\",\n        \"soso-zagri\": \"そそざぐり\",\n        \"sot\": \"sot\",\n        \"sou\": \"そう\",\n        \"sou akiko\": \"奏亜希子\",\n        \"soubi\": \"そーび\",\n        \"souchou\": \"曹长\",\n        \"souda gumi\": \"創田ぐみ\",\n        \"souen hiro\": \"蒼鉛ヒロ\",\n        \"souichi\": \"そういち\",\n        \"souko souji\": \"倉子倉次\",\n        \"soukoban\": \"倉庫番\",\n        \"soukurou\": \"双九朗\",\n        \"soul\": \"Soul\",\n        \"souma tatsuya\": \"そうま竜也\",\n        \"souma monooki2tsu tokage\": \"双馬・物置2つ・蜥蜴\",\n        \"souseiou\": \"創世王\",\n        \"sousen\": \"Sousen\",\n        \"soushin souma\": \"創神蒼魔\",\n        \"souto\": \"草人\",\n        \"soutome emu\": \"五月女えむ\",\n        \"sovayu\": \"そば湯\",\n        \"sowjun\": \"宗純\",\n        \"soyane\": \"そやね\",\n        \"soyoki\": \"そよき\",\n        \"sparrow\": \"雀\",\n        \"special g\": \"すぺしゃるじー\",\n        \"speed\": \"speed\",\n        \"squarewave29\": \"矩形波\",\n        \"ssz\": \"SSZ\",\n        \"st.germain-sal\": \"さんぢぇるまん・猿\",\n        \"st.retcher\": \"ST.レッチャー\",\n        \"stain\": \"STAIN\",\n        \"stealth changing line\": \"ステルス改行\",\n        \"stealth moko\": \"ステルスもこ\",\n        \"stem\": \"stem\",\n        \"stereotype\": \"stereotype\",\n        \"stiel\": \"すてぃえる\",\n        \"stigaya\": \"チガヤ\",\n        \"stir\": \"ステア\",\n        \"subachi\": \"すばち\",\n        \"subaru\": \"スバル\",\n        \"subuina 81r\": \"スブイナ81R\",\n        \"sudoo kaoru\": \"すどおかおる\",\n        \"sudou\": \"すどー\",\n        \"suehiro yoshiyuki\": \"末廣よしゆき\",\n        \"suemitsu dicca\": \"すえみつぢっか\",\n        \"sueyuu\": \"すえゆう\",\n        \"sugai\": \"スガイ\",\n        \"sugaleon\": \"スガレオン\",\n        \"sugamon\": \"すがもん\",\n        \"sugar picola\": \"しゅがーピコラ\",\n        \"sugata uri\": \"菅田うり\",\n        \"sugawara miyako\": \"菅原ミヤコ\",\n        \"sugayama\": \"菅山\",\n        \"sugii tsukasa\": \"すぎいつかさ\",\n        \"sugimura tomokazu\": \"杉村友和\",\n        \"sugita ranpaku\": \"過ぎた卵白\",\n        \"sugitomo kazuhiro\": \"杉友カヅヒロ\",\n        \"sugiyama genshou\": \"すぎやま現象\",\n        \"sugiyama yuzuki\": \"杉山ゆずき\",\n        \"sugoi hi\": \"すごい火\",\n        \"sugoi kinniku\": \"すごいきんにく\",\n        \"sugoku zako\": \"すごく雑魚\",\n        \"suhara shiina\": \"須原シイナ\",\n        \"suhoi\": \"すほい\",\n        \"sui\": \"sui\",\n        \"suien\": \"翠燕\",\n        \"suihei kiki\": \"水兵きき\",\n        \"suihi\": \"すいひ\",\n        \"suika\": \"酔花\",\n        \"suika koron\": \"酔花ころん\",\n        \"suika soda\": \"すいかソーダ\",\n        \"suiren\": \"睡蓮\",\n        \"suiren touru\": \"水簾藤流\",\n        \"suirenka\": \"翠錬華\",\n        \"suisen toilet\": \"水洗トイレ\",\n        \"suishin tenra\": \"水心天羅\",\n        \"suisui\": \"すいすい\",\n        \"sukage\": \"須影\",\n        \"suke6\": \"スケ6\",\n        \"sukedai\": \"すけだい\",\n        \"sukeichi\": \"すけいち\",\n        \"sukeya kurov\": \"助谷クロウ\",\n        \"suki na mono wa yakiniku\": \"好きなものは焼肉\",\n        \"sukima man\": \"すきま満\",\n        \"sukiyoshi shinji\": \"好善信士\",\n        \"sukumizu\": \"すくみづ\",\n        \"sukumo\": \"すくも\",\n        \"sukunahiko\": \"少名彦\",\n        \"sumeragi bron\": \"スメラギバロン\",\n        \"sumeragi kohaku\": \"すめらぎ琥珀\",\n        \"sumeragi kou\": \"すめらぎこう\",\n        \"sumeragi seisuke\": \"皇征介\",\n        \"sumeragi yuusuke\": \"皇裕介\",\n        \"sumeshi\": \"酢飯\",\n        \"sumihey\": \"すみ兵\",\n        \"sumio\": \"すみおー\",\n        \"sumisaki yuduna\": \"住咲ゆづな\",\n        \"sumisumi\": \"スミスミ\",\n        \"sumitomo\": \"すみとも\",\n        \"sumizaki\": \"炭崎\",\n        \"sumomo ex\": \"すももEX\",\n        \"sumomo pink\": \"すももぴんく\",\n        \"suna\": \"すな\",\n        \"sunahara izuko\": \"砂原何処\",\n        \"sunameri\": \"すなめり\",\n        \"sunao\": \"スナオ\",\n        \"sundomeya\": \"すんどめ屋\",\n        \"sunshow\": \"さんしょう\",\n        \"sunson\": \"SUNSON\",\n        \"supopo\": \"すぽぽ\",\n        \"suppy\": \"スッピー\",\n        \"supurai\": \"すぷらい\",\n        \"suradora\": \"すらドラ\",\n        \"suruga rinu\": \"駿河りぬ\",\n        \"susuanpan\": \"煤あんぱん\",\n        \"susugu\": \"ススグ\",\n        \"suto\": \"すと\",\n        \"suu\": \"すう\",\n        \"suv\": \"SUV\",\n        \"suzu\": \"すず\",\n        \"suzu kazumi\": \"寿杜缶住\",\n        \"suzuhara kouki\": \"鈴原考樹\",\n        \"suzuho hotaru\": \"鈴穗ほたる\",\n        \"suzui narumi\": \"鈴井ナルミ\",\n        \"suzukawa rino\": \"鈴川梨乃\",\n        \"suzuki address\": \"木あどれす\",\n        \"suzuki amaharu\": \"涼樹天晴\",\n        \"suzuki ganma\": \"鈴木がんま\",\n        \"suzuki kimuchi\": \"鈴木キムチ\",\n        \"suzuki metal\": \"鈴木メタル\",\n        \"suzuki mey\": \"すずきめい\",\n        \"suzuki nene\": \"鈴樹ねね\",\n        \"suzuki sakura\": \"鈴輝 桜\",\n        \"suzuki shina\": \"鈴木志奈\",\n        \"suzuki sinobu\": \"鈴木忍\",\n        \"suzuki takeo\": \"鈴木岳生\",\n        \"suzuki toto\": \"すずきとと\",\n        \"suzumaru\": \"すずまる\",\n        \"suzumiya\": \"涼御夜\",\n        \"suzumiya kazuki\": \"涼宮和貴\",\n        \"suzumiya kiriha\": \"鈴宮きりは\",\n        \"suzumori uina\": \"鈴森ういな\",\n        \"suzune rai\": \"鈴根らい\",\n        \"suzune yuuji\": \"鈴音ゆうじ\",\n        \"suzunokei\": \"スズノケイ\",\n        \"suzunomoku\": \"すずのもく\",\n        \"suzurame\": \"スズラメ\",\n        \"suzuri\": \"石見すずり\",\n        \"suzusato rinka\": \"鈴里厘花\",\n        \"suzusawa aki\": \"鈴沢秋\",\n        \"suzuse\": \"涼瀬\",\n        \"suzushiro nazuna\": \"蘿蔔なずな\",\n        \"suzushiro yutaka\": \"すずしろゆたか\",\n        \"suzushiro\": \"すずしろ\",\n        \"suzuta yume\": \"鈴田ゆめ\",\n        \"swa\": \"SWA\",\n        \"swakichi\": \"すわきち\",\n        \"syanal\": \"しゃーなる\",\n        \"syaneko\": \"しゃねこ\",\n        \"syaraku\": \"しゃらく\",\n        \"sync\": \"sync\",\n        \"syou\": \"syou\",\n        \"syougo kota\": \"省吾こた\",\n        \"syouji\": \"将司\",\n        \"syouryuupen\": \"しょーりゅーぺん\",\n        \"syowmaru\": \"翔丸\",\n        \"syoyu\": \"しょーゆ\",\n        \"syu\": \"川上修一\",\n        \"syunichi\": \"しゅにち\",\n        \"syunzo\": \"しゅんぞう\",\n        \"syutaro\": \"秋太郎\",\n        \"t\": \"T\",\n        \"t-factory\": \"T factory\",\n        \"t-hiko\": \"T彦\",\n        \"t-zok\": \"T-ZOK\",\n        \"t.cylinder\": \"円柱\",\n        \"ta\": \"ta\",\n        \"ta and a\": \"TA&A\",\n        \"ta152\": \"Ta152\",\n        \"taankee\": \"た～んけー\",\n        \"tabe koji\": \"たべ・こーじ\",\n        \"tabo\": \"tabo\",\n        \"taca\": \"taca\",\n        \"tachi tsubaki\": \"太刀椿\",\n        \"tachibana\": \"たちばな\",\n        \"tachibana chata\": \"橘チャタ\",\n        \"tachibana hisui\": \"橘ヒスイ\",\n        \"tachibana naoki\": \"断華ナオキ\",\n        \"tachibana riuta\": \"橘りうた\",\n        \"tachibana sakuya\": \"たちばなさくや\",\n        \"tachibana satsuki\": \"橘颯希\",\n        \"tachibanaei\": \"たちばなえい\",\n        \"koyama shigeru\": \"こやま滋\",\n        \"tachitsu teto\": \"舘津テト\",\n        \"tacky\": \"tacky\",\n        \"tada atsunori\": \"ただ☆あつのり\",\n        \"tadano happa\": \"ただのはっぱ\",\n        \"tadano kagekichi\": \"唯野影吉\",\n        \"tadano kushami\": \"唯乃くしゃみ\",\n        \"tadano myoushi\": \"忠之みょうし\",\n        \"tagame gengoroh\": \"田亀源五郎\",\n        \"tagro\": \"TAGRO\",\n        \"taguchi\": \"たグち\",\n        \"taguchi kirei\": \"田口綺麗\",\n        \"taguchi makoto\": \"田口まこと\",\n        \"tahara anco\": \"田原あんこ\",\n        \"tahibo\": \"誰罷慕\",\n        \"tai\": \"泰\",\n        \"tai0201\": \"帯\",\n        \"taiki\": \"大気\",\n        \"taiki ken\": \"大気KEN\",\n        \"taikuu jikan\": \"滞空時間\",\n        \"taira\": \"たいら\",\n        \"taira hajime\": \"たいらはじめ\",\n        \"taira kosaka\": \"平こさか\",\n        \"taira kouichirou\": \"平光一郎\",\n        \"tairame\": \"タイラメ\",\n        \"taireru\": \"たいれる\",\n        \"tairyo ryou\": \"大呂亮\",\n        \"taishi\": \"たいし\",\n        \"taishow tanaka\": \"たいしょう田中\",\n        \"taiyaki\": \"たいやき\",\n        \"taji\": \"たじ\",\n        \"tajima ryuushi\": \"タジマ粒子\",\n        \"tajima yasue\": \"田嶋安恵\",\n        \"tak\": \"T@k\",\n        \"tak-u\": \"TAK-U\",\n        \"taka pon\": \"タカ☆ぽん\",\n        \"taka sena\": \"嵩世菜\",\n        \"takabatake enaga\": \"高畠エナガ\",\n        \"takadoya akira\": \"たかどやあきら\",\n        \"takagari mitsuru\": \"鷹狩みつる\",\n        \"takagi kyou\": \"高木喬\",\n        \"takahagi kemono\": \"タカハギケモノ\",\n        \"takahan\": \"タカはん\",\n        \"takaha momo\": \"高羽もも\",\n        \"takahara sea-gull\": \"高原シーガル\",\n        \"takahashi\": \"多花ハシ\",\n        \"takahashi konnyaku\": \"高橋こんにゃく\",\n        \"takahashi mako\": \"タカハシマコ\",\n        \"takahashi note\": \"タカハシノヲト\",\n        \"takahashi record\": \"高橋レコード\",\n        \"takahashi yoshiki\": \"高橋良喜\",\n        \"takahashikun\": \"高橋君\",\n        \"takahiko\": \"たかひこ\",\n        \"takahirou ringu\": \"たかひろーりんぐ\",\n        \"takahisa kunihiro\": \"鷹久邦弘\",\n        \"takai biki\": \"高井美姫\",\n        \"takaishi fuu\": \"高石ふう\",\n        \"takako\": \"タカコ\",\n        \"takaku shouko\": \"高久尚子\",\n        \"takaku toshihiko\": \"高久としひこ\",\n        \"takaku tubby\": \"高句タビー\",\n        \"takamiya\": \"たかみや\",\n        \"takamiya sakura\": \"鷹宮沙玖羅\",\n        \"takamori3\": \"たかもり3\",\n        \"takamoto akisa\": \"上下右左\",\n        \"takamura tabisuke\": \"高村旅輔\",\n        \"takana yu-ki\": \"鷹那優輝\",\n        \"takanabe chitose\": \"高鍋千歳\",\n        \"takanaru\": \"たかなる\",\n        \"takanashi ayumu\": \"小鳥遊\",\n        \"takanashi china\": \"たかなし知那\",\n        \"takanashi haruto\": \"たかなしはると\",\n        \"takanashi kei\": \"小鳥遊啓\",\n        \"takanashi nozomi\": \"高梨のぞみ\",\n        \"takanashi shiro\": \"高梨志郎\",\n        \"takano hayato\": \"たかのはやと\",\n        \"takano iori\": \"高野庵\",\n        \"takano masayuki\": \"高野真之\",\n        \"takano uaka\": \"たかのうあか\",\n        \"takano yuu\": \"高野有\",\n        \"takanotume\": \"たかのつめ\",\n        \"takao hiroi\": \"高緒拾\",\n        \"takao ukyou\": \"高雄右京\",\n        \"takao yori\": \"高尾鷹浬\",\n        \"takaoka chikara\": \"高岡智空\",\n        \"takapi\": \"たかぴ\",\n        \"takara akihito\": \"宝あきひと\",\n        \"takaryoo\": \"たかりょー\",\n        \"takasaki akira\": \"高崎晶\",\n        \"takasaki karin\": \"高崎かりん\",\n        \"takasaki maco\": \"高崎まこ\",\n        \"takasaki ryo\": \"貴崎涼\",\n        \"takasaki takemaru\": \"高崎たけまる\",\n        \"takase hiroe\": \"貴瀬博恵\",\n        \"takase muh\": \"高瀬むぅ\",\n        \"takashina urara\": \"高階麗\",\n        \"takasumi miduki\": \"貴澄美月\",\n        \"takatora\": \"タカトラ\",\n        \"takatsuki ichi\": \"タカツキイチ\",\n        \"takatsuki nagy\": \"高槻ナギー\",\n        \"takatsuki shuuya\": \"高月柊也\",\n        \"takatuka ramune\": \"鷹柄ラムネ\",\n        \"takaya yoshiyuki\": \"鷹屋ヨシユキ\",\n        \"takayama chihiro\": \"高山千尋\",\n        \"takayamanon\": \"タカヤマノン\",\n        \"takayuki hiyori\": \"Evo.R.B\",\n        \"take takeshi\": \"武猛\",\n        \"take toshiaki\": \"武俊彰\",\n        \"takea saki\": \"たけあ崎\",\n        \"takeashiro\": \"たけあしろ\",\n        \"takeda\": \"たけだ\",\n        \"takeda sora\": \"武田空\",\n        \"takedake\": \"タケダケ\",\n        \"takei tsukasa\": \"タケイツカサ\",\n        \"takemaru\": \"タケマル\",\n        \"takemitz\": \"たけみつ\",\n        \"takemori shintarou\": \"竹森真太郎\",\n        \"takenaka hideo\": \"武中英雄\",\n        \"takenoko\": \"takenoko\",\n        \"takenoko maru\": \"たけのこ丸\",\n        \"takenoko seijin\": \"たけのこ星人\",\n        \"takenouchi suama\": \"竹之内すあま\",\n        \"takepon\": \"たけぽん\",\n        \"takeponian\": \"たけぽにあん\",\n        \"takese nono\": \"高瀬乃々\",\n        \"takeshima eku\": \"竹嶋えく\",\n        \"takeshisu\": \"タケシス\",\n        \"takeshita kenjirou\": \"竹下けんじろう\",\n        \"taketora suzume\": \"竹虎スズメ\",\n        \"takeu\": \"たけう\",\n        \"takeuchi reona\": \"竹内玲于奈\",\n        \"takeuma\": \"たけうま\",\n        \"takewakamaru\": \"武若丸\",\n        \"takewan\": \"たけわん\",\n        \"takeyama kaki\": \"たけやまかき\",\n        \"takeyama shimeji\": \"茸山しめじ\",\n        \"taki re-ki\": \"滝れーき\",\n        \"takimoto satoru\": \"滝本悟\",\n        \"takineko\": \"タキ猫\",\n        \"takizawa hajime\": \"瀧澤春\",\n        \"takkii\": \"たっきぃ\",\n        \"takku\": \"たっく\",\n        \"tako\": \"たこ\",\n        \"tako kuboh\": \"蛸公方\",\n        \"takorice\": \"たこらいす\",\n        \"takotyu\": \"たこちゅう\",\n        \"takoya kiki\": \"多胡屋きき\",\n        \"takoyaki\": \"たこ焼き\",\n        \"takto\": \"TAKTO\",\n        \"taku\": \"タク\",\n        \"taku hiraku\": \"拓ヒラク\",\n        \"takuji yuusaku\": \"卓二雄作\",\n        \"takuma\": \"琢磨\",\n        \"takuma tomomasa\": \"たくま朋正\",\n        \"takumi na muchi\": \"たくみな無知\",\n        \"takumi rohan\": \"たくみ露伴\",\n        \"takura mahiro\": \"田倉まひろ\",\n        \"takuteks\": \"TAKUTEKS\",\n        \"tama\": \"tama\",\n        \"tama ii\": \"たまつー\",\n        \"tama kifuyu\": \"たまきふゆ\",\n        \"tamachi\": \"たまち\",\n        \"tamachie\": \"たまちえ\",\n        \"tamaco\": \"tamaco\",\n        \"tamagawa chiruru\": \"多摩川ちるる\",\n        \"tamagawa yakkyou\": \"多摩川やっきょう\",\n        \"tamagawa yukimaru\": \"多摩川雪丸\",\n        \"tamago\": \"煌月忍\",\n        \"tamago meshi\": \"たまごめし\",\n        \"tamahiro\": \"たまひろ\",\n        \"tamahiyo\": \"たまひよ\",\n        \"tamaki kaoru\": \"環かおる\",\n        \"tamaki nozomu\": \"環望\",\n        \"tamaki yayoi\": \"珠樹やよい\",\n        \"tamaki yui\": \"タマキ結\",\n        \"tamamo ozen\": \"たまも御前\",\n        \"tamanegi\": \"たまねぎ\",\n        \"tamaoki benkyo\": \"玉置勉強\",\n        \"tamaran niisan\": \"たまらん兄さん\",\n        \"tamaru\": \"たまる\",\n        \"tamaru makoto\": \"田丸まこと\",\n        \"tamarun\": \"タマラン\",\n        \"tamatsuyada\": \"たまつやだ\",\n        \"tame\": \"ため\",\n        \"tamekou\": \"ためこう\",\n        \"tami-k\": \"TAMI-K\",\n        \"tamifull\": \"たみふる\",\n        \"tamiko\": \"たみこ\",\n        \"tamineko\": \"タミネコ\",\n        \"tamo\": \"たも\",\n        \"tamochi\": \"田持\",\n        \"tamon ketsuyuki\": \"多門結之\",\n        \"tamori tadaji\": \"たもりただぢ\",\n        \"tamu\": \"たむ\",\n        \"tamuhi\": \"タムヒ\",\n        \"tamura searchlight\": \"田村サーチライト\",\n        \"tamura shimeji\": \"田村シメジ\",\n        \"tana\": \"TANA\",\n        \"tanabe\": \"TANABE\",\n        \"tanaka keigo\": \"たなかけいご\",\n        \"tanaka kumubou\": \"田中伍某\",\n        \"tanaka penta\": \"田中ペン太\",\n        \"tanaka rin\": \"田中琳\",\n        \"tanaka sei\": \"田中セイ\",\n        \"tanaka tarou\": \"田中太郎\",\n        \"tanakamori yokota\": \"田中森よこた\",\n        \"tanakana\": \"たなかな\",\n        \"tanba kuromame\": \"丹波KURO豆\",\n        \"tanemura arina\": \"種村有菜\",\n        \"tanenashi kuribo\": \"たねなしくりぼ\",\n        \"tanenashi miya\": \"種梨みや\",\n        \"tange rin\": \"丹下凛\",\n        \"tango-tango\": \"tango-tango\",\n        \"taniguchi daisuke\": \"谷口大介\",\n        \"tanihara natsuki\": \"たにはらなつき\",\n        \"tanimura marika\": \"谷村まりか\",\n        \"tanizakura shidare\": \"谷桜しだれ\",\n        \"tanken harahara\": \"探検はらはら\",\n        \"tankslayer equals san\": \"タンクスレイヤー=サン\",\n        \"tano\": \"たの\",\n        \"tanoma suzume\": \"たのますずめ\",\n        \"tanpopo shunmaru\": \"たんぽぽ隼丸\",\n        \"tansui shirasu\": \"淡水シラス\",\n        \"tanufude\": \"たぬふで\",\n        \"tanuki\": \"たぬき\",\n        \"tanuma yuuichirou\": \"田沼雄一郎\",\n        \"tanunosuke\": \"たぬ之助\",\n        \"tanutan\": \"たぬたん\",\n        \"tanzi\": \"丹治\",\n        \"tao\": \"たお\",\n        \"tapisuke\": \"たぴすけ\",\n        \"tappa\": \"たっぱ\",\n        \"tar\": \"TAR\",\n        \"tarakan\": \"たらかん\",\n        \"tarazoo\": \"たらぞお\",\n        \"tare\": \"たれ\",\n        \"tare mayuzou\": \"タレ眉ぞう\",\n        \"tarekatsu\": \"TARE活\",\n        \"tarihou\": \"タリホウ\",\n        \"tarinu\": \"足りぬ\",\n        \"tariyoshi\": \"たりよし\",\n        \"taro\": \"taro\",\n        \"taro-san\": \"たろさん\",\n        \"taropun\": \"たろプン\",\n        \"taroro\": \"たろろ\",\n        \"tarte\": \"タルト\",\n        \"tarutarugungun\": \"たるたるぐんぐん\",\n        \"taryl.\": \"たりる｡\",\n        \"tasa urara\": \"たさうらら\",\n        \"tasuku\": \"助\",\n        \"tasuro kuzuha\": \"たすろくずは\",\n        \"tataru\": \"タタル\",\n        \"tatejima.\": \"縦縞。\",\n        \"tateno tomoki\": \"タテノトモキ\",\n        \"sennohito.\": \"線の人。\",\n        \"tatsuhiko\": \"たつひこ\",\n        \"tatsumiya motokazu\": \"たつみやもとかず\",\n        \"tatsumu kyou\": \"龍武京\",\n        \"tatsuneko\": \"たつねこ\",\n        \"tatsunosuke yukiya\": \"逹之介ユキヤ\",\n        \"tatsuoka miyoshi\": \"龍岡巳葦\",\n        \"tatsuya\": \"tatsuya\",\n        \"tatunokosso\": \"タツノコッソ\",\n        \"tau\": \"tau\",\n        \"tavor\": \"Tavor\",\n        \"taya takashi\": \"たやたかし\",\n        \"tayuta yuu\": \"たゆた☆ゆう\",\n        \"teaindian\": \"紅茶インディアン\",\n        \"tear\": \"Tear\",\n        \"tec\": \"TEC\",\n        \"tecchan\": \"てっちゃん\",\n        \"techizou\": \"てちぞう\",\n        \"techno\": \"てくの\",\n        \"teckei\": \"TEcKei\",\n        \"tedain\": \"てだいん\",\n        \"tegdor\": \"てぐどら\",\n        \"tegura yuuki\": \"テグラユウキ\",\n        \"tehen\": \"てへん\",\n        \"tei-oh-k-takamuro\": \"TEI-OH-K-TAKAMURO\",\n        \"teil\": \"teil\",\n        \"teitaraku\": \"ていた楽\",\n        \"teka\": \"てか\",\n        \"tekkyuu\": \"鉄球\",\n        \"teko\": \"てこ\",\n        \"tekuteku\": \"てくてく\",\n        \"teltelhousi\": \"てるてる法師\",\n        \"ten\": \"貂\",\n        \"ten ga\": \"天駕\",\n        \"ten no hoshi\": \"天ノ星\",\n        \"tenamaru\": \"テナマル\",\n        \"tenchuumaru\": \"天誅丸\",\n        \"tenchuunan\": \"天誅男\",\n        \"tendou itsuki\": \"天堂樹\",\n        \"tendou kuon\": \"天童久遠\",\n        \"tendou makura\": \"天童まくら\",\n        \"tengudake\": \"テングダケ\",\n        \"tenji\": \"てんじ\",\n        \"tenjiku rounin\": \"天竺浪人\",\n        \"tenju\": \"天咒\",\n        \"tenkawa ai\": \"天河藍\",\n        \"tenken\": \"てんけん\",\n        \"tenma\": \"天馬\",\n        \"tenmaso\": \"てんまそ\",\n        \"tenori\": \"てのり\",\n        \"tenrai\": \"天籟\",\n        \"tenshou akira\": \"天祥輝\",\n        \"tenteko\": \"てんてこ\",\n        \"tentenkingyo\": \"てんてんきんぎょ\",\n        \"tenyati\": \"TenYati\",\n        \"tenyuu\": \"てんゆ～\",\n        \"tenzaki kanna\": \"天崎かんな\",\n        \"tera\": \"TERA\",\n        \"terada\": \"寺田\",\n        \"terada tera\": \"寺田てら\",\n        \"terai daikichi\": \"寺イ大吉\",\n        \"teramoto kaoru\": \"寺本薫\",\n        \"terashi\": \"てらし\",\n        \"terasu mc\": \"テラスmc\",\n        \"terazip\": \"テラzip\",\n        \"teri terio\": \"てりてりお\",\n        \"terry hijiri\": \"照井聖\",\n        \"teru\": \"てる\",\n        \"terufuu\": \"てるふう\",\n        \"terujirou\": \"晃次郎\",\n        \"teruwi\": \"てるうぃ\",\n        \"teruyama momiji\": \"照山紅葉\",\n        \"tes\": \"tes\",\n        \"teshio\": \"てしお\",\n        \"tete\": \"tete\",\n        \"tetoga\": \"てとが\",\n        \"tetora\": \"てとら\",\n        \"tetramax\": \"てとらまっくす\",\n        \"tetsu kazuna\": \"鉄カズナ\",\n        \"tetsubirei\": \"てつびれい\",\n        \"tetsukui\": \"鐡喰\",\n        \"tetsumi\": \"哲美\",\n        \"tetsunohiji\": \"てつのひじ\",\n        \"tetsuya\": \"テツヤ\",\n        \"tetubuta\": \"鉄豚\",\n        \"tetujin momoko\": \"鉄人桃子\",\n        \"tetumiya\": \"鉄宮\",\n        \"thanat\": \"たなと\",\n        \"the fall guy\": \"フォール・ガイ\",\n        \"the orz\": \"the_orz\",\n        \"thor\": \"THOR\",\n        \"tickzou\": \"てぃくぞー\",\n        \"tid\": \"TID\",\n        \"tief\": \"Tief\",\n        \"tiger\": \"タイガー\",\n        \"tiger shark\": \"大牙射悪\",\n        \"tigusa suzume\": \"千草雀\",\n        \"tilm\": \"ティルム\",\n        \"tim\": \"TIM\",\n        \"tima\": \"ちぃま\",\n        \"timato\": \"ちまと\",\n        \"timuni\": \"チムニ\",\n        \"ting\": \"Ting\",\n        \"tipo\": \"ティーポ\",\n        \"tira\": \"Tira\",\n        \"tirotata\": \"ちろたた\",\n        \"titiduki\": \"チチヅキ\",\n        \"tiv\": \"Tiv\",\n        \"tj-type1\": \"TJ-type1\",\n        \"tk\": \"TK\",\n        \"tkdash\": \"TKDASH\",\n        \"tks\": \"TKS\",\n        \"tnsk\": \"TNSK\",\n        \"tobari\": \"とばり\",\n        \"tobimura\": \"鳶村\",\n        \"tobunda jet\": \"飛ぶんだジェット\",\n        \"toby\": \"だぶるあーる\",\n        \"tocky\": \"Tocky\",\n        \"toda kaduki\": \"とだかづき\",\n        \"todd oyamada\": \"トッド小山田\",\n        \"todoroki shusei\": \"等々力秋声\",\n        \"tofu\": \"とうふ\",\n        \"togame\": \"とがめ\",\n        \"togashi\": \"トガシ\",\n        \"toge toge\": \"棘棘\",\n        \"togo\": \"とーご\",\n        \"toguchi masaya\": \"トグチマサヤ\",\n        \"tohani\": \"とーはに\",\n        \"tohno tatsuki\": \"遠野タツキ\",\n        \"toi\": \"Toi\",\n        \"toi amatsu\": \"とい天津\",\n        \"toichi\": \"トイチ\",\n        \"toilet\": \"といれ\",\n        \"toilet komoru\": \"トイレ籠\",\n        \"toine hoko\": \"樋音歩琥\",\n        \"toitoi\": \"といとい\",\n        \"toka\": \"toka\",\n        \"tokachi genjuurou\": \"十勝源十郎\",\n        \"tokei\": \"時計\",\n        \"tokei usagi\": \"とけーうさぎ\",\n        \"tokeiya-san\": \"時計屋さん\",\n        \"toki\": \"トキ\",\n        \"tokiai haya\": \"伽藍快\",\n        \"tokihama jiro\": \"時浜次郎\",\n        \"tokimachi eisei\": \"トキマチ★エイセイ\",\n        \"tokimal yoshihisa\": \"時丸佳久\",\n        \"tokino\": \"時乃\",\n        \"tokinobutt\": \"ときのぶっと\",\n        \"tokinon\": \"ときのん\",\n        \"tokio\": \"ときお\",\n        \"tokisaka mugi\": \"時坂夢戲\",\n        \"tokisana\": \"トキサナ\",\n        \"tokita monta\": \"刻田門大\",\n        \"tokitoki\": \"ときとき\",\n        \"tokiwa kanenari\": \"常磐兼成\",\n        \"tokiwa wako\": \"ときわようこ\",\n        \"tokiwa youko\": \"常葉ヨウコ\",\n        \"tokiwa yutaka\": \"ときわゆたか\",\n        \"tokizumi emishi\": \"時積恵美之\",\n        \"tokkou kujira\": \"特攻くじら\",\n        \"tokonaru\": \"トコナル\",\n        \"tokonone\": \"床音\",\n        \"tokorot\": \"tokorot\",\n        \"tokorotenf\": \"ところてんf\",\n        \"tokoyo\": \"常世\",\n        \"tokoyo akashi\": \"常夜あかし\",\n        \"tokoyon\": \"tokoyon\",\n        \"toku\": \"特\",\n        \"toku soncho\": \"とく村長\",\n        \"tokuda shinnosuke\": \"徳田しんのすけ\",\n        \"tokugawa miyo\": \"徳川みよ\",\n        \"tokui supermarket\": \"徳井スーパーマーケット\",\n        \"tokumei hero\": \"匿名ヒーロー\",\n        \"tokunaga\": \"とくなが\",\n        \"tokunomura\": \"とおくのむら\",\n        \"tokurito\": \"とくりと\",\n        \"tokusa lico\": \"砥草りこ\",\n        \"tokutan\": \"とくたん\",\n        \"tokyo\": \"tokyo\",\n        \"tokyokyoto\": \"東京京都\",\n        \"tololi\": \"とろり\",\n        \"tom\": \"トム\",\n        \"tom keith\": \"とむ・きーす\",\n        \"toma\": \"TOMA\",\n        \"tomakomai\": \"とまこまい\",\n        \"tomatomato\": \"トマトマト\",\n        \"tome\": \"トメ\",\n        \"tomekichi\": \"とめきち\",\n        \"tometo\": \"とめと\",\n        \"tomihero\": \"トミヒロ\",\n        \"tomisawa chinatsu\": \"とみさわ千夏\",\n        \"tomite\": \"とみて\",\n        \"tomiyama akiji\": \"兎耳山アキジ\",\n        \"tomiyoshi\": \"トミヨシ\",\n        \"tomneko\": \"吐夢猫\",\n        \"tomo takino\": \"智タキノ\",\n        \"tomoe\": \"巴萌\",\n        \"tomoe kiko\": \"トモエキコ\",\n        \"tomoe tenbu\": \"巴天舞\",\n        \"tomohara michiya\": \"友原道哉\",\n        \"tomoharu\": \"トモハル\",\n        \"tomohiro\": \"ともひろ\",\n        \"tomojo\": \"ともじょー\",\n        \"tomoki shikata\": \"志方朋季\",\n        \"tomomaya\": \"tomomaya\",\n        \"tomona\": \"tomona\",\n        \"tomosuke\": \"ともすけ\",\n        \"tomotsuka haruomi\": \"ともつか治臣\",\n        \"tomoya\": \"ともや\",\n        \"tomoya kankurou\": \"友屋勘九郎\",\n        \"tomto\": \"Tomto\",\n        \"tomu\": \"tomu\",\n        \"tonbo\": \"トンボ\",\n        \"tonchan\": \"とんちゃん\",\n        \"tonikaku\": \"兎に角\",\n        \"tonnosuke\": \"とんのすけ\",\n        \"tonotani\": \"とのたに\",\n        \"tonpu\": \"とんぷ\",\n        \"tonsuke\": \"とんすけ\",\n        \"tonten\": \"トンテン\",\n        \"tooco\": \"Tooco\",\n        \"tooda shunkei\": \"遠田春景\",\n        \"tooka\": \"とーか\",\n        \"toono yayoi\": \"十野弥生\",\n        \"tooya\": \"十矢\",\n        \"tooya daisuke\": \"遠矢大介\",\n        \"topo\": \"とぽ\",\n        \"tora\": \"虎\",\n        \"torai ryuu\": \"虎井 龍\",\n        \"toraisi666\": \"とらいし666\",\n        \"torajimaneko\": \"とらじまねこ\",\n        \"torakichi\": \"とらきち\",\n        \"toran\": \"とらん\",\n        \"toraneko\": \"トラ猫\",\n        \"kyukyutto\": \"キュキュット\",\n        \"tori\": \"トリ◯\",\n        \"tori hikari\": \"とりひかり\",\n        \"tori mogura\": \"鳥土竜\",\n        \"tori nice par\": \"とりナイスパー\",\n        \"toria\": \"とりあ\",\n        \"toribami sasami\": \"鳥喰ささみ\",\n        \"torigoshi yayoi\": \"鳥越やよい\",\n        \"torikawa\": \"鳥皮\",\n        \"toriki cooya\": \"とりきくーや\",\n        \"torimaki\": \"鳥巻\",\n        \"torimaru\": \"トリ○\",\n        \"torino munenik\": \"トリノ宗肉\",\n        \"torisan\": \"鳥三\",\n        \"torisana\": \"トリサナ\",\n        \"torishimo\": \"とりしも\",\n        \"toritora\": \"酉寅\",\n        \"toriumi kapiko\": \"鳥海かぴこ\",\n        \"toroi\": \"toroi\",\n        \"tororo\": \"とろろ\",\n        \"torque\": \"トルク\",\n        \"toryuu\": \"十竜\",\n        \"tos-tos-f-ski\": \"とすとすFスキー\",\n        \"tosa\": \"トサ\",\n        \"tosh\": \"tosh\",\n        \"toshihiro\": \"トシヒロ\",\n        \"toshiki yuuji\": \"としきゆうぢ\",\n        \"toshio\": \"としお\",\n        \"toshizo\": \"トシぞー\",\n        \"toto nemigi\": \"ととねみぎ\",\n        \"totofumi\": \"ととふみ\",\n        \"totoki kikaku\": \"十時企画\",\n        \"totokichi\": \"トトキチ\",\n        \"totto\": \"totto\",\n        \"tottori sakyuu\": \"鳥取砂丘\",\n        \"toudori\": \"トウドリ\",\n        \"toudou fumika\": \"藤堂冬美香\",\n        \"toufu majin\": \"とうふ魔神\",\n        \"touga kotobuki\": \"塔河寿\",\n        \"touge hiro\": \"峠比呂\",\n        \"toujou\": \"東條\",\n        \"touko\": \"東子\",\n        \"touma nao\": \"藤馬奈緒\",\n        \"tourou\": \"灯籠\",\n        \"touta\": \"淘汰\",\n        \"toutaku\": \"董卓\",\n        \"touya\": \"と～や\",\n        \"touya tsuduru\": \"塔夜綴\",\n        \"tow\": \"tow\",\n        \"towa\": \"とわ\",\n        \"towai raito\": \"問合来人\",\n        \"towamin\": \"とわみん\",\n        \"tower\": \"ToWeR\",\n        \"toya hayato\": \"トヤハヤト\",\n        \"toyama jigoku\": \"外山じごく\",\n        \"toyama nanao\": \"とやま七生\",\n        \"toyo\": \"とよ\",\n        \"toyoman\": \"TOYOMAN\",\n        \"toyomaru\": \"十夜丸\",\n        \"toyoshima yuusaku\": \"豊島ゆーさく\",\n        \"tozakura nagomi\": \"都桜和\",\n        \"transition\": \"transition\",\n        \"trickster\": \"TrickSter\",\n        \"trident\": \"トライデント\",\n        \"trista\": \"トリスタ\",\n        \"trump\": \"Trump\",\n        \"try\": \"TRY\",\n        \"tsubaki hara\": \"ツバキハラ\",\n        \"tsubaki metasu\": \"椿めたす\",\n        \"tsubakiya meguru\": \"椿屋めぐる\",\n        \"tsubakiyama parry\": \"椿山パリィ\",\n        \"tsubasa\": \"ツバサ\",\n        \"tsucaco\": \"tsucaco\",\n        \"tsuchiya tarou\": \"土屋太郎\",\n        \"tsuda akira\": \"津田 晶\",\n        \"tsugaru\": \"Tsugaru\",\n        \"tsugu\": \"つぐ\",\n        \"tsugumi\": \"tsugumi\",\n        \"tsugumi nagisa\": \"ツグミ渚\",\n        \"tsuina\": \"tsuina\",\n        \"tsuino sumika\": \"終野すみか\",\n        \"tsuizi\": \"ついじ\",\n        \"tsuji\": \"ツジ\",\n        \"tsuji takeshi\": \"辻武司\",\n        \"tsujigiri\": \"つじぎり\",\n        \"tsujimaru\": \"辻丸\",\n        \"tsukadama\": \"つかだま\",\n        \"tsukasa jun\": \"司淳\",\n        \"tsukasa ningyou\": \"司人形\",\n        \"tsuki neko\": \"月猫\",\n        \"tsuki yoshimi\": \"月嘉\",\n        \"tsukigami\": \"月咬\",\n        \"tsukigami chronica\": \"月上クロニカ\",\n        \"tsukiji\": \"月路\",\n        \"tsukikage hisashi\": \"月影久\",\n        \"tsukikage manmaru\": \"月影満丸\",\n        \"tsukimi kirara\": \"月見キララ\",\n        \"tsukinami kousuke\": \"月並甲介\",\n        \"tsukino\": \"月野\",\n        \"tsukino wakuma\": \"月野輪熊\",\n        \"tsukino yuuya\": \"月野悠也\",\n        \"tsukinose maro\": \"月之瀬まろ\",\n        \"tsukishima kai\": \"月島改\",\n        \"tsukishima mist\": \"月島ミスト\",\n        \"tsukishima takafuyu\": \"月島隆冬\",\n        \"tsukuba kensuu\": \"つくばケンスウ\",\n        \"tsukumizu yuu\": \"月水憂\",\n        \"tsukumo\": \"九十九\",\n        \"tsukumo gou\": \"19号\",\n        \"tsukumo kazuki\": \"ツクモカヅキ\",\n        \"tsukumo matoro\": \"月雲まとろ\",\n        \"tsukushino makoto\": \"つくしの真琴\",\n        \"tsukuyomi sazin\": \"月読さじん\",\n        \"tsumetoro\": \"つめとろ\",\n        \"tsumitani daisuke\": \"罪谷死輔\",\n        \"tsumugi\": \"つむぎ\",\n        \"tsumumi\": \"つむみ\",\n        \"tsuna\": \"ツナ\",\n        \"tsuna onigiri\": \"ツナおにぎり\",\n        \"tsunami\": \"ツナミ\",\n        \"tsunamushi\": \"つなむし\",\n        \"tsunapiko\": \"TSUNAPIKO\",\n        \"tsunbeji\": \"つんべじ\",\n        \"tsune yoshi\": \"常好し\",\n        \"tsuneyoshi\": \"つねよし\",\n        \"tsuno\": \"つの\",\n        \"tsunoame kazuya\": \"角雨和八\",\n        \"tsunoda mag\": \"つのだ★まぐ\",\n        \"tsunoda saburoo\": \"つのだサブロー\",\n        \"tsunomiya katsuki\": \"津宮伽月\",\n        \"tsunsuki\": \"ツンスキ\",\n        \"tsurimiya gen\": \"釣宮弦\",\n        \"tsuru\": \"つる\",\n        \"tsurugi\": \"Tsurugi\",\n        \"tsurugi ai\": \"剑城蓝\",\n        \"tsurugi hikaru\": \"つるぎ輝\",\n        \"tsurugi wakarou\": \"鶴亀ワカロー\",\n        \"tsurugi yasuyuki\": \"剣康之\",\n        \"tsurukame\": \"ツルKAME\",\n        \"tsuruma megumi\": \"つるまめぐみ\",\n        \"tsurumaki kazuya\": \"鶴巻和哉\",\n        \"tsusauto\": \"津差宇土\",\n        \"tsutsumi\": \"包\",\n        \"tsutsumi akari\": \"つつみあかり\",\n        \"tsutsumori\": \"筒森\",\n        \"tsuwabuki raishi\": \"石蕗らいし\",\n        \"tsuyoshi\": \"津義\",\n        \"tsuzuki kazuhiko\": \"都築和彦\",\n        \"tsuzuki masumi\": \"つづきますみ\",\n        \"tsuzura\": \"つづら\",\n        \"tsuzurao kaya\": \"九尾かや\",\n        \"tsuzuri\": \"水瀬修\",\n        \"tt\": \"tt\",\n        \"ttl\": \"ttl\",\n        \"ttomm\": \"TTOMM\",\n        \"ttuunn\": \"つん\",\n        \"tukamori syuuji\": \"ツカモリシュウジ\",\n        \"tukazi\": \"つかぢ\",\n        \"tukii yasiro\": \"月井やしろ\",\n        \"tukikage nemu\": \"月影ネム\",\n        \"tukise mizuna\": \"月瀬水無\",\n        \"tukisiro saya\": \"月白沙耶\",\n        \"tukito\": \"月兎\",\n        \"tukumo keiichi\": \"九十九K1\",\n        \"tukusi hirokazu\": \"土筆ヒロカズ\",\n        \"tulip\": \"ちゅーりっふ。\",\n        \"tuna milk\": \"つなみるく\",\n        \"tuyo\": \"tuyo\",\n        \"twilight\": \"TWILIGHT\",\n        \"tyanaka\": \"てぃゃなか\",\n        \"tyatubo\": \"ちゃつぼ\",\n        \"tyauke\": \"茶請\",\n        \"tyke\": \"たいく\",\n        \"tyongera.\": \"ちょんげら。\",\n        \"typehatena\": \"たいぷはてな\",\n        \"tyrant sugawara\": \"タイラント菅原\",\n        \"tyranu\": \"ティラヌー\",\n        \"tyuda\": \"ちゅだ\",\n        \"tyuuten\": \"蟲天\",\n        \"u\": \"う\",\n        \"u nitro\": \"うにとろ\",\n        \"u-1\": \"U-1\",\n        \"u-hi\": \"U-hi\",\n        \"u-k\": \"U-K\",\n        \"u-ko\": \"U子\",\n        \"u-ring\": \"うーりん\",\n        \"u-ta\": \"u-ta\",\n        \"u35\": \"U35\",\n        \"ubanis\": \"うばにす\",\n        \"uchi-uchi keyaki\": \"内々欅\",\n        \"uchida shou\": \"内田翔\",\n        \"uchiga\": \"ウチガ\",\n        \"uchikura\": \"内座\",\n        \"uchiyan\": \"ウチやん\",\n        \"uchoten\": \"有頂天\",\n        \"uchuu ika\": \"宇宙烏賊\",\n        \"udon\": \"うどん\",\n        \"uduki sonowo\": \"空月苑生\",\n        \"ueda rieko\": \"上田リエコ\",\n        \"ueda ryou\": \"植田亮\",\n        \"uehara ari\": \"上原あり\",\n        \"uehasu\": \"上蓮\",\n        \"uehiro\": \"うえひろ\",\n        \"uemukai dai\": \"上向だい\",\n        \"ueno ebisen\": \"上野えびせん\",\n        \"ueno juubai\": \"上野十倍\",\n        \"ueno meguru\": \"植野メグル\",\n        \"ueno naoya\": \"ウエノ直哉\",\n        \"ueshima haruki\": \"上嶋ハルキ\",\n        \"uesugi shingo\": \"上杉信五\",\n        \"uetake\": \"植竹\",\n        \"ueto seri\": \"上戸セリ\",\n        \"ugatsu matsuki\": \"うがつ末期\",\n        \"ugeppa\": \"うげっぱ\",\n        \"ugetsu\": \"ウゲツ\",\n        \"ugo\": \"ゆうご\",\n        \"ugou gou\": \"うごうゴウ\",\n        \"uguisu kagura\": \"莺神乐\",\n        \"uhhii\": \"うっひー\",\n        \"uin\": \"uin\",\n        \"uirotuzi yumihiko\": \"外郎辻ゆみ彦\",\n        \"uirou\": \"うぃろう\",\n        \"ukatu jyuzou\": \"迂闊十臓\",\n        \"ukikotatsu\": \"うきこたつ\",\n        \"ukita tougo\": \"宇岐多冬梧\",\n        \"uku\": \"uku\",\n        \"ukyo rst\": \"ukyo_rst\",\n        \"ukyochu\": \"うきょちゅう\",\n        \"ulrich\": \"うるりひ\",\n        \"ultone\": \"うるとん\",\n        \"ultrabuster\": \"ウルトラバスター\",\n        \"uma\": \"UMA\",\n        \"umadura grenouille\": \"馬面グルヌイユ\",\n        \"umanosuke\": \"馬の助\",\n        \"umayadono ohji\": \"厩戸王子\",\n        \"ume\": \"うめ\",\n        \"umehara suzuko\": \"梅原スズコ\",\n        \"umekichi\": \"ウメ吉\",\n        \"umekko\": \"うめっこ\",\n        \"umemachi syouji\": \"梅町将二\",\n        \"umeran\": \"うめらん\",\n        \"umetarou\": \"梅太郎\",\n        \"umezo\": \"うめ蔵\",\n        \"umezu yoko\": \"梅津葉子\",\n        \"umi kurage\": \"海海月\",\n        \"umi tamako\": \"うみたまこ\",\n        \"umiazuma kakeru\": \"うみあずまかける\",\n        \"umibouzu\": \"うみぼうず\",\n        \"umichika\": \"うみちか\",\n        \"umihoshi minori\": \"海星みのり\",\n        \"umihotaru harumare\": \"海蛍はるまれ\",\n        \"umineko akira\": \"海猫明\",\n        \"umino haine\": \"海野灰猫\",\n        \"umino sachi\": \"海野幸\",\n        \"umino yayoi\": \"海野やよい\",\n        \"uminya\": \"うみにゃ\",\n        \"umipro\": \"umiプロ\",\n        \"umiyama misaki\": \"宇美山ミサキ\",\n        \"umiyume\": \"紅壱\",\n        \"umu rahi\": \"有無らひ\",\n        \"umuga yasusi\": \"U無我仁\",\n        \"un-moto\": \"云元\",\n        \"una\": \"うな\",\n        \"unacchi\": \"うなっち\",\n        \"unadare\": \"うなだれ\",\n        \"unamu\": \"うなむ\",\n        \"unazuki\": \"うなづき\",\n        \"unbalance\": \"UnBaLanCE\",\n        \"unepon\": \"うねぱん\",\n        \"uneta\": \"うねた\",\n        \"uni\": \"うに\",\n        \"uni-corn\": \"Uni-corn\",\n        \"unico kasumi\": \"ゆにこかすみ\",\n        \"unikura\": \"うに蔵\",\n        \"uniskie seagal\": \"ウニスキー・セガール\",\n        \"unknown\": \"春香\",\n        \"uno ryoku\": \"温野りょく\",\n        \"unohanat\": \"うのはな透\",\n        \"unomi\": \"うのみ\",\n        \"unoqlo\": \"UNOQLO\",\n        \"unoshima kanaka\": \"卯ノ島カナカ\",\n        \"unp\": \"UNp\",\n        \"untue\": \"ウンツエ\",\n        \"unwikkii\": \"うぃっきい\",\n        \"unyo\": \"うにょ\",\n        \"uona telepin\": \"うおなてれぴん\",\n        \"ura\": \"URA\",\n        \"ura dramatic\": \"裏ドラマチック\",\n        \"ura ichiko\": \"裏一子\",\n        \"uradoori nukemichi\": \"裏通抜道\",\n        \"uraharukon\": \"うらはるこん\",\n        \"urakami sosogi\": \"浦上そそぎ\",\n        \"urakawa opera\": \"浦河おぺら\",\n        \"urakuso\": \"うらくそ\",\n        \"urakusog\": \"有楽そG\",\n        \"uranfu\": \"うらんふ\",\n        \"urano mami\": \"浦乃まみ\",\n        \"urashima yuuhi\": \"浦島ゆうひ\",\n        \"uraura\": \"uraura\",\n        \"urayama\": \"うらやま\",\n        \"urec\": \"UREC\",\n        \"urekemo lala\": \"熟獣LaLa\",\n        \"ureshino megumi\": \"嬉野めぐみ\",\n        \"ureup\": \"うれあっぷ\",\n        \"uriboh\": \"ウリ坊\",\n        \"urin\": \"卯林\",\n        \"urivo\": \"ウリボぅ\",\n        \"uro\": \"ウロ | 雨露\",\n        \"uro-g\": \"Uro-G\",\n        \"urokozuki\": \"ウロコヅキ\",\n        \"uron\": \"うろん\",\n        \"urotsuki\": \"うろつき\",\n        \"urozuki akira\": \"宇路月\",\n        \"urushi\": \"ウルシ\",\n        \"urutsu\": \"ウルツ\",\n        \"uruu\": \"うるう\",\n        \"uryu sango\": \"瓜生珊瑚\",\n        \"us them\": \"あすぜむ\",\n        \"usa\": \"ウサ\",\n        \"usa usagi\": \"うさうさぎ\",\n        \"usagi ink\": \"うさぎいンく\",\n        \"usagi kei\": \"宇佐木恵\",\n        \"usaki\": \"うさき\",\n        \"usako\": \"ウサ小\",\n        \"usami rui\": \"ウサミルイ\",\n        \"usami suruga\": \"うさみするが\",\n        \"usano riko\": \"兎野りこ\",\n        \"usen\": \"ユウセン\",\n        \"ushi\": \"うし\",\n        \"ushi mochi\": \"うしもち\",\n        \"ushitora tatsumi\": \"丑寅たつみ\",\n        \"usi\": \"usi\",\n        \"usimanu\": \"うしまぬ\",\n        \"usoneko\": \"うそねこ\",\n        \"usso\": \"USSO\",\n        \"usuchi.\": \"うすちー。\",\n        \"usui\": \"薄\",\n        \"usuke bou\": \"うすけ坊\",\n        \"usuki\": \"薄稀\",\n        \"usurai\": \"うすら氷\",\n        \"usyuuri\": \"白ぅ～凪ぃ\",\n        \"uta\": \"唄\",\n        \"utage\": \"宴\",\n        \"utahara\": \"ウタハラ\",\n        \"utakata nagi\": \"UTAKATA凪\",\n        \"utako\": \"うた子\",\n        \"utana\": \"うたな\",\n        \"utano\": \"うた乃\",\n        \"utanone sion\": \"うたのねしおん\",\n        \"utase yui\": \"うたせゆい\",\n        \"utida k\": \"ウチダケイ\",\n        \"utsubo kazura\": \"うつぼかずら\",\n        \"utsugi tsuguha\": \"空木次葉\",\n        \"utsuki\": \"うー☆月\",\n        \"utsurogi angu\": \"空木あんぐ\",\n        \"uttorikun\": \"うっとりくん\",\n        \"utu\": \"utu\",\n        \"uwano sora\": \"ウワノソラ\",\n        \"uzukinoko\": \"うづきのこ\",\n        \"uzunoki tamaki\": \"渦の木環\",\n        \"uzura no tamago\": \"うずらのたまご\",\n        \"v-mag\": \"v-mag\",\n        \"vae\": \"ヴァエ\",\n        \"val\": \"val\",\n        \"valero\": \"ヴァレロ\",\n        \"valiant\": \"ばりあんと\",\n        \"vanadium\": \"Vanadium\",\n        \"vancho\": \"ばんちょー\",\n        \"vanilla\": \"vanilla\",\n        \"vanilla coke\": \"ヴァニラコーク\",\n        \"vanilla cream\": \"ヴァニラCREAM\",\n        \"vanity\": \"VANITY\",\n        \"varein\": \"Varein\",\n        \"velfro\": \"べるふろ\",\n        \"velzhe\": \"ベルゼ\",\n        \"ven\": \"ヴェン\",\n        \"venomlin\": \"venomlin\",\n        \"vice\": \"vice\",\n        \"vinny\": \"vinny\",\n        \"virth\": \"ばぁす\",\n        \"vivi\": \"びび\",\n        \"vogue\": \"vogue\",\n        \"volcano shigeru\": \"ボルケーノ滋\",\n        \"vt\": \"VT\",\n        \"vulcan nure\": \"ヴぁるかん濡\",\n        \"vyo\": \"べぃお\",\n        \"walzrj erorider\": \"W18\",\n        \"wabuki\": \"わぶき\",\n        \"wacoco waco\": \"輪子湖わこ\",\n        \"wada erika\": \"和田エリカ\",\n        \"wadachi kururu\": \"わだちくるる\",\n        \"wadanaka\": \"ワダナカ\",\n        \"wadatsumi\": \"わだつみ\",\n        \"waga na wa masamichi\": \"我が名は正道\",\n        \"wagahai hakushaku\": \"ワガハイ伯爵\",\n        \"waira\": \"猥裸\",\n        \"waka\": \"わか\",\n        \"wakachiko\": \"わかちこ\",\n        \"wakaki tamiki\": \"若木民喜\",\n        \"wakamesan\": \"ワカメさん\",\n        \"wakamiya teresa\": \"我宮てれさ\",\n        \"wakatsuki\": \"若月\",\n        \"wako\": \"わこ\",\n        \"wakura\": \"わくら\",\n        \"wakyo\": \"Wakyo\",\n        \"wamuko\": \"わむこ\",\n        \"wamusato haru\": \"和六里ハル\",\n        \"wan-pyo\": \"王彪\",\n        \"wanaata\": \"わなあた\",\n        \"wanao\": \"わなお\",\n        \"wanashiro giovanna\": \"和南城ジョアンナ\",\n        \"wanderer\": \"Wanderer\",\n        \"wanie digital\": \"ワニデジタル\",\n        \"wanriky\": \"腕力\",\n        \"wantaro\": \"ワン夕口\",\n        \"wap\": \"WaP\",\n        \"wapokichi\": \"わぽ吉\",\n        \"warabi yuuzou\": \"わらびゆうぞう\",\n        \"warashibe\": \"わらしべ\",\n        \"warashina mama\": \"わらしなママ\",\n        \"waroko\": \"ワロコ\",\n        \"warp mind\": \"warp_mind\",\n        \"wasa beef\": \"わさビーフ\",\n        \"wasabi yuuma\": \"わさび悠馬\",\n        \"wasamo\": \"わさも\",\n        \"wase rin\": \"早生リン\",\n        \"washima\": \"washima\",\n        \"washimi yu-ko\": \"わしみゆーこ\",\n        \"washimori\": \"鷲森\",\n        \"washizuka sho\": \"鷲塚翔\",\n        \"wasizuu\": \"わしず\",\n        \"wassyoi\": \"WASSYOI\",\n        \"wasu\": \"ワス\",\n        \"wata motsu\": \"綿もつ\",\n        \"wata-ruh\": \"わた・るぅー\",\n        \"wataichi meko\": \"綿市めこ\",\n        \"watanabe ignica\": \"渡辺イグニカ\",\n        \"watanabe yoshimasa\": \"わたなべよしまさ\",\n        \"watanabe yuuna\": \"渡辺ゆうな\",\n        \"watanuki kaname\": \"四月朔日要\",\n        \"watanuki lon\": \"綿貫ろん\",\n        \"watao\": \"わたお\",\n        \"watarai\": \"度会\",\n        \"wataru\": \"渉\",\n        \"watase rei\": \"渡瀬玲\",\n        \"watase sakana\": \"渡瀬さかな\",\n        \"wataya\": \"綿谷\",\n        \"watayoshi\": \"わたよし\",\n        \"watchie\": \"わっちー\",\n        \"watts\": \"Watts\",\n        \"wave\": \"WAVE\",\n        \"waves\": \"waves\",\n        \"wawa\": \"和々\",\n        \"wawon\": \"ワヲン\",\n        \"waysin\": \"Waysin\",\n        \"wazuka\": \"ワズカ\",\n        \"we53\": \"we53\",\n        \"wedge\": \"WEDGE\",\n        \"wemu\": \"ゑむ\",\n        \"white\": \"ほわいと\",\n        \"who are you\": \"風亜 ゆう\",\n        \"wing bird\": \"WING☆BIRD\",\n        \"winopz\": \"WinOPZ\",\n        \"winte\": \"winte\",\n        \"winter\": \"うぃんたぁ\",\n        \"wk.\": \"wk.\",\n        \"wkar\": \"WKAR\",\n        \"wm\": \"wm\",\n        \"wokasiya\": \"ヲカシヤ\",\n        \"woody\": \"WOODY\",\n        \"woof\": \"woof\",\n        \"workaholic\": \"若堀久\",\n        \"woza\": \"うぉざ\",\n        \"wtwinmk2nd\": \"WTwinMkⅡ2nd\",\n        \"www\": \"www\",\n        \"wx\": \"WX\",\n        \"x6suke\": \"X6suke\",\n        \"xain\": \"ザイン\",\n        \"xanadu\": \"Xanadu\",\n        \"xe\": \"Xe\",\n        \"xelvy\": \"xelvy\",\n        \"xeph\": \"Xeph\",\n        \"xi daisei\": \"クスィー大誠\",\n        \"xiaohua\": \"消化\",\n        \"xiaowoo\": \"小武\",\n        \"xiarobo\": \"しあろぼ\",\n        \"xii\": \"イニ\",\n        \"xiin\": \"xiin\",\n        \"xopc\": \"XOPC\",\n        \"xxzero\": \"xxzero\",\n        \"y\": \"Y\",\n        \"ya\": \"ヤッ\",\n        \"yabuki mao\": \"矢吹マオ\",\n        \"yabuno uguisu\": \"やぶのうぐいす\",\n        \"yaburebouki akuta\": \"破箒芥\",\n        \"yac\": \"YAC\",\n        \"yace\": \"YAce\",\n        \"yachan\": \"やちゃん\",\n        \"yachi\": \"ヤチ\",\n        \"yada masaka\": \"やだ！まさかっ\",\n        \"yadapoteto\": \"やだぽてと\",\n        \"yadokari genpachirou\": \"宿借り源八郎\",\n        \"yadoroku 7\": \"やどろく7\",\n        \"yae\": \"八重\",\n        \"yaeba\": \"やえば\",\n        \"yaebane\": \"八重羽根\",\n        \"yaeda nagumo\": \"八重田なぐも\",\n        \"yaegashi nan\": \"八重樫南\",\n        \"yaeto\": \"yaeto\",\n        \"yagami dai\": \"八神大\",\n        \"yagami sanjin\": \"矢上参仁\",\n        \"yagami shimei\": \"八神士明\",\n        \"yagezawa tetsuyuki\": \"やげざわてつゆき\",\n        \"yagi yuu\": \"山羊ゆう\",\n        \"yagumo kengou\": \"八雲剣豪\",\n        \"yahakin\": \"やはきん\",\n        \"yajiro masaru\": \"野城まさる\",\n        \"yajuu\": \"野獣\",\n        \"yakata soukei\": \"屋形宗慶\",\n        \"yaki ohagi\": \"やきおはぎ\",\n        \"yakisoba ohmori\": \"やきそばおおもり\",\n        \"yakisobapantarou\": \"ヤキソバぱん太郎\",\n        \"yakob\": \"やこぶ\",\n        \"yakuta tetsuya\": \"やくたてつや\",\n        \"yakuwa ken\": \"八鍬健\",\n        \"yakuzaishi\": \"薬剤師\",\n        \"yam\": \"yam\",\n        \"yama\": \"YAMA\",\n        \"pokoten\": \"ぽこてん\",\n        \"yamabatake\": \"山場岳\",\n        \"yamaboshi-kun\": \"やまぼしくん\",\n        \"yamabuki mook\": \"山吹ムック\",\n        \"yamaburo\": \"やまぶろ\",\n        \"yamachan\": \"やまちゃん\",\n        \"yamada\": \"ヤマダ\",\n        \"yamada ako\": \"山田あこ\",\n        \"yamada enako\": \"山田エナ子\",\n        \"yamada kou\": \"山田こう\",\n        \"yamada non\": \"やまだノン\",\n        \"yamada satoshi\": \"山田サトシ\",\n        \"yamada shiguma\": \"山田シグ魔\",\n        \"yamada shuutarou\": \"山田秋太郎\",\n        \"yamada takashi\": \"山田高嗣\",\n        \"yamada yuumi\": \"やまだゆうみ\",\n        \"yamadori\": \"山鳥\",\n        \"yamadori kodi\": \"山鳥こぢ\",\n        \"yamagiwa yuusuke\": \"山際悠介\",\n        \"yamaguchi\": \"ヤマグチ\",\n        \"yamaguchi nao\": \"やまぐち なお\",\n        \"yamaguchi shinji\": \"やまぐちしんじ\",\n        \"yamaguchi shunichi\": \"山口俊一\",\n        \"yamaguchi ugou\": \"やまぐち羽轟\",\n        \"yamai\": \"山井\",\n        \"yamai sakatarou\": \"山井坂太郎 or 山井逆太郎\",\n        \"yamaimo torotoro\": \"山いもとろとろ\",\n        \"yamaishi\": \"山石\",\n        \"yamaishi joe\": \"山石ジョウ\",\n        \"yamaiso\": \"やまいそ\",\n        \"yamakawa yuu\": \"山河勇\",\n        \"yamako\": \"やまこ\",\n        \"yamamoh\": \"やまもー\",\n        \"yamamoto atsuji\": \"山本貴嗣\",\n        \"yamamoto canponi\": \"やまもと かんぽに\",\n        \"yamamoto johanne\": \"山本夜羽音\",\n        \"yamamoto kaori\": \"山本佳織\",\n        \"yamamoto ryuusuke\": \"はせ☆裕\",\n        \"yamamoto tomomitsu\": \"山本ともみつ\",\n        \"yamamura natsuru\": \"山村なつる\",\n        \"yamane masahiro\": \"やまねまさひろ\",\n        \"yamaneko suzume\": \"山猫スズメ\",\n        \"yamano\": \"やまの\",\n        \"yamano konzaburo\": \"山野紺三郎\",\n        \"yamaori\": \"yamaori\",\n        \"yamashita masahiro\": \"山下正浩\",\n        \"yamashita woory\": \"山下うり\",\n        \"yamato\": \"YAMATO\",\n        \"yamato akami\": \"大和あかみ\",\n        \"yamato masaomi\": \"やまと将臣\",\n        \"yamato nadeshiko\": \"大和なでしこ\",\n        \"yamato nyaon\": \"ヤマトにゃ音\",\n        \"yamato osamushi\": \"大和乃 史\",\n        \"yamato techno\": \"大和テクノ\",\n        \"yamatodanuki\": \"大和狸\",\n        \"yamaura shou\": \"山浦章\",\n        \"yamazaki show\": \"夜魔咲翔\",\n        \"yameru doushi\": \"病める同志\",\n        \"yameta takashi\": \"止田卓史\",\n        \"yami no naka\": \"闇の中\",\n        \"yamikage missa\": \"闇影みさ\",\n        \"yaminoki\": \"やみのき\",\n        \"yamisupi\": \"やみすぴ\",\n        \"yamizawa\": \"ヤミザワ\",\n        \"yamizora hikari\": \"闇空光\",\n        \"yamome\": \"ヤモメ\",\n        \"yamoto\": \"yamoto\",\n        \"yan\": \"ヤン\",\n        \"yana\": \"也な\",\n        \"yanagi\": \"柳\",\n        \"yanagi hirohiko\": \"柳ひろひこ\",\n        \"yanagida fumita\": \"柳田史太\",\n        \"yanagie\": \"やなぎー\",\n        \"yanagise\": \"やなぎせ\",\n        \"yanase kotatsu\": \"柳瀬こたつ\",\n        \"yanasegawabeya\": \"柳瀬川部屋\",\n        \"yaneura meteor impact\": \"屋根裏メテオインパクト\",\n        \"yang\": \"ヤン\",\n        \"yankopi\": \"やんこぴ\",\n        \"yano\": \"Yano\",\n        \"yano rahna\": \"夜乃らあな\",\n        \"yano takumi\": \"香川友信\",\n        \"yano toshinori\": \"矢野トシノリ\",\n        \"yanokake\": \"やのかけ\",\n        \"yanonoshin\": \"やののしん\",\n        \"yao.\": \"YaO.\",\n        \"yaomai\": \"やおまい\",\n        \"yappen\": \"ヤッペン\",\n        \"yappy\": \"yappy\",\n        \"yarii shimeta\": \"枪衣七五三太\",\n        \"yas\": \"yas\",\n        \"yasaka\": \"弥栄\",\n        \"yasaka minato\": \"八坂ミナト\",\n        \"yasha\": \"yasha\",\n        \"yashai\": \"やしゃい\",\n        \"yashichii\": \"やしちぃ\",\n        \"yashiki third\": \"屋敷さーど\",\n        \"yashima koto\": \"屋嶋コト\",\n        \"yashio taiga\": \"八潮タイガー\",\n        \"yashiro\": \"社\",\n        \"yashiro ryo\": \"八代涼\",\n        \"yason shain\": \"ヤソン社員\",\n        \"yass\": \"yass\",\n        \"yasu rintarou\": \"安麟太郎\",\n        \"yasuaki\": \"ヤスアキ\",\n        \"yasuda\": \"YASUDA\",\n        \"yasuda katsunori\": \"安田かつのり\",\n        \"yasuhara tsukasa\": \"安原司\",\n        \"yasumon\": \"yasumon\",\n        \"yasumori zen\": \"安森然\",\n        \"yasunaga kouichirou\": \"安永航一郎\",\n        \"yasunao\": \"やすなお\",\n        \"yasuto\": \"泰斗\",\n        \"yat\": \"yat\",\n        \"yata\": \"yata\",\n        \"yataneko\": \"ヤタネコ\",\n        \"yatano\": \"やたの\",\n        \"yatengetu\": \"夜天月\",\n        \"yato hikaru\": \"八仁ヒカル\",\n        \"yatsuashi matomo\": \"ヤツアシマトモ\",\n        \"yatsufusa hajime\": \"八房一\",\n        \"yatsugami tenchou\": \"八ツ神店長\",\n        \"yatsuka yuhata\": \"夜束ユハタ\",\n        \"yatsushima tetsuya\": \"八嶋テツヤ\",\n        \"yatsuzaki\": \"八咲\",\n        \"yatuzaki\": \"やつざき\",\n        \"yautsuro\": \"ヤウツロ\",\n        \"yawaraka concrete\": \"やわらかコンクリート\",\n        \"yawaraka midori\": \"やわらかみどり\",\n        \"yayo\": \"夜与\",\n        \"yayoi kotoyuki\": \"弥生ことゆき\",\n        \"yayoichi\": \"夜よいち\",\n        \"yazawa oke\": \"矢澤おけ\",\n        \"yazawa owl\": \"Yazawa Owl\",\n        \"yazuki aoi\": \"野月あおい\",\n        \"yellowseeds\": \"YellowSeeds\",\n        \"yequo\": \"イエクオ\",\n        \"yf studio\": \"YF Studio\",\n        \"yk\": \"yk\",\n        \"yo-jin\": \"YO-JIN\",\n        \"yo-suke\": \"yo-suke\",\n        \"yo2\": \"YO2\",\n        \"yoban\": \"よばん\",\n        \"yocchi\": \"よっち\",\n        \"yodare\": \"よだれ\",\n        \"yodori\": \"よどり\",\n        \"yoekosukii\": \"ヨエコスキー\",\n        \"yofukashi\": \"夜ふかし\",\n        \"yogiri neo\": \"夜霧音緒\",\n        \"yohi\": \"よひ\",\n        \"yohinori\": \"ヨヒノリ\",\n        \"yoichi\": \"よいち\",\n        \"yoihoshi hikari\": \"宵星ヒカリ\",\n        \"yoikuma\": \"酔\",\n        \"yoki\": \"よーき\",\n        \"yokko\": \"よっこ～\",\n        \"yokkyun\": \"よっきゅん\",\n        \"yoko\": \"yoko\",\n        \"yoko juusuke\": \"横十輔\",\n        \"yoko mawatari\": \"馬渡ようこ\",\n        \"yokohachi\": \"よこはち\",\n        \"yokosima\": \"横縞\",\n        \"yokota mamoru\": \"横田守\",\n        \"yokoyama kouji\": \"横山コウジ\",\n        \"yokoyama michiru\": \"横山ミチル\",\n        \"yokoyama naoki\": \"よこやまなおき\",\n        \"yokoyama negi\": \"横山葱\",\n        \"yoku\": \"ヨク\",\n        \"yokuran\": \"翼卵\",\n        \"yomiclone\": \"yomiclone\",\n        \"yomoda yomo\": \"よもだよも\",\n        \"yomogi\": \"よもぎ\",\n        \"yomogi ringo\": \"よもぎりんご\",\n        \"yomogiya keita\": \"よもぎや敬太\",\n        \"yomosaka\": \"よもさか\",\n        \"yomotsuka tsukasa\": \"四方塚ツカサ\",\n        \"yomoyama akira\": \"四方山哲\",\n        \"yonaga\": \"よなが\",\n        \"yonbangai\": \"4番街\",\n        \"yone\": \"ヨネ\",\n        \"yonekura\": \"米蔵\",\n        \"yonekura hisaki\": \"米倉久記\",\n        \"yonekura kihiro\": \"米倉きひろ\",\n        \"yonemaru\": \"よねまる\",\n        \"yonezou\": \"よねぞう\",\n        \"yonige-ya no kyou\": \"夜逃げ屋の恭\",\n        \"yonu\": \"よる\",\n        \"yoo oona\": \"よーな\",\n        \"yorihito\": \"頼一\",\n        \"yoriko\": \"よりこ\",\n        \"yorisuke\": \"よりすけ\",\n        \"yoriu mushi\": \"寄生虫\",\n        \"yoroshiku tarou\": \"夜露死苦汰楼\",\n        \"yorozu\": \"よろづ\",\n        \"yoru yoru\": \"ヨルヨル\",\n        \"yorutori\": \"よるとり\",\n        \"yosage yoshikazu\": \"よさげよしかず\",\n        \"yosai\": \"葉才\",\n        \"yoshi\": \"yoshi\",\n        \"yoshi keto\": \"よしけ～と\",\n        \"yoshi-puu\": \"よしぷー\",\n        \"yoshida gorou\": \"吉田悟郎\",\n        \"yoshida goten\": \"吉田御殿\",\n        \"yoshida hajime\": \"吉田創\",\n        \"yoshida masahiko\": \"吉田正彦\",\n        \"yoshida nami\": \"吉田浪\",\n        \"yoshida negi\": \"よしだねぎ\",\n        \"yoshida yoshimi\": \"よしだよしみ\",\n        \"yoshiga fuumi\": \"吉賀ふうみ\",\n        \"yoshihara maito\": \"芳原舞人\",\n        \"kasaki yoshihiko\": \"加崎善彦\",\n        \"yoshii toshinari\": \"由衣利成\",\n        \"yoshiizumi hana\": \"よしいずみはな\",\n        \"yoshijima ataru\": \"よしじまあたる\",\n        \"yoshiki\": \"YOSHIKI\",\n        \"yoshimiya chitose\": \"義宮ちとせ\",\n        \"yoshimoto ayumu\": \"芳本あゆむ\",\n        \"yoshimune\": \"よしむね\",\n        \"yoshimura\": \"吉村\",\n        \"yoshimura kentaro\": \"よしむらけんたろー\",\n        \"yoshinaga eikichi\": \"吉永えいきち\",\n        \"yoshinari ayaka\": \"吉成綾加\",\n        \"yoshino kasa\": \"よしのかさ\",\n        \"yoshino sora\": \"吉乃そら\",\n        \"yoshino.\": \"よしの。\",\n        \"yoshiragi\": \"ヨシラギ\",\n        \"yoshiron\": \"よしろん\",\n        \"yoshiten\": \"よし天\",\n        \"yoshitora\": \"YOSHITORA\",\n        \"momomo momo\": \"桃萌 百\",\n        \"yoshiwo\": \"よしを\",\n        \"yoshiyuki\": \"ヨシユキ\",\n        \"yoshizane akihiro\": \"好実昭博\",\n        \"yoshizawa kei\": \"吉沢蛍\",\n        \"yoshizawa mayu\": \"よしざわ真由\",\n        \"yoshizawa megane\": \"吉沢メガネ\",\n        \"yoshizawa miyabi\": \"吉沢雅\",\n        \"yoshizawa tomoaki\": \"吉澤友章\",\n        \"yoshizawa vanilla\": \"芳澤ばにら\",\n        \"yositama\": \"英戦\",\n        \"yosomono\": \"よそ者\",\n        \"yosuke\": \"ヨースケ\",\n        \"yosyo-\": \"ヨショー\",\n        \"yotaka\": \"yotaka\",\n        \"yotarou\": \"夜太弄\",\n        \"yotsuba yuiko\": \"四葉ゆいこ\",\n        \"yotsura\": \"寄弦\",\n        \"yotsuya mika\": \"よつやみか\",\n        \"yottan\": \"ヨッタン\",\n        \"you2\": \"YOU2\",\n        \"you3.\": \"you3｡\",\n        \"youdou\": \"謡堂\",\n        \"youichirou w\": \"よーいちろーW\",\n        \"youjomodoki\": \"ヨウジョモドキ\",\n        \"youka\": \"よーか\",\n        \"youkan\": \"ようかん\",\n        \"youma kachie\": \"夜馬勝絵\",\n        \"youtou sadamitsu\": \"妖刀定光\",\n        \"yowashi\": \"よわし\",\n        \"yoyo\": \"YoYo\",\n        \"yoyoyoyou\": \"よよよよう\",\n        \"yozi\": \"YoZi\",\n        \"yozo\": \"yozo\",\n        \"yts takana\": \"YTS 鷹那\",\n        \"yu\": \"YU\",\n        \"yu-ri\": \"YU-RI\",\n        \"yu-ya\": \"熊耶\",\n        \"yua\": \"夕海\",\n        \"yuam\": \"ゆあま\",\n        \"yucchris\": \"ゆっ栗栖\",\n        \"yuchi\": \"ゆち\",\n        \"yuchitose\": \"ゆうちとせ\",\n        \"yuda-chan\": \"湯田ちゃん\",\n        \"yude pea\": \"茹でピー\",\n        \"yuduki kei\": \"雪月佳\",\n        \"yuduki kisa\": \"柚希妃紗\",\n        \"yuge\": \"ゆげ\",\n        \"yui-7\": \"YUI_7\",\n        \"yuika\": \"ゆいか\",\n        \"yuima yutaka\": \"ゆいまゆたか\",\n        \"yuisaki takumi\": \"結崎拓海\",\n        \"yuitsu\": \"ゆいつ\",\n        \"yukagen tenyu\": \"湯加減てんゆ～\",\n        \"yukako\": \"ゆかこ\",\n        \"yukaran nosuke\": \"ゆからんのすけ\",\n        \"yukatama\": \"ゆかたま\",\n        \"yukataro\": \"ゆかたろ\",\n        \"yukawa mario\": \"湯川まりお\",\n        \"yuki mau\": \"有希まう\",\n        \"yuki seriya\": \"yuki seriya\",\n        \"yuki tomoshi\": \"幸灯\",\n        \"yukia\": \"ゆきあ\",\n        \"yukian\": \"Yukian\",\n        \"yukibana\": \"雪華\",\n        \"yukichi-san\": \"ゆきちさん\",\n        \"yukiguni eringi\": \"雪国エリンギ\",\n        \"yukiharu\": \"にゃわて荘\",\n        \"yukihime haruka\": \"雪姫はるか\",\n        \"yukihoshi kokoro\": \"雪星こころ\",\n        \"yukimachi tounosuke\": \"雪町灯之助\",\n        \"yukimai\": \"ゆきまい\",\n        \"yukimaro yukky\": \"ゆきまろゆっきー\",\n        \"yukimaru.\": \"雪丸。\",\n        \"yukimi\": \"由木彌\",\n        \"yukimi iris\": \"雪味あいりす\",\n        \"yukimino yukio\": \"雪見野ユキオ\",\n        \"yukimitsu\": \"ゆきみつ\",\n        \"yukimura hajime\": \"雪村一\",\n        \"yukimura tsugumi\": \"ゆきむらつぐみ\",\n        \"yukina\": \"ゆきな\",\n        \"yukina funa\": \"幸奈ふな\",\n        \"yukino\": \"ゆきの\",\n        \"yukino yukikaze\": \"ゆきのゆきかぜ\",\n        \"yukiri takashi\": \"結桐たかし\",\n        \"yukishiro yima\": \"雪白イマ\",\n        \"yukisiro arte\": \"雪代あるて\",\n        \"yukitaka\": \"柚木貴\",\n        \"yukito\": \"雪人\",\n        \"yukitsuka tsukasa\": \"ゆきつかつかさ\",\n        \"yukiusagi\": \"ゆきうさぎ\",\n        \"yukiwo\": \"ユキヲ\",\n        \"yukiya\": \"雪哉\",\n        \"yukiyanagi yui\": \"雪柳唯依\",\n        \"yukizuki chikuba\": \"雪月竹馬\",\n        \"yukke-ani\": \"ゆっけ兄\",\n        \"yukke.\": \"ゆっけ。\",\n        \"yukki\": \"ゆっき\",\n        \"yukko\": \"ゆっこ\",\n        \"yukkyun\": \"ユッキュン\",\n        \"yuku\": \"ゆく\",\n        \"yukyu ponzu\": \"悠久ポン酢\",\n        \"yuma\": \"ゆーま\",\n        \"yuma ryouhei\": \"ゆま亮平\",\n        \"yumaman\": \"ゆままん\",\n        \"yumbo anahoru\": \"ゆんぼあなほる\",\n        \"yume\": \"夢\",\n        \"yumegi\": \"ユメギ\",\n        \"yumegi atsuki\": \"ゆめぎあつき\",\n        \"yumemiya subaru\": \"夢宮すばる\",\n        \"yumeno shiya\": \"夢ノ紫也\",\n        \"yumesato makura\": \"夢里まくら\",\n        \"yumeutsutsu hideki\": \"夢現ひでき\",\n        \"yumi ichirou\": \"友美イチロウ\",\n        \"yumiya\": \"ゆみや\",\n        \"yuna\": \"由那\",\n        \"yunagi kahoru\": \"夕凪薫\",\n        \"yuniba\": \"ゆにば\",\n        \"yunioshi\": \"ゆにおし\",\n        \"yuno shigure\": \"雪乃時雨\",\n        \"yunodon\": \"ゆのどん\",\n        \"yunoka gashuu\": \"ゆのか雅愁\",\n        \"yunokawa yosomi\": \"温泉川よそ見\",\n        \"yunoki yu\": \"柚木ユウ\",\n        \"yunopanchako\": \"ゆのぱんちゃこ\",\n        \"yunosuke\": \"ゆのすけ\",\n        \"yurarin\": \"yurarin\",\n        \"yurei\": \"ゆーれー\",\n        \"yuri kamome\": \"友梨かもめ\",\n        \"yuri tamashii\": \"百合魂\",\n        \"yuri tohru\": \"百合融\",\n        \"yuriaki\": \"ユリアキ\",\n        \"yurige\": \"ゆりげ\",\n        \"yurihara aki\": \"百合原明\",\n        \"yurikawa\": \"ゆりかわ\",\n        \"yuririn\": \"ゆりりん\",\n        \"yuriwhale\": \"Yuriwhale\",\n        \"yusa ikuyoshi\": \"遊佐育美\",\n        \"yusui\": \"ゆすい\",\n        \"yusura\": \"山桜桃\",\n        \"yutakame\": \"ゆたかめ\",\n        \"yuto\": \"yuto\",\n        \"yutori-nu\": \"ゆとりーぬ\",\n        \"yutsuki tsuzuri\": \"愉月綴\",\n        \"yuu\": \"由宇\",\n        \"yuu sagi\": \"ユウサギ\",\n        \"yuuga\": \"遊賀\",\n        \"yuuga momiji\": \"夕雅紅葉\",\n        \"yuuge\": \"夕餉\",\n        \"yuugo\": \"ユーゴ\",\n        \"ariuo\": \"有魚\",\n        \"yuuhi\": \"雄飛\",\n        \"yuuhi alpha\": \"悠飛あるふぁ\",\n        \"yuuichi\": \"ゆういち\",\n        \"yuuk\": \"yuuk\",\n        \"yuuka rei\": \"優華麗\",\n        \"yuuki alice\": \"夕姫ありす\",\n        \"yuuki haruka\": \"結城遥\",\n        \"yuuki hb\": \"ユウキHB\",\n        \"yuuki hide\": \"悠希ヒデ\",\n        \"yuuki mia\": \"結城みあ\",\n        \"yuuki mitsuru\": \"結城みつる\",\n        \"yuuki miya\": \"結城美夜\",\n        \"yuuki miyabi\": \"結城みやび\",\n        \"yuuki noco\": \"悠樹ノコ\",\n        \"yuuki ray\": \"ユウキレイ\",\n        \"yuuki ryo\": \"結城稜\",\n        \"yuuki satoru\": \"結城さとる\",\n        \"yuuki tomoka\": \"ゆうきともか\",\n        \"yuuki tsumugi\": \"ゆうきつむぎ\",\n        \"yuuki yu\": \"結城結\",\n        \"yuumazume\": \"ゆうまずめ\",\n        \"yuumi takako\": \"夕海たかこ\",\n        \"yuumyago\": \"ゆうみゃご\",\n        \"yuunagi show\": \"夕凪ショウ\",\n        \"yuuno\": \"ゆうの\",\n        \"yuunyan\": \"ゆうにゃん\",\n        \"yuuri\": \"遊離\",\n        \"yuurin\": \"佑りん\",\n        \"yuusa riki\": \"ゆうさ理姫\",\n        \"yuusei iori\": \"遊星庵\",\n        \"yuusuke asazume\": \"麻爪佑助\",\n        \"yuuta\": \"湯唄\",\n        \"yuuyake roji\": \"夕焼け路地\",\n        \"yuya\": \"悠夜\",\n        \"yuyu\": \"ゆゆ\",\n        \"yuzaki\": \"ユウザキ\",\n        \"yuzco\": \"ゆずこ\",\n        \"yuzn\": \"ゆずん\",\n        \"yuzu ramune\": \"柚子ラムネ\",\n        \"yuzu syrup\": \"ゆずしろっぷ\",\n        \"yuzucky\": \"ゆずっきー\",\n        \"yuzuka\": \"柚夏\",\n        \"yuzuki makii\": \"柚木まき\",\n        \"yuzuki rin\": \"柚木鈴\",\n        \"yuzuki ruri\": \"柚木ルリ\",\n        \"yuzuki suzu\": \"柚木鈴\",\n        \"yuzuki yu\": \"柚木ゆう\",\n        \"yuzuki yua\": \"柚月ゆあ\",\n        \"yuzuki yuno\": \"柚木ゆの\",\n        \"yuzuko syou\": \"ゆずこしょう\",\n        \"yuzupon\": \"ゆずぽん\",\n        \"yuzuriha\": \"杠\",\n        \"yuzushiko\": \"ゆずしこ\",\n        \"yuzuyoukan\": \"ゆずようかん\",\n        \"z-s-e\": \"z-s-e\",\n        \"z26\": \"Z26\",\n        \"zacro\": \"柘榴\",\n        \"zakiko\": \"ザキコ\",\n        \"zakkunpoppu\": \"雑君保プ\",\n        \"zakotv\": \"ZakoTV\",\n        \"zakuro\": \"ざくろ\",\n        \"zama shouji\": \"座間翔二\",\n        \"zan\": \"ZAN\",\n        \"zaneri\": \"ザネリ\",\n        \"zangi\": \"ざんぎ\",\n        \"zarasi\": \"ざらし\",\n        \"zariya ranmaru\": \"座裏屋蘭丸\",\n        \"zasan\": \"ざさん\",\n        \"zasha\": \"ザシャ\",\n        \"zashiki ushi\": \"座敷牛\",\n        \"zassyu\": \"ザッシュ\",\n        \"zawa\": \"ざわ\",\n        \"zawameki\": \"ざわめき\",\n        \"zawar\": \"ZawarC\",\n        \"zax\": \"Zax\",\n        \"zekkyosyu\": \"絶巨主\",\n        \"zekkyou\": \"絶叫\",\n        \"zeku\": \"ゼク\",\n        \"zen\": \"ZEN\",\n        \"zen.\": \"ぜん。\",\n        \"zen33n\": \"Zen33n\",\n        \"zen9\": \"zen9\",\n        \"zengo\": \"前後\",\n        \"zenki\": \"ぜんき\",\n        \"zenra\": \"全裸\",\n        \"zenra yashiki\": \"全裸屋敷\",\n        \"zentam\": \"ゼンタム\",\n        \"zephi\": \"ゼフィ\",\n        \"zephid\": \"ゼフィド\",\n        \"raianonzika\": \"RaianOnzika\",\n        \"zero\": \"zero\",\n        \"zero punch\": \"ぜろぽんち\",\n        \"zero tanuki\": \"零狸\",\n        \"zessekaishonen\": \"絶世界少年\",\n        \"zest\": \"ゼスト\",\n        \"zettaizetumei\": \"絶対絶命\",\n        \"zetz\": \"ぜっつ\",\n        \"zima\": \"Zima\",\n        \"zin\": \"ZiN\",\n        \"zinan\": \"ジナン\",\n        \"zinno\": \"zinno\",\n        \"zion\": \"ZION\",\n        \"ziz\": \"ziz\",\n        \"zo\": \"ぞ\",\n        \"zol\": \"ZOL\",\n        \"zono\": \"ぞの\",\n        \"zonta\": \"ぞん太\",\n        \"zorane\": \"ぞらね\",\n        \"zourion\": \"ゾウリオン\",\n        \"zukky\": \"Zukky\",\n        \"zummy\": \"Zummy\",\n        \"zumo8\": \"ずも8\",\n        \"zun nyannyan\": \"ズンにゃんにゃん\",\n        \"zundamochi\": \"ずんだ餅\",\n        \"zundarinda\": \"ズンダリンダ\",\n        \"zunta\": \"Zunta\",\n        \"zuru\": \"ズル\",\n        \"zutta\": \"Zutta\",\n        \"zuzu\": \"ズズ\",\n        \"zyaroh akira\": \"邪琅明\",\n        \"zyougen\": \"上弦\",\n        \"zyulokuya\": \"十録屋\",\n        \"zzinzinz\": \"なめジョン\",\n        \"zzz\": \"zzz\",\n        \"1up\": \"1UP\",\n        \"6zo\": \"6zo\",\n        \"anzheli\": \"Anzheli\",\n        \"cfr\": \"CFR\",\n        \"inagita\": \"INAGITA\",\n        \"inside\": \"Inside\",\n        \"kashiko akira\": \"かしこ村\",\n        \"kururururu\": \"くるるるる\",\n        \"murayamamon\": \"村山門\",\n        \"nanohana800\": \"なのはな800\",\n        \"nns\": \"nnS\",\n        \"norainu\": \"野良犬\",\n        \"noysca\": \"noysca\",\n        \"styx\": \"STYX\",\n        \"takamiya hairi\": \"たかみやはいり\",\n        \"tinmeshi\": \"珍飯\",\n        \"utatane\": \"うたたね\",\n        \"tomodachi\": \"Tomodachi\",\n        \"puracotte\": \"Puracotte＊ぷらこ\",\n        \"tsuyuhisa fumi\": \"露久ふみ\",\n        \"hinoshita akame\": \"日之下あかめ\",\n        \"ryokuchamichi\": \"緑茶みち\",\n        \"mamimi\": \"Mamimi\",\n        \"mujin bensin\": \"無人\",\n        \"jima\": \"じま\",\n        \"miyama tsubakime\": \"美山椿芽\",\n        \"haku89\": \"haku89\",\n        \"shengtian\": \"升天\",\n        \"tezuka osamu\": \"手冢治虫\",\n        \"oyuyu\": \"おゆゆ\",\n        \"mo oku\": \"MO:OKU\",\n        \"rounds chen\": \"RoundsChen\",\n        \"tsubame\": \"つばめ\",\n        \"ushinomiya\": \"うしのみや\",\n        \"yoikorogashi\": \"よいころがし\",\n        \"natsu jam\": \"夏ジャム\",\n        \"aosawa yuki\": \"青沢由紀\",\n        \"inui nuinu\": \"犬居ぬいぬ\",\n        \"2no.\": \"2no.\",\n        \"h.carrrrrrot\": \"カロロット\",\n        \"toriattogununu\": \"とりあっとぐぬぬ\",\n        \"harrishero\": \"ハリスヒロ\",\n        \"potatorinrin\": \"孟達\",\n        \"hotter daimon\": \"掘多大門\",\n        \"cirilla\": \"CIRILLA\",\n        \"tsunakama\": \"ツナかま\",\n        \"yoshida ninn\": \"吉田にん\",\n        \"yukimura yukio\": \"雪村雪緒\",\n        \"akiyoshi amelie\": \"秋芳あめり\",\n        \"shikibe tsuko\": \"色辺つこ\",\n        \"yusha-m\": \"Yusha-M\",\n        \"kuroboshi kouhaku\": \"黑星红白（饭冢武史）\",\n        \"aji taro\": \"AJ/鯵太郎\",\n        \"aizen pochi\": \"愛染ぽち\",\n        \"nagatsuki hatsuka\": \"長月はつか\",\n        \"kotobuki haruki\": \"琴吹はるき\",\n        \"kou kou ax\": \"口口AX\",\n        \"madoka tsukumo\": \"円つくも\",\n        \"takeda hinata\": \"武田日向\",\n        \"tsuyuri inu\": \"栗花落淫雨\",\n        \"minagi koh\": \"海凪コウ\",\n        \"mumumu seijin\": \"むむむ星人\",\n        \"redchicken\": \"붉은닭\",\n        \"shirai bebe\": \"白井べべ\",\n        \"nekosaki aoi\": \"猫崎葵\",\n        \"kakuchou no okina\": \"拡張の翁\",\n        \"shiawase na choshoku.\": \"幸せな朝食。\",\n        \"cenangam\": \"CeNanGam\",\n        \"tabasco pasta\": \"タバスコパスタ\",\n        \"gin eiji\": \"銀エイジ\",\n        \"yan-baru\": \"やんBARU\",\n        \"hanasaka houcha\": \"花咲方茶\",\n        \"fallen-leaves\": \"Fallen落叶\",\n        \"hanayama\": \"はなやま\",\n        \"kusoniku yokichi\": \"糞肉与吉\",\n        \"hatoba akane\": \"波止場茜\",\n        \"hachi no hachihachi\": \"はちの八八\",\n        \"rhasta\": \"牛乳重工\",\n        \"melailai\": \"么赖赖\",\n        \"da mao banlangen\": \"大猫板蓝根\",\n        \"touwa nikuman\": \"空72色\",\n        \"yushi quetzalli\": \"羽蛇Quetzalli\",\n        \"fukuro daizi\": \"Fukuro袋子\",\n        \"tsukumo nikyu\": \"九十九弐級\",\n        \"uten ameka\": \"雨天あめか\",\n        \"sakuraba rokusuke\": \"樱庭六辅\",\n        \"aoyama akira\": \"苍山哲\",\n        \"kamitake\": \"鱗物\",\n        \"k-ko\": \"K子\",\n        \"sisyamo 2 percent\": \"sisyamo2%\",\n        \"metacora\": \"めたこら\",\n        \"kangoku meika\": \"監獄銘菓\",\n        \"souseki\": \"層積\",\n        \"manno\": \"まんの\",\n        \"tamada heijun\": \"玉田平准\",\n        \"nagai go\": \"永井豪\",\n        \"takamaru\": \"鷹丸\",\n        \"nidaime\": \"二代目\",\n        \"minato ojitan\": \"湊おじたん\",\n        \"orukoa\": \"orukoa\",\n        \"karakuri musha\": \"からくり武者\",\n        \"neisan\": \"ねいさん\",\n        \"takekawa sin\": \"武川慎\",\n        \"galbany denryuu\": \"ガルバニー電流\",\n        \"utsunomiya ukatsu\": \"郁之宫迂阔\",\n        \"suito\": \"すいと\",\n        \"kura\": \"倉\",\n        \"ayasaka\": \"綾坂\",\n        \"akusema\": \"あくせま\",\n        \"takumichi\": \"Taku道\",\n        \"ramanda\": \"ラマンダ\",\n        \"suimi\": \"水深\",\n        \"totoyama keiji\": \"魚山ケイジ\",\n        \"konery\": \"ｺﾈﾘｨ＠(ヽ'ω`)\",\n        \"cocomachi\": \"ここまち\",\n        \"mizuse kiseki\": \"星の紅茶\",\n        \"momomo gasshuukoku\": \"ももも合衆国\",\n        \"nameless peasant\": \"皮三豆\",\n        \"minamoto kosada\": \"源康定\",\n        \"mukatsuku\": \"ム菓ツク（むか）\",\n        \"akiamare\": \"あきあまれ\",\n        \"sakuragi yomi\": \"樱木黄泉\",\n        \"suichuu hanabi\": \"水中花火\",\n        \"enmanuelart\": \"enmanuelart\",\n        \"shirosaba\": \"白サバ\",\n        \"cslucaris\": \"CSLucaris\",\n        \"4riasensei\": \"フォリア\",\n        \"matsuda\": \"ユウスケ\",\n        \"rasen kyofu kaku\": \"ラセン恐怖閣\",\n        \"damenahito\": \"だめなひと\",\n        \"satou teruhito\": \"佐藤辉人\",\n        \"yamada tahichi\": \"山田タヒチ\",\n        \"nijiiro tyahantei\": \"虹色チャーハン亭\",\n        \"ikemura hiroichi\": \"池村ヒロイチ\",\n        \"kizaki masuta\": \"季崎ますた\",\n        \"komera\": \"こめら\",\n        \"kurotane\": \"くろたね\",\n        \"toushiki yubune\": \"橙織ゆぶね\",\n        \"shimada panda\": \"しま田ぱんだ\",\n        \"kakei kei\": \"花兄けい\",\n        \"kudou hisashi\": \"くどうひさし\",\n        \"yuuzuki hijiri\": \"夕月ひじり\",\n        \"koumashiro\": \"こうましろ\",\n        \"denpouya chamaru\": \"伝法谷ちゃまる\",\n        \"miazi\": \"miazi\",\n        \"namagome negi\": \"瑠川ねぎ\",\n        \"ebi fry teishoku\": \"ぐえー/エビフライ定食\",\n        \"shishido sakura\": \"宍戸沙玖来\",\n        \"pontaro\": \"ぽんたろ\",\n        \"ikawa waki\": \"わき\",\n        \"aizawa marimo\": \"愛沢 まりも\",\n        \"moyamoya\": \"モヤモヤ\",\n        \"okabe gyoza\": \"尾壁餃子\",\n        \"shizuhime\": \"静姬\",\n        \"kagawa yusaku\": \"香川悠作\",\n        \"daito\": \"daito\",\n        \"nakamura asumiko\": \"中村明日美子\",\n        \"muto\": \"醤油エビ\",\n        \"dokuneko noil\": \"毒猫ノイル\",\n        \"urabe katsuto\": \"浦辺克斗\",\n        \"minakami rin\": \"ミナカミ\",\n        \"koyomania\": \"Koyomania\",\n        \"magowasabi\": \"magowasabi\",\n        \"kurigami\": \"kurigamiin\",\n        \"renetan\": \"レネタン\",\n        \"hi\": \"Hi\",\n        \"kitsune choukan\": \"きつね長官\",\n        \"kagura kurumi\": \"神楽くるみ\",\n        \"yaemugura\": \"八重葎\",\n        \"pottsness\": \"pottsness\",\n        \"kimyou chourui\": \"奇妙鸟类\",\n        \"kawakami minoru\": \"川上稔\",\n        \"omulet tomato\": \"オムレットマト\",\n        \"hyouta\": \"俵太\",\n        \"asaomi shimura\": \"アサオミ志群\",\n        \"ooban yaki\": \"大伴ヤキ\",\n        \"yoshida killy\": \"吉田Killy\",\n        \"tou\": \"トウ\",\n        \"natsusaka\": \"夏坂\",\n        \"tempura dozaemon\": \"天妇罗土左卫门\",\n        \"furatsu\": \"ふらつ\",\n        \"matsui yasutsugu\": \"松井康治（郁那和なにろ）\",\n        \"inari bancha\": \"稻荷ばん茶\",\n        \"pumpkinspicelatte\": \"pumpkinspice\",\n        \"sca-ji\": \"SCA-自\",\n        \"shichi ouji\": \"七王子\",\n        \"mankai beesuke\": \"満開べえスケ\",\n        \"hiiragi yuichi\": \"柊裕一\",\n        \"mukaino kei\": \"向野圭衣\",\n        \"sogom\": \"裕珍\",\n        \"bk-mita\": \"灰濁クロム\",\n        \"sanjiro\": \"さんじろ♨\",\n        \"atelier30\": \"Atelier30\",\n        \"magnificent sexy gals\": \"Magnificent\",\n        \"yoshinari you\": \"吉成曜\",\n        \"sirosoil\": \"白土\",\n        \"chinpan\": \"チンパン\",\n        \"chocoro\": \"チョコロ\",\n        \"sasaki shounen\": \"佐佐木少年\",\n        \"haruno tomoya\": \"春野友矢\",\n        \"pirorikin\": \"ピロリ菌\",\n        \"hayama junichi\": \"羽山淳一\",\n        \"kureha\": \"クレハ\",\n        \"kinomiki\": \"きのみき\",\n        \"ao plus beni\": \"青十紅\",\n        \"ruzhai\": \"儒宅\",\n        \"hukairi botan\": \"深煎り牡丹\",\n        \"katano chika\": \"片野ちか\",\n        \"shirai samoedo\": \"白井サモエド\",\n        \"madana\": \"まだな\",\n        \"squchan\": \"SquChan\",\n        \"mikamin\": \"みかみん\",\n        \"nakamori\": \"なかもり\",\n        \"gittangittan\": \"ギッタンギッタン\",\n        \"kuroda kurota\": \"黒田くろた\",\n        \"inui hana\": \"犬居葉菜\",\n        \"yukai na factory\": \"愉快なFactory\",\n        \"otsunosuke\": \"乙の助\",\n        \"sada sadao\": \"佐田さだお\",\n        \"asakura clock\": \"朝倉クロック\",\n        \"koromotake\": \"ころもたけ\",\n        \"hashina tamaki\": \"葉科たまき\",\n        \"kusogaki\": \"くそガキ\",\n        \"aestheticc-meme\": \"ミームクリーム\",\n        \"denkou nyako\": \"電光にゃコ\",\n        \"hamico\": \"はみこ\",\n        \"takeru\": \"たける\",\n        \"yamoge\": \"やもげ\",\n        \"taguchi monyata\": \"田口もにゃ太\",\n        \"sushiyama\": \"寿司山\",\n        \"kaminari doon\": \"カミナリ・ドーン\",\n        \"ayanakitori\": \"アヤナキトリ\",\n        \"yukoring\": \"優子鈴\",\n        \"fjsmu\": \"fjsmu（ふじしむ）\",\n        \"tomari\": \"トマリ\",\n        \"miso tanuki inka teikoku\": \"みそたぬきインカ帝国\",\n        \"asakawa\": \"浅川\",\n        \"fellatrix\": \"fellatrix\",\n        \"bone hiko\": \"骨彦\",\n        \"yuzuhara moke\": \"柚原もけ\",\n        \"eryu\": \"えりゅ\",\n        \"micosivaa\": \"神輿葉\",\n        \"doritoru\": \"どりとる\",\n        \"nagina\": \"なぎな\",\n        \"ura kaizokudan\": \"裏海俗団\",\n        \"tsuda hitokuchi\": \"津田ヒトクチ\",\n        \"sakura ab\": \"さくらAB\",\n        \"sevengar\": \"せぶんがー\",\n        \"jagi iwa\": \"ジャギ岩\",\n        \"seneto\": \"セネト\",\n        \"unosero\": \"うのせろ\",\n        \"murasaki shingou\": \"紫信号\",\n        \"meriibe\": \"めりーべ\",\n        \"hoshina mimiwo\": \"星奈みみヲ\",\n        \"sakauchi waka\": \"坂内若\",\n        \"sagami yuki\": \"さがみおきば\",\n        \"miyanose you\": \"宮ノ瀬陽\",\n        \"tsukiyo\": \"月夜\",\n        \"nakkar\": \"Nakkar\",\n        \"bippew\": \"Bippew\",\n        \"omegazero01\": \"Omegazero01\",\n        \"diesel\": \"でーぜる\",\n        \"sincos\": \"サインこす\",\n        \"lshiki\": \"Lshiki\",\n        \"asahina yoshitosi\": \"朝比奈吉利（420号高速道路）\",\n        \"mithril rim\": \"みすりるリム\",\n        \"matsunaga kouyou\": \"松永紅葉\",\n        \"muta no yoi oniku\": \"mutaの良いお肉\",\n        \"hokkyoku hotaru\": \"北極ホタル\",\n        \"sunhyun\": \"そんひょん\",\n        \"mizuno yukimi\": \"みずの雪見\",\n        \"greem bang\": \"GreemBang\",\n        \"bibimbub\": \"Bibimbub\",\n        \"kuni-kun\": \"クニくん\",\n        \"mushihara\": \"虫原\",\n        \"momomomo hakushaku\": \"モモモーモー伯爵\",\n        \"takaoka sui\": \"高岡彗\",\n        \"gatoh ganaha\": \"我藤がなは\",\n        \"shirasu\": \"しらす\",\n        \"kandata nijou\": \"神多二丞\",\n        \"saipaco.\": \"SAIPACo.\",\n        \"jj.jj\": \"JJ.JJ\",\n        \"ringo club\": \"りんごくらぶ\",\n        \"usatsuka eiji\": \"兔冢英志\",\n        \"ishii takamori\": \"石井高森\",\n        \"coro fae\": \"Coro Fae\",\n        \"piuta\": \"piuta\",\n        \"meeko\": \"めえこ（めえお）\",\n        \"kuroni bokujou\": \"クロニ\",\n        \"himiya zyo-zu\": \"比宮じょーず\",\n        \"hinageshi\": \"雏罂粟\",\n        \"unknown showhey\": \"马岛祥平\",\n        \"saito naoki\": \"斋藤直葵\",\n        \"yoshiku\": \"四々九\",\n        \"kakage\": \"かかげ\",\n        \"nibiiro shizuka\": \"鈍色玄\",\n        \"kousaka tohru\": \"香坂透\",\n        \"aikolik\": \"AIKOlik\",\n        \"2bls\": \"2bls\",\n        \"utagawa yosiero\": \"歌川芳江呂\",\n        \"allenes\": \"ALLENES\",\n        \"haiironpada\": \"灰色ンパダ\",\n        \"hanamaluo\": \"ハナマルオ\",\n        \"kuroto yu\": \"黒兎ゆう\",\n        \"sugue tetto\": \"スグエ鉄塔\",\n        \"sorayama hajime\": \"空山基\",\n        \"hotate-chan\": \"ほたてちゃん\",\n        \"akai same\": \"かふぇいん中毒\",\n        \"takano tomohiro\": \"高野友宏\",\n        \"ameno shigure\": \"雨野时雨\",\n        \"ushi kousen\": \"牛工船\",\n        \"eroi-roe\": \"エロ井ロエ\",\n        \"camekirin\": \"かめきりん\",\n        \"mayonaka taroupho\": \"真夜中足穗\",\n        \"sharekoube\": \"メカしゃれこうべ\",\n        \"mizusane\": \"みづさね\",\n        \"ninda hayo\": \"忍田波葉\",\n        \"delta chimaki\": \"▲ちまき\",\n        \"menbou\": \"めんぼー\",\n        \"uishi poru\": \"羽衣石ぽる\",\n        \"momoyama hato\": \"モモヤマハト\",\n        \"inukami inoji\": \"犬上いの字\",\n        \"ichikawa noa\": \"一河のあ\",\n        \"mary-san\": \"メリサン\",\n        \"auman zureedus\": \"オーマンズリーダス\",\n        \"maeshima shigeki\": \"前嶋重機\",\n        \"nanquanzl\": \"南拳蟑狼\",\n        \"janggun\": \"jeneral\",\n        \"eros o gutsugutsu nikonda megane\": \"エロスをぐつぐつ煮込んだメガネ\",\n        \"sekkei\": \"雪景\",\n        \"mouja\": \"モウじゃ\",\n        \"hararame\": \"はららめ\",\n        \"shiba aya\": \"柴あや\",\n        \"kiyoshi\": \"キヨシ\",\n        \"shiworiita\": \"シヲリイタ\",\n        \"kitakawa touta\": \"北河トウタ\",\n        \"okiha\": \"沖葉\",\n        \"uekura eku\": \"上倉エク\",\n        \"dendoro kakariya\": \"澱泥カカリヤ\",\n        \"cucchiore\": \"くっきおーれ\",\n        \"konbu wakame\": \"昆布わかめ\",\n        \"omusubi korori\": \"緒結ころり\",\n        \"memeyu\": \"めめゆ\",\n        \"onokana\": \"斧カナ\",\n        \"masuda miyaka\": \"枠田ちさき\",\n        \"arima zin\": \"有马侭\",\n        \"silver dog\": \"シルバードッグ\",\n        \"shihira tatsuya\": \"四平龙也\",\n        \"aoki seishin\": \"碧木诚心\",\n        \"tachibana takashi\": \"橘孝志\",\n        \"sekai ichii\": \"世界一位\",\n        \"maroya kayo\": \"まろや伽夜\",\n        \"kobayashi ritz\": \"小林立\",\n        \"hiroki\": \"宏き\",\n        \"emoto shikeko\": \"えもと しけこ\",\n        \"gogopanda\": \"ごーごーぱんだ\",\n        \"naminori kamome\": \"波乗かもめ\",\n        \"tyontyon\": \"てょんてょん\",\n        \"soejima shigenori\": \"副岛成记\",\n        \"chisunosuke\": \"ちすの助\",\n        \"sakurayashiki tonkotsu\": \"桜屋敷とんこつ\",\n        \"fukumoto masahisa\": \"福本真久\",\n        \"signo mandara\": \"シグノマンダラ\",\n        \"tobiume sayu\": \"飞梅さゆ\",\n        \"omitsu\": \"えびおみつ\",\n        \"hangetsuban sonshou\": \"半月板损伤\",\n        \"tottotonero tarou.\": \"とっととねろ太郎。\",\n        \"nakagomi\": \"中込\",\n        \"d.\": \"D.\",\n        \"oyu\": \"おゆ\",\n        \"pononozo\": \"ぽののぞ\",\n        \"hirota shimaguni\": \"浩田岛国\",\n        \"mutou tetsu\": \"武藤铁\",\n        \"agachi\": \"あがち\",\n        \"shiina shinya\": \"椎名深夜\",\n        \"touketsu\": \"卜ウケツ\",\n        \"hoshina meito\": \"星名めいと\",\n        \"nanonanno\": \"なのなんの\",\n        \"kuroseimu\": \"クロセイム\",\n        \"teppo\": \"鉄歩\",\n        \"mochio\": \"白蜜モチ\",\n        \"kitagawa zayaku\": \"北川ざやく\",\n        \"saito tsubame\": \"齋藤燕\",\n        \"aohonoo\": \"蒼炎\",\n        \"tamayura banko\": \"玉ぼん\",\n        \"tamaki nao\": \"玉姫なお\",\n        \"inonaka kawazu\": \"胃ノ中かわず\",\n        \"saiogauma\": \"塞翁が马\",\n        \"usui yui\": \"碓氷汐泉\",\n        \"raiou\": \"raiou\",\n        \"yokoyari mengo\": \"横枪萌果\",\n        \"alexanderdinh\": \"Alexanderdinh\",\n        \"toubaru rairu\": \"桃原らいる\",\n        \"murao mio\": \"村生未央\",\n        \"toriyaro\": \"トリヤロウ\",\n        \"umeda nautilus\": \"梅田ノーチラス\",\n        \"komura\": \"コムラ\",\n        \"dakkoku jiro\": \"脱壳次郎\",\n        \"futatsuno-peanuts\": \"ふたつのピーナツ\",\n        \"kanzarin\": \"カンザリン\",\n        \"nemurinemu\": \"ねむりねむ\",\n        \"wusui yangcong\": \"五岁洋葱\",\n        \"yuga\": \"ゆがー\",\n        \"akadashi\": \"赤だし\",\n        \"hitakamo\": \"ひたかも\",\n        \"osaki\": \"オオサキ\",\n        \"usa otome\": \"うさおとめ\",\n        \"hatsuuni ikura\": \"初雲丹いくら\",\n        \"asano yomichi\": \"朝野よみち\",\n        \"fuguta-ke\": \"フグタ家\",\n        \"namahiyu\": \"なまひゆ\",\n        \"keise.\": \"慧瀬。\",\n        \"zandoro\": \"ざんどろ\",\n        \"rinaka moruchi\": \"モルんち\",\n        \"tachi\": \"タチ\",\n        \"metsubushi\": \"メツブシ\",\n        \"iuui\": \"イウウイ\",\n        \"cham22\": \"cham22\",\n        \"ie\": \"ie\",\n        \"kokushi\": \"黑司\",\n        \"matsuri seishiro\": \"マツリセイシロウ\",\n        \"mameroku\": \"豆六\",\n        \"chigusa minori\": \"千種みのり\",\n        \"xiaomu\": \"筱牧\",\n        \"petra\": \"佩城\",\n        \"akano murasaki\": \"アカノムラサキ\",\n        \"wood cube\": \"小木蹬子\",\n        \"pentagon\": \"ぺんたごん\",\n        \"radio sensei\": \"ラジオ先生\",\n        \"suitshark\": \"Suitshark\",\n        \"honashi\": \"Honashi\",\n        \"hayanye r\": \"はやにぇR\",\n        \"awamiku\": \"あわこと\",\n        \"barakey\": \"バラキー\",\n        \"ricerice\": \"飯桶君\",\n        \"ahbai\": \"阿白\",\n        \"parsley\": \"パセリ\",\n        \"ochin-sama\": \"おちんさま\",\n        \"takafumi\": \"たかふみ\",\n        \"rkrk12\": \"rkrk12\",\n        \"yurishima shiro\": \"ゆりしましろ\",\n        \"purumetal\": \"ぷるめたる\",\n        \"nicolai no yome\": \"ニコライの嫁（nicolai）\",\n        \"sukusan\": \"SukuSan\",\n        \"noya macoto\": \"ノヤマコト\",\n        \"ryouta\": \"りょうた\",\n        \"shijiu\": \"いけめる\",\n        \"sorimachi toufu\": \"反町豆腐\",\n        \"shibatora\": \"柴寅\",\n        \"cowbow\": \"矼房\",\n        \"yamada kintetsu\": \"山田金铁\",\n        \"kudou maimu\": \"九童まいむ\",\n        \"iwamoto kuyo\": \"いーなん\",\n        \"pilaf modoki\": \"ぴらふもどき\",\n        \"uenosuke\": \"↑野介\",\n        \"inoue makito\": \"井植莳人\",\n        \"mudoochi\": \"むどおち\",\n        \"mori manpei\": \"森万平\",\n        \"frogsnake\": \"蛙记\",\n        \"tearontaron\": \"てぃーろんたろん\",\n        \"tonee\": \"Tonee\",\n        \"rangu\": \"らんぐ\",\n        \"icomochi\": \"イコモチ\",\n        \"hongshi\": \"紅世\",\n        \"shibori kasu\": \"搾り課す\",\n        \"sensiya\": \"千氏夜\",\n        \"aruto naruto\": \"有人成徒\",\n        \"denbu momo\": \"でんぶ腿\",\n        \"gogatsu unagi\": \"五月うなぎ\",\n        \"uko\": \"うこ\",\n        \"ishimari yuuya\": \"イシマリユウヤ\",\n        \"mannen junyuuki\": \"万年授乳期(ジュニー)\",\n        \"putama\": \"ぷ玉\",\n        \"waka mochi ta\": \"わかもち太\",\n        \"mmchair\": \"MM\",\n        \"arisugawa kotone\": \"有栖川琴音\",\n        \"hitonitati\": \"ひとにたち\",\n        \"ryou\": \"涼\",\n        \"ono elle\": \"える\",\n        \"usitora tatumi\": \"牛虎たつみ\",\n        \"takashima shoa\": \"高嶋しょあ\",\n        \"half horse hanma\": \"半馬ハンマ\",\n        \"ekimae machinaka\": \"駅前街中\",\n        \"hoyhoy colo\": \"ホイホイこーろ\",\n        \"noyama\": \"のやま\",\n        \"araizumi rui\": \"新泉留衣\",\n        \"hui yin\": \"慧骃\",\n        \"pineapple panda\": \"鳳梨ぱんだ\",\n        \"qiandai yiyu\": \"Qiandai以宇\",\n        \"kacyu\": \"卡丘\",\n        \"bagelbomb\": \"Bagelbomb\",\n        \"kitano yukito\": \"北乃ゆきと\",\n        \"haruri\": \"HARURI\",\n        \"sumina en\": \"澄名エン\",\n        \"jinja eru\": \"神社えーる\",\n        \"nukeru\": \"ヌケル\",\n        \"musui ethanol\": \"無水エタノール\",\n        \"mori sinrisk\": \"森シンリスク\",\n        \"moegi\": \"萌黄おじさん\",\n        \"kikomuhito\": \"着込む人\",\n        \"elegant\": \"えれがんと\",\n        \"tonyman plus\": \"トニーマン+\",\n        \"shimetsuki tanki\": \"湿月タンキ\",\n        \"yuukey\": \"ゆーきぃ\",\n        \"wu qing yan hui gang\": \"无情烟灰缸\",\n        \"yoshimura bitchmotor\": \"吉村ビッチモーター\",\n        \"mochimoon curry\": \"餅月カレン\",\n        \"yukimochi kinako\": \"幸餅きなこ\",\n        \"houraku\": \"HOURAKU\",\n        \"nagatsuki misoka\": \"长月みそか\",\n        \"wosushi\": \"をすし\",\n        \"kiyohara hiro\": \"清原纮\",\n        \"yakiuni\": \"烧きうに\",\n        \"inui ayu\": \"犬井あゆ\",\n        \"osanai shiina\": \"小山内しいな\",\n        \"umino ryo\": \"海野りょう\",\n        \"daruma jd\": \"だるまJD\",\n        \"gsus\": \"GSUS\",\n        \"gucchian\": \"ぐっち庵\",\n        \"uekura ryona\": \"上倉RyoNA\",\n        \"kusothumu\": \"くそつむ\",\n        \"ashitaba mofu\": \"明日葉もふ\",\n        \"yoshitomi akihito\": \"吉富昭仁\",\n        \"lestart\": \"lestart\",\n        \"shiono\": \"しおの\",\n        \"semino hazuki\": \"セミノハヅキ\",\n        \"yasumi mirakichi\": \"やすみみらきち\",\n        \"tsukunendo\": \"つくねんど\",\n        \"okachimachi tamachi\": \"御徒町たまち\",\n        \"jmg\": \"JMG\",\n        \"ueshita\": \"うえした\",\n        \"mintaro\": \"みんたろう\",\n        \"bergyb\": \"博哥\",\n        \"yukimochi\": \"ゆきもち\",\n        \"jury\": \"じゅらい\",\n        \"yandama\": \"やんだま\",\n        \"youngjijii\": \"ヤングじじい\",\n        \"kawazoe taichi\": \"河添太一\",\n        \"mochikushi\": \"もちくし\",\n        \"shaggy susu\": \"Shaggy SUSU\",\n        \"xiao bai tian\": \"小白天\",\n        \"suzukawa\": \"凉河\",\n        \"kizuna\": \"絆\",\n        \"natsume yochiki\": \"よちき\",\n        \"modare\": \"モ誰\",\n        \"momoshiki\": \"ももしき\",\n        \"momochi chia\": \"桃稚 ちあ\",\n        \"skai kun\": \"Skai_kun\",\n        \"tsuyatsuya\": \"艶々\",\n        \"star shadow magician\": \"STAR影法师\",\n        \"sakai\": \"坂井\",\n        \"reiichi\": \"零壱\",\n        \"akichi\": \"空き地\",\n        \"kouzu sousuke\": \"兴津惣介\",\n        \"lemon snail\": \"Lemon Snail\",\n        \"zirba\": \"Zirba\",\n        \"fyxfd\": \"肥油小分队\",\n        \"karei\": \"かれい\",\n        \"arashiya\": \"嵐屋\",\n        \"yamamoto yumiko\": \"山本由美子\",\n        \"zurikishi\": \"ずり騎士\",\n        \"himeno mikan\": \"姫野蜜柑\",\n        \"fujimura q\": \"藤村久\",\n        \"kaneko naoya\": \"カネコナオヤ\",\n        \"grimgrim\": \"grimgrim\",\n        \"makochan42\": \"まこちあ\",\n        \"wagashi\": \"和菓子\",\n        \"kayama yuichiro\": \"鹿山裕一郎\",\n        \"iranon\": \"冬灯\",\n        \"takanaga kouhei\": \"高永浩平\",\n        \"shuru-ban\": \"しゅる版\",\n        \"yoongonji\": \"尹坤志\",\n        \"mobuta\": \"モブ太\",\n        \"xiaozi xiao\": \"笑笑饺子\",\n        \"shura\": \"朱雷\",\n        \"kokonobi\": \"九尾\",\n        \"pooh\": \"ぷぅ\",\n        \"irono\": \"ゐろの\",\n        \"isshi pyuma\": \"一志ピューマ\",\n        \"mamerakko\": \"豆ラッコニキ\",\n        \"amakusa tobari\": \"天草帳\",\n        \"sasaki mutsumi\": \"ささきむつみ\",\n        \"murabito toufuten\": \"村人豆腐店\",\n        \"kuma ashi s\": \"熊足S\",\n        \"sasai nakoto\": \"茶彩なこと\",\n        \"hina\": \"氷菜\",\n        \"yozakura souki\": \"夜桜ソウキ\",\n        \"susukumo nagi\": \"煤雲なぎ\",\n        \"cielo\": \"CIELO\",\n        \"hekoman\": \"へこまん\",\n        \"ichinosono yui\": \"一之园唯\",\n        \"rindow masaki\": \"あるでぃ\",\n        \"orihika\": \"おりひか\",\n        \"scottie\": \"スコッティ\",\n        \"makin\": \"まきん\",\n        \"myamo\": \"ミャモ\",\n        \"pedopetton\": \"ぺどぺっとん\",\n        \"mikozin\": \"ミコジン\",\n        \"imajin kouji\": \"イマジン孝二\",\n        \"meisuke\": \"めーすけ\",\n        \"kotobuki mairo\": \"寿まいろ\",\n        \"minato yuu\": \"湊ゆう\",\n        \"ameko\": \"あめこ\",\n        \"senda hisamaru\": \"せんだ寿丸\",\n        \"fujiwara noa\": \"藤原のあ\",\n        \"ryoutani kana\": \"両谷哉\",\n        \"hoshino rao\": \"星野らお\",\n        \"jankey\": \"ジャンキー\",\n        \"nettsuu\": \"ねっつー\",\n        \"point takashi\": \"みるく工房\",\n        \"wakatake\": \"わかたけ\",\n        \"aak\": \"aak\",\n        \"rabu\": \"ラブ\",\n        \"uni toshiki\": \"ウニトシキ\",\n        \"teikuuhikou\": \"低空飞行\",\n        \"iwami yasoya\": \"石见やそや\",\n        \"mittsuman\": \"みっつまん\",\n        \"chinetsu\": \"ちねつ\",\n        \"akausu ko\": \"赤薄红\",\n        \"otona no sexy ehon\": \"大人のSEXY絵本\",\n        \"hogeramu\": \"ほげらむ\",\n        \"raikou\": \"らい公\",\n        \"raku\": \"乐\",\n        \"karaage\": \"唐扬\",\n        \"jinze\": \"今沢\",\n        \"hosigarasu\": \"干しガラス\",\n        \"koyama harutarou\": \"コヤマハルタロウ\",\n        \"iketatsu shizuru\": \"池竜静留\",\n        \"kogara tsugumi\": \"小雀つぐみ\",\n        \"papipukepo\": \"ぱぴぷけぽ\",\n        \"yomogi mametaro\": \"よもぎ豆太郎\",\n        \"yasuda yasuhiro\": \"保田やすひろ\",\n        \"minazuki miyabi\": \"水無月雅\",\n        \"okome taberu\": \"おこめタベル\",\n        \"nagase tooru\": \"長瀬 徹\",\n        \"az slash hybrid\": \"をん（AZ/HYBRID）\",\n        \"shirabii\": \"しらび\",\n        \"ushio kiyoshi\": \"潮汐きよし\",\n        \"yumemi teer\": \"夢見てぇる\",\n        \"kisaragi sonami\": \"生肉\",\n        \"nishi yasuaki\": \"西ヤスアキ\",\n        \"higashi taishi\": \"東太子\",\n        \"kokudou juunigou\": \"国道12号\",\n        \"sushi yuusha toro\": \"寿司勇者トロ\",\n        \"sandbox\": \"砂场\",\n        \"yunamaro\": \"ゆなまろ\",\n        \"810eru\": \"草葉える\",\n        \"mochiduki riku\": \"望月りく\",\n        \"asoka\": \"あそか\",\n        \"komiya yuuta\": \"小宮裕太\",\n        \"inchou no naka no hito\": \"いんちょ～の中の人\",\n        \"asakura hayate\": \"朝倉はやて\",\n        \"yutaka izubuchi\": \"出渕裕\",\n        \"tachibana-ko\": \"橘子\",\n        \"toridamono\": \"トリダモノ\",\n        \"yoshimura takuya\": \"吉村拓哉\",\n        \"yuki no arashi\": \"雪之岚\",\n        \"yiduan\": \"异端\",\n        \"kii kanna\": \"紀伊カンナ\",\n        \"watosu mama\": \"わとす\",\n        \"wodae\": \"ヲダエ\",\n        \"nagoyaka jirou\": \"なごやか次郎\",\n        \"kyonta\": \"きょんた\",\n        \"amakawa gumi\": \"甘皮ぐみ\",\n        \"blvefo9\": \"blvefo9\",\n        \"nyaon\": \"にゃおん\",\n        \"fuugetsu makoto\": \"楓月誠\",\n        \"rebutsu\": \"りぶつ\",\n        \"choi moz\": \"ちょいもず\",\n        \"miyazaki usagi\": \"みやざきうさぎ\",\n        \"touchuu kasou\": \"冬虫夏草\",\n        \"cbmus\": \"cbmus\",\n        \"torii yoshitsuna\": \"鳥居ヨシツナ\",\n        \"mannack\": \"まんなく\",\n        \"miwerjooggetser\": \"無名老圖\",\n        \"shimohara\": \"しもはら\",\n        \"kazutake hazano\": \"和武はざの\",\n        \"kanpancake\": \"kanpancake\",\n        \"satoh sugar\": \"砂藤シュガー\",\n        \"okura-chan\": \"おくらちゃん\",\n        \"bannou\": \"万能\",\n        \"rokita\": \"ろきた\",\n        \"naruya shin\": \"なるやしん\",\n        \"tamura-chan\": \"田村ちゃん\",\n        \"nyum\": \"にゅむ\",\n        \"tsunako\": \"つなこ\",\n        \"amagai tarou\": \"おるだん\",\n        \"takota konu\": \"蛸田こぬ\",\n        \"made rokuri\": \"迄ロクリ\",\n        \"charin\": \"チャリン\",\n        \"usodi\": \"ウソヂ\",\n        \"chairoino\": \"茶色いの\",\n        \"sugiyama\": \"杉山\",\n        \"antifreez3\": \"天凉多喝防冻液\",\n        \"norihito\": \"仁人\",\n        \"ogatatei\": \"緒方てい\",\n        \"aota sora\": \"あおたそら\",\n        \"4uu\": \"4UU\",\n        \"miginer\": \"みぎなー\",\n        \"kenko shindan-chan\": \"健康診断ちゃん\",\n        \"hibari\": \"雲雀ひな\",\n        \"neko no youchuu\": \"猫の幼虫\",\n        \"to hegemonikon\": \"ト！ヘーゲモニコン\",\n        \"agagaga\": \"あがががが\",\n        \"namekuji\": \"なめくじ\",\n        \"bonnou obaa-chan\": \"煩悩おばあちゃん\"\n    },\n    \"cosplayer\": {\n        \"otohara an\": \"乙原あん\",\n        \"rioko\": \"涼涼子\",\n        \"atsuki\": \"あつき\",\n        \"hane ame\": \"雨波\",\n        \"chunmomo\": \"蠢沫沫\",\n        \"kalinka fox\": \"Kalynka Fox\",\n        \"nora fawn\": \"Nora Fawn\",\n        \"saku\": \"サク\",\n        \"arty huang\": \"Arty亞緹\",\n        \"carry key\": \"Carry Key\",\n        \"valery himera\": \"Valery Himera\",\n        \"vinnegal\": \"Vinnegal\",\n        \"nath sokolova\": \"Nath Sokolova\",\n        \"virtual geisha\": \"Virtual Geisha\",\n        \"kaya huang\": \"KaYa 萱\",\n        \"sayako\": \"さやこ\",\n        \"mikomi hokina\": \"Mikomi Hokina\",\n        \"akane araragi\": \"Akane Araragi\",\n        \"lenfried\": \"lenfried\",\n        \"xidaidai\": \"習呆呆\",\n        \"senluo caituan\": \"森蘿財團\",\n        \"pigma\": \"Pigman\",\n        \"abaoyeshituniang\": \"阿包也是兔娘\",\n        \"kimmie mi\": \"蜜蜜子\",\n        \"aqua area\": \"水淼Aqua\",\n        \"erzuo nisa\": \"二佐nisa\",\n        \"sola\": \"Sola\",\n        \"tsuki desu\": \"Tsuki Desu\",\n        \"kokura chiyo\": \"小倉ちよ\",\n        \"g44 wa kizutsukanai\": \"G44不會受傷\",\n        \"okita rinka\": \"沖田凜花\",\n        \"nekokoyoshi\": \"爆機少女喵小吉\",\n        \"akemi101xoxo\": \"Akemi101xoxo\",\n        \"hoshilily\": \"星之遲遲\",\n        \"yurikodxd\": \"YurikoDxD\",\n        \"yuuforia\": \"Yuuforia\",\n        \"lovelyspacekitten\": \"LovelySpaceKitten\",\n        \"uyuy\": \"UyUy\",\n        \"alicekyo\": \"Alicekyo\",\n        \"baoer mysterial\": \"寶兒Mysterial\",\n        \"menmentan\": \"燜燜碳\",\n        \"rio-chan\": \"愛瀬りおな\",\n        \"siao ding\": \"小丁\",\n        \"franxcos\": \"FranXcos\",\n        \"junkenstein\": \"Junkenstein\",\n        \"helly von valentine\": \"Helly von Valentine\",\n        \"penkarui\": \"Penkarui\",\n        \"mizhimaoqiu\": \"蜜汁貓裘\",\n        \"refeen\": \"Refeen\",\n        \"ely cosplay\": \"ElyEE子\",\n        \"azami\": \"Azami\",\n        \"mercurylamp\": \"水銀燈\",\n        \"niyeye\": \"你燁燁\",\n        \"yaoyaoqwq\": \"軟妹搖搖樂\",\n        \"maria desu\": \"Maria Desu\",\n        \"hidori rose\": \"Hidori Rose\",\n        \"ai lei jiang\": \"少女映畫\",\n        \"shimotsuki\": \"霜月shimo\",\n        \"hua qi hana\": \"花柒Hana\",\n        \"lostwind10\": \"貓と爪呸羅呸羅\",\n        \"xue qi-sama\": \"雪琪SAMA\",\n        \"larissa rochefort\": \"Larissa Rochefort\",\n        \"kitaro\": \"Kitaro綺太郎\",\n        \"banbanko\": \"半半子\",\n        \"aninnyan\": \"桜井甯甯\",\n        \"nagisa\": \"NAGISA魔物喵\",\n        \"katiecakey\": \"Katie Cakey\",\n        \"linzi jiang\": \"凜子醬\",\n        \"cherry neko\": \"桜桃喵\",\n        \"kuuko w\": \"Kuuko W\",\n        \"luo xiaoli miao\": \"洛璃LoLiSAMA\",\n        \"yaokoututu\": \"咬一口兔娘\",\n        \"yuki astra\": \"雪晴Astra\",\n        \"niannian d\": \"念念_D\",\n        \"tyouduki maryou\": \"蝶月真綾\",\n        \"ringo mitsuki\": \"林檎蜜紀\",\n        \"tokar\": \"浵卡Tokar\",\n        \"saotome love\": \"早乙女らぶ\",\n        \"tsubomin\": \"つぼみん\",\n        \"omimi\": \"おみみ\",\n        \"sakura noa\": \"桜のぁ\",\n        \"yuricha\": \"YURICHA\",\n        \"na-san\": \"なーさん\",\n        \"mashiro yuki\": \"真白ゆき\",\n        \"alina becker\": \"Alina Becker\",\n        \"shizuku honami\": \"穂南しずく\",\n        \"lmusicl\": \"lMusicl\",\n        \"masako yume\": \"Masako Yume\",\n        \"ain nguyen\": \"Ain Nguyễn\",\n        \"oniksiya sofinikum\": \"Oniksiya Sofinikum\"\n    },\n    \"male\": {\n        \"age progression\": \"年齡增長\",\n        \"age regression\": \"返老還童\",\n        \"dilf\": \"熟男\",\n        \"infantilism\": \"幼稚型\",\n        \"old man\": \"老人\",\n        \"shotacon\": \"正太\",\n        \"toddlercon\": \"幼兒\",\n        \"amputee\": \"截肢\",\n        \"big muscles\": \"大肌肉\",\n        \"body modification\": \"身體改造\",\n        \"conjoined\": \"連體\",\n        \"doll joints\": \"關節娃娃\",\n        \"gijinka\": \"擬人化\",\n        \"inflation\": \"腹部膨脹\",\n        \"invisible\": \"透明\",\n        \"multiple arms\": \"多臂\",\n        \"muscle\": \"肌肉\",\n        \"muscle growth\": \"肌肉成長\",\n        \"stretching\": \"拉伸\",\n        \"tailjob\": \"尾交\",\n        \"wings\": \"翅膀\",\n        \"absorption\": \"吸收\",\n        \"petrification\": \"石化\",\n        \"transformation\": \"變身\",\n        \"alien\": \"外星人👽\",\n        \"angel\": \"天使\",\n        \"bat boy\": \"蝙蝠男\",\n        \"bear boy\": \"狗熊男\",\n        \"bee boy\": \"蜂男\",\n        \"bird boy\": \"鳥男\",\n        \"bunny boy\": \"兔子男孩\",\n        \"catboy\": \"貓男\",\n        \"centaur\": \"半人馬\",\n        \"cowman\": \"牛男\",\n        \"deer boy\": \"鹿男孩\",\n        \"demon\": \"惡魔\",\n        \"dog boy\": \"狗男孩\",\n        \"draenei\": \"德萊尼\",\n        \"elephant boy\": \"象男孩\",\n        \"fairy\": \"仙子🧚‍♂️\",\n        \"fox boy\": \"狐男\",\n        \"frog boy\": \"青蛙男孩\",\n        \"furry\": \"毛茸茸\",\n        \"giraffe boy\": \"長頸鹿男\",\n        \"ghost\": \"幽靈👻\",\n        \"goblin\": \"哥布林\",\n        \"harpy\": \"鳥人\",\n        \"horse boy\": \"馬男孩\",\n        \"human on furry\": \"人毛\",\n        \"hyena boy\": \"鬣狗男孩\",\n        \"insect boy\": \"昆蟲男孩\",\n        \"kappa\": \"河童\",\n        \"lizard guy\": \"蜥蜴男孩\",\n        \"merman\": \"人魚🧜‍♂️\",\n        \"minotaur\": \"牛頭人\",\n        \"monkey boy\": \"猴男孩\",\n        \"monster\": \"怪物\",\n        \"mouse boy\": \"鼠男孩\",\n        \"necrophilia\": \"姦屍\",\n        \"oni\": \"鬼\",\n        \"orc\": \"半獸人\",\n        \"otter boy\": \"水獺男孩\",\n        \"panda boy\": \"熊貓男\",\n        \"pig man\": \"豬男\",\n        \"plant boy\": \"植物男孩\",\n        \"raccoon boy\": \"浣熊男孩\",\n        \"robot\": \"機器人🤖\",\n        \"shark boy\": \"鯊男孩\",\n        \"sheep boy\": \"羊男孩\",\n        \"slime\": \"史萊姆\",\n        \"slime boy\": \"史萊姆男孩\",\n        \"snake boy\": \"蛇男\",\n        \"spider boy\": \"蜘蛛男\",\n        \"squid boy\": \"烏賊男\",\n        \"squirrel boy\": \"松鼠男\",\n        \"skunk boy\": \"臭鼬男\",\n        \"tentacles\": \"觸手\",\n        \"vampire\": \"吸血鬼🧛‍♂️\",\n        \"wolf boy\": \"狼男孩\",\n        \"zombie\": \"殭屍🧟‍♂️\",\n        \"animal on animal\": \"獸獸\",\n        \"animal on furry\": \"獸毛\",\n        \"bear\": \"熊🐻\",\n        \"bestiality\": \"獸交\",\n        \"bull\": \"牛🐂\",\n        \"camel\": \"駱駝🐫\",\n        \"cat\": \"貓🐈\",\n        \"crab\": \"螃蟹🦀\",\n        \"deer\": \"鹿🦌\",\n        \"dinosaur\": \"恐龍🦖\",\n        \"dog\": \"狗🐕\",\n        \"dolphin\": \"海豚🐬\",\n        \"donkey\": \"驢\",\n        \"dragon\": \"龍🐉\",\n        \"eel\": \"鰻魚\",\n        \"elephant\": \"象🐘\",\n        \"fish\": \"魚🐟\",\n        \"fox\": \"狐狸🦊\",\n        \"frog\": \"青蛙🐸\",\n        \"goat\": \"山羊🐐\",\n        \"gorilla\": \"猩猩🦍\",\n        \"horse\": \"馬🐎\",\n        \"insect\": \"昆蟲🐜\",\n        \"kangaroo\": \"袋鼠\",\n        \"lion\": \"獅🦁\",\n        \"maggot\": \"蛆🐛\",\n        \"monkey\": \"猴🐒\",\n        \"mouse\": \"鼠🐀\",\n        \"octopus\": \"章魚🐙\",\n        \"ostrich\": \"鴕鳥\",\n        \"panther\": \"豹🐆\",\n        \"pegasus\": \"天馬\",\n        \"pig\": \"豬🐖\",\n        \"rabbit\": \"兔🐇\",\n        \"reptile\": \"爬蟲\",\n        \"rhinoceros\": \"犀牛🦏\",\n        \"sheep\": \"綿羊🐏\",\n        \"shark\": \"鯊🦈\",\n        \"slug\": \"蛞蝓\",\n        \"snake\": \"蛇🐍\",\n        \"spider\": \"蜘蛛🕷\",\n        \"tiger\": \"虎🐅\",\n        \"turtle\": \"龜🐢\",\n        \"unicorn\": \"獨角獸🦄\",\n        \"whale\": \"鯨🐋\",\n        \"wolf\": \"狼🐺\",\n        \"worm\": \"蠕蟲\",\n        \"zebra\": \"斑馬🦓\",\n        \"giant\": \"巨人\",\n        \"growth\": \"巨大化\",\n        \"midget\": \"侏儒\",\n        \"miniguy\": \"迷你男孩\",\n        \"shrinking\": \"縮小\",\n        \"tall man\": \"高個男\",\n        \"albino\": \"白化\",\n        \"body writing\": \"身體寫作\",\n        \"body painting\": \"身體繪畫\",\n        \"dark skin\": \"黑皮\",\n        \"freckles\": \"雀斑\",\n        \"gyaru-oh\": \"黃毛\",\n        \"large tattoo\": \"全身紋身\",\n        \"lipstick mark\": \"口紅印\",\n        \"scar\": \"疤痕\",\n        \"skinsuit\": \"人皮衣\",\n        \"tanlines\": \"曬痕\",\n        \"anorexic\": \"厭食症\",\n        \"bbm\": \"胖男人\",\n        \"ssbbm\": \"超級胖男人\",\n        \"weight gain\": \"體重增加\",\n        \"ahegao\": \"阿黑顏\",\n        \"beauty mark\": \"美人痣\",\n        \"brain fuck\": \"腦交🧠\",\n        \"cockslapping\": \"屌打耳光\",\n        \"crown\": \"王冠👑\",\n        \"elf\": \"精靈🧝‍♂️\",\n        \"facesitting\": \"坐臉\",\n        \"facial hair\": \"鬍子\",\n        \"gasmask\": \"防毒面具\",\n        \"halo\": \"光環\",\n        \"hood\": \"帽兜\",\n        \"horns\": \"角\",\n        \"kemonomimi\": \"獸耳\",\n        \"kigurumi pajama\": \"動物連體睡衣\",\n        \"makeup\": \"化妝\",\n        \"masked face\": \"假面\",\n        \"mouth mask\": \"口罩\",\n        \"thick eyebrows\": \"濃眉\",\n        \"afro\": \"爆炸頭\",\n        \"bald\": \"禿頂\",\n        \"drill hair\": \"螺旋辮\",\n        \"eye-covering bang\": \"長劉海\",\n        \"hair buns\": \"丸子頭\",\n        \"hairjob\": \"髮交\",\n        \"pixie cut\": \"精靈頭\",\n        \"ponytail\": \"馬尾辮\",\n        \"prehensile hair\": \"抓頭髮\",\n        \"shaved head\": \"光頭\",\n        \"twintails\": \"雙馬尾\",\n        \"very long hair\": \"超長髮\",\n        \"body swap\": \"換身\",\n        \"chloroform\": \"迷藥\",\n        \"corruption\": \"墮落\",\n        \"drugs\": \"藥物\",\n        \"drunk\": \"醉酒\",\n        \"emotionless sex\": \"性冷淡\",\n        \"mind break\": \"洗腦\",\n        \"mind control\": \"催眠\",\n        \"moral degeneration\": \"道德退化\",\n        \"parasite\": \"寄生\",\n        \"personality excretion\": \"人格排洩\",\n        \"possession\": \"附身\",\n        \"shared senses\": \"感官共享\",\n        \"sleeping\": \"睡覺\",\n        \"blindfold\": \"遮眼布\",\n        \"closed eyes\": \"閉眼\",\n        \"crying\": \"流淚\",\n        \"dark sclera\": \"黑眼白\",\n        \"eye penetration\": \"插入眼睛\",\n        \"eyemask\": \"眼部面具\",\n        \"eyepatch\": \"眼罩\",\n        \"glasses\": \"眼鏡👓\",\n        \"heterochromia\": \"異色瞳\",\n        \"monoeye\": \"獨眼\",\n        \"sunglasses\": \"太陽鏡🕶\",\n        \"unusual pupils\": \"異瞳\",\n        \"nose fuck\": \"鼻交\",\n        \"nose hook\": \"鼻吊鉤\",\n        \"smell\": \"氣味\",\n        \"big lips\": \"大嘴唇💋\",\n        \"blowjob\": \"口交\",\n        \"blowjob face\": \"口交顏\",\n        \"braces\": \"牙套\",\n        \"burping\": \"打嗝\",\n        \"coprophagia\": \"食糞\",\n        \"deepthroat\": \"深喉\",\n        \"double blowjob\": \"一口二鳥\",\n        \"foot licking\": \"舔足\",\n        \"gag\": \"口塞\",\n        \"gokkun\": \"飲精\",\n        \"kissing\": \"接吻💏\",\n        \"long tongue\": \"長舌👅\",\n        \"multimouth blowjob\": \"多口口交\",\n        \"piss drinking\": \"飲尿\",\n        \"rimjob\": \"舔肛\",\n        \"saliva\": \"唾液\",\n        \"smoking\": \"吸菸🚬\",\n        \"tooth brushing\": \"刷牙\",\n        \"unusual teeth\": \"異齒\",\n        \"vomit\": \"嘔吐🤮\",\n        \"vore\": \"吞食\",\n        \"asphyxiation\": \"窒息\",\n        \"collar\": \"項圈\",\n        \"hanging\": \"絞刑\",\n        \"leash\": \"狗鏈\",\n        \"armpit licking\": \"腋下舔\",\n        \"armpit sex\": \"腋交\",\n        \"hairy armpits\": \"腋毛\",\n        \"fisting\": \"拳交💪\",\n        \"gloves\": \"手套\",\n        \"handjob\": \"打手槍\",\n        \"multiple handjob\": \"多重打手槍\",\n        \"big areolae\": \"大乳暈\",\n        \"big breasts\": \"巨乳\",\n        \"breast expansion\": \"乳房膨脹\",\n        \"breast feeding\": \"哺乳\",\n        \"lactation\": \"母乳\",\n        \"milking\": \"擠奶\",\n        \"paizuri\": \"乳交\",\n        \"big nipples\": \"大乳頭\",\n        \"dark nipples\": \"黑乳頭\",\n        \"dicknipples\": \"陰莖乳頭\",\n        \"inverted nipples\": \"乳頭內陷\",\n        \"nipple birth\": \"乳頭出產\",\n        \"nipple fuck\": \"乳穴性交\",\n        \"nipple piercing\": \"乳頭穿孔\",\n        \"nipple stimulation\": \"乳頭刺激\",\n        \"cumflation\": \"精液膨脹\",\n        \"navel fuck\": \"肚臍奸\",\n        \"pregnant\": \"懷孕\",\n        \"stomach deformation\": \"腹部變形\",\n        \"chastity belt\": \"貞操帶\",\n        \"crotch tattoo\": \"淫紋\",\n        \"genital piercing\": \"性器穿孔\",\n        \"hairy\": \"多毛\",\n        \"mesuiki\": \"幹高潮\",\n        \"multiple orgasms\": \"連續高潮\",\n        \"no balls\": \"無蛋\",\n        \"pantyjob\": \"內褲交\",\n        \"pubic stubble\": \"陰毛渣\",\n        \"urethra insertion\": \"尿道插入\",\n        \"adventitious penis\": \"畸位陰莖\",\n        \"ball caressing\": \"揉蛋\",\n        \"balls expansion\": \"睪丸生長\",\n        \"ball sucking\": \"吸球\",\n        \"balljob\": \"球交\",\n        \"big balls\": \"大睪丸\",\n        \"big penis\": \"大根\",\n        \"cloaca insertion\": \"泄殖腔插入\",\n        \"cockphagia\": \"陰莖吞食\",\n        \"cock ring\": \"鎖精環\",\n        \"frottage\": \"陰莖摩擦🤺\",\n        \"horse cock\": \"馬根\",\n        \"huge penis\": \"巨根\",\n        \"multiple penises\": \"多種雞雞\",\n        \"penis birth\": \"陰莖出產\",\n        \"penis enlargement\": \"陰莖生長\",\n        \"phimosis\": \"包莖\",\n        \"prostate massage\": \"前列腺按摩\",\n        \"retractable penis\": \"可伸縮陰莖\",\n        \"smegma\": \"陰垢\",\n        \"cervix prolapse\": \"宮頸脫垂\",\n        \"clit insertion\": \"陰蒂插入\",\n        \"clit stimulation\": \"陰蒂刺激\",\n        \"cunnilingus\": \"舔陰\",\n        \"unbirth\": \"入陰\",\n        \"vaginal birth\": \"陰道出產\",\n        \"anal\": \"爆肛\",\n        \"anal birth\": \"肛門出產\",\n        \"anal intercourse\": \"肛交\",\n        \"analphagia\": \"肛門吞食\",\n        \"anal prolapse\": \"脫肛\",\n        \"ass expansion\": \"臀部膨脹\",\n        \"assjob\": \"尻交\",\n        \"big ass\": \"大屁股\",\n        \"enema\": \"灌腸\",\n        \"farting\": \"放屁\",\n        \"multiple assjob\": \"多重尻交\",\n        \"pegging\": \"爆菊\",\n        \"spanking\": \"打屁股\",\n        \"tail\": \"尾巴\",\n        \"tailphagia\": \"尾巴吞食\",\n        \"eggs\": \"產卵\",\n        \"gaping\": \"敞口\",\n        \"large insertions\": \"大玩具\",\n        \"nakadashi\": \"中出\",\n        \"prolapse\": \"脫垂\",\n        \"leg lock\": \"勾腿\",\n        \"sumata\": \"股間性交\",\n        \"denki anma\": \"電氣按摩\",\n        \"foot insertion\": \"足插入\",\n        \"footjob\": \"足交\",\n        \"multiple footjob\": \"多重足交\",\n        \"sockjob\": \"襪交🧦\",\n        \"animegao\": \"頭殼\",\n        \"apron\": \"圍裙\",\n        \"bandages\": \"繃帶\",\n        \"bike shorts\": \"腳踏車短褲\",\n        \"bikini\": \"比基尼👙\",\n        \"bloomers\": \"裙褲\",\n        \"bodystocking\": \"連身襪\",\n        \"bodysuit\": \"緊身衣褲\",\n        \"bride\": \"婚紗\",\n        \"business suit\": \"西裝\",\n        \"butler\": \"管家\",\n        \"cashier\": \"收銀員\",\n        \"cheerleader\": \"啦啦隊員\",\n        \"chinese dress\": \"旗袍\",\n        \"christmas\": \"聖誕裝🎅\",\n        \"clothed female nude male\": \"裸男\",\n        \"clown\": \"小丑🤡\",\n        \"condom\": \"避孕套\",\n        \"corset\": \"緊身胸衣\",\n        \"cosplaying\": \"Cosplay\",\n        \"crossdressing\": \"異性裝\",\n        \"detached sleeves\": \"分離袖子\",\n        \"diaper\": \"尿布\",\n        \"dougi\": \"練功服🥋\",\n        \"exposed clothing\": \"開洞裝\",\n        \"fishnets\": \"漁網\",\n        \"fundoshi\": \"六尺褌\",\n        \"garter belt\": \"吊襪帶\",\n        \"gothic lolita\": \"哥特蘿莉裝\",\n        \"gymshorts\": \"運動短褲\",\n        \"haigure\": \"高叉裝\",\n        \"headphones\": \"頭戴式耳機\",\n        \"high heels\": \"高跟鞋\",\n        \"hijab\": \"頭巾\",\n        \"hotpants\": \"熱褲\",\n        \"kimono\": \"和服👘\",\n        \"kindergarten uniform\": \"幼兒園制服\",\n        \"kunoichi\": \"女忍裝\",\n        \"lab coat\": \"白大褂\",\n        \"latex\": \"乳膠緊身衣\",\n        \"leotard\": \"緊身衣\",\n        \"lingerie\": \"情趣內衣\",\n        \"living clothes\": \"生物衣\",\n        \"magical girl\": \"魔法少女\",\n        \"maid\": \"女僕裝\",\n        \"mecha boy\": \"機男\",\n        \"metal armor\": \"金屬盔甲\",\n        \"miko\": \"巫女裝\",\n        \"military\": \"軍裝\",\n        \"nazi\": \"納粹軍裝\",\n        \"ninja\": \"忍者裝\",\n        \"nun\": \"修女服\",\n        \"nurse\": \"護士裝\",\n        \"painted nails\": \"美甲\",\n        \"pantyhose\": \"連褲襪\",\n        \"pasties\": \"乳貼\",\n        \"piercing\": \"穿孔\",\n        \"pirate\": \"海盜服\",\n        \"policeman\": \"警服\",\n        \"priest\": \"牧師服\",\n        \"randoseru\": \"書包\",\n        \"schoolboy uniform\": \"男生制服\",\n        \"schoolgirl uniform\": \"女生制服\",\n        \"school gym uniform\": \"學校體操服\",\n        \"school swimsuit\": \"死庫水\",\n        \"scrotal lingerie\": \"陰囊袋\",\n        \"small penis\": \"小小鳥\",\n        \"shimapan\": \"條紋胖次\",\n        \"stewardess\": \"空姐服\",\n        \"steward\": \"男空乘服\",\n        \"stirrup legwear\": \"襪蹬\",\n        \"stockings\": \"長筒襪\",\n        \"straitjacket\": \"拘束衣\",\n        \"sundress\": \"夏裝\",\n        \"swimsuit\": \"泳裝\",\n        \"tabi socks\": \"足袋\",\n        \"thigh high boots\": \"高筒靴\",\n        \"tiara\": \"寶冠\",\n        \"tights\": \"厚連褲襪\",\n        \"tracksuit\": \"運動服\",\n        \"waiter\": \"男侍者裝\",\n        \"waitress\": \"女侍者裝\",\n        \"wet clothes\": \"溼身\",\n        \"witch\": \"女巫裝\",\n        \"double anal\": \"雙插肛門\",\n        \"gang rape\": \"輪姦\",\n        \"group\": \"亂交\",\n        \"harem\": \"後宮\",\n        \"layer cake\": \"夾心蛋糕\",\n        \"mmm threesome\": \"男3P\",\n        \"multiple straddling\": \"多人跨騎\",\n        \"oyakodon\": \"父子丼\",\n        \"shimaidon\": \"兄弟丼\",\n        \"triple anal\": \"三插肛門\",\n        \"twins\": \"雙胞胎\",\n        \"all the way through\": \"消化道貫穿\",\n        \"double penetration\": \"雙重插入\",\n        \"triple penetration\": \"三重插入\",\n        \"clamp\": \"夾具\",\n        \"glory hole\": \"尋歡洞\",\n        \"machine\": \"機械奸\",\n        \"onahole\": \"飛機杯\",\n        \"pillory\": \"枷具\",\n        \"pole dancing\": \"鋼管舞\",\n        \"sex toys\": \"性玩具\",\n        \"speculum\": \"擴張器\",\n        \"strap-on\": \"穿戴式陽具\",\n        \"syringe\": \"注射器\",\n        \"tail plug\": \"尾塞\",\n        \"tube\": \"插管\",\n        \"unusual insertions\": \"異物插入\",\n        \"vacbed\": \"真空床\",\n        \"whip\": \"鞭打\",\n        \"wooden horse\": \"木馬\",\n        \"wormhole\": \"蟲洞\",\n        \"oil\": \"油\",\n        \"underwater\": \"水下\",\n        \"blood\": \"血液\",\n        \"apparel bukkake\": \"穿衣顏射\",\n        \"bukkake\": \"顏射\",\n        \"cum bath\": \"精液浴\",\n        \"giant sperm\": \"巨大精子\",\n        \"internal urination\": \"內部排尿\",\n        \"omorashi\": \"漏尿\",\n        \"public use\": \"肉便器\",\n        \"scat\": \"糞便💩\",\n        \"sweating\": \"出汗\",\n        \"urination\": \"排尿\",\n        \"chikan\": \"痴漢\",\n        \"rape\": \"強姦\",\n        \"bdsm\": \"調教\",\n        \"domination loss\": \"統治丟失\",\n        \"food on body\": \"男體盛\",\n        \"forniphilia\": \"人體傢俱\",\n        \"human cattle\": \"人類飼養\",\n        \"josou seme\": \"女裝攻\",\n        \"orgasm denial\": \"高潮禁止\",\n        \"petplay\": \"人寵\",\n        \"slave\": \"奴隸\",\n        \"smalldom\": \"逆體格差\",\n        \"tickling\": \"撓癢\",\n        \"bondage\": \"束縛\",\n        \"fanny packing\": \"人肉腰包\",\n        \"harness\": \"挽具\",\n        \"shibari\": \"捆綁\",\n        \"stuck in wall\": \"卡在牆上\",\n        \"abortion\": \"墮胎\",\n        \"cannibalism\": \"食人\",\n        \"cbt\": \"虐屌\",\n        \"dismantling\": \"拆解\",\n        \"guro\": \"獵奇\",\n        \"electric shocks\": \"電擊\",\n        \"ryona\": \"凌虐\",\n        \"snuff\": \"殺害\",\n        \"torture\": \"拷打\",\n        \"trampling\": \"踐踏\",\n        \"wrestling\": \"摔角\",\n        \"autofellatio\": \"自吹\",\n        \"clone\": \"克隆\",\n        \"masturbation\": \"自慰\",\n        \"phone sex\": \"電話性愛\",\n        \"selfcest\": \"自交\",\n        \"solo action\": \"自摸\",\n        \"table masturbation\": \"桌角自慰\",\n        \"blind\": \"失明\",\n        \"handicapped\": \"身障\",\n        \"mute\": \"啞巴\",\n        \"full tour\": \"消化道遊覽\",\n        \"cuntboy\": \"人妖♀\",\n        \"feminization\": \"女性化\",\n        \"gender change\": \"性轉換\",\n        \"gender morph\": \"女體化\",\n        \"otokofutanari\": \"扶他\",\n        \"bisexual\": \"雙性戀\",\n        \"dickgirl on male\": \"扶上男\",\n        \"first person perspective\": \"第一人稱視角\",\n        \"x-ray\": \"透視\",\n        \"blackmail\": \"要挾\",\n        \"coach\": \"教練\",\n        \"impregnation\": \"受孕\",\n        \"mesugaki\": \"雄小鬼\",\n        \"prostitution\": \"賣淫\",\n        \"teacher\": \"教師\",\n        \"tomgirl\": \"偽娘\",\n        \"tutor\": \"家庭教師\",\n        \"virginity\": \"喪失童貞\",\n        \"vtuber\": \"虛擬主播\",\n        \"widower\": \"鰥夫\",\n        \"yandere\": \"病嬌\",\n        \"yaoi\": \"男同\",\n        \"males only\": \"純男性⚣\",\n        \"pussyboys only\": \"純扶他\",\n        \"sole male\": \"單男主\",\n        \"sole pussyboy\": \"單扶他\",\n        \"cheating\": \"出軌\",\n        \"netorare\": \"NTR\",\n        \"netorase\": \"綠帽癖\",\n        \"swinging\": \"換夫\",\n        \"brother\": \"兄弟\",\n        \"cousin\": \"表兄弟\",\n        \"father\": \"父親\",\n        \"grandfather\": \"祖父\",\n        \"incest\": \"亂倫\",\n        \"inseki\": \"姻戚\",\n        \"uncle\": \"叔叔\",\n        \"exhibitionism\": \"露陰癖\",\n        \"filming\": \"攝像\",\n        \"forced exposure\": \"強制暴露\",\n        \"hidden sex\": \"隱蔽性交\",\n        \"humiliation\": \"屈辱\",\n        \"voyeurism\": \"偷窺\",\n        \"low bestiality\": \"低存在獸交\",\n        \"low guro\": \"低存在獵奇\",\n        \"low scat\": \"低存在排便\",\n        \"low shotacon\": \"低存在正太\",\n        \"low smegma\": \"低存在陰垢\",\n        \"focus anal\": \"高存在肛交\",\n        \"focus blowjob\": \"高存在口交\",\n        \"focus paizuri\": \"高存在乳交\"\n    },\n    \"female\": {\n        \"age progression\": \"年齡增長\",\n        \"age regression\": \"返老還童\",\n        \"infantilism\": \"幼稚型\",\n        \"lolicon\": \"蘿莉\",\n        \"milf\": \"熟女\",\n        \"old lady\": \"老女人\",\n        \"toddlercon\": \"幼女\",\n        \"amputee\": \"截肢\",\n        \"big muscles\": \"大肌肉\",\n        \"body modification\": \"身體改造\",\n        \"conjoined\": \"連體\",\n        \"doll joints\": \"關節娃娃\",\n        \"gijinka\": \"擬人化\",\n        \"inflation\": \"腹部膨脹\",\n        \"invisible\": \"透明\",\n        \"multiple arms\": \"多臂\",\n        \"multiple breasts\": \"多乳房\",\n        \"muscle\": \"肌肉\",\n        \"muscle growth\": \"肌肉成長\",\n        \"shapening\": \"平面化\",\n        \"stretching\": \"拉伸\",\n        \"tailjob\": \"尾交\",\n        \"wingjob\": \"翼交\",\n        \"wings\": \"翅膀\",\n        \"absorption\": \"吸收\",\n        \"futanarization\": \"扶她化\",\n        \"petrification\": \"石化\",\n        \"transformation\": \"變身\",\n        \"alien girl\": \"外星女👽\",\n        \"angel\": \"天使\",\n        \"bat girl\": \"蝙蝠娘\",\n        \"bear girl\": \"狗熊娘\",\n        \"bee girl\": \"蜂女\",\n        \"bird girl\": \"鳥娘\",\n        \"bunny girl\": \"兔女郎\",\n        \"catgirl\": \"貓女\",\n        \"centaur\": \"半人馬\",\n        \"cowgirl\": \"牛女孩\",\n        \"deer girl\": \"鹿女孩\",\n        \"demon girl\": \"惡魔女孩\",\n        \"dog girl\": \"狗女孩\",\n        \"draenei\": \"德萊尼\",\n        \"elephant girl\": \"象女孩\",\n        \"fairy\": \"仙女🧚‍♀️\",\n        \"frog girl\": \"青蛙女孩\",\n        \"fox girl\": \"狐女\",\n        \"furry\": \"毛茸茸\",\n        \"giraffe girl\": \"長頸鹿娘\",\n        \"ghost\": \"幽靈👻\",\n        \"goblin\": \"哥布林\",\n        \"harpy\": \"鳥人\",\n        \"horse girl\": \"馬女孩\",\n        \"human on furry\": \"人毛\",\n        \"hyena girl\": \"鬣狗女孩\",\n        \"insect girl\": \"昆蟲女孩\",\n        \"kappa\": \"河童\",\n        \"lizard girl\": \"蜥蜴女孩\",\n        \"mermaid\": \"美人魚🧜‍♀️\",\n        \"monkey girl\": \"猴女孩\",\n        \"monster girl\": \"魔物娘\",\n        \"mouse girl\": \"鼠女孩\",\n        \"necrophilia\": \"姦屍\",\n        \"oni\": \"鬼\",\n        \"orc\": \"半獸人\",\n        \"otter girl\": \"水獺女孩\",\n        \"panda girl\": \"熊貓娘\",\n        \"pig girl\": \"豬女\",\n        \"plant girl\": \"植物女孩\",\n        \"raccoon girl\": \"浣熊女孩\",\n        \"robot\": \"機器人🤖\",\n        \"shark girl\": \"鯊女孩\",\n        \"sheep girl\": \"羊女孩\",\n        \"slime\": \"史萊姆\",\n        \"slime girl\": \"史萊姆女孩\",\n        \"snail girl\": \"蝸牛女孩\",\n        \"snake girl\": \"蛇女\",\n        \"spider girl\": \"蜘蛛娘\",\n        \"squid girl\": \"烏賊娘\",\n        \"squirrel girl\": \"松鼠娘\",\n        \"skunk girl\": \"臭鼬娘\",\n        \"tentacles\": \"觸手\",\n        \"vampire\": \"吸血鬼🧛‍♀️\",\n        \"wolf girl\": \"狼女孩\",\n        \"zombie\": \"僵屍🧟‍♀️\",\n        \"animal on animal\": \"獸獸\",\n        \"animal on furry\": \"獸毛\",\n        \"bear\": \"熊🐻\",\n        \"bestiality\": \"獸交\",\n        \"cat\": \"貓🐈\",\n        \"cow\": \"牛🐄\",\n        \"crab\": \"螃蟹🦀\",\n        \"deer\": \"鹿🦌\",\n        \"dinosaur\": \"恐龍🦕\",\n        \"dog\": \"狗🐩\",\n        \"dolphin\": \"海豚🐬\",\n        \"donkey\": \"驢\",\n        \"dragon\": \"龍🐉\",\n        \"eel\": \"鰻魚\",\n        \"elephant\": \"象🐘\",\n        \"fish\": \"魚🐟\",\n        \"fox\": \"狐狸🦊\",\n        \"frog\": \"青蛙🐸\",\n        \"goat\": \"山羊🐐\",\n        \"horse\": \"馬🐎\",\n        \"insect\": \"昆蟲🐜\",\n        \"kangaroo\": \"袋鼠\",\n        \"lioness\": \"獅🦁\",\n        \"maggot\": \"蛆🐛\",\n        \"monkey\": \"猴🐒\",\n        \"mouse\": \"鼠🐁\",\n        \"octopus\": \"章魚🦑\",\n        \"pegasus\": \"天馬\",\n        \"pig\": \"豬🐖\",\n        \"rabbit\": \"兔🐇\",\n        \"reptile\": \"爬蟲\",\n        \"rhinoceros\": \"犀牛🦏\",\n        \"sheep\": \"綿羊🐑\",\n        \"shark\": \"鯊🦈\",\n        \"slug\": \"蛞蝓\",\n        \"snake\": \"蛇🐍\",\n        \"spider\": \"蜘蛛🕷\",\n        \"tiger\": \"虎🐅\",\n        \"turtle\": \"龜🐢\",\n        \"unicorn\": \"獨角獸🦄\",\n        \"whale\": \"鯨🐋\",\n        \"wolf\": \"狼🐺\",\n        \"worm\": \"蠕蟲\",\n        \"zebra\": \"斑馬🦓\",\n        \"giantess\": \"女巨人\",\n        \"growth\": \"巨大化\",\n        \"midget\": \"侏儒\",\n        \"minigirl\": \"迷你女孩\",\n        \"shrinking\": \"縮小\",\n        \"tall girl\": \"高個女\",\n        \"albino\": \"白化\",\n        \"body writing\": \"身體寫作\",\n        \"body painting\": \"身體繪畫\",\n        \"dark skin\": \"黑皮\",\n        \"freckles\": \"雀斑\",\n        \"gyaru\": \"辣妹\",\n        \"large tattoo\": \"全身紋身\",\n        \"lipstick mark\": \"口紅印\",\n        \"scar\": \"瘢痕\",\n        \"skinsuit\": \"人皮衣\",\n        \"tanlines\": \"曬痕\",\n        \"anorexic\": \"瘦骨嶙峋\",\n        \"bbw\": \"胖女人\",\n        \"ssbbw\": \"超級胖女人\",\n        \"weight gain\": \"體重增加\",\n        \"ahegao\": \"阿黑顏\",\n        \"beauty mark\": \"美人痣\",\n        \"brain fuck\": \"腦交🧠\",\n        \"cockslapping\": \"屌打耳光\",\n        \"crown\": \"王冠👑\",\n        \"ear fuck\": \"耳交👂\",\n        \"elf\": \"精靈🧝‍♀️\",\n        \"facesitting\": \"坐臉\",\n        \"facial hair\": \"鬍子\",\n        \"gasmask\": \"防毒面具\",\n        \"halo\": \"光環\",\n        \"headless\": \"無頭\",\n        \"hood\": \"帽兜\",\n        \"horns\": \"角\",\n        \"kemonomimi\": \"獸耳\",\n        \"kigurumi pajama\": \"動物連體睡衣\",\n        \"makeup\": \"化妝\",\n        \"masked face\": \"假面\",\n        \"mouth mask\": \"口罩\",\n        \"thick eyebrows\": \"濃眉\",\n        \"afro\": \"爆炸頭\",\n        \"bald\": \"禿頭\",\n        \"drill hair\": \"螺旋辮\",\n        \"eye-covering bang\": \"長瀏海\",\n        \"hair buns\": \"丸子頭\",\n        \"hairjob\": \"髮交\",\n        \"pixie cut\": \"精靈頭\",\n        \"ponytail\": \"馬尾辮\",\n        \"prehensile hair\": \"抓頭髮\",\n        \"shaved head\": \"光頭\",\n        \"twintails\": \"雙馬尾\",\n        \"very long hair\": \"超長髮\",\n        \"body swap\": \"換身\",\n        \"chloroform\": \"迷藥\",\n        \"corruption\": \"墮落\",\n        \"drugs\": \"藥物\",\n        \"drunk\": \"醉酒\",\n        \"emotionless sex\": \"性冷淡\",\n        \"mind break\": \"洗腦\",\n        \"mind control\": \"催眠\",\n        \"moral degeneration\": \"道德退化\",\n        \"parasite\": \"寄生\",\n        \"personality excretion\": \"人格排泄\",\n        \"possession\": \"附身\",\n        \"shared senses\": \"感官共享\",\n        \"sleeping\": \"睡覺\",\n        \"blindfold\": \"遮眼布\",\n        \"closed eyes\": \"閉眼\",\n        \"crying\": \"流淚\",\n        \"cum in eye\": \"眼射\",\n        \"dark sclera\": \"黑眼白\",\n        \"eye penetration\": \"插入眼睛\",\n        \"eyemask\": \"眼部面具\",\n        \"eyepatch\": \"眼罩\",\n        \"glasses\": \"眼鏡👓\",\n        \"heterochromia\": \"異色瞳\",\n        \"monoeye\": \"獨眼\",\n        \"sunglasses\": \"太陽眼鏡🕶\",\n        \"unusual pupils\": \"異瞳\",\n        \"nose fuck\": \"鼻交\",\n        \"nose hook\": \"鼻吊鉤\",\n        \"smell\": \"氣味\",\n        \"adventitious mouth\": \"畸位口\",\n        \"big lips\": \"大嘴唇💋\",\n        \"blowjob\": \"口交\",\n        \"blowjob face\": \"口交顏\",\n        \"braces\": \"牙套\",\n        \"burping\": \"打嗝\",\n        \"coprophagia\": \"食糞\",\n        \"deepthroat\": \"深喉\",\n        \"double blowjob\": \"一口二鳥\",\n        \"foot licking\": \"舔足\",\n        \"gag\": \"口塞\",\n        \"gokkun\": \"飲精\",\n        \"kissing\": \"接吻💏\",\n        \"long tongue\": \"長舌👅\",\n        \"multimouth blowjob\": \"多口口交\",\n        \"piss drinking\": \"飲尿\",\n        \"rimjob\": \"舔肛\",\n        \"saliva\": \"唾液\",\n        \"smoking\": \"吸菸🚬\",\n        \"tooth brushing\": \"刷牙\",\n        \"unusual teeth\": \"異齒\",\n        \"vomit\": \"嘔吐🤮\",\n        \"vore\": \"吞食\",\n        \"asphyxiation\": \"窒息\",\n        \"collar\": \"項圈\",\n        \"hanging\": \"絞刑\",\n        \"leash\": \"狗鏈\",\n        \"armpit licking\": \"腋下舔\",\n        \"armpit sex\": \"腋交\",\n        \"hairy armpits\": \"腋毛\",\n        \"fingering\": \"指法\",\n        \"fisting\": \"拳交💪\",\n        \"gloves\": \"手套\",\n        \"handjob\": \"打手槍\",\n        \"multiple handjob\": \"多重打手槍\",\n        \"big areolae\": \"大乳暈\",\n        \"big breasts\": \"巨乳\",\n        \"breast expansion\": \"乳房膨脹\",\n        \"breast feeding\": \"哺乳\",\n        \"breast reduction\": \"乳房縮小\",\n        \"gigantic breasts\": \"極乳\",\n        \"huge breasts\": \"超乳\",\n        \"lactation\": \"母乳\",\n        \"milking\": \"擠奶\",\n        \"multiple paizuri\": \"多重乳交\",\n        \"oppai loli\": \"巨乳蘿莉\",\n        \"paizuri\": \"乳交\",\n        \"clothed paizuri\": \"穿衣乳交\",\n        \"small breasts\": \"貧乳\",\n        \"big nipples\": \"大乳頭\",\n        \"dark nipples\": \"暗色乳頭\",\n        \"dicknipples\": \"陰莖乳頭\",\n        \"inverted nipples\": \"乳頭內陷\",\n        \"multiple nipples\": \"多乳頭\",\n        \"nipple birth\": \"乳頭出產\",\n        \"nipple expansion\": \"乳頭膨脹\",\n        \"nipple fuck\": \"乳穴性交\",\n        \"nipple piercing\": \"乳頭穿孔\",\n        \"nipple stimulation\": \"乳頭刺激\",\n        \"cumflation\": \"精液膨脹\",\n        \"navel fuck\": \"肚臍奸\",\n        \"pregnant\": \"懷孕\",\n        \"stomach deformation\": \"腹部變形\",\n        \"ball-less shemale\": \"無蛋人妖\",\n        \"chastity belt\": \"貞操帶\",\n        \"crotch tattoo\": \"淫紋\",\n        \"full-packaged futanari\": \"有蛋扶她\",\n        \"genital piercing\": \"性器穿孔\",\n        \"hairy\": \"多毛\",\n        \"mesuiki\": \"干高潮\",\n        \"multiple orgasms\": \"連續高潮\",\n        \"pantyjob\": \"內褲交\",\n        \"pubic stubble\": \"陰毛渣\",\n        \"urethra insertion\": \"尿道插入\",\n        \"adventitious penis\": \"畸位陰莖\",\n        \"ball caressing\": \"揉蛋\",\n        \"balls expansion\": \"睪丸生長\",\n        \"ball sucking\": \"吸球\",\n        \"balljob\": \"球交\",\n        \"big balls\": \"大睪丸\",\n        \"big penis\": \"大根\",\n        \"cockphagia\": \"陰莖吞食\",\n        \"cock ring\": \"鎖精環\",\n        \"frottage\": \"陰莖摩擦🤺\",\n        \"horse cock\": \"馬根\",\n        \"huge penis\": \"巨根\",\n        \"multiple penises\": \"多種雞雞\",\n        \"penis birth\": \"陰莖出產\",\n        \"penis enlargement\": \"陰莖生長\",\n        \"phimosis\": \"包莖\",\n        \"prostate massage\": \"前列腺按摩\",\n        \"retractable penis\": \"可伸縮陰莖\",\n        \"smegma\": \"陰垢\",\n        \"adventitious vagina\": \"畸位陰道\",\n        \"big clit\": \"大陰蒂\",\n        \"big vagina\": \"大陰道\",\n        \"cervix penetration\": \"宮頸穿透\",\n        \"cervix prolapse\": \"宮頸脫垂\",\n        \"clit growth\": \"陰蒂生長\",\n        \"clit insertion\": \"陰蒂插入\",\n        \"clit stimulation\": \"陰蒂刺激\",\n        \"cunnilingus\": \"舔陰\",\n        \"defloration\": \"破處\",\n        \"multiple vaginas\": \"多陰道\",\n        \"tribadism\": \"磨豆腐\",\n        \"unbirth\": \"入陰\",\n        \"vaginal birth\": \"陰道出產\",\n        \"anal\": \"爆肛\",\n        \"anal birth\": \"肛門出產\",\n        \"anal intercourse\": \"肛交\",\n        \"analphagia\": \"肛門吞食\",\n        \"anal prolapse\": \"脫肛\",\n        \"ass expansion\": \"臀部膨脹\",\n        \"assjob\": \"尻交\",\n        \"big ass\": \"大屁股\",\n        \"enema\": \"灌腸\",\n        \"farting\": \"放屁\",\n        \"multiple assjob\": \"多重尻交\",\n        \"spanking\": \"打屁股\",\n        \"tail\": \"尾巴\",\n        \"tailphagia\": \"尾巴吞食\",\n        \"eggs\": \"產卵\",\n        \"gaping\": \"敞口\",\n        \"large insertions\": \"大玩具\",\n        \"nakadashi\": \"中出\",\n        \"prolapse\": \"脫垂\",\n        \"kneepit sex\": \"膝下性交\",\n        \"leg lock\": \"勾腿\",\n        \"legjob\": \"腿交\",\n        \"sumata\": \"股間性交\",\n        \"denki anma\": \"電氣按摩\",\n        \"foot insertion\": \"足插入\",\n        \"footjob\": \"足交\",\n        \"multiple footjob\": \"多重足交\",\n        \"sockjob\": \"襪交🧦\",\n        \"animegao\": \"頭殼\",\n        \"apron\": \"圍裙\",\n        \"bandages\": \"繃帶\",\n        \"vaginal sticker\": \"陰貼\",\n        \"bandaid\": \"OK繃\",\n        \"bike shorts\": \"自行車短褲\",\n        \"bikini\": \"比基尼👙\",\n        \"bloomers\": \"燈籠褲\",\n        \"bodystocking\": \"連身襪\",\n        \"bodysuit\": \"緊身衣褲\",\n        \"bride\": \"婚紗\",\n        \"business suit\": \"西裝\",\n        \"butler\": \"管家\",\n        \"cashier\": \"收銀員\",\n        \"cheerleader\": \"啦啦隊員\",\n        \"chinese dress\": \"旗袍\",\n        \"christmas\": \"聖誕裝🤶\",\n        \"clothed male nude female\": \"裸女\",\n        \"clown\": \"小丑🤡\",\n        \"condom\": \"保險套\",\n        \"corset\": \"緊身胸衣\",\n        \"cosplaying\": \"Cosplay\",\n        \"crossdressing\": \"異性裝\",\n        \"detached sleeves\": \"分離袖子\",\n        \"diaper\": \"尿布\",\n        \"dougi\": \"練功服🥋\",\n        \"exposed clothing\": \"開洞裝\",\n        \"fishnets\": \"漁網\",\n        \"fundoshi\": \"六尺褌\",\n        \"garter belt\": \"吊襪帶\",\n        \"gothic lolita\": \"哥德蘿莉裝\",\n        \"gymshorts\": \"運動短褲\",\n        \"haigure\": \"高叉裝\",\n        \"headphones\": \"頭戴式耳機\",\n        \"high heels\": \"高跟鞋\",\n        \"hijab\": \"頭巾\",\n        \"hotpants\": \"熱褲\",\n        \"kimono\": \"和服👘\",\n        \"kindergarten uniform\": \"幼兒園制服\",\n        \"kunoichi\": \"女忍裝\",\n        \"lab coat\": \"白袍\",\n        \"latex\": \"乳膠緊身衣\",\n        \"leotard\": \"緊身衣\",\n        \"lingerie\": \"情趣內衣\",\n        \"living clothes\": \"生物衣\",\n        \"magical girl\": \"魔法少女\",\n        \"maid\": \"女僕裝\",\n        \"mecha girl\": \"機娘\",\n        \"metal armor\": \"金屬盔甲\",\n        \"miko\": \"巫女裝\",\n        \"military\": \"軍裝\",\n        \"nazi\": \"納粹軍裝\",\n        \"nun\": \"修女服\",\n        \"nurse\": \"護士裝\",\n        \"painted nails\": \"美甲\",\n        \"pantyhose\": \"褲襪\",\n        \"pasties\": \"乳貼\",\n        \"piercing\": \"穿孔\",\n        \"pirate\": \"海盜服\",\n        \"policewoman\": \"警服\",\n        \"ponygirl\": \"小馬女\",\n        \"race queen\": \"賽車女郎\",\n        \"randoseru\": \"書包\",\n        \"sarashi\": \"纏胸布\",\n        \"schoolboy uniform\": \"男生制服\",\n        \"schoolgirl uniform\": \"女生制服\",\n        \"school gym uniform\": \"學校體操服\",\n        \"school swimsuit\": \"死庫水\",\n        \"scrotal lingerie\": \"陰囊袋\",\n        \"small penis\": \"小小鳥\",\n        \"shimapan\": \"條紋胖次\",\n        \"stewardess\": \"空姐服\",\n        \"stirrup legwear\": \"馬鐙褲\",\n        \"stockings\": \"長筒襪\",\n        \"straitjacket\": \"拘束衣\",\n        \"sundress\": \"夏裝\",\n        \"swimsuit\": \"泳裝\",\n        \"tabi socks\": \"足袋\",\n        \"thigh high boots\": \"高筒靴\",\n        \"tiara\": \"寶冠\",\n        \"tights\": \"厚褲襪\",\n        \"tracksuit\": \"運動服\",\n        \"transparent clothing\": \"透明服裝\",\n        \"waiter\": \"男侍者裝\",\n        \"waitress\": \"女侍者裝\",\n        \"wet clothes\": \"濕身\",\n        \"witch\": \"女巫裝\",\n        \"double anal\": \"雙插肛門\",\n        \"double vaginal\": \"雙插陰道\",\n        \"fff threesome\": \"女3P\",\n        \"fft threesome\": \"女扶女3P\",\n        \"gang rape\": \"輪姦\",\n        \"group\": \"亂交\",\n        \"harem\": \"後宮\",\n        \"layer cake\": \"夾心蛋糕\",\n        \"multiple straddling\": \"多人跨騎\",\n        \"oyakodon\": \"母女丼\",\n        \"shimaidon\": \"姐妹丼\",\n        \"triple anal\": \"三插肛門\",\n        \"triple vaginal\": \"三插陰道\",\n        \"ttf threesome\": \"扶女扶3P\",\n        \"ttt threesome\": \"扶3P\",\n        \"twins\": \"雙胞胎\",\n        \"all the way through\": \"消化道貫穿\",\n        \"double penetration\": \"雙重插入\",\n        \"triple penetration\": \"三重插入\",\n        \"clamp\": \"夾具\",\n        \"glory hole\": \"尋歡洞\",\n        \"machine\": \"機械姦\",\n        \"onahole\": \"飛機杯\",\n        \"pillory\": \"枷具\",\n        \"pole dancing\": \"鋼管舞\",\n        \"real doll\": \"充氣娃娃\",\n        \"sex toys\": \"性玩具\",\n        \"speculum\": \"擴張器\",\n        \"strap-on\": \"穿戴式陽具\",\n        \"syringe\": \"注射器\",\n        \"tail plug\": \"尾塞\",\n        \"tube\": \"插管\",\n        \"unusual insertions\": \"異物插入\",\n        \"vacbed\": \"真空床\",\n        \"whip\": \"鞭打\",\n        \"wooden horse\": \"木馬\",\n        \"wormhole\": \"蟲洞\",\n        \"oil\": \"油\",\n        \"underwater\": \"水下\",\n        \"blood\": \"血液\",\n        \"squirting\": \"潮吹\",\n        \"apparel bukkake\": \"穿衣顏射\",\n        \"bukkake\": \"顏射\",\n        \"cum bath\": \"精液浴\",\n        \"cum swap\": \"交換精液\",\n        \"giant sperm\": \"巨大精子\",\n        \"internal urination\": \"內部排尿\",\n        \"menstruation\": \"經血\",\n        \"omorashi\": \"漏尿\",\n        \"public use\": \"肉便器\",\n        \"scat\": \"糞便💩\",\n        \"scat insertion\": \"糞便插入\",\n        \"sweating\": \"出汗\",\n        \"urination\": \"排尿\",\n        \"chikan\": \"痴漢\",\n        \"rape\": \"強姦\",\n        \"bdsm\": \"調教\",\n        \"femdom\": \"女性主導\",\n        \"domination loss\": \"統治 失\",\n        \"food on body\": \"女體盛\",\n        \"forniphilia\": \"人體家具\",\n        \"human cattle\": \"人類飼養\",\n        \"orgasm denial\": \"高潮禁止\",\n        \"petplay\": \"人寵\",\n        \"slave\": \"奴隸\",\n        \"smalldom\": \"逆體格差\",\n        \"tickling\": \"抓癢\",\n        \"bondage\": \"束縛\",\n        \"fanny packing\": \"人肉腰包\",\n        \"harness\": \"挽具\",\n        \"shibari\": \"捆綁\",\n        \"stuck in wall\": \"卡在牆上\",\n        \"abortion\": \"墮胎\",\n        \"cannibalism\": \"食人\",\n        \"catfight\": \"貓斗\",\n        \"cbt\": \"虐屌\",\n        \"cuntbusting\": \"陰道破壞\",\n        \"dismantling\": \"拆解\",\n        \"guro\": \"獵奇\",\n        \"electric shocks\": \"電擊\",\n        \"ryona\": \"凌虐\",\n        \"snuff\": \"殺害\",\n        \"torture\": \"拷打\",\n        \"trampling\": \"踐踏\",\n        \"wrestling\": \"摔角\",\n        \"autofellatio\": \"自吹\",\n        \"autopaizuri\": \"自乳交\",\n        \"clone\": \"複製\",\n        \"masturbation\": \"自慰\",\n        \"phone sex\": \"電話性愛\",\n        \"selfcest\": \"自交\",\n        \"solo action\": \"自摸\",\n        \"table masturbation\": \"桌角自慰\",\n        \"blind\": \"失明\",\n        \"handicapped\": \"身障\",\n        \"mute\": \"啞巴\",\n        \"full tour\": \"消化道遊覽\",\n        \"futanari\": \"扶她\",\n        \"gender change\": \"性轉換\",\n        \"gender morph\": \"男體化\",\n        \"shemale\": \"人妖♂\",\n        \"bisexual\": \"雙性戀\",\n        \"dickgirl on dickgirl\": \"扶上扶\",\n        \"dickgirl on female\": \"扶上女\",\n        \"male on dickgirl\": \"男上扶\",\n        \"first person perspective\": \"第一人稱視角\",\n        \"x-ray\": \"透視\",\n        \"blackmail\": \"要挾\",\n        \"coach\": \"教練\",\n        \"impregnation\": \"受孕\",\n        \"mesugaki\": \"雌小鬼\",\n        \"prostitution\": \"賣淫\",\n        \"teacher\": \"教師\",\n        \"tomboy\": \"假小子\",\n        \"tutor\": \"家庭教師\",\n        \"vtuber\": \"虛擬主播\",\n        \"widow\": \"寡婦\",\n        \"yandere\": \"病嬌\",\n        \"yuri\": \"百合\",\n        \"dickgirls only\": \"純扶她\",\n        \"females only\": \"純女性⚢\",\n        \"sole dickgirl\": \"單扶她\",\n        \"sole female\": \"單女主\",\n        \"cheating\": \"出軌\",\n        \"netorare\": \"NTR\",\n        \"netorase\": \"綠帽癖\",\n        \"swinging\": \"換妻\",\n        \"aunt\": \"阿姨\",\n        \"cousin\": \"表姐妹\",\n        \"daughter\": \"女兒\",\n        \"granddaughter\": \"孫女\",\n        \"grandmother\": \"祖母\",\n        \"incest\": \"亂倫\",\n        \"inseki\": \"姻戚\",\n        \"mother\": \"母親\",\n        \"niece\": \"侄女\",\n        \"sister\": \"姐妹\",\n        \"exhibitionism\": \"露陰癖\",\n        \"filming\": \"攝影\",\n        \"forced exposure\": \"強制暴露\",\n        \"hidden sex\": \"隱蔽性交\",\n        \"humiliation\": \"屈辱\",\n        \"voyeurism\": \"偷窺\",\n        \"low bestiality\": \"低存在獸交\",\n        \"low guro\": \"低存在獵奇\",\n        \"low lolicon\": \"低存在蘿莉\",\n        \"low scat\": \"低存在排便\",\n        \"low smegma\": \"低存在陰垢\",\n        \"focus anal\": \"高存在肛交\",\n        \"focus blowjob\": \"高存在口交\",\n        \"focus paizuri\": \"高存在乳交\"\n    },\n    \"mixed\": {\n        \"animal on animal\": \"獸獸\",\n        \"body swap\": \"換身\",\n        \"multimouth blowjob\": \"多口口交\",\n        \"multiple handjob\": \"多重打手槍\",\n        \"frottage\": \"陰莖摩擦🤺\",\n        \"multiple assjob\": \"多重尻交\",\n        \"multiple footjob\": \"多重足交\",\n        \"nudism\": \"裸體主義\",\n        \"ffm threesome\": \"女男女3P\",\n        \"gang rape\": \"輪姦\",\n        \"group\": \"亂交\",\n        \"mmf threesome\": \"男女男3P\",\n        \"mmt threesome\": \"男扶男3P\",\n        \"mtf threesome\": \"男扶女3P\",\n        \"oyakodon\": \"親子丼\",\n        \"shimaidon\": \"手足丼\",\n        \"ttm threesome\": \"扶扶男3P\",\n        \"twins\": \"雙胞胎\",\n        \"incest\": \"亂倫\",\n        \"inseki\": \"姻戚\"\n    },\n    \"other\": {\n        \"yukkuri\": \"放輕鬆\",\n        \"dakimakura\": \"抱枕\",\n        \"time stop\": \"時間停止⏱️\",\n        \"3d\": \"3D\",\n        \"3d imageset\": \"3D圖片集\",\n        \"ai generated\": \"AI生成\",\n        \"anaglyph\": \"紅藍3D\",\n        \"animated\": \"動圖\",\n        \"comic\": \"西方漫畫\",\n        \"extraneous ads\": \"外部廣告\",\n        \"figure\": \"手辦\",\n        \"full color\": \"全彩\",\n        \"game manual\": \"遊戲手冊\",\n        \"game sprite\": \"像素畫\",\n        \"how to\": \"教程\",\n        \"multipanel sequence\": \"多格序列\",\n        \"multi-work series\": \"系列作品\",\n        \"non-h imageset\": \"無H圖片集\",\n        \"paperchild\": \"紙片人\",\n        \"redraw\": \"重繪\",\n        \"screenshots\": \"截圖\",\n        \"sketch lines\": \"線稿\",\n        \"stereoscopic\": \"立體圖\",\n        \"story arc\": \"故事線\",\n        \"themeless\": \"無主題\",\n        \"western cg\": \"西方CG\",\n        \"western non-h\": \"西方無H\",\n        \"western imageset\": \"西方圖集\",\n        \"uncensored\": \"無修正\",\n        \"mosaic censorship\": \"馬賽克修正\",\n        \"full censorship\": \"完全修正\",\n        \"hardcore\": \"硬核\",\n        \"non-nude\": \"無露點\",\n        \"already uploaded\": \"已上傳\",\n        \"defaced\": \"汙損\",\n        \"forbidden content\": \"禁止內容\",\n        \"realporn\": \"真人色情\",\n        \"replaced\": \"已替換\",\n        \"compilation\": \"彙編\",\n        \"incomplete\": \"缺頁\",\n        \"missing cover\": \"缺封面\",\n        \"out of order\": \"順序錯亂\",\n        \"sample\": \"樣本\",\n        \"scanmark\": \"掃描水印\",\n        \"watermarked\": \"水印\",\n        \"anthology\": \"選集\",\n        \"artbook\": \"畫集\",\n        \"goudoushi\": \"合作本\",\n        \"novel\": \"小說\",\n        \"soushuuhen\": \"總集篇\",\n        \"tankoubon\": \"單行本\",\n        \"variant set\": \"變體集\",\n        \"webtoon\": \"條漫\",\n        \"caption\": \"說明文字\",\n        \"rough grammar\": \"語法差\",\n        \"rough translation\": \"渣翻\",\n        \"nudity only\": \"僅裸體\",\n        \"no penetration\": \"無插入\"\n    }\n}\n"
  },
  {
    "path": "assets/translation.json",
    "content": "{\n  \"zh_CN\": {\n    \"新到书\": \"新到旧\"\n  },\n  \"zh_TW\": {\n    \"有可用更新\": \"有可用更新\",\n    \"下载管理器\": \"下載管理器\",\n    \"有未完成的下载, 是否继续?\": \"有未完成的下載, 是否繼續?\",\n    \"点击完成身份验证\": \"點擊完成身份驗證\",\n    \"否\": \"否\",\n    \"是\": \"是\",\n    \"取消\": \"取消\",\n    \"下载\": \"下載\",\n    \"了解\": \"了解\",\n    \"更多\": \"更多\",\n    \"提交\": \"提交\",\n    \"全选\": \"全選\",\n    \"导出\": \"匯出\",\n    \"查看漫画详情\": \"查看漫畫詳情\",\n    \"确认\": \"確認\",\n    \"删除\": \"刪除\",\n    \"阅读\": \"閱讀\",\n    \"暂停\": \"暫停\",\n    \"重试\": \"重試\",\n    \"继续\": \"繼續\",\n    \"清除\": \"清除\",\n    \"清除记录\": \"清除記錄\",\n    \"要清除历史记录吗?\": \"要清除歷史記錄嗎?\",\n    \"要删除这条历史记录吗\": \"要刪除這條歷史記錄嗎\",\n    \"返回\": \"返回\",\n    \"保存图片\": \"保存圖片\",\n    \"分享\": \"分享\",\n    \"登录\": \"登入\",\n    \"注册\": \"註冊\",\n    \"我\": \"我\",\n    \"探索\": \"探索\",\n    \"分类\": \"分類\",\n    \"搜索\": \"搜尋\",\n    \"排行榜\": \"排行榜\",\n    \"设置\": \"設置\",\n    \"收藏夹\": \"收藏夾\",\n    \"已下载\": \"已下載\",\n    \"Picacg游戏\": \"Picacg遊戲\",\n    \"Eh主页\": \"Eh主頁\",\n    \"Eh热门\": \"Eh熱門\",\n    \"禁漫主页\": \"禁漫主頁\",\n    \"禁漫最新\": \"禁漫最新\",\n    \"历史记录\": \"歷史記錄\",\n    \"24小时\": \"24小時\",\n    \"7天\": \"7天\",\n    \"30天\": \"30天\",\n    \"图片\": \"圖片\",\n    \"要删除已选择的项目吗? 此操作无法撤销\": \"要刪除已選擇的項目嗎? 此操作無法撤銷\",\n    \"页码\": \"頁碼\",\n    \"输入范围: \": \"輸入範圍: \",\n    \"加载中\": \"加載中\",\n    \"请选择漫画\": \"請選擇漫畫\",\n    \"一次只能导出一部漫画\": \"一次只能匯出一部漫畫\",\n    \"打包中\": \"打包中\",\n    \"未知大小\": \"未知大小\",\n    \"请选择一个漫画\": \"請選擇一個漫畫\",\n    \"查看详情\": \"查看詳情\",\n    \"下载出错\": \"下載出錯\",\n    \" 已暂停\": \" 已暫停\",\n    \" 下载中\": \" 下載中\",\n    \"@length 项下载任务\": \"@length 項下載任務\",\n    \"未登录\": \"未登入\",\n    \"网络错误\": \"網路錯誤\",\n    \"账号管理\": \"帳號管理\",\n    \"退出登录\": \"退出登入\",\n    \"重新登录\": \"重新登入\",\n    \"正在重新登录\": \"正在重新登入\",\n    \"重新登录成功\": \"重新登入成功\",\n    \"目标\": \"目標\",\n    \"禁漫漫画ID\": \"禁漫漫畫ID\",\n    \"输入禁漫漫画ID\": \"輸入禁漫漫畫ID\",\n    \"输入的ID不是数字\": \"輸入的ID不是數字\",\n    \"漫画排序模式\": \"漫畫排序模式\",\n    \"新到书\": \"新到舊\",\n    \"旧到新\": \"舊到新\",\n    \"最多喜欢\": \"最多喜歡\",\n    \"最多指名\": \"最多指名\",\n    \"最新\": \"最新\",\n    \"最多点击\": \"最多點擊\",\n    \"最多图片\": \"最多圖片\",\n    \"历史搜索\": \"歷史搜尋\",\n    \"@year 年前\": \"@year 年前\",\n    \"@month 个月前\": \"@month 個月前\",\n    \"@day 天前\": \"@day 天前\",\n    \"@hour 小时前\": \"@hour 小時前\",\n    \"@minute 分钟前\": \"@minute 分鐘前\",\n    \"刚刚\": \"剛剛\",\n    \"没有其它章节\": \"沒有其他章節\",\n    \"切换章节\": \"切換章節\",\n    \"章节\": \"章節\",\n    \"退出\": \"退出\",\n    \"第 @c 章\": \"第 @c 章\",\n    \"当前\": \"當前\",\n    \" 倒序\": \" 倒序\",\n    \"未知\": \"未知\",\n    \"继续阅读\": \"繼續閱讀\",\n    \"从头开始\": \"從頭開始\",\n    \"上次阅读到第 @ep 章第 @page 页, 是否继续阅读?\": \"上次閱讀到第 @ep 章第 @page 頁, 是否繼續閱讀?\",\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    \"评论至少需要2个字\": \"留言至少需要2個字\",\n    \"评论\": \"留言\",\n    \"下一页\": \"下一頁\",\n    \"下载游戏\": \"下載遊戲\",\n    \"将前往哔咔游戏下载页面, 是否继续\": \"將前往嗶咔遊戲下載頁面，是否繼續\",\n    \"屏幕截图\": \"螢幕截圖\",\n    \"转到注册\": \"轉到註冊\",\n    \"账号\": \"帳號\",\n    \"密码\": \"密碼\",\n    \"您的登录密码\": \"您的登入密碼\",\n    \"登录中\": \"登入中\",\n    \"登录失败\": \"登入失敗\",\n    \"两次输入的密码不一致\": \"兩次輸入的密碼不一致\",\n    \"密码至少8位\": \"密碼至少8位\",\n    \"更换头像\": \"更換頭像\",\n    \"请先选择图像\": \"請先選擇圖像\",\n    \"上传成功\": \"上傳成功\",\n    \"上传\": \"上傳\",\n    \"修改密码\": \"修改密碼\",\n    \"输入旧密码\": \"輸入舊密碼\",\n    \"输入新密码\": \"輸入新密碼\",\n    \"再输一次新密码\": \"再輸一次新密碼\",\n    \"用户名\": \"用戶名\",\n    \"等级\": \"等級\",\n    \"自我介绍\": \"自我介紹\",\n    \"更改自我介绍\": \"更改自我介紹\",\n    \"不能为空\": \"不能為空\",\n    \"要退出登录吗\": \"要登出嗎\",\n    \"选择搜索模式\": \"選擇搜尋模式\",\n    \"每周必看\": \"每週必看\",\n    \"作者\": \"作者\",\n    \"正在取消收藏\": \"正在取消收藏\",\n    \"全部收藏\": \"全部收藏\",\n    \"收藏漫画\": \"收藏漫畫\",\n    \"第1章\": \"第1章\",\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    \"igneous(非必要)\": \"igneous(非必要)\",\n    \"请填写完整\": \"請填寫完整\",\n    \"在Webview中登录\": \"在Webview中登入\",\n    \"无\": \"無\",\n    \"下载全部\": \"下載全部\",\n    \"下载选择\": \"下載選擇\",\n    \"下载漫画\": \"下載漫畫\",\n    \"关键词屏蔽\": \"關鍵詞封鎖\",\n    \"设置代理\": \"設置代理\",\n    \"检查更新\": \"檢查更新\",\n    \"当前:\": \"當前:\",\n    \"启动时检查更新\": \"啟動時檢查更新\",\n    \"设置下载目录\": \"設置下載目錄\",\n    \"缓存大小\": \"快取大小\",\n    \"计算中\": \"計算中\",\n    \"清除缓存\": \"清理快取\",\n    \"隐私\": \"隱私\",\n    \"阻止屏幕截图\": \"阻止螢幕截圖\",\n    \"需要重启App以应用更改\": \"需要重啟App以應用更改\",\n    \"如果系统中未设置任何认证方法请勿开启\": \"如果系統中未設定任何認證方法請勿開啟\",\n    \"项目地址\": \"項目地址\",\n    \"提出建议\": \"提出建議\",\n    \"正在检查更新\": \"正在檢查更新\",\n    \"关闭更新检查\": \"關閉更新檢查\",\n    \"已是最新版本\": \"已是最新版本\",\n    \"使用系统代理\": \"使用系統代理\",\n    \"使用系统代理时无法手动设置\": \"使用系統代理時無法手動設定\",\n    \"设置代理, 例如127.0.0.1:7890\": \"設置代理, 例如127.0.0.1:7890\",\n    \"禁漫天堂\": \"禁漫天堂\",\n    \"路径\": \"路徑\",\n    \"为空表示使用App数据目录\": \"為空表示使用App資料目錄\",\n    \"转移数据\": \"轉移資料\",\n    \"正在复制文件\": \"正在複製文件\",\n    \"更新成功\": \"更新成功\",\n    \"目录不存在\": \"目錄不存在\",\n    \"现在的路径为\": \"現在的路徑為\",\n    \"添加\": \"添加\",\n    \"添加屏蔽关键词\": \"添加封鎖關鍵詞\",\n    \"添加关键词\": \"添加關鍵詞\",\n    \"关键词屏蔽不会生效于收藏夹和历史记录, 屏蔽的依据仅限加载漫画列表时能够获取到的信息\": \"關鍵詞封鎖不會生效於收藏夾和歷史記錄, 封鎖僅限於加載漫畫列表時能夠獲取到的資訊\",\n    \"画廊站点\": \"畫廊站點\",\n    \"分类中漫画排序模式\": \"分類中漫畫排序模式\",\n    \"搜索中漫画排序模式\": \"搜索中漫畫排序模式\",\n    \"设置分流\": \"設置分流\",\n    \"分流1\": \"分流1\",\n    \"分流2\": \"分流2\",\n    \"分流3\": \"分流3\",\n    \"分流4\": \"分流4\",\n    \"哔咔漫画\": \"嗶咔漫畫\",\n    \"正在获取分流IP\": \"正在獲取分流IP\",\n    \"设置图片质量\": \"設置圖片品質\",\n    \"低\": \"低\",\n    \"中\": \"中\",\n    \"高\": \"高\",\n    \"原图\": \"原圖\",\n    \"设置搜索及分类排序模式\": \"設置搜尋及分類排序模式\",\n    \"显示头像框\": \"顯示頭像框\",\n    \"漫画列表显示方式\": \"漫畫列表顯示方式\",\n    \"绅士漫画\": \"紳士漫畫\",\n    \"自动打卡\": \"自動打卡\",\n    \"初始页面\": \"初始頁面\",\n    \"已下载的漫画排序方式\": \"已下載的漫畫排序方式\",\n    \"优先加载原图\": \"優先加載原圖\",\n    \"图片预加载\": \"圖片預加載\",\n    \"自动翻页时间间隔\": \"自動翻頁時間間隔\",\n    \"主题选择\": \"主題選擇\",\n    \"深色模式\": \"深色模式\",\n    \"清除所有数据\": \"清除所有資料\",\n    \"打卡成功\": \"打卡成功\",\n    \"本地\": \"本地\",\n    \"网络\": \"網路\",\n    \"导出用户数据\": \"匯出用戶資料\",\n    \"将导出设置, 账号, 历史记录, 下载内容, 本地收藏等数据\": \"將匯出設置, 帳號, 歷史記錄, 下載內容, 本地收藏等資料\",\n    \"导入用户数据\": \"匯入用戶資料\",\n    \"将导入设置, 账号, 历史记录, 下载内容, 本地收藏等数据, 现在的所有数据将会被覆盖\": \"將匯入設置, 帳號, 歷史記錄, 下載內容, 本地收藏等資料, 現在的所有資料將會被覆蓋\",\n    \"订阅\": \"訂閱\",\n    \"建议\": \"建議\",\n    \"清空\": \"清空\",\n    \"警告\": \"警告\",\n    \"此操作无法撤销, 是否继续\": \"此操作無法撤銷，是否繼續\",\n    \"新建\": \"新增\",\n    \"排序\": \"排序\",\n    \"重命名\": \"重命名\",\n    \"切换源\": \"更改來源\",\n    \"应用链接\": \"應用程式連結\",\n    \"在系统设置中管理APP支持的链接\": \"在系統設定中管理APP支援的連結\",\n    \"取消收藏\": \"取消收藏\",\n    \"本地收藏\": \"本地收藏\",\n    \"新收藏添加至\": \"新收藏新增至\",\n    \"阅读后移动本地收藏至\": \"閱讀後移動本地收藏至\",\n    \"最前\": \"最前\",\n    \"最后\": \"最後\",\n    \"无操作\": \"無操作\",\n    \"长按缩放\": \"長按縮放\",\n    \"同步数据中\": \"同步資料中\",\n    \"最少星星\": \"最少星星\",\n    \"高级选项\": \"進階選項\",\n    \"隐藏\": \"隱藏\",\n    \"规则\": \"規則\",\n    \"探索页面\": \"探索頁面\",\n    \"查看信息\": \"查看詳情\",\n    \"显示页面信息\": \"顯示頁面訊息\",\n    \"从文件导入\": \"從文件匯入\",\n    \"从网络导入\": \"從網路匯入\",\n    \"复制到\": \"複製到\",\n    \"这里什么都没有\": \"空空ㄉ\",\n    \"前往\": \"前往\",\n    \"寻找漫画\": \"尋找漫畫\",\n    \"随机\": \"隨機\",\n    \"长度\": \"長度\",\n    \"链接\": \"連結\",\n    \"排序方式\": \"排序方式\",\n    \"检查剪切板中的链接\": \"檢查剪貼簿中的連結\",\n    \"漫画块大小\": \"漫畫區塊大小\",\n    \"默认搜索源\": \"預設搜尋來源\",\n    \"启用侧边翻页栏\": \"啟用側邊翻頁欄\",\n    \"高刷新率模式\": \"高刷新率模式\",\n    \"帮助\": \"幫助\",\n    \"使用须知\": \"使用須知\",\n    \"感谢使用本软件, 请注意:\": \"感謝使用本軟體, 請注意:\",\n    \"我已阅读并知晓\": \"我已閱讀並同意\",\n    \"更多设置\": \"更多設定\",\n    \"登录账号\": \"登入帳號\",\n    \"进入APP\": \"進入APP\",\n    \"请先阅读使用须知\": \"請先閱讀使用須知\",\n    \"分类页面\": \"分類頁面\",\n    \"网络收藏页面\": \"網路收藏頁面\",\n    \"自动添加语言筛选\": \"自動新增語言篩選\",\n    \"屏蔽\": \"封鎖\",\n    \"自动翻页\": \"自動翻頁\",\n    \"全屏\": \"全螢幕\",\n    \"反转点按翻页\": \"反轉點按翻頁\",\n    \"本次更新数: \": \"本次更新數:\",\n    \", 上次更新时间: \": \", 上次更新時間:\",\n    \"下拉更新拉取页数\": \"下拉更新拉取頁數\",\n    \"支持下拉更新\": \"支援下拉更新\",\n    \"已登录 @a 个账号\": \"已登入 @a 個帳號\",\n    \"共 @a 部漫画\": \"共 @a 部漫畫\",\n    \"@a 条历史记录\": \"@a 條歷史記錄\",\n    \"显示收藏状态\": \"顯示收藏狀態\",\n    \"显示阅读位置\": \"顯示閱讀位置\",\n    \"图片收藏大小\": \"圖片收藏大小\",\n    \"图片收藏\": \"圖片收藏\",\n    \"@a 条图片收藏\": \"@a 條圖片收藏\",\n    \"要删除这个图片吗\": \"要刪除這個圖片嗎\",\n    \"图片配额\": \"圖片配額\",\n    \"已用\": \"已用\",\n    \"重置花费\": \"重置花費\",\n    \"可用货币\": \"可用貨幣\",\n    \"头像\": \"頭像\",\n    \"显示\": \"顯示\",\n    \"漫画块\": \"漫畫塊\",\n    \"下载数据失败, 已禁用同步\": \"下載資料失敗, 已禁用同步\",\n    \"固定横屏\": \"固定橫屏\",\n    \"缓存限制\": \"快取限制\",\n    \"导出不含下载的数据\": \"匯出不含下載的資料\",\n    \"导出所有数据\": \"匯出所有資料\",\n    \"如需还原之前的下载, 将路径填写为下载数据的位置, 并取消勾选转移数据\": \"如需還原之前的下載, 將路徑填寫為下載資料的位置, 並取消勾選轉移資料\",\n    \"如果导入的数据中包含下载数据, 则当前的下载数据也将被覆盖\": \"如果匯入的資料中包含下載資料, 則當前的下載資料也將被覆蓋\",\n    \"缓存大小限制\": \"快取大小限制\",\n    \"缓存数量限制\": \"快取數量限制\",\n    \"仅在退出阅读器时检查缓存是否超出限制\": \"僅在退出閱讀器時檢查快取是否超出限制\",\n    \"需要身份验证\": \"需要身份驗證\",\n    \"添加漫画源\": \"添加漫畫來源\",\n    \"选择文件\": \"選擇文件\",\n    \"优先显示副标题\": \"優先顯示副標題\",\n    \"适用于已下载的画廊\": \"適用於已下載的畫廊\",\n    \"配置文件\": \"配置文件\",\n    \"最近\": \"最近\",\n    \"获取图片信息...\": \"獲取圖片資訊...\",\n    \"快速收藏\": \"快速收藏\",\n    \"复制标题\": \"複製標題\",\n    \"复制链接\": \"複製連結\",\n    \"搜索相似\": \"搜索相似\",\n    \"点击查看详情\": \"點擊查看詳情\",\n    \"当前设备不支持\": \"當前設備不支援\",\n    \"第一章\": \"第一章\",\n    \"时间\": \"時間\",\n    \"已保存\": \"已保存\",\n    \"修改成功\": \"修改成功\",\n    \"选择图像\": \"選擇圖像\",\n    \"如果登录失效点击此处\": \"如果登入失效點擊此處\",\n    \"已登录\": \"已登入\",\n    \"无数据\": \"無資料\",\n    \"重置成功\": \"重置成功\",\n    \"重置\": \"重置\",\n    \"登录成功\": \"登入成功\",\n    \"查看\": \"查看\",\n    \"在浏览器中打开\": \"在瀏覽器中打開\",\n    \"重新加载\": \"重新加載\",\n    \"成功添加收藏\": \"成功添加收藏\",\n    \"正在添加收藏\": \"正在添加收藏\",\n    \"添加收藏失败\": \"添加收藏失敗\",\n    \"取消收藏失败\": \"取消收藏失敗\",\n    \"成功取消收藏\": \"成功取消收藏\",\n    \"倒序\": \"倒序\",\n    \"添加至本地收藏\": \"添加至本地收藏\",\n    \"要删除这个章节吗\": \"要刪除這個章節嗎\",\n    \"请输入评论\": \"請輸入評論\",\n    \"保存至本地\": \"保存至本地\",\n    \"此画廊存在令人不适的内容\\\\n在设置中可以禁用此警告\": \"此畫廊存在令人不適的內容\\\\n在設定中可以禁用此警告\",\n    \"忽略\": \"忽略\",\n    \"评分成功\": \"評分成功\",\n    \"已加入下载队列\": \"已加入下載隊列\",\n    \"EH订阅\": \"EH訂閱\",\n    \"其它漫画源的订阅尚未完成\\\\n如需管理EH订阅, 请前往EH网站\": \"其他漫畫源的訂閱尚未完成\\\\n如需管理EH訂閱, 請前往EH網站\",\n    \"查看更多\": \"查看更多\",\n    \"编辑标签\": \"編輯標籤\",\n    \"已添加下载任务\": \"已添加下載任務\",\n    \"无效的漫画\": \"無效的漫畫\",\n    \"从当前的搜索结果创建新的收藏夹\": \"從當前的搜尋結果創建新的收藏夾\",\n    \"未选择\": \"未選擇\",\n    \"选择收藏夹\": \"選擇收藏夾\",\n    \"检查漫画存活\": \"檢查漫畫存活\",\n    \"正在导出\": \"正在匯出\",\n    \"删除失败\": \"刪除失敗\",\n    \"Invalid comic source\": \"無效的漫畫來源\",\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    \"打开禁漫ID\": \"打開禁漫ID\",\n    \"选择屏幕上的图片\": \"選擇螢幕上的圖片\",\n    \"点按翻页识别范围\": \"點按翻頁識別範圍\",\n    \"深色模式下降低图片亮度\": \"深色模式下降低圖片亮度\",\n    \"翻页动画\": \"翻頁動畫\",\n    \"图片缩放\": \"圖片縮放\",\n    \"容纳\": \"容納\",\n    \"适应宽度\": \"適應寬度\",\n    \"适应高度\": \"適應高度\",\n    \"双击缩放\": \"雙擊縮放\",\n    \"限制图片最大显示宽度\": \"限制圖片最大顯示寬度\",\n    \"图片分流\": \"圖片分流\",\n    \"分流5\": \"分流5\",\n    \"分流6\": \"分流6\",\n    \"双页\": \"雙頁\",\n    \"双页(反向)\": \"雙頁(反向)\",\n    \"屏幕方向\": \"螢幕方向\",\n    \"收藏图片\": \"收藏圖片\",\n    \"成功收藏图片\": \"成功收藏圖片\",\n    \"留空表示禁用网络代理\": \"留空表示禁用網路代理\",\n    \"请在下载任务完成后进行操作\": \"請在下載任務完成後進行操作\",\n    \"允许储存权限\": \"允許儲存權限\",\n    \"需要储存权限以选取任意目录\": \"需要儲存權限以選取任意目錄\",\n    \"储存路径\": \"儲存路徑\",\n    \"请确保路径存在\": \"請確保路徑存在\",\n    \"立即执行:\": \"立即執行:\",\n    \"上传数据\": \"上傳資料\",\n    \"下载数据\": \"下載資料\",\n    \"将URL留空以禁用同步\": \"將URL留空以禁用同步\",\n    \"已禁用\": \"已禁用\",\n    \"要删除此漫画源吗?\": \"要刪除此漫畫來源嗎?\",\n    \"浏览列表\": \"瀏覽列表\",\n    \"查看帮助\": \"查看幫助\",\n    \"忽略警告\": \"忽略警告\",\n    \"漫画名\": \"漫畫名\",\n    \"作者名\": \"作者名\",\n    \"大小\": \"大小\",\n    \"漫画块显示模式\": \"漫畫塊顯示模式\",\n    \"详细\": \"詳細\",\n    \"简略\": \"簡略\",\n    \"漫画块缩略图布局\": \"漫畫塊縮略圖布局\",\n    \"覆盖\": \"覆蓋\",\n    \"完成\": \"完成\",\n    \"设置漫画排序模式\": \"設置漫畫排序模式\",\n    \"收藏夹中漫画排序模式\": \"收藏夾中漫畫排序模式\",\n    \"最新收藏\": \"最新收藏\",\n    \"最新更新\": \"最新更新\",\n    \"启用\": \"啟用\",\n    \"APP启动或是距离上次打卡间隔一天时执行\": \"APP啟動或是距離上次打卡間隔一天時執行\",\n    \"启动时执行\": \"啟動時執行\",\n    \"收藏夹漫画排序模式\": \"收藏夾漫畫排序模式\",\n    \"跟随系统\": \"跟隨系統\",\n    \"禁用\": \"禁用\",\n    \"日志\": \"日誌\",\n    \"更新\": \"更新\",\n    \"数据\": \"資料\",\n    \"确认清除缓存?\": \"確認清除快取?\",\n    \"数据同步\": \"資料同步\",\n    \"下载并行\": \"下載並行\",\n    \"Pica Comic是一个完全免费的漫画阅读APP\": \"Pica Comic是一個完全免費的漫畫閱讀APP\",\n    \"仅用于学习交流\": \"僅用於學習交流\",\n    \"提出建议(Github)\": \"提出建議(Github)\",\n    \"通过电子邮件联系我\": \"通過電子郵件聯繫我\",\n    \"支持开发\": \"支持開發\",\n    \"加入Telegram群\": \"加入Telegram群\",\n    \"图片搜索 [搜图bot酱]\": \"圖片搜索 [搜圖bot醬]\",\n    \"图片搜索 [SauceNAO]\": \"圖片搜索 [SauceNAO]\",\n    \"不支持的链接\": \"不支援的連結\",\n    \"输入链接\": \"輸入連結\",\n    \"欢迎\": \"歡迎\",\n    \"设置App外观\": \"設置App外觀\",\n    \"添加收藏\": \"添加收藏\",\n    \"普通下载\": \"普通下載\",\n    \"归档下载\": \"歸檔下載\",\n    \"已加入队列\": \"已加入隊列\",\n    \"star(非必要)\": \"Star(非必要)\",\n    \"长按收藏按钮执行快速收藏\": \"長按收藏按鈕執行快速收藏\",\n    \"点击漫画时\": \"點擊漫畫時\",\n    \"浏览\": \"瀏覽\",\n    \"漫画源\": \"漫畫源\",\n    \"外观\": \"外觀\",\n    \"关于\": \"關於\",\n    \"有可用更新:\": \"有可用更新:\",\n    \"自定义漫画源\": \"自定義漫畫源\",\n    \"已选择 @num 个项目\": \"已選擇 @num 個項目\",\n    \"可能导致加载失败\": \"可能導致加載失敗\",\n    \"首页显示单张图片\": \"首頁顯示單張圖片\",\n    \"要删除此项目吗?\" : \"要刪除此項目嗎?\",\n    \"要清空历史记录吗?\" : \"要清空歷史記錄嗎?\",\n    \"要清空收藏吗?\" : \"要清空收藏嗎?\",\n    \"是否退出程序？\" : \"是否退出程序？\",\n    \"不再提示\": \"不再提示\",\n    \"删除下载\": \"刪除下載\",\n    \"复制路径\": \"複製路徑\",\n    \"通过 cookie 身份信息快速填写\": \"通過 cookie 身份信息快速填寫\",\n    \"解析\": \"解析\",\n    \"空的内容不能解析哦\": \"空的內容不能解析哦\",\n    \"cookie 信息格式可能有误\": \"cookie 格式可能有誤\",\n    \"本App的开发目的仅为学习交流与个人兴趣, 显示的任何内容均来自网络, 与开发者无关\": \"本App的開發目的僅為學習交流與個人興趣, 顯示的任何內容均來自網路, 與開發者無關\",\n    \"如果在使用中发现问题, 请先确认是否为自己的设备问题, 然后再进行反馈\": \"如果在使用中發現問題, 請先確認是否為自己的設備問題, 然後再進行反饋\",\n    \"开发者不对能否解决问题负责\": \"開發者不對能否解決問題負責\",\n    \"连续模式\": \"連續模式\",\n    \"滑动到底部时自动加载下一页并追加到页面末尾\": \"滑動到底部時自動加載下一頁並追加到頁面末尾\",\n    \"分页模式\": \"分頁模式\",\n    \"需要手动切换页面\": \"需要手動切換頁面\",\n    \"App数据目录\": \"App資料目錄\",\n    \"成功导出\": \"成功匯出\",\n    \"导出失败\": \"匯出失敗\",\n    \"完全隐藏屏蔽的作品\": \"完全隱藏封鎖的作品\",\n    \"内置漫画源\": \"內置漫畫源\",\n    \"设置缓存限制\": \"設置快取限制\",\n    \"需要进行Cloudflare验证\": \"需要進行Cloudflare驗證\",\n    \"屏蔽关键词\": \"封鎖關鍵詞\",\n    \"上传者\": \"上傳者\",\n    \"图片搜索\": \"圖片搜索\",\n    \"Eh订阅\": \"Eh訂閱\",\n    \"菜单\": \"選單\",\n    \"导出为pdf\": \"匯出為pdf\",\n    \"更新漫画信息\": \"更新漫畫資訊\"\n  },\n  \"en_US\": {\n    \"有可用更新\": \"Updates available\",\n    \"下载管理器\": \"Download manager\",\n    \"有未完成的下载, 是否继续?\": \"There are unfinished downloads, continue?\",\n    \"点击完成身份验证\": \"Click to complete identity verification\",\n    \"否\": \"No\",\n    \"是\": \"Yes\",\n    \"取消\": \"Cancel\",\n    \"下载\": \"Download\",\n    \"了解\": \"OK\",\n    \"更多\": \"More\",\n    \"提交\": \"Submit\",\n    \"全选\": \"Select all\",\n    \"导出\": \"Export\",\n    \"查看漫画详情\": \"View Comic Details\",\n    \"确认\": \"Confirm\",\n    \"删除\": \"Delete\",\n    \"阅读\": \"Read\",\n    \"暂停\": \"Pause\",\n    \"重试\": \"Retry\",\n    \"继续\": \"Continue\",\n    \"清除\": \"Clear\",\n    \"清除记录\": \"Clear History\",\n    \"要清除历史记录吗?\": \"Do you want to clear the history?\",\n    \"要删除这条历史记录吗\": \"Do you want to delete this history record?\",\n    \"返回\": \"Back\",\n    \"保存图片\": \"Save Image\",\n    \"分享\": \"Share\",\n    \"登录\": \"Log In\",\n    \"注册\": \"Register\",\n    \"我\": \"Me\",\n    \"探索\": \"Explore\",\n    \"分类\": \"Category\",\n    \"搜索\": \"Search\",\n    \"排行榜\": \"Ranking\",\n    \"设置\": \"Settings\",\n    \"收藏夹\": \"Favorites\",\n    \"已下载\": \"Downloaded\",\n    \"Picacg游戏\": \"Picacg Games\",\n    \"Eh主页\": \"Eh Homepage\",\n    \"Eh热门\": \"Eh Popular\",\n    \"禁漫主页\": \"JM Homepage\",\n    \"禁漫最新\": \"JM Latest\",\n    \"历史记录\": \"History\",\n    \"24小时\": \"24 Hours\",\n    \"7天\": \"7 Days\",\n    \"30天\": \"30 Days\",\n    \"图片\": \"Image\",\n    \"要删除已选择的项目吗? 此操作无法撤销\": \"Do you want to delete the selected items? This operation cannot be undone\",\n    \"页码\": \"Page Number\",\n    \"输入范围: \": \"Input Range: \",\n    \"加载中\": \"Loading\",\n    \"请选择漫画\": \"Please select a comic\",\n    \"一次只能导出一部漫画\": \"You can only export one comic at a time\",\n    \"打包中\": \"Packing\",\n    \"未知大小\": \"Unknown Size\",\n    \"请选择一个漫画\": \"Please select a comic\",\n    \"查看详情\": \"View Details\",\n    \"下载出错\": \"Download Error\",\n    \" 已暂停\": \" Paused\",\n    \" 下载中\": \" Downloading\",\n    \"@length 项下载任务\": \"@length Download Tasks\",\n    \"未登录\": \"Login required\",\n    \"网络错误\": \"Network Error\",\n    \"账号管理\": \"Accounts\",\n    \"退出登录\": \"Log Out\",\n    \"重新登录\": \"Re-login\",\n    \"正在重新登录\": \"Re-logging in\",\n    \"重新登录成功\": \"Re-login successful\",\n    \"目标\": \"Target\",\n    \"禁漫漫画ID\": \"JMComic Comic ID\",\n    \"输入禁漫漫画ID\": \"Enter JMComic ID\",\n    \"输入的ID不是数字\": \"The entered ID is not a number\",\n    \"漫画排序模式\": \"Comic Sorting Mode\",\n    \"新到书\": \"New to Old\",\n    \"旧到新\": \"Old to New\",\n    \"最多喜欢\": \"Most Likes\",\n    \"最多指名\": \"Most Nominated\",\n    \"最新\": \"Latest\",\n    \"最多点击\": \"Most Clicks\",\n    \"最多图片\": \"Most Images\",\n    \"历史搜索\": \"History\",\n    \"@year 年前\": \"@year years ago\",\n    \"@month 个月前\": \"@month months ago\",\n    \"@day 天前\": \"@day days ago\",\n    \"@hour 小时前\": \"@hour hours ago\",\n    \"@minute 分钟前\": \"@minute minutes ago\",\n    \"刚刚\": \"Just now\",\n    \"没有其它章节\": \"No other chapters\",\n    \"切换章节\": \"Chapters\",\n    \"章节\": \"Chapter\",\n    \"退出\": \"Exit\",\n    \"第 @c 章\": \"Chapter @c\",\n    \"当前\": \"Current\",\n    \" 倒序\": \"Reverse Order\",\n    \"未知\": \"Unknown\",\n    \"继续阅读\": \"Continue\",\n    \"从头开始\": \"Start\",\n    \"上次阅读到第 @ep 章第 @page 页, 是否继续阅读?\": \"Last read at Chapter @ep, Page @page. Do you want to continue reading?\",\n    \"已经是第一页了\": \"Already on the first page\",\n    \"已经是最后一页了\": \"Already on the last page\",\n    \"阅读设置\": \"Reading Settings\",\n    \"点按翻页\": \"Tap to Flip Page\",\n    \"使用音量键翻页\": \"Use Volume Keys to Flip Page\",\n    \"宽屏时显示控制按钮\": \"Show control buttons in widescreen\",\n    \"保持屏幕常亮\": \"Keep Screen On\",\n    \"深色模式下降低图片亮度\": \"Reduce Image Brightness in dark mode\",\n    \"选择阅读模式\": \"Select Reading Mode\",\n    \"从左至右\": \"Left to Right\",\n    \"从右至左\": \"Right to Left\",\n    \"从上至下\": \"Top to Bottom\",\n    \"从上至下(连续)\": \"Top to Bottom (Continuous)\",\n    \"选择漫画排序模式\": \"Select Comic Sorting Mode\",\n    \"推荐\": \"Recommend\",\n    \"没有推荐, 可能等级不足\": \"No recommendations, possibly due to insufficient level\",\n    \"简介\": \"Introduction\",\n    \"相关推荐\": \"Related\",\n    \"收藏\": \"Favorite\",\n    \"复制\": \"Copy\",\n    \"下载中\": \"Downloading\",\n    \"已加入下载\": \"Added to Downloads\",\n    \"回复\": \"Reply\",\n    \"评论至少需要2个字\": \"Comments must be at least 2 characters long\",\n    \"评论\": \"Comment\",\n    \"下一页\": \"Next Page\",\n    \"下载游戏\": \"Download Game\",\n    \"将前往哔咔游戏下载页面, 是否继续\": \"You will be redirected to the Picacg Games download page, do you want to continue?\",\n    \"屏幕截图\": \"Screenshot\",\n    \"转到注册\": \"Sign Up\",\n    \"账号\": \"Account\",\n    \"密码\": \"Password\",\n    \"您的登录密码\": \"Your login password\",\n    \"登录中\": \"Logging in\",\n    \"登录失败\": \"Login Failed\",\n    \"两次输入的密码不一致\": \"Passwords entered do not match\",\n    \"密码至少8位\": \"Password must be at least 8 characters\",\n    \"更换头像\": \"Change Avatar\",\n    \"请先选择图像\": \"Please select an image first\",\n    \"上传成功\": \"Upload successful\",\n    \"上传\": \"Upload\",\n    \"修改密码\": \"Change Password\",\n    \"输入旧密码\": \"Enter old password\",\n    \"输入新密码\": \"Enter new password\",\n    \"再输一次新密码\": \"Re-enter new password\",\n    \"用户名\": \"Username\",\n    \"等级\": \"Level\",\n    \"自我介绍\": \"Self-introduction\",\n    \"更改自我介绍\": \"Change self-introduction\",\n    \"不能为空\": \"Cannot be empty\",\n    \"要退出登录吗\": \"Do you want to log out?\",\n    \"选择搜索模式\": \"Choose search mode\",\n    \"每周必看\": \"Must-See Weekly\",\n    \"作者\": \"Author\",\n    \"正在取消收藏\": \"Canceling collection\",\n    \"全部收藏\": \"All collections\",\n    \"收藏漫画\": \"Favorite Comics\",\n    \"第1章\": \"Chapter 1\",\n    \"正在发送评论\": \"Sending comment\",\n    \"全部\": \"All\",\n    \"确认删除\": \"Confirm deletion\",\n    \"要删除这个收藏夹吗\": \"Do you want to delete this collection?\",\n    \"正在删除收藏夹\": \"Deleting collection\",\n    \"删除成功\": \"Deletion successful\",\n    \"创建收藏夹\": \"Create Folder\",\n    \"名称\": \"Name\",\n    \"成功创建\": \"Successfully created\",\n    \"总排行\": \"Overall Ranking\",\n    \"月排行\": \"Monthly Ranking\",\n    \"周排行\": \"Weekly Ranking\",\n    \"日排行\": \"Daily Ranking\",\n    \"韩漫\": \"Korean Comics\",\n    \"日漫\": \"Japanese Comics\",\n    \"其它\": \"Other\",\n    \"未知错误\": \"Unknown error\",\n    \"添加收藏成功\": \"Favorite added successfully\",\n    \"取消收藏成功\": \"Unfavorite successful\",\n    \"类型\": \"Type\",\n    \"语言\": \"Language\",\n    \"昨天\": \"Yesterday\",\n    \"一个月\": \"One month\",\n    \"一年\": \"One year\",\n    \"所有时间\": \"All time\",\n    \"igneous(非必要)\": \"igneous (optional)\",\n    \"请填写完整\": \"Please fill in completely\",\n    \"在Webview中登录\": \"Login in Webview\",\n    \"无\": \"None\",\n    \"下载全部\": \"Download all\",\n    \"下载选择\": \"Download selection\",\n    \"下载漫画\": \"Download comics\",\n    \"关键词屏蔽\": \"Keyword blocking\",\n    \"设置代理\": \"Set proxy\",\n    \"检查更新\": \"Check for updates\",\n    \"当前:\": \"Current:\",\n    \"启动时检查更新\": \"Check for updates on startup\",\n    \"设置下载目录\": \"Set download directory\",\n    \"缓存大小\": \"Cache size\",\n    \"计算中\": \"Calculating\",\n    \"清除缓存\": \"Clear cache\",\n    \"隐私\": \"Privacy\",\n    \"阻止屏幕截图\": \"Block screen capture\",\n    \"需要重启App以应用更改\": \"App needs to be restarted to apply changes\",\n    \"如果系统中未设置任何认证方法请勿开启\": \"Do not enable if no authentication methods are set in the system\",\n    \"项目地址\": \"Repository\",\n    \"提出建议\": \"Submit suggestions\",\n    \"正在检查更新\": \"Checking for updates\",\n    \"关闭更新检查\": \"Turn off update check\",\n    \"已是最新版本\": \"Already the latest version\",\n    \"使用系统代理\": \"Use system proxy\",\n    \"使用系统代理时无法手动设置\": \"Manual settings are not available when using system proxy\",\n    \"设置代理, 例如127.0.0.1:7890\": \"Set proxy, e.g., 127.0.0.1:7890\",\n    \"禁漫天堂\": \"JMComic\",\n    \"路径\": \"Path\",\n    \"为空表示使用App数据目录\": \"Empty indicates the use of the App data directory\",\n    \"转移数据\": \"Transfer data\",\n    \"正在复制文件\": \"Copying files\",\n    \"更新成功\": \"Update successful\",\n    \"目录不存在\": \"Directory does not exist\",\n    \"现在的路径为\": \"Current path is\",\n    \"添加\": \"Add\",\n    \"添加屏蔽关键词\": \"Add blocked keywords\",\n    \"添加关键词\": \"Add keywords\",\n    \"关键词屏蔽不会生效于收藏夹和历史记录, 屏蔽的依据仅限加载漫画列表时能够获取到的信息\": \"Keyword blocking does not affect favorites and history. It is based on information available only when loading the comic list.\",\n    \"画廊站点\": \"Gallery domain\",\n    \"分类中漫画排序模式\": \"Comic sorting mode in categories\",\n    \"搜索中漫画排序模式\": \"Comic sorting mode in searches\",\n    \"设置分流\": \"Set stream\",\n    \"分流1\": \"Stream 1\",\n    \"分流2\": \"Stream 2\",\n    \"分流3\": \"Stream 3\",\n    \"分流4\": \"Stream 4\",\n    \"哔咔漫画\": \"Picacg\",\n    \"设置图片质量\": \"Set image quality\",\n    \"低\": \"Low\",\n    \"中\": \"Medium\",\n    \"高\": \"High\",\n    \"原图\": \"Original image\",\n    \"设置搜索及分类排序模式\": \"Set search and category sorting mode\",\n    \"显示头像框\": \"Display avatar frame\",\n    \"漫画列表显示方式\": \"Comic list display mode\",\n    \"自动打卡\": \"Auto check-in\",\n    \"初始页面\": \"Initial page\",\n    \"已下载的漫画排序方式\": \"Sorting mode for downloaded comics\",\n    \"优先加载原图\": \"Load original images\",\n    \"图片预加载\": \"Image preloading\",\n    \"自动翻页时间间隔\": \"Auto page turn interval\",\n    \"主题选择\": \"Select Theme\",\n    \"深色模式\": \"Dark mode\",\n    \"清除所有数据\": \"Clear all data\",\n    \"打卡成功\": \"Check-in successful\",\n    \"本地\": \"Local\",\n    \"网络\": \"Network\",\n    \"导出用户数据\": \"Export user data\",\n    \"将导出设置, 账号, 历史记录, 下载内容, 本地收藏等数据\": \"Export settings, accounts, history, downloaded content, local favorites, and other data\",\n    \"导入用户数据\": \"Import user data\",\n    \"将导入设置, 账号, 历史记录, 下载内容, 本地收藏等数据, 现在的所有数据将会被覆盖\": \"Import settings, accounts, history, downloaded content, local favorites, and other data. All existing data will be overwritten.\",\n    \"订阅\": \"Subscribe\",\n    \"建议\": \"Suggestions\",\n    \"清空\": \"Clear\",\n    \"警告\": \"Warning\",\n    \"此操作无法撤销, 是否继续\": \"This operation cannot be undone. Do you want to continue?\",\n    \"双页\": \"Two page\",\n    \"双页(反向)\": \"Two page(reserved)\",\n    \"翻页动画\": \"Page turning animation\",\n    \"留空表示禁用网络代理\": \"Leave blank to disable web proxy\",\n    \"跟随系统\": \"system\",\n    \"启用\": \"enable\",\n    \"禁用\": \"disable\",\n    \"图片分流\": \"Image Stream\",\n    \"时间\": \"Time\",\n    \"漫画名\": \"Title\",\n    \"作者名\": \"Author\",\n    \"大小\": \"Size\",\n    \"收藏夹漫画排序模式\": \"Comic sorting mode in favorites\",\n    \"启动时执行\": \"Execute at startup\",\n    \"APP启动或是距离上次打卡间隔一天时执行\": \"Executed when the APP is started or one day after the last check-in\",\n    \"如果登录失效点击此处\": \"Click here if login expires\",\n    \"已登录\": \"Logged in\",\n    \"查看\": \"View\",\n    \"热门 | 今天\": \"Popular|Today\",\n    \"热门 | 一周\": \"Popular|Week\",\n    \"热门 | 本月\": \"Popular|Month\",\n    \"热门 | 一年\": \"Popular|Year\",\n    \"热门 | 所有时间\": \"Popular | All Time\",\n    \"点按翻页识别范围\": \"Range of Tapping to Flip Page\",\n    \"图片缩放\": \"Image zoom\",\n    \"容纳\": \"contain\",\n    \"适应宽度\": \"fit width\",\n    \"适应高度\": \"fit height\",\n    \"复制标题\": \"copy title\",\n    \"复制链接\": \"copy link\",\n    \"在浏览器中打开\": \"open in browser\",\n    \"工具\": \"Tools\",\n    \"使用工具发现更多漫画\": \"Find more comics with tools\",\n    \"收藏夹中漫画排序模式\": \"Comic sorting mode in favorite folder\",\n    \"最新更新\": \"Update Time\",\n    \"最新收藏\": \"Favorite Time\",\n    \"搜索选项\": \"Search Options\",\n    \"设置App外观\": \"Set App appearance\",\n    \"完成\": \"All Done\",\n    \"EH订阅\": \"EH Subscription\",\n    \"打开链接\": \"Open Link\",\n    \"图片搜索 [搜图bot酱]\": \"Image Search [搜图bot酱]\",\n    \"图片搜索 [SauceNAO]\": \"Image Search [SauceNAO]\",\n    \"输入链接\": \"Enter Link\",\n    \"不支持的链接\": \"Unsupported Link\",\n    \"打开\": \"open\",\n    \"限制图片最大显示宽度\": \"Limit image width\",\n    \"倒序\": \"Reverse\",\n    \"漫画块显示模式\": \"Display mode of comic tile\",\n    \"数据同步\": \"Data Sync\",\n    \"简略\": \"Brief\",\n    \"详细\": \"Detailed\",\n    \"储存路径\": \"Storage Path\",\n    \"请确保路径存在\": \"Make sure the path exists\",\n    \"立即执行:\": \"Run Now:\",\n    \"上传数据\": \"Upload\",\n    \"下载数据\": \"Download\",\n    \"将URL留空以禁用同步\": \"Leave the URL blank to disable sync\",\n    \"忽略警告\": \"Ignore Warning\",\n    \"已收藏\": \"Added\",\n    \"忽略\": \"Ignore\",\n    \"预览\": \"Preview\",\n    \"双击缩放\": \"Double tap to zoom\",\n    \"日志\": \"Logs\",\n    \"更新\": \"Update\",\n    \"数据\": \"Data\",\n    \"提出建议(Github)\": \"Make a suggestion(Github)\",\n    \"通过电子邮件联系我\": \"Contact me via email\",\n    \"支持开发\": \"Support Development\",\n    \"Pica Comic是一个完全免费的漫画阅读APP\": \"Pica Comic is a free comic reading APP\",\n    \"仅用于学习交流\": \"For learning and communication\",\n    \"加入Telegram群\": \"Join Telegram Group\",\n    \"绅士漫画\": \"HtComic\",\n    \"上一页\": \"Last Page\",\n    \"页面\": \"Page\",\n    \"新建\": \"New\",\n    \"排序\": \"Reorder\",\n    \"重命名\": \"Rename\",\n    \"切换源\": \"Change Source\",\n    \"应用链接\": \"App Links\",\n    \"在系统设置中管理APP支持的链接\": \"Manage APP links in system settings\",\n    \"取消收藏\": \"Unfavorite\",\n    \"本地收藏\": \"Local Favorites\",\n    \"新收藏添加至\": \"Add new favorite to\",\n    \"阅读后移动本地收藏至\": \"After reading, move local favorite to\",\n    \"最前\": \"front\",\n    \"最后\": \"end\",\n    \"无操作\": \"no\",\n    \"长按缩放\": \"Long press to zoom\",\n    \"同步数据中\": \"Synchronizing data\",\n    \"最少星星\": \"Min Stars\",\n    \"高级选项\": \"Advanced Options\",\n    \"隐藏\": \"Hide\",\n    \"规则\": \"rule\",\n    \"探索页面\": \"Explore pages\",\n    \"查看信息\": \"View Info\",\n    \"显示页面信息\": \"Show page information\",\n    \"从文件导入\": \"From file\",\n    \"从网络导入\": \"From network\",\n    \"复制到\": \"Copy\",\n    \"这里什么都没有\": \"Nothing here now\",\n    \"前往\": \"Go to \",\n    \"寻找漫画\": \" to find comics\",\n    \"随机\": \"Random\",\n    \"长度\": \"Length\",\n    \"链接\": \"Link\",\n    \"排序方式\": \"Sort by\",\n    \"检查剪切板中的链接\": \"Check links in clipboard\",\n    \"漫画块大小\": \"Size of the comic tile\",\n    \"默认搜索源\": \"Default search source\",\n    \"启用侧边翻页栏\": \"Enable Side Flip Bar\",\n    \"高刷新率模式\": \"High refresh rate mode\",\n    \"帮助\": \"Help\",\n    \"覆盖\": \"cover\",\n    \"漫画块缩略图布局\": \"Thumbnail Layout\",\n    \"使用须知\": \"Notice\",\n    \"感谢使用本软件, 请注意:\": \"Thank you for using this app, please note:\",\n    \"我已阅读并知晓\": \"I have read and understand\",\n    \"更多设置\": \"More settings\",\n    \"登录账号\": \"Login account\",\n    \"进入APP\": \"Enter\",\n    \"请先阅读使用须知\": \"Please read the Notice first\",\n    \"分类页面\": \"Category page\",\n    \"网络收藏页面\": \"Network favorites page\",\n    \"自动添加语言筛选\": \"Auto add language filters\",\n    \"屏蔽\": \"Block\",\n    \"自动翻页\": \"Auto\",\n    \"全屏\": \"Full Screen\",\n    \"反转点按翻页\": \"Reverse Tap to Flip Page\",\n    \"本次更新数: \": \"Number of updates this time:\",\n    \", 上次更新时间: \": \", last updated:\",\n    \"下拉更新拉取页数\": \"Pull down to update the number of pages pulled\",\n    \"支持下拉更新\": \"Support pull down update\",\n    \"已登录 @a 个账号\": \"@a accounts logged in.\",\n    \"共 @a 部漫画\": \"@a comics in total\",\n    \"@a 条历史记录\": \"@a history records\",\n    \"显示收藏状态\": \"Show favorite status\",\n    \"显示阅读位置\": \"Show reading history\",\n    \"图片收藏大小\": \"Size of favorite image\",\n    \"图片收藏\": \"Favorite image\",\n    \"@a 条图片收藏\": \"@a favorite images\",\n    \"要删除这个图片吗\": \"Do you want to delete this image?\",\n    \"图片配额\": \"Image limit\",\n    \"已用\": \"Used\",\n    \"重置花费\": \"Reset cost\",\n    \"可用货币\": \"Available money\",\n    \"头像\": \"Avatar\",\n    \"显示\": \"Display\",\n    \"漫画块\": \"Comic tile\",\n    \"下载数据失败, 已禁用同步\": \"Failed to download data, sync disabled\",\n    \"固定横屏\": \"Fixed landscape\",\n    \"缓存限制\": \"Cache limit\",\n    \"导出不含下载的数据\": \"Export data without downloads\",\n    \"导出所有数据\": \"Export all data\",\n    \"如需还原之前的下载, 将路径填写为下载数据的位置, 并取消勾选转移数据\": \"To restore previous downloads, fill in the path as the location of the downloaded data, and uncheck the \\\"Transfer data\\\".\",\n    \"如果导入的数据中包含下载数据, 则当前的下载数据也将被覆盖\": \"If the imported data contains download data, the current download data will also be overwritten\",\n    \"缓存大小限制\": \"Cache size limit\",\n    \"缓存数量限制\": \"Cache number limit\",\n    \"仅在退出阅读器时检查缓存是否超出限制\": \"Only check if the cache exceeds the limit when exiting the reader\",\n    \"需要身份验证\": \"Authentication required\",\n    \"添加漫画源\": \"Add comic source\",\n    \"选择文件\": \"Select file\",\n    \"优先显示副标题\": \"Show subtitle first\",\n    \"适用于已下载的画廊\": \"For downloaded galleries\",\n    \"配置文件\": \"Profile\",\n    \"最近\": \"Recent\",\n    \"要删除此漫画源吗?\": \"Do you want to delete this comic source?\",\n    \"获取图片信息...\": \"Getting images information...\",\n    \"已添加下载任务\": \"Download task added\",\n    \"搜索相似\": \"Search similar\",\n    \"点击查看详情\": \"Click to view details\",\n    \"当前设备不支持\": \"Current device does not support\",\n    \"第一章\": \"Chapter 1\",\n    \"已保存\": \"Saved\",\n    \"修改成功\": \"Modified successfully\",\n    \"选择图像\": \"Select image\",\n    \"无数据\": \"Empty data\",\n    \"已复制\": \"Copied\",\n    \"重置成功\": \"Reset successful\",\n    \"重置\": \"Reset\",\n    \"登录成功\": \"Login successful\",\n    \"重新加载\": \"Reload\",\n    \"成功添加收藏\": \"Favorite added\",\n    \"正在添加收藏\": \"Adding favorite\",\n    \"添加收藏失败\": \"Failed to add favorite\",\n    \"取消收藏失败\": \"Failed to unfavorite\",\n    \"成功取消收藏\": \"Unfavorite successful\",\n    \"添加至本地收藏\": \"Add to local favorites\",\n    \"要删除这个章节吗\": \"Do you want to delete this chapter?\",\n    \"请输入评论\": \"Enter comment\",\n    \"保存至本地\": \"Save locally\",\n    \"此画廊存在令人不适的内容\\\\n在设置中可以禁用此警告\": \"This gallery contains objectionable content\\\\nThis warning can be disabled in settings\",\n    \"评分成功\": \"Rating successful\",\n    \"已加入下载队列\": \"Added to download queue\",\n    \"其它漫画源的订阅尚未完成\\\\n如需管理EH订阅, 请前往EH网站\": \"To manage EH subscriptions, please go to the EH website\",\n    \"查看更多\": \"View more\",\n    \"编辑标签\": \"Edit tags\",\n    \"无效的漫画\": \"Invalid comic\",\n    \"从当前的搜索结果创建新的收藏夹\": \"Create a new folder from the current search results\",\n    \"未选择\": \"Not selected\",\n    \"选择收藏夹\": \"Select folder\",\n    \"检查漫画存活\": \"Check comics survival\",\n    \"正在导出\": \"Exporting\",\n    \"删除失败\": \"Deletion failed\",\n    \"已屏蔽\": \"Blocked\",\n    \"标签\": \"Tags\",\n    \"成功发表评论\": \"Comment posted successfully\",\n    \"登录哔咔时发生错误:\": \"Error logging in to Picacg:\",\n    \"登录绅士漫画时发生错误:\": \"Error logging in to HtComic:\",\n    \"发现剪切板中的链接\": \"Found links in clipboard\",\n    \"输入的数字不正确\": \"Incorrect input\",\n    \"喜欢\": \"Like\",\n    \"相似\": \"Similar\",\n    \"信息\": \"Info\",\n    \"显示全部\": \"Show all\",\n    \"本子妹推荐\": \"Recommended\",\n    \"本子母推荐\": \"Recommended\",\n    \"已添加至收藏夹:\": \"Added to favorites:\",\n    \"汉化\": \"Translation\",\n    \"打开禁漫ID\": \"Open JM ID\",\n    \"选择屏幕上的图片\": \"Select the image on the screen\",\n    \"正在获取分流IP\": \"Getting stream IP\",\n    \"分流5\": \"Stream 5\",\n    \"分流6\": \"Stream 6\",\n    \"屏幕方向\": \"Screen orientation\",\n    \"收藏图片\": \"Favorite image\",\n    \"成功收藏图片\": \"Image favorited successfully\",\n    \"请在下载任务完成后进行操作\": \"Please perform the operation after the download task is completed\",\n    \"允许储存权限\": \"Allow storage permission\",\n    \"需要储存权限以选取任意目录\": \"Storage permission is required to select any directory\",\n    \"已禁用\": \"Disabled\",\n    \"浏览列表\": \"Browse list\",\n    \"查看帮助\": \"View help\",\n    \"设置漫画排序模式\": \"Set comic sorting mode\",\n    \"确认清除缓存?\": \"Confirm clearing cache?\",\n    \"下载并行\": \"Download parallel\",\n    \"欢迎\": \"Welcome\",\n    \"添加收藏\": \"Add to favorites\",\n    \"快速收藏\": \"Quick favorite\",\n    \"普通下载\": \"Normal download\",\n    \"归档下载\": \"Archive download\",\n    \"已加入队列\": \"Added to queue\",\n    \"star(非必要)\": \"star(optional)\",\n    \"长按收藏按钮执行快速收藏\": \"Long press the favorite button to quickly favorite\",\n    \"点击漫画时\": \"Clicking on a comic\",\n    \"浏览\": \"Browse\",\n    \"漫画源\": \"Comic Source\",\n    \"外观\": \"Appearance\",\n    \"关于\": \"About\",\n    \"有可用更新:\": \"Updates available:\",\n    \"自定义漫画源\": \"Custom comic source\",\n    \"已选择 @num 个项目\": \"Selected @num items\",\n    \"使用深色背景\": \"Use dark background\",\n    \"可能导致加载失败\": \"May cause loading failure\",\n    \"首页显示单张图片\": \"Show single image on first page\",\n    \"要删除此项目吗?\" : \"Do you want to delete this item?\",\n    \"要清空历史记录吗?\" : \"Do you want to clear the history?\",\n    \"要清空收藏吗?\" : \"Do you want to clear the favorites?\",\n    \"是否退出程序？\" : \"Exit the program?\",\n    \"不再提示\": \"Do not show again\",\n    \"删除下载\": \"Delete download\",\n    \"复制路径\": \"Copy path\",\n    \"通过 cookie 身份信息快速填写\": \"Quickly fill in identity information through cookies\",\n    \"解析\": \"Parse\",\n    \"空的内容不能解析哦\": \"Empty content cannot be parsed\",\n    \"cookie 信息格式可能有误\": \"Cookie information format may be incorrect\",\n    \"本App的开发目的仅为学习交流与个人兴趣, 显示的任何内容均来自网络, 与开发者无关\": \"The purpose of this App is only for learning, communication, and personal interest. Any content displayed comes from the internet and is not related to the developer\",\n    \"如果在使用中发现问题, 请先确认是否为自己的设备问题, 然后再进行反馈\": \"If you encounter any problems during use, please first confirm whether it is a problem with your device, and then provide feedback\",\n    \"开发者不对能否解决问题负责\": \"The developer is not responsible for whether the problem can be solved\",\n    \"连续模式\": \"Continuous mode\",\n    \"滑动到底部时自动加载下一页并追加到页面末尾\": \"Automatically load the next page and append it to the end of the page when sliding to the bottom\",\n    \"分页模式\": \"Paging mode\",\n    \"需要手动切换页面\": \"Need to manually switch pages\",\n    \"App数据目录\": \"App data directory\",\n    \"成功导出\": \"Export successful\",\n    \"导出失败\": \"Export failed\",\n    \"完全隐藏屏蔽的作品\": \"Completely hide blocked works\",\n    \"内置漫画源\": \"Built-in comic source\",\n    \"设置缓存限制\": \"Set cache limit\",\n    \"需要进行Cloudflare验证\": \"Cloudflare verification required\",\n    \"屏蔽关键词\": \"Block keywords\",\n    \"上传者\": \"Uploader\",\n    \"图片搜索\": \"Image search\",\n    \"Eh订阅\": \"Eh subscription\",\n    \"菜单\": \"Menu\",\n    \"导出为pdf\": \"Export as pdf\",\n    \"更新漫画信息\": \"Update comic information\"\n  }\n}\n"
  },
  {
    "path": "debian/build.py",
    "content": "import subprocess\n\ndebianContent = ''\ndesktopContent = ''\nversion = ''\n\nwith open('debian/debian.yaml', 'r') as f:\n    debianContent = f.read()\nwith open('debian/gui/pica-comic.desktop', 'r') as f:\n    desktopContent = f.read()\nwith open('pubspec.yaml', 'r') as f:\n    version = str.split(str.split(f.read(), 'version: ')[1], '+')[0]\n\nwith open('debian/debian.yaml', 'w') as f:\n    f.write(debianContent.replace('{{Version}}', version))\nwith open('debian/gui/pica-comic.desktop', 'w') as f:\n    f.write(desktopContent.replace('{{Version}}', version))\n\nsubprocess.run([\"flutter\", \"build\", \"linux\"])\n\nsubprocess.run([\"$HOME/.pub-cache/bin/flutter_to_debian\"], shell=True)\n\nwith open('debian/debian.yaml', 'w') as f:\n    f.write(debianContent)\nwith open('debian/gui/pica-comic.desktop', 'w') as f:\n    f.write(desktopContent)\n"
  },
  {
    "path": "debian/debian.yaml",
    "content": "flutter_app: \n  command: pica_comic\n  arch: x64\n  parent: /usr/local/lib\n  nonInteractive: true\n  execFieldCodes: u\n\ncontrol:\n  Package: pica-comic\n  Version: {{Version}}\n  Architecture: amd64\n  Priority: optional\n  Depends: libwebkit2gtk-4.1-0, libgtk-3-0\n  Maintainer: nyne\n  Description: pica comic\n  \n#options:\n#  exec_out_dir: debian/packages"
  },
  {
    "path": "debian/gui/pica-comic.desktop",
    "content": "[Desktop Entry]\nVersion={{Version}}\nName=PicaComic\nGenericName=PicaComic\nComment=pica comic\nTerminal=false\nType=Application\nCategories=Utility\nKeywords=Flutter;comic;images;"
  },
  {
    "path": "doc/comic_source.md",
    "content": "# 自定义漫画源\n\n## 简介\n\n自v3.0.0版本, app允许添加自定义漫画源, 自定义漫画源通过JS语言向APP提供配置, 使用QuickJS引擎\n\nv3.1.0版本对自定义漫画源功能进行了大幅改造\n\n## 编写自定义漫画源\n\n在[这里](https://github.com/wgh136/pica_configs/blob/master/template.js)下载模板\n\n模板中有详细的注释, 没必要在这里重复说明\n\n## API\n\n所有的API都可以在本项目`/assets/init.js`中找到\n\n### 网络\n\n发起Http请求, 获取和修改Cookie\n\nApp会自动处理网络请求中的Cookie, 使用`Network`对象提供的方法可以获取和修改Cookie\n\n对于Http请求:\n\n所有的`data`均为任意类型\n\n返回值为如下结构, 其中body的类型取决于调用的方法, 使用`fetchBytes`方法其类型为`ArrayBuffer`, 其他方法均为string\n```\n{\n      \"status\": number,\n      \"headers\": Object,\n      \"body\": string | ArrayBuffer,\n      \"error\": string?,\n}\n```\n\n```js\nlet Network = {\n    /**\n     * Sends an HTTP request.\n     * @param {string} method - The HTTP method (e.g., GET, POST, PUT, PATCH, DELETE).\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @returns {Promise<ArrayBuffer>} The response from the request.\n     */\n    async fetchBytes(method, url, headers, data) {...},\n    \n    /**\n     * Sends an HTTP request.\n     * @param {string} method - The HTTP method (e.g., GET, POST, PUT, PATCH, DELETE).\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @returns {Promise<Object>} The response from the request.\n     */\n    async sendRequest(method, url, headers, data) {...},\n\n    /**\n     * Sends an HTTP GET request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @returns {Promise<Object>} The response from the request.\n     */\n    async get(url, headers) {...},\n\n    /**\n     * Sends an HTTP POST request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @returns {Promise<Object>} The response from the request.\n     */\n    async post(url, headers, data) {...},\n\n    /**\n     * Sends an HTTP PUT request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @returns {Promise<Object>} The response from the request.\n     */\n    async put(url, headers, data) {...},\n\n    /**\n     * Sends an HTTP PATCH request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @returns {Promise<Object>} The response from the request.\n     */\n    async patch(url, headers, data) {...},\n\n    /**\n     * Sends an HTTP DELETE request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @returns {Promise<Object>} The response from the request.\n     */\n    async delete(url, headers) {...},\n\n    /**\n     * Sets cookies for a specific URL.\n     * @param {string} url - The URL to set the cookies for.\n     * @param {Cookie[]} cookies - The cookies to set.\n     */\n    setCookies(url, cookies) {...},\n\n    /**\n     * Retrieves cookies for a specific URL.\n     * @param {string} url - The URL to get the cookies from.\n     * @returns {Promise<Cookie[]>} The cookies for the given URL.\n     */\n    getCookies(url) {...},\n\n    /**\n     * Deletes cookies for a specific URL.\n     * @param {string} url - The URL to delete the cookies from.\n     */\n    deleteCookies(url) {...},\n};\n```\n\n### 数据处理\n\n此部分包含编码, 解码, 散列, 解密\n\n```js\n/// encode, decode, hash, decrypt\nlet Convert = {\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {string}\n     */\n    encodeBase64: (value) => {...},\n\n    /**\n     * @param {string} value\n     * @returns {ArrayBuffer}\n     */\n    decodeBase64: (value) => {...},\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {ArrayBuffer}\n     */\n    md5: (value) => {...},\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {ArrayBuffer}\n     */\n    sha1: (value) => {...},\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {ArrayBuffer}\n     */\n    sha256: (value) => {...},\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {ArrayBuffer}\n     */\n    sha512: (value) => {...},\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @returns {ArrayBuffer}\n     */\n    decryptAesEcb: (value, key) => {...},\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @param {ArrayBuffer} iv\n     * @returns {ArrayBuffer}\n     */\n    decryptAesCbc: (value, key, iv) => {...},\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @param {number} blockSize\n     * @returns {ArrayBuffer}\n     */\n    decryptAesCfb: (value, key, blockSize) => {...},\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @param {number} blockSize\n     * @returns {ArrayBuffer}\n     */\n    decryptAesOfb: (value, key, blockSize) => {...},\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @returns {ArrayBuffer}\n     */\n    decryptRsa: (value, key) => {...}\n}\n```\n\n### Html解析\n\n通过与dart端交互的方式解析html\n\n```js\n/**\n * HtmlDocument class for parsing HTML and querying elements.\n */\nclass HtmlDocument {\n    static _key = 0;\n\n    key = 0;\n\n    /**\n     * Constructor for HtmlDocument.\n     * @param {string} html - The HTML string to parse.\n     */\n    constructor(html) {...}\n\n    /**\n     * Query a single element from the HTML document.\n     * @param {string} query - The query string.\n     * @returns {HtmlDom} The first matching element.\n     */\n    querySelector(query) {...}\n\n    /**\n     * Query all matching elements from the HTML document.\n     * @param {string} query - The query string.\n     * @returns {HtmlDom[]} An array of matching elements.\n     */\n    querySelectorAll(query) {...}\n}\n\n/**\n * HtmlDom class for interacting with HTML elements.\n */\nclass HtmlDom {\n    key = 0;\n\n    /**\n     * Constructor for HtmlDom.\n     * @param {number} k - The key of the element.\n     */\n    constructor(k) {\n        this.key = k;\n    }\n\n    /**\n     * Get the text content of the element.\n     * @returns {string} The text content.\n     */\n    get text() {...}\n\n    /**\n     * Get the attributes of the element.\n     * @returns {Object} The attributes.\n     */\n    get attributes() {...}\n\n    /**\n     * Query a single element from the current element.\n     * @param {string} query - The query string.\n     * @returns {HtmlDom} The first matching element.\n     */\n    querySelector(query) {...}\n\n    /**\n     * Query all matching elements from the current element.\n     * @param {string} query - The query string.\n     * @returns {HtmlDom[]} An array of matching elements.\n     */\n    querySelectorAll(query) {...}\n\n    /**\n     * Get the children of the current element.\n     * @returns {HtmlDom[]} An array of child elements.\n     */\n    get children() {...}\n}\n```\n\n### 日志\n\n使用下列方法发送数据给dart端, 将会显示于`设置-App-Logs`, 在debug模式下同时会输出到控制台\n\n```js\nfunction log(level, title, content) {...}\n\nlet console = {\n    log: (content) => {\n        log('info', 'JS Console', content)\n    },\n    warn: (content) => {\n        log('warning', 'JS Console', content)\n    },\n    error: (content) => {\n        log('error', 'JS Console', content)\n    },\n};\n```\n"
  },
  {
    "path": "doc/hosts.md",
    "content": "# 关于hosts的使用\n\n## 工作原理及存在的问题\n\n启用后, app会在本地启动一个代理服务器用于转发流量, 如果指定了域名对应的ip地址, 代理服务器将直接通过ip与目标服务器建立连接.\n\n使用这种方式可以解决Dart中无法手动校验证书的问题, 在Dart中如果尝试直接通过ip建立https连接, 将会出现证书校验错误, \n如果忽略证书校验, 将存在严重的安全性问题. 代理服务器似乎是此问题的唯一解法.\n\n由于eh被通过sni嗅探的方式封锁, 因此必须绕过sni嗅探才能解决问题. 目前没有好的解决方式, app中将直接通过ip建立https连接并忽略证书校验.\n\n## 配置文件书写方式\n\n使用json, 如果不了解, 可以去搜索json的格式\n\n退出修改页面时将自动保存文件, 如果修改了端口, 需要手动重启代理服务器\n\n### port\n\n指定代理服务器的端口, 如果端口与其它程序冲突, 在此处修改\n\n### rule\n\n指定域名的ip地址\n\n### sni\n\n尝试访问列在此处的域名时, app将使用绕过sni嗅探方式工作, 这将降低安全性\n\n## 示例\n\n这是app的默认配置\n\n```json\n{\n    \"port\": 7891,\n    \"rule\": {\n          \"picaapi.picacomic.com\": \"104.21.91.145\",\n          \"img.picacomic.com\": \"104.21.91.145\",\n          \"storage1.picacomic.com\": \"104.21.91.145\",\n          \"storage-b.picacomic.com\": \"104.21.91.145\",\n          \"e-hentai.org\": \"172.67.0.127\",\n          \"exhentai.org\": \"178.175.129.254\"\n    },\n    \"sni\": [\n        \"e-hentai.org\",\n        \"exhentai.org\"\n    ]\n}\n```"
  },
  {
    "path": "ios/.gitignore",
    "content": "**/dgph\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedData/\nIcon?\n**/Pods/\n**/.symlinks/\nprofile\nxcuserdata\n**/.generated/\nFlutter/App.framework\nFlutter/Flutter.framework\nFlutter/Flutter.podspec\nFlutter/Generated.xcconfig\nFlutter/ephemeral/\nFlutter/app.flx\nFlutter/app.zip\nFlutter/flutter_assets/\nFlutter/flutter_export_environment.sh\nServiceDefinitions.json\nRunner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n"
  },
  {
    "path": "ios/Flutter/AppFrameworkInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>MinimumOSVersion</key>\n  <string>11.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Flutter/Debug.xcconfig",
    "content": "#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/Release.xcconfig",
    "content": "#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Podfile",
    "content": "# Uncomment this line to define a global platform for your project\nplatform :ios, '12.0'\n\n# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] = 'true'\n\nproject 'Runner', {\n  'Debug' => :debug,\n  'Profile' => :release,\n  'Release' => :release,\n}\n\ndef flutter_root\n  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)\n  unless File.exist?(generated_xcode_build_settings_path)\n    raise \"#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first\"\n  end\n\n  File.foreach(generated_xcode_build_settings_path) do |line|\n    matches = line.match(/FLUTTER_ROOT\\=(.*)/)\n    return matches[1].strip if matches\n  end\n  raise \"FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get\"\nend\n\nrequire File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)\n\nflutter_ios_podfile_setup\n\ntarget 'Runner' do\n  use_frameworks!\n  use_modular_headers!\n\n  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))\n  #target 'RunnerTests' do\n  #  inherit! :search_paths\n  #end\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n  end\nend\n"
  },
  {
    "path": "ios/Runner/AppDelegate.swift",
    "content": "import UIKit\nimport Flutter\nimport flutter_local_notifications\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n  ) -> Bool {\n    let controller: FlutterViewController = window?.rootViewController as! FlutterViewController\n\n    FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in\n      GeneratedPluginRegistrant.register(with: registry)\n    }\n\n    if #available(iOS 10.0, *) {\n      UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate\n    }\n\n    // 用于获取系统代理配置的 MethodChannel\n    let methodChannel = FlutterMethodChannel(name: \"kokoiro.xyz.pica_comic/proxy\", binaryMessenger: controller.binaryMessenger)\n    methodChannel.setMethodCallHandler { [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in\n        if let proxySettings = CFNetworkCopySystemProxySettings()?.takeUnretainedValue() as NSDictionary?,\n           let dict = proxySettings.object(forKey: kCFNetworkProxiesHTTPProxy) as? NSDictionary,\n           let host = dict.object(forKey: kCFNetworkProxiesHTTPProxy) as? String,\n           let port = dict.object(forKey: kCFNetworkProxiesHTTPPort) as? Int {\n            let proxyConfig = \"\\(host):\\(port)\"\n            result(proxyConfig)\n        } else {\n            result(\"\")\n        }\n    }\n\n    // 用于设置屏幕常亮的 MethodChannel\n    let channel2 = FlutterMethodChannel(name: \"com.kokoiro.xyz.pica_comic/keepScreenOn\", binaryMessenger: controller.binaryMessenger)\n    channel2.setMethodCallHandler { (call: FlutterMethodCall, result: FlutterResult) in\n      if call.method == \"set\" {\n        let screenOn = true // 设置屏幕常亮\n        UIApplication.shared.isIdleTimerDisabled = screenOn\n      } else {\n        let screenOn = false // 设置屏幕不常亮\n        UIApplication.shared.isIdleTimerDisabled = screenOn\n      }\n      result(nil)\n    }\n\n    // 用于监听音量键的 MethodChannel\n    let volumeChannel = FlutterEventChannel(name: \"com.kokoiro.xyz.pica_comic/volume\", binaryMessenger: controller.binaryMessenger)\n    volumeChannel.setStreamHandler(VolumeStreamHandler())\n\n    GeneratedPluginRegistrant.register(with: self)\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n}\n\nclass VolumeStreamHandler: NSObject, FlutterStreamHandler {\n  private var eventSink: FlutterEventSink?\n\n  func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {\n    eventSink = events\n    return nil\n  }\n\n  func onCancel(withArguments arguments: Any?) -> FlutterError? {\n    eventSink = nil\n    return nil\n  }\n}"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\": [\n    {\n      \"filename\": \"AppIcon@2x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"2x\",\n      \"size\": \"60x60\"\n    },\n    {\n      \"filename\": \"AppIcon@3x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"3x\",\n      \"size\": \"60x60\"\n    },\n    {\n      \"filename\": \"AppIcon~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"1x\",\n      \"size\": \"76x76\"\n    },\n    {\n      \"filename\": \"AppIcon@2x~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"2x\",\n      \"size\": \"76x76\"\n    },\n    {\n      \"filename\": \"AppIcon-83.5@2x~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"2x\",\n      \"size\": \"83.5x83.5\"\n    },\n    {\n      \"filename\": \"AppIcon-40@2x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"2x\",\n      \"size\": \"40x40\"\n    },\n    {\n      \"filename\": \"AppIcon-40@3x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"3x\",\n      \"size\": \"40x40\"\n    },\n    {\n      \"filename\": \"AppIcon-40~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"1x\",\n      \"size\": \"40x40\"\n    },\n    {\n      \"filename\": \"AppIcon-40@2x~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"2x\",\n      \"size\": \"40x40\"\n    },\n    {\n      \"filename\": \"AppIcon-20@2x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"2x\",\n      \"size\": \"20x20\"\n    },\n    {\n      \"filename\": \"AppIcon-20@3x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"3x\",\n      \"size\": \"20x20\"\n    },\n    {\n      \"filename\": \"AppIcon-20~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"1x\",\n      \"size\": \"20x20\"\n    },\n    {\n      \"filename\": \"AppIcon-20@2x~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"2x\",\n      \"size\": \"20x20\"\n    },\n    {\n      \"filename\": \"AppIcon-29.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"1x\",\n      \"size\": \"29x29\"\n    },\n    {\n      \"filename\": \"AppIcon-29@2x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"2x\",\n      \"size\": \"29x29\"\n    },\n    {\n      \"filename\": \"AppIcon-29@3x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"3x\",\n      \"size\": \"29x29\"\n    },\n    {\n      \"filename\": \"AppIcon-29~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"1x\",\n      \"size\": \"29x29\"\n    },\n    {\n      \"filename\": \"AppIcon-29@2x~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"2x\",\n      \"size\": \"29x29\"\n    },\n    {\n      \"filename\": \"AppIcon-60@2x~car.png\",\n      \"idiom\": \"car\",\n      \"scale\": \"2x\",\n      \"size\": \"60x60\"\n    },\n    {\n      \"filename\": \"AppIcon-60@3x~car.png\",\n      \"idiom\": \"car\",\n      \"scale\": \"3x\",\n      \"size\": \"60x60\"\n    },\n    {\n      \"filename\": \"AppIcon~ios-marketing.png\",\n      \"idiom\": \"ios-marketing\",\n      \"scale\": \"1x\",\n      \"size\": \"1024x1024\"\n    }\n  ],\n  \"info\": {\n    \"author\": \"iconkitchen\",\n    \"version\": 1\n  }\n}"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images."
  },
  {
    "path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12089\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"168\" height=\"185\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "ios/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>Pica Comic</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>pica_comic</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n\t<key>CADisableMinimumFrameDurationOnPhone</key>\n\t<true/>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\n\t<key>NSPhotoLibraryAddUsageDescription</key>\n\t<string>Save the images selected by user</string>\n\t<key>NSPhotoLibraryUsageDescription</key>\n\t<string>Allow user to Choose image as his avatar</string>\n\t<key>NSFaceIDUsageDescription</key>\n    <string>Protect user's privacy</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1300;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" embed_and_thin\";\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.kokoiro.xyz.picaComic;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.kokoiro.xyz.picaComic;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.kokoiro.xyz.picaComic;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t\t249021D3217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t\t249021D4217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1300\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "lib/base.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/jm_network/jm_network.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/network/webdav.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/io_tools.dart';\nimport 'package:pica_comic/tools/notification.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:shared_preferences/shared_preferences.dart';\nimport 'foundation/def.dart';\nexport 'foundation/def.dart';\n\nString get pathSep => Platform.pathSeparator;\n\nvar downloadManager = DownloadManager();\n\nclass Appdata {\n  ///搜索历史\n  List<String> searchHistory = [];\n  Set<String> favoriteTags = {};\n\n  ///历史记录管理器, 可以通过factory构造函数访问, 也可以通过这里访问\n  var history = HistoryManager();\n\n  ///设置\n  List<String> settings = [\n    \"1\", //0 点击屏幕左右区域翻页\n    \"dd\", //1 排序方式\n    \"1\", //2 启动时检查更新\n    \"0\", //3 Api请求地址, 为0时表示使用哔咔官方Api, 为1表示使用转发服务器\n    \"1\", //4 宽屏时显示前进后退关闭按钮\n    \"1\", //5 是否显示头像框\n    \"1\", //6 启动时签到\n    \"1\", //7 使用音量键翻页\n    \"0\", //8 代理设置, 0代表使用系统代理\n    \"1\", //9 翻页方式: 1从左向右,2从右向左,3从上至下,4从上至下(连续)\n    \"0\", //10 是否第一次使用\n    \"0\", //11 收藏夹浏览方式, 0为正常浏览, 1为分页浏览\n    \"0\", //12 阻止屏幕截图\n    \"0\", //13 需要生物识别\n    \"1\", //14 阅读器中保持屏幕常亮\n    \"0\", //15 Cloudflare IP, //为1表示使用哔咔官方提供的Ip, 为0表示禁用, 其他值表示使用自定义的Ip(废弃)\n    \"0\", //16 Jm分类漫画排序模式, 值为 ComicsOrder 的索引\n    \"0\", //17 Jm分流\n    \"0\", //18 夜间模式降低图片亮度\n    \"0\", //19 Jm搜索漫画排序模式, 值为 ComicsOrder 的索引\n    \"0\", //20 Eh画廊站点, 1表示e-hentai, 2表示exhentai\n    \"111111\", //21 启用的漫画源\n    \"\", //22 下载目录, 仅Windows端, 为空表示使用App数据目录\n    \"0\", //23 初始页面,\n    \"1111111111\", //24 [废弃]分类页面\n    \"0\", //25 漫画列表显示模式\n    \"00\", //26 已下载页面排序模式: 时间, 漫画名, 作者名, 大小\n    \"0\", //27 颜色\n    \"2\", //28 预加载页数\n    \"0\", //29 eh优先加载原图\n    \"1\", //30 picacg收藏夹新到旧\n    \"https://www.wnacg.com\", //31 绅士漫画域名\n    \"0\", //32  深色模式: 0-跟随系统, 1-禁用, 2-启用\n    \"5\", //33 自动翻页时间\n    \"1000\", //34 缓存数量限制\n    \"500\", //35 缓存大小限制\n    \"1\", //36 翻页动画\n    \"0\", //37 禁漫图片分流\n    \"0\", //38 高刷新率\n    \"0\", //39 nhentai搜索排序\n    \"25\", //40 点按翻页识别范围(0-50),\n    \"0\", //41 阅读器图片布局方式, 0-contain, 1-fitWidth, 2-fitHeight\n    \"0\", //42 禁漫收藏夹排序模式, 0-最新收藏, 1-最新更新\n    \"1\", //43 限制图片宽度\n    \"0,1.0\", //44 comic display type\n    \"\", //45 webdav\n    \"0\", //46 webdav version\n    \"0\", //47 eh warning\n    \"https://nhentai.net\", //48 nhentai domain\n    \"1\", //49 阅读器中双击放缩\n    \"\", //50 language, empty=system\n    \"\", //51 默认收藏夹\n    \"1\", //52 favorites\n    \"0\", //53 本地收藏添加位置(尾/首)\n    \"0\", //54 阅读后移动本地收藏(否/尾/首)\n    \"1\", //55 长按缩放\n    \"https://18comic.vip\", //56 jm domain\n    \"1\", //57 show page info in reader\n    \"0\", //58 hosts\n    \"012345678\", //59 explore page(废弃)\n    \"0\", //60 action when local favorite is tapped\n    \"0\", //61 check link in clipboard\n    \"10000\", //62 漫画信息页面工具栏: \"快速收藏\".tl, \"复制标题\".tl, \"复制链接\".tl, \"分享\".tl, \"搜索相似\".tl\n    \"0\", //63 初始搜索目标\n    \"0\", //64 启用侧边翻页\n    \"0\", //65 本地收藏显示数量\n    \"0\", //66 缩略图布局: 覆盖, 容纳\n    \"picacg,ehentai,jm,htmanga,nhentai\", //67 分类页面\n    \"picacg,ehentai,jm,htmanga,nhentai\", //68 收藏页面\n    \"0\", //69 自动添加语言筛选\n    \"0\", //70 反转点按识别\n    \"1\", // 71 关联网络收藏夹后每次刷新拉取几页\n    \"1\", //72 漫画块显示收藏状态\n    \"0\", //73 漫画块显示阅读位置\n    \"1.0\", //74 图片收藏大小\n    \"\", //75 eh profile\n    \"0\", //76 阅读器内固定横屏\n    \"picacg,Eh主页,Eh热门,禁漫主页,禁漫最新,hitomi,绅士漫画,nhentai\", //77 探索页面\n    \"0\", //78 已下载的eh漫画优先显示副标题\n    \"6\", //79 下载并行\n    \"1\", //80 启动时检查自定义漫画源的更新\n    \"0\", //81 使用深色背景\n    \"111111\", //82 内置漫画源启用状态,\n    \"1\", //83 完全隐藏屏蔽的作品\n  ];\n\n  /// 隐式数据, 用于存储一些不需要用户设置的数据, 此数据通常为某些组件的状态, 此设置不应当被同步\n  List<String> implicitData = [\n    \"1;;\", //收藏夹状态\n    \"0\", // 双页模式下第一页显示单页\n    \"0\", // 点击关闭按钮时不显示提示\n    webUA, // UA\n  ];\n\n  void writeImplicitData() async {\n    var s = await SharedPreferences.getInstance();\n    await s.setStringList(\"implicitData\", implicitData);\n  }\n\n  void readImplicitData() async {\n    var s = await SharedPreferences.getInstance();\n    var data = s.getStringList(\"implicitData\");\n    if (data == null) {\n      writeImplicitData();\n      return;\n    }\n    for (int i = 0; i < data.length && i < implicitData.length; i++) {\n      implicitData[i] = data[i];\n    }\n  }\n\n  ///屏蔽的关键词\n  List<String> blockingKeyword = [];\n\n  ///是否第一次使用的判定, 用于显示提示\n  List<String> firstUse = [\n    \"1\", //屏蔽关键词1\n    \"1\", //屏蔽关键词2(已废弃)\n    \"1\", //漫画详情页\n    \"0\", //是否进入过app\n    \"1\", //显示本地收藏夹的管理提示\n  ];\n\n  int getSearchMode() {\n    var modes = [\"dd\", \"da\", \"ld\", \"vd\"];\n    return modes.indexOf(settings[1]);\n  }\n\n  void setSearchMode(int mode) async {\n    var modes = [\"dd\", \"da\", \"ld\", \"vd\"];\n    settings[1] = modes[mode];\n    var s = await SharedPreferences.getInstance();\n    await s.setStringList(\"settings\", settings);\n  }\n\n  Future<void> readSettings(SharedPreferences s) async {\n    var settingsFile = File(\"${App.dataPath}/settings\");\n    List<String> st;\n    if (settingsFile.existsSync()) {\n      var json = jsonDecode(await settingsFile.readAsString());\n      if (json is List) {\n        st = List.from(json);\n      } else {\n        st = [];\n      }\n    } else {\n      st = s.getStringList(\"settings\") ?? [];\n    }\n    for (int i = 0; i < st.length && i < settings.length; i++) {\n      settings[i] = st[i];\n    }\n    if (settings[26].length < 2) {\n      settings[26] += \"0\";\n    }\n  }\n\n  Future<void> updateSettings([bool syncData = true]) async {\n    var settingsFile = File(\"${App.dataPath}/settings\");\n    await settingsFile.writeAsString(jsonEncode(settings));\n    if (syncData) {\n      Webdav.uploadData();\n    }\n  }\n\n  void writeFirstUse() async {\n    var s = await SharedPreferences.getInstance();\n    await s.setStringList(\"firstUse\", firstUse);\n  }\n\n  void writeHistory() async {\n    var s = await SharedPreferences.getInstance();\n    await s.setStringList(\"search\", searchHistory);\n    await s.setStringList(\"favoriteTags\", favoriteTags.toList());\n  }\n\n  Future<void> writeData([bool sync = true]) async {\n    if (sync) {\n      Webdav.uploadData();\n    }\n    var s = await SharedPreferences.getInstance();\n    await updateSettings();\n    await s.setStringList(\"blockingKeyword\", blockingKeyword);\n    await s.setStringList(\"firstUse\", firstUse);\n  }\n\n  Future<bool> readData() async {\n    var s = await SharedPreferences.getInstance();\n    try {\n      await readSettings(s);\n      searchHistory = s.getStringList(\"search\") ?? [];\n      favoriteTags = (s.getStringList(\"favoriteTags\") ?? []).toSet();\n      blockingKeyword = s.getStringList(\"blockingKeyword\") ?? [];\n      if (s.getStringList(\"firstUse\") != null) {\n        var st = s.getStringList(\"firstUse\")!;\n        for (int i = 0; i < st.length; i++) {\n          firstUse[i] = st[i];\n        }\n      }\n      readImplicitData();\n      return firstUse[3] == \"1\";\n    } catch (e) {\n      return false;\n    }\n  }\n\n  Map<String, dynamic> toJson() => {\n        \"settings\": settings,\n        \"firstUse\": firstUse,\n        \"blockingKeywords\": blockingKeyword,\n        \"favoriteTags\": favoriteTags.toList(),\n      };\n\n  bool readDataFromJson(Map<String, dynamic> json) {\n    try {\n      var newSettings = List<String>.from(json[\"settings\"]);\n      var downloadPath = settings[22];\n      for (var i = 0; i < settings.length && i < newSettings.length; i++) {\n        settings[i] = newSettings[i];\n      }\n      settings[22] = downloadPath;\n      var newFirstUse = List<String>.from(json[\"firstUse\"]);\n      for (var i = 0; i < firstUse.length && i < newFirstUse.length; i++) {\n        firstUse[i] = newFirstUse[i];\n      }\n      if (json[\"history\"] != null) {\n        history.readDataFromJson(json[\"history\"]);\n      }\n      // merge data\n      blockingKeyword = Set<String>.from(\n              ((json[\"blockingKeywords\"] ?? []) + blockingKeyword) as List)\n          .toList();\n      favoriteTags =\n          Set.from((json[\"favoriteTags\"] ?? []) + List.from(favoriteTags));\n      writeData(false);\n      return true;\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Appdata.readDataFromJson\",\n          \"error reading appdata$e\\n$s\");\n      readData();\n      return false;\n    }\n  }\n\n  final appSettings = _Settings();\n}\n\nvar appdata = Appdata();\nvar notifications = Notifications();\n\n/// clear all data\nFuture<void> clearAppdata() async {\n  var s = await SharedPreferences.getInstance();\n  await s.clear();\n  var settingsFile = File(\"${App.dataPath}/settings\");\n  if (await settingsFile.exists()) {\n    await settingsFile.delete();\n  }\n  appdata.history.clearHistory();\n  appdata = Appdata();\n  await appdata.readData();\n  await eraseCache();\n  await JmNetwork().cookieJar.deleteAll();\n  await LocalFavoritesManager().clearAll();\n}\n\nclass _Settings {\n  List<String> get _settings => appdata.settings;\n\n  /// Theme color, index of [colors] (lib/foundation/def.dart)\n  int get theme => int.parse(_settings[27]);\n\n  set theme(int value) {\n    appdata.settings[27] = value.toString();\n  }\n\n  /// Dark Mode, 0/1/2 (system/disabled/enable)\n  int get darkMode => int.parse(appdata.settings[32]);\n\n  set darkMode(int value) {\n    appdata.settings[32] = value.toString();\n  }\n\n  /// 0/1 (detailed/brief)\n  int get comicTileDisplayType =>\n      int.parse(appdata.settings[44].split(',').first);\n\n  set comicTileDisplayType(int v) {\n    var values = appdata.settings[44].split(',');\n    if (values.length != 2) {\n      values = ['0', '1.0'];\n    }\n    values[0] = v.toString();\n    appdata.settings[44] = values.join(',');\n  }\n\n  /// 0/1 (Continuous mode/Paging mode)\n  int get comicsListDisplayType => int.parse(appdata.settings[25]);\n\n  set comicsListDisplayType(int value) {\n    appdata.settings[25] = value.toString();\n  }\n\n  /// build-in comic sources\n  bool isComicSourceEnabled(String key) {\n    var index = builtInSources.indexOf(key);\n    if (index == -1) {\n      throw \"Not Found\";\n    }\n    return appdata.settings[82][index] == '1';\n  }\n\n  void setComicSourceEnabled(String key, bool enabled) {\n    var index = builtInSources.indexOf(key);\n    if (index == -1) {\n      throw \"Not Found\";\n    }\n    appdata.settings[82] =\n        appdata.settings[82].setValueAt(enabled ? '1' : '0', index);\n  }\n\n  List<String> get explorePages => appdata.settings[77].split(',');\n\n  set explorePages(List<String> pages) {\n    appdata.settings[77] = pages.join(',');\n  }\n\n  List<String> get categoryPages => appdata.settings[67].split(',');\n\n  set categoryPages(List<String> pages) {\n    appdata.settings[67] = pages.join(',');\n  }\n\n  String get initialSearchTarget => appdata.settings[63];\n\n  set initialSearchTarget(String value) {\n    appdata.settings[63] = value;\n  }\n\n  bool get reduceBrightnessInDarkMode => appdata.settings[18] == \"1\";\n\n  set reduceBrightnessInDarkMode(bool value) {\n    appdata.settings[18] = value ? \"1\" : \"0\";\n  }\n\n  bool get showPageInfoInReader => appdata.settings[57] == \"1\";\n\n  set showPageInfoInReader(bool value) {\n    appdata.settings[57] = value ? \"1\" : \"0\";\n  }\n\n  bool get showButtonsInReader => appdata.settings[4] == \"1\";\n\n  set showButtonsInReader(bool value) {\n    appdata.settings[4] = value ? \"1\" : \"0\";\n  }\n\n  bool get flipPageWithClick => appdata.settings[0] == \"1\";\n\n  set flipPageWithClick(bool value) {\n    appdata.settings[0] = value ? \"1\" : \"0\";\n  }\n\n  bool get useDarkBackground => appdata.settings[81] == \"1\";\n\n  set useDarkBackground(bool value) {\n    appdata.settings[81] = value ? \"1\" : \"0\";\n  }\n\n  bool get fullyHideBlockedWorks => appdata.settings[83] == \"1\";\n\n  set fullyHideBlockedWorks(bool value) {\n    appdata.settings[83] = value ? \"1\" : \"0\";\n  }\n\n  /// cache size limit in MB\n  int get cacheLimit => int.tryParse(appdata.settings[35]) ?? 500;\n\n  set cacheLimit(int value) {\n    appdata.settings[35] = value.toString();\n  }\n\n  List<String> get networkFavorites => appdata.settings[68].split(',');\n\n  set networkFavorites(List<String> pages) {\n    appdata.settings[68] = pages.join(',');\n  }\n}\n"
  },
  {
    "path": "lib/comic_source/app_build_in_category.dart",
    "content": "import 'package:pica_comic/network/nhentai_network/tags.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\n\nimport 'comic_source.dart';\n\nconst CategoryData picacgCategory = CategoryData(\n    title: \"Picacg\",\n    key: \"picacg\",\n    categories: [\n      FixedCategoryPart(\n          \"分类\",\n          [\n            \"大家都在看\",\n            \"大濕推薦\",\n            \"那年今天\",\n            \"官方都在看\",\n            \"嗶咔漢化\",\n            \"全彩\",\n            \"長篇\",\n            \"同人\",\n            \"短篇\",\n            \"圓神領域\",\n            \"碧藍幻想\",\n            \"CG雜圖\",\n            \"英語 ENG\",\n            \"生肉\",\n            \"純愛\",\n            \"百合花園\",\n            \"耽美花園\",\n            \"偽娘哲學\",\n            \"後宮閃光\",\n            \"扶他樂園\",\n            \"單行本\",\n            \"姐姐系\",\n            \"妹妹系\",\n            \"SM\",\n            \"性轉換\",\n            \"足の恋\",\n            \"人妻\",\n            \"NTR\",\n            \"強暴\",\n            \"非人類\",\n            \"艦隊收藏\",\n            \"Love Live\",\n            \"SAO 刀劍神域\",\n            \"Fate\",\n            \"東方\",\n            \"WEBTOON\",\n            \"禁書目錄\",\n            \"歐美\",\n            \"Cosplay\",\n            \"重口地帶\"\n          ],\n          \"category\"),\n    ], enableRankingPage: false);\n\nCategoryData ehCategory = CategoryData(\n    title: \"ehentai\",\n    key: \"ehentai\",\n    categories: [\n      RandomCategoryPartWithRuntimeData(\n          \"male\",\n          () => TagsTranslation.maleTags.keys.toList(),\n          20,\n          \"search_with_namespace\"),\n      RandomCategoryPartWithRuntimeData(\n          \"female\",\n          () => TagsTranslation.femaleTags.keys.toList(),\n          20,\n          \"search_with_namespace\"),\n      RandomCategoryPartWithRuntimeData(\n          \"parody\",\n          () => TagsTranslation.parodyTags.keys.toList(),\n          20,\n          \"search_with_namespace\"),\n      RandomCategoryPartWithRuntimeData(\n          \"character\",\n          () => TagsTranslation.characterTranslations.keys.toList(),\n          20,\n          \"search\"),\n      RandomCategoryPartWithRuntimeData(\n          \"mixed\",\n          () => TagsTranslation.mixedTags.keys.toList(),\n          20,\n          \"search_with_namespace\"),\n      RandomCategoryPartWithRuntimeData(\n          \"artist\",\n          () => TagsTranslation.artistTags.keys.toList(),\n          20,\n          \"search_with_namespace\"),\n      RandomCategoryPartWithRuntimeData(\n          \"group\",\n          () => TagsTranslation.groupTags.keys.toList(),\n          20,\n          \"search_with_namespace\"),\n      RandomCategoryPartWithRuntimeData(\n          \"cosplayer\",\n          () => TagsTranslation.cosplayerTags.keys.toList(),\n          20,\n          \"search_with_namespace\"),\n      RandomCategoryPartWithRuntimeData(\n          \"other\",\n          () => TagsTranslation.otherTags.keys.toList(),\n          20,\n          \"search_with_namespace\"),\n    ],\n    enableRankingPage: true,);\n\nconst CategoryData jmCategory = CategoryData(\n    title: \"禁漫天堂\",\n    key: \"jm\",\n    categories: [\n      FixedCategoryPart(\n          \"成人A漫\",\n          [\n            \"最新A漫\",\n            \"同人\",\n            \"單本\",\n            \"短篇\",\n            \"其他類\",\n            \"韓漫\",\n            \"美漫\",\n            \"Cosplay\",\n            \"3D\",\n            \"禁漫漢化組\"\n          ],\n          \"category\",\n          [\n            \"0\",\n            \"doujin\",\n            \"single\",\n            \"short\",\n            \"another\",\n            \"hanman\",\n            \"meiman\",\n            \"another_cosplay\",\n            \"3D\",\n            \"禁漫漢化組\"\n          ]),\n      FixedCategoryPart(\n          \"主題A漫\",\n          [\n            '無修正',\n            '劇情向',\n            '青年漫',\n            '校服',\n            '純愛',\n            '人妻',\n            '教師',\n            '百合',\n            'Yaoi',\n            '性轉',\n            'NTR',\n            '女裝',\n            '癡女',\n            '全彩',\n            '女性向',\n            '完結',\n            '純愛',\n            '禁漫漢化組'\n          ],\n          \"search\"),\n      FixedCategoryPart(\n          \"角色扮演\",\n          [\n            '御姐',\n            '熟女',\n            '巨乳',\n            '貧乳',\n            '女性支配',\n            '教師',\n            '女僕',\n            '護士',\n            '泳裝',\n            '眼鏡',\n            '連褲襪',\n            '其他制服',\n            '兔女郎'\n          ],\n          \"search\"),\n      FixedCategoryPart(\n          \"特殊PLAY\",\n          [\n            '群交',\n            '足交',\n            '束縛',\n            '肛交',\n            '阿黑顏',\n            '藥物',\n            '扶他',\n            '調教',\n            '野外露出',\n            '催眠',\n            '自慰',\n            '觸手',\n            '獸交',\n            '亞人',\n            '怪物女孩',\n            '皮物',\n            'ryona',\n            '騎大車'\n          ],\n          \"search\"),\n      FixedCategoryPart(\n          \"其它\", ['CG', '重口', '獵奇', '非H', '血腥暴力', '站長推薦'], \"search\"),\n    ],\n    enableRankingPage: true,);\n\nconst CategoryData htCategory = CategoryData(\n    title: \"绅士漫画\",\n    key: \"htmanga\",\n    categories: [\n      FixedCategoryPart(\"最新\", [\"最新漫画\"], \"category\", [\"/albums.html\"]),\n      FixedCategoryPart(\n          \"同人志\",\n          [\n            \"同人志\",\n            \"同人志-汉化\",\n            \"同人志-日语\",\n            \"同人志-English\",\n            \"同人志-CG画集\",\n            \"同人志-3D漫画\",\n            \"同人志-Cosplay\"\n          ],\n          \"category\",\n          [\n            \"/albums-index-cate-5.html\",\n            \"/albums-index-cate-1.html\",\n            \"/albums-index-cate-12.html\",\n            \"/albums-index-cate-16.html\",\n            \"/albums-index-cate-2.html\",\n            \"/albums-index-cate-22.html\",\n            \"/albums-index-cate-3.html\",\n          ]),\n      FixedCategoryPart(\n          \"单行本\",\n          [\"单行本\", \"单行本-汉化\", \"单行本-日语\", \"单行本-English\"],\n          \"category\",\n          [\n            \"/albums-index-cate-6.html\",\n            \"/albums-index-cate-9.html\",\n            \"/albums-index-cate-13.html\",\n            \"/albums-index-cate-17.html\",\n          ]),\n      FixedCategoryPart(\n          \"杂志&短篇\",\n          [\"杂志&短篇\", \"杂志&短篇-汉化\", \"杂志&短篇-日语\", \"杂志&短篇-English\"],\n          \"category\",\n          [\n            \"/albums-index-cate-7.html\",\n            \"/albums-index-cate-10.html\",\n            \"/albums-index-cate-14.html\",\n            \"/albums-index-cate-18.html\",\n          ]),\n      FixedCategoryPart(\n          \"韩漫\",\n          [\"韩漫\", \"韩漫-汉化\", \"韩漫-其它\"],\n          \"category\",\n          [\n            \"/albums-index-cate-19.html\",\n            \"/albums-index-cate-20.html\",\n            \"/albums-index-cate-21.html\",\n          ]),\n    ],\n    enableRankingPage: false,);\n\nfinal nhCategory = CategoryData(\n    title: \"nhentai\",\n    key: \"nhentai\",\n    categories: [\n      const FixedCategoryPart(\"language\", [\"chinese\", \"japanese\", \"english\"],\n          \"search_with_namespace\"),\n      RandomCategoryPartWithRuntimeData(\n          \"Tags\", () => nhentaiTags.values.toList(), 50, \"search\"),\n    ],\n    enableRankingPage: false);\n"
  },
  {
    "path": "lib/comic_source/app_build_in_favorites.dart",
    "content": "import 'package:pica_comic/base.dart';\nimport 'package:pica_comic/network/htmanga_network/htmanga_main_network.dart';\nimport 'package:pica_comic/network/jm_network/jm_network.dart';\nimport 'package:pica_comic/network/nhentai_network/nhentai_main_network.dart';\nimport 'package:pica_comic/network/picacg_network/methods.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'comic_source.dart';\n\nfinal picacgFavorites = FavoriteData(\n    key: \"picacg\",\n    title: \"Picacg\",\n    multiFolder: false,\n    loadComic: (i, [folder]) => PicacgNetwork().getFavorites(i, appdata.settings[30]==\"1\"),\n    loadFolders: null,\n    addOrDelFavorite: (id, folder, isAdding) async{\n      var res = await PicacgNetwork().favouriteOrUnfavouriteComic(id);\n      return res ? const Res(true) : const Res(false, errorMessage: \"Network Error\");\n    }\n);\n\n/// eh较为特殊, 写统一接口有点麻烦, 不要使用这个进行构建页面\nfinal ehFavorites = FavoriteData(\n    key: \"ehentai\",\n    title: \"ehentai\",\n    multiFolder: true,\n    loadComic: (i, [folder]) => throw UnimplementedError(),\n    loadFolders: null\n);\n\nfinal jmFavorites = FavoriteData(\n    key: \"jm\",\n    title: \"禁漫天堂\",\n    multiFolder: true,\n    loadComic: (i, [folder]) => JmNetwork().getFolderComicsPage(folder!, i),\n    loadFolders: ([String? comicId]) => JmNetwork().getFolders(),\n    deleteFolder: (id) => JmNetwork().deleteFolder(id),\n    addFolder: (name) => JmNetwork().createFolder(name),\n    allFavoritesId: \"0\",\n    addOrDelFavorite: (id, folder, isAdding) async{\n      if(isAdding)  return const Res.error(\"invalid\");\n      var res = await JmNetwork().favorite(id, folder);\n      return res;\n    }\n);\n\nfinal htFavorites = FavoriteData(\n    key: \"htmanga\",\n    title: \"绅士漫画\",\n    multiFolder: true,\n    loadComic: (i, [folder]) => HtmangaNetwork().getFavoriteFolderComics(folder!, i),\n    loadFolders: ([String? comicId]) => HtmangaNetwork().getFolders(),\n    allFavoritesId: \"0\",\n    deleteFolder: (id) async{\n      var res = await HtmangaNetwork().deleteFolder(id);\n      return res ? const Res(true) : const Res(false, errorMessage: \"Network Error\");\n    },\n    addFolder: (name) async{\n      var res = await HtmangaNetwork().createFolder(name);\n      return res ? const Res(true) : const Res(false, errorMessage: \"Network Error\");\n    },\n    addOrDelFavorite: (id, folder, isAdding) async{\n      if(isAdding)  return const Res.error(\"invalid\");\n      var res = await HtmangaNetwork().delFavorite(id);\n      return res;\n    }\n);\n\nfinal nhentaiFavorites = FavoriteData(\n    key: \"nhentai\",\n    title: \"nhentai\",\n    multiFolder: false,\n    loadComic: (i, [folder]) => NhentaiNetwork().getFavorites(i),\n    loadFolders: null,\n);"
  },
  {
    "path": "lib/comic_source/built_in/ehentai.dart",
    "content": "import 'dart:collection';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/network/base_comic.dart';\nimport 'package:pica_comic/network/eh_network/eh_main_network.dart';\nimport 'package:pica_comic/network/eh_network/eh_models.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/ehentai/accounts.dart';\nimport 'package:pica_comic/pages/ehentai/eh_gallery_page.dart';\nimport 'package:pica_comic/pages/ehentai/eh_login_page.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nimport '../../base.dart';\nimport '../comic_source.dart';\n\nfinal ehentai = ComicSource.named(\n  name: 'ehentai',\n  key: 'ehentai',\n  filePath: 'built-in',\n  favoriteData: FavoriteData(\n    key: \"ehentai\",\n    title: \"ehentai\",\n    multiFolder: true,\n    loadComic: (i, [folderId]) {\n      if (i == 1) {\n        _EhentaiGalleriesLoader.instances['favorite'] =\n            _EhentaiGalleriesLoader(firstPageLoader: () async {\n          Res<Galleries> res;\n          if (folderId == '-1') {\n            res = await EhNetwork().getGalleries(\n                \"${EhNetwork().ehBaseUrl}/favorites.php\",\n                favoritePage: true);\n          } else {\n            res = await EhNetwork().getGalleries(\n                \"${EhNetwork().ehBaseUrl}/favorites.php?favcat=$folderId\",\n                favoritePage: true);\n          }\n          return res;\n        });\n      }\n      return _EhentaiGalleriesLoader.instances['favorite']!(i);\n    },\n    loadFolders: ([cid]) async {\n      var e = await EhNetwork().getGalleries(\n          \"${EhNetwork().ehBaseUrl}/favorites.php\",\n          favoritePage: true);\n      if (e.error) {\n        return Res.fromErrorRes(e);\n      }\n      var res = <String, String>{};\n      var folders = <String>[\"全部\".tl];\n      folders.addAll(EhNetwork().folderNames);\n      for (int i = -1; i < EhNetwork().folderNames.length; i++) {\n        res[i.toString()] = folders[i + 1];\n      }\n      return Res(res);\n    },\n  ),\n  categoryData: CategoryData(\n    title: \"ehentai\",\n    key: \"ehentai\",\n    categories: [\n      RandomCategoryPartWithRuntimeData(\n        \"male\",\n        () => TagsTranslation.maleTags.keys,\n        20,\n        \"search_with_namespace\",\n      ),\n      RandomCategoryPartWithRuntimeData(\n        \"female\",\n        () => TagsTranslation.femaleTags.keys,\n        20,\n        \"search_with_namespace\",\n      ),\n      RandomCategoryPartWithRuntimeData(\n        \"parody\",\n        () => TagsTranslation.parodyTags.keys,\n        20,\n        \"search_with_namespace\",\n      ),\n      RandomCategoryPartWithRuntimeData(\n        \"character\",\n        () => TagsTranslation.characterTranslations.keys,\n        20,\n        \"search\",\n      ),\n      RandomCategoryPartWithRuntimeData(\n        \"mixed\",\n        () => TagsTranslation.mixedTags.keys,\n        20,\n        \"search_with_namespace\",\n      ),\n      RandomCategoryPartWithRuntimeData(\n        \"artist\",\n        () => TagsTranslation.artistTags.keys,\n        20,\n        \"search_with_namespace\",\n      ),\n      RandomCategoryPartWithRuntimeData(\n        \"group\",\n        () => TagsTranslation.groupTags.keys,\n        20,\n        \"search_with_namespace\",\n      ),\n      RandomCategoryPartWithRuntimeData(\n        \"cosplayer\",\n        () => TagsTranslation.cosplayerTags.keys,\n        20,\n        \"search_with_namespace\",\n      ),\n      RandomCategoryPartWithRuntimeData(\n        \"other\",\n        () => TagsTranslation.otherTags.keys,\n        20,\n        \"search_with_namespace\",\n      ),\n    ],\n    enableRankingPage: true,\n  ),\n  categoryComicsData: CategoryComicsData.named(\n    load: (p0, p1, p3, p4) => throw UnimplementedError(),\n    rankingData: RankingData.named(\n      options: {\n        '15': \"昨天\",\n        '13': \"本月\",\n        '12': \"今年\",\n        '11': \"全部\",\n      },\n      load: (options, page) {\n        var type = int.tryParse(options) ?? 15;\n        return EhNetwork().getLeaderBoardByPage(type, page);\n      },\n    ),\n  ),\n  account: AccountConfig.named(\n    allowReLogin: false,\n    onLogin: (BuildContext context) async {\n      await context.to(() => const EhLoginPage());\n      var cookies = EhNetwork().cookieJar.loadForRequest(Uri.parse(\"https://e-hentai.org\"));\n      if(!cookies.any((e) => e.name == 'ipb_member_id')) {\n        return;\n      }\n      var ehentai = ComicSource.find('ehentai')!;\n      if (ehentai.data['name'] != null) {\n        ehentai.data['account'] = 'ok';\n      }\n      ehentai.saveData();\n    },\n    logout: () {\n      var ehentai = ComicSource.find('ehentai')!;\n      EhNetwork().cookieJar.deleteUri(Uri.parse(\"https://e-hentai.org\"));\n      EhNetwork().cookieJar.deleteUri(Uri.parse(\"https://exhentai.org\"));\n      ehentai.data['name'] = '';\n    },\n    infoItems: [\n      AccountInfoItem(\n        title: \"用户名\",\n        data: () => ComicSource.find('ehentai')!.data['name'] ?? '',\n      ),\n      AccountInfoItem(\n        title: \"\",\n        builder: (context) => const CookieManagementView(),\n      ),\n    ],\n  ),\n  comicTileBuilderOverride: (context, gallery, menuOptions) {\n    return _EhGalleryTile(\n      gallery: gallery as EhGalleryBrief,\n      addonMenuOptions: menuOptions,\n    );\n  },\n  explorePages: [\n    ExplorePageData.named(\n      title: \"Eh主页\",\n      type: ExplorePageType.multiPageComicList,\n      loadPage: _EhentaiGalleriesLoader(\n        firstPageLoader: () => EhNetwork().getGalleries(EhNetwork().ehBaseUrl),\n      ),\n    ),\n    ExplorePageData.named(\n      title: \"Eh热门\",\n      type: ExplorePageType.multiPageComicList,\n      loadPage: _EhentaiGalleriesLoader(\n        firstPageLoader: () =>\n            EhNetwork().getGalleries(\"${EhNetwork().ehBaseUrl}/popular\"),\n      ),\n    ),\n  ],\n  searchPageData: SearchPageData.named(\n    loadPage: (keyword, page, options) {\n      if (page == 1) {\n        _EhentaiGalleriesLoader.clean();\n        _EhentaiGalleriesLoader.instances['search:$keyword'] =\n            _EhentaiGalleriesLoader(\n          firstPageLoader: () => EhNetwork().search(\n            keyword,\n            fCats: int.tryParse(options.elementAtOrNull(0) ?? ''),\n            startPages: int.tryParse(options.elementAtOrNull(1) ?? ''),\n            endPages: int.tryParse(options.elementAtOrNull(2) ?? ''),\n            minStars: int.tryParse(options.elementAtOrNull(3) ?? ''),\n          ),\n        );\n      }\n      return _EhentaiGalleriesLoader.instances['search:$keyword']!(page);\n    },\n    customOptionsBuilder: (context, initialValues, updater) {\n      return _SearchOptions(initialValues, updater);\n    },\n    enableLanguageFilter: true,\n    enableTagsSuggestions: true,\n  ),\n  comicPageBuilder: (context, id, cover) {\n    return EhGalleryPage.fromLink(id, comicCover: cover);\n  },\n);\n\nclass _EhGalleryTile extends ComicTile {\n  final EhGalleryBrief gallery;\n\n  const _EhGalleryTile({required this.gallery, this.addonMenuOptions});\n\n  List<String> _generateTags(List<String> tags) {\n    if (App.locale.languageCode != \"zh\") {\n      return tags;\n    }\n    List<String> res = [];\n    List<String> res2 = [];\n    for (var tag in tags) {\n      if (tag.contains(\":\")) {\n        var splits = tag.split(\":\");\n        if (splits[0] == \"language\") {\n          continue;\n        }\n        var lowLevelKey = [\"character\", \"artist\", \"cosplayer\", \"group\"];\n        if (lowLevelKey.contains(splits[0])) {\n          res2.add(TagsTranslation.translationTagWithNamespace(\n              splits[1], splits[0]));\n        } else {\n          res.add(TagsTranslation.translationTagWithNamespace(\n              splits[1], splits[0]));\n        }\n      } else {\n        res.add(tag.translateTagsToCN);\n      }\n    }\n    return res + res2;\n  }\n\n  @override\n  int get maxLines =>\n      MediaQuery.of(App.globalContext!).size.width < 430 ? 1 : 2;\n\n  @override\n  ActionFunc? get read => () async {\n        bool cancel = false;\n        var dialog = showLoadingDialog(\n          App.globalContext!,\n          onCancel: () => cancel = true,\n        );\n        var res = await EhNetwork().getGalleryInfo(gallery.link);\n        if (cancel) {\n          return;\n        }\n        dialog.close();\n        if (res.error) {\n          showToast(message: res.errorMessage ?? \"Error\");\n        } else {\n          var history = await History.findOrCreate(res.data);\n          App.globalTo(\n                () => ComicReadingPage.ehentai(\n              res.data,\n              initialPage: history.page,\n            ),\n          );\n        }\n      };\n\n  @override\n  List<String>? get tags => _generateTags(gallery.tags);\n\n  @override\n  String get description => \"${gallery.time}  ${gallery.type}\";\n\n  @override\n  String? get badge => () {\n        String? lang;\n        if (gallery.tags.isNotEmpty &&\n            gallery.tags[0].substring(0, 4) == \"lang\") {\n          lang = gallery.tags[0].substring(9);\n        } else if (gallery.tags.length > 1 &&\n            gallery.tags.isNotEmpty &&\n            gallery.tags[1].substring(0, 4) == \"lang\") {\n          lang = gallery.tags[1].substring(9);\n        }\n        if (App.locale.languageCode == \"zh\" && lang != null) {\n          lang = lang.translateTagsToCN;\n        }\n        return lang;\n      }.call();\n\n  @override\n  Widget get image => AnimatedImage(\n        image: CachedImageProvider(\n          gallery.coverPath,\n          headers: {\n            \"Cookie\": EhNetwork().cookiesStr,\n            \"User-Agent\": webUA,\n            \"Referer\": EhNetwork().ehBaseUrl,\n          },\n        ),\n        fit: BoxFit.cover,\n        height: double.infinity,\n        width: double.infinity,\n      );\n\n  @override\n  void onTap_() {\n    App.mainNavigatorKey!.currentContext!.to(\n      () => ComicPage(\n        sourceKey: 'ehentai',\n        id: gallery.link,\n        cover: gallery.cover,\n      ),\n    );\n  }\n\n  @override\n  Widget? buildSubDescription(context) {\n    final s = gallery.stars ~/ 0.5;\n    return SizedBox(\n      height: 20,\n      child: Row(\n        children: [\n          for (int i = 0; i < s ~/ 2; i++)\n            Icon(\n              Icons.star,\n              size: 20,\n              color: Theme.of(context).colorScheme.secondary,\n            ),\n          if (s % 2 == 1)\n            Icon(\n              Icons.star_half,\n              size: 20,\n              color: Theme.of(context).colorScheme.secondary,\n            ),\n          for (int i = 0; i < (5 - s ~/ 2 - s % 2); i++)\n            const Icon(\n              Icons.star_border,\n              size: 20,\n            )\n        ],\n      ),\n    );\n  }\n\n  @override\n  String get subTitle => gallery.uploader;\n\n  @override\n  String get title => gallery.title;\n\n  @override\n  int? get pages => gallery.pages;\n\n  @override\n  FavoriteItem? get favoriteItem => FavoriteItem.fromEhentai(gallery);\n\n  @override\n  final List<ComicTileMenuOption>? addonMenuOptions;\n\n  @override\n  String get comicID => gallery.link;\n}\n\nclass _SearchOptions extends StatefulWidget {\n  const _SearchOptions(this.initialValues, this.updater);\n\n  final List<String> initialValues;\n\n  final void Function(List<String> updater) updater;\n\n  @override\n  State<_SearchOptions> createState() => _SearchOptionsState();\n}\n\nclass _SearchOptionsState extends State<_SearchOptions> {\n  int ehFCats = 0;\n  int? ehStartPage;\n  int? ehEndPage;\n  int? ehMinStars;\n\n  @override\n  void initState() {\n    ehFCats = int.tryParse(widget.initialValues.elementAtOrNull(0) ?? '') ?? 0;\n    ehStartPage = int.tryParse(widget.initialValues.elementAtOrNull(1) ?? '');\n    ehEndPage = int.tryParse(widget.initialValues.elementAtOrNull(2) ?? '');\n    ehMinStars = int.tryParse(widget.initialValues.elementAtOrNull(3) ?? '');\n    super.initState();\n  }\n\n  void update() {\n    widget.updater([\n      ehFCats.toString(),\n      ehStartPage.toString(),\n      ehEndPage.toString(),\n      ehMinStars.toString(),\n    ]);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var isInDialog = context.findAncestorWidgetOfExactType<Dialog>() != null;\n    var width = context.width-16;\n    if(width > 500) {\n      width = 500;\n    }\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        ListTile(\n          title: Text(\"高级选项\".tl),\n        ),\n        if(!isInDialog)\n          LayoutBuilder(\n            builder: (context, constrains) => Wrap(\n              children: List.generate(categories.length, (index) {\n                const minWidth = 86;\n                var items = constrains.maxWidth ~/ minWidth;\n                return buildCategoryItem(\n                  categories[index],\n                  index,\n                  constrains.maxWidth / items - items,\n                );\n              }),\n            ),\n          ).paddingHorizontal(12)\n        else\n          SizedBox(\n            width: width,\n            child: Wrap(\n              children: List.generate(categories.length, (index) {\n                const minWidth = 86;\n                var items = width ~/ minWidth;\n                return buildCategoryItem(\n                  categories[index],\n                  index,\n                  width / items - items,\n                );\n              }),\n            ),\n          ).paddingHorizontal(12),\n        const SizedBox(\n          height: 8,\n        ),\n        Row(\n          children: [\n            const SizedBox(width: 8),\n            const Text(\"Pages From\"),\n            const SizedBox(width: 8),\n            SizedBox(\n              width: 68,\n              child: TextField(\n                onChanged: (s) {\n                  ehStartPage = int.tryParse(s);\n                  update();\n                },\n                keyboardType: TextInputType.number,\n                inputFormatters: [\n                  FilteringTextInputFormatter.allow(RegExp(\"[0-9]\"))\n                ],\n              ),\n            ),\n            const SizedBox(width: 8),\n            const Text(\"To\"),\n            const SizedBox(width: 8),\n            SizedBox(\n              width: 68,\n              child: TextField(\n                onChanged: (s) {\n                  ehEndPage = int.tryParse(s);\n                  update();\n                },\n                keyboardType: TextInputType.number,\n                inputFormatters: [\n                  FilteringTextInputFormatter.allow(RegExp(\"[0-9]\"))\n                ],\n              ),\n            ),\n          ],\n        ).paddingHorizontal(12),\n        const SizedBox(\n          height: 12,\n        ),\n        Row(\n          children: [\n            const SizedBox(\n              width: 8,\n            ),\n            Text(\"最少星星\".tl),\n            const SizedBox(\n              width: 16,\n            ),\n            Select(\n              initialValue: ehMinStars,\n              onChange: (i) {\n                ehMinStars = i;\n                update();\n              },\n              values: const [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\"],\n              outline: true,\n            ),\n          ],\n        ).paddingHorizontal(12),\n        const SizedBox(height: 8)\n      ],\n    );\n  }\n\n  static const categories = [\n    \"Misc\",\n    \"Doujinshi\",\n    \"Manga\",\n    \"Artist CG\",\n    \"Game CG\",\n    \"Image Set\",\n    \"Cosplay\",\n    \"Asian Porn\",\n    \"Non-H\",\n    \"Western\"\n  ];\n\n  Widget buildCategoryItem(String title, int value, double width) {\n    bool disabled = ehFCats & (1 << value) == 1 << value;\n    return AnimatedContainer(\n      duration: const Duration(milliseconds: 120),\n      margin: const EdgeInsets.symmetric(vertical: 4, horizontal: 2),\n      width: width,\n      height: 38,\n      decoration: BoxDecoration(\n        color: !disabled\n            ? App.colors(context).tertiaryContainer\n            : App.colors(context).tertiaryContainer.withOpacity(0.2),\n        borderRadius: BorderRadius.circular(8),\n      ),\n      child: InkWell(\n        borderRadius: BorderRadius.circular(8),\n        onTap: () {\n          setState(() {\n            disabled ? ehFCats -= (1 << value) : ehFCats += (1 << value);\n          });\n          update();\n        },\n        child: Center(\n          child: Text(\n            title,\n            style: const TextStyle(fontSize: 14),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass _EhentaiGalleriesLoader {\n  static final instances = <String, _EhentaiGalleriesLoader>{};\n\n  static void clean() {\n    var shouldRemove = <String>[];\n    for (var i in instances.entries) {\n      if (i.key.startsWith(\"search:\")) {\n        var keyword = i.key.replaceFirst(\"search:\", \"\");\n        if (StateController.findOrNull(\n                tag: \"ehentai search page with $keyword\") ==\n            null) {\n          shouldRemove.add(i.key);\n        }\n      }\n    }\n    for (var i in shouldRemove) {\n      instances.remove(i);\n    }\n  }\n\n  _EhentaiGalleriesLoader({required this.firstPageLoader});\n\n  final Future<Res<Galleries>> Function() firstPageLoader;\n\n  String? nextPage;\n\n  List<List<BaseComic>> cache = [];\n\n  Future<Res<List<BaseComic>>> call(int page) async {\n    if (page == 1 || cache.isEmpty) {\n      var res = await firstRequest();\n      if (res.error) {\n        return Res.fromErrorRes(res);\n      }\n    }\n    page--;\n    while (page >= cache.length) {\n      var res = await loadNext();\n      if(res.error) {\n        return Res.fromErrorRes(res);\n      }\n    }\n    if (nextPage == null) {\n      return Res(cache[page], subData: cache.length);\n    }\n    return Res(cache[page]);\n  }\n\n  Future<Res<void>> firstRequest() async {\n    cache.clear();\n    var res = await firstPageLoader();\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    cache.add(res.data.galleries);\n    nextPage = res.data.next;\n    return const Res(null);\n  }\n\n  Future<Res<void>> loadNext() async {\n    var res = await EhNetwork().getGalleries(nextPage!);\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    cache.add(res.data.galleries);\n    nextPage = res.data.next;\n    return const Res(null);\n  }\n}\n"
  },
  {
    "path": "lib/comic_source/built_in/hitomi.dart",
    "content": "import 'package:flutter/widgets.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/def.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_main_network.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_models.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/hitomi/hitomi_comic_page.dart';\nimport 'package:pica_comic/pages/hitomi/hitomi_home_page.dart';\nimport 'package:pica_comic/pages/hitomi/hitomi_search.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\n\nfinal hitomi = ComicSource.named(\n  name: \"hitomi\",\n  key: \"hitomi\",\n  filePath: \"built-in\",\n  comicTileBuilderOverride: (context, comic, options) {\n    return _HiComicTile(\n      comic as HitomiComicBrief,\n      addonMenuOptions: options,\n    );\n  },\n  explorePages: [\n    ExplorePageData.named(\n      title: \"hitomi\",\n      type: ExplorePageType.override,\n      overridePageBuilder: (context) => const HitomiHomePage(),\n    ),\n  ],\n  searchPageData: SearchPageData.named(\n    overrideSearchResultBuilder: (keyword, options) {\n      return HitomiSearchPage(keyword);\n    },\n    enableLanguageFilter: true,\n  ),\n  comicPageBuilder: (context, id, cover) {\n    return HitomiComicPage.fromLink(id, cover: cover);\n  },\n  getThumbnailLoadingConfig: (url) {\n    return {\n      \"headers\": {\"User-Agent\": webUA, \"Referer\": \"https://hitomi.la/\"},\n    };\n  },\n);\n\nclass _HiComicTile extends ComicTile {\n  final HitomiComicBrief comic;\n\n  const _HiComicTile(this.comic, {this.addonMenuOptions});\n\n  List<String> _generateTags(List<Tag> tags) {\n    var res = <String>[];\n    for (var tag in tags) {\n      var name = tag.name;\n      if (App.locale.languageCode == \"zh\") {\n        if (name.contains('♀')) {\n          name = \"${name.replaceFirst(\" ♀\", \"\").translateTagsToCN}♀\";\n        } else if (name.contains('♂')) {\n          name = \"${name.replaceFirst(\" ♂\", \"\").translateTagsToCN}♂\";\n        } else {\n          name = name.translateTagsToCN;\n        }\n      }\n      res.add(name);\n    }\n    return res;\n  }\n\n  @override\n  List<String>? get tags => _generateTags(comic.tagList);\n\n  @override\n  ActionFunc? get read => () async {\n        bool cancel = false;\n        var dialog = showLoadingDialog(App.globalContext!,\n            onCancel: () => cancel = true);\n        var res = await HiNetwork().getComicInfo(comic.link);\n        if (cancel) {\n          return;\n        }\n        dialog.close();\n        if (res.error) {\n          showToast(message: res.errorMessage ?? \"Error\");\n        } else {\n          var history = await History.findOrCreate(res.data);\n          App.globalTo(\n                () => ComicReadingPage.hitomi(\n              res.data,\n              comic.link,\n              initialPage: history.page,\n            ),\n          );\n        }\n      };\n\n  @override\n  String get description => () {\n        var description = \"${comic.type}    \";\n        description += comic.lang;\n        return description;\n      }.call();\n\n  @override\n  Widget get image => AnimatedImage(\n        image: CachedImageProvider(\n          comic.cover,\n          headers: {\"User-Agent\": webUA, \"Referer\": \"https://hitomi.la/\"},\n        ),\n        fit: BoxFit.cover,\n        height: double.infinity,\n        width: double.infinity,\n      );\n\n  @override\n  void onTap_() {\n    App.mainNavigatorKey!.currentContext!.to(\n      () => ComicPage(\n        sourceKey: 'hitomi',\n        id: comic.link,\n        cover: comic.cover,\n      ),\n    );\n  }\n\n  @override\n  String get subTitle => comic.artist;\n\n  @override\n  String get title => comic.name;\n\n  @override\n  FavoriteItem? get favoriteItem => FavoriteItem.fromHitomi(comic);\n\n  @override\n  String get comicID => comic.link;\n\n  @override\n  final List<ComicTileMenuOption>? addonMenuOptions;\n}\n"
  },
  {
    "path": "lib/comic_source/built_in/ht_manga.dart",
    "content": "import 'package:flutter/widgets.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/def.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/network/htmanga_network/htmanga_main_network.dart';\nimport 'package:pica_comic/network/htmanga_network/models.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/htmanga/ht_comic_page.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport '../comic_source.dart';\n\nfinal htManga = ComicSource.named(\n  name: '紳士漫畫',\n  key: 'htmanga',\n  filePath: 'built-in',\n  favoriteData: FavoriteData(\n    key: \"htmanga\",\n    title: \"绅士漫画\",\n    multiFolder: true,\n    loadComic: (i, [folder]) =>\n        HtmangaNetwork().getFavoriteFolderComics(folder!, i),\n    loadFolders: ([String? comicId]) => HtmangaNetwork().getFolders(),\n    allFavoritesId: \"0\",\n    deleteFolder: (id) async {\n      var res = await HtmangaNetwork().deleteFolder(id);\n      return res\n          ? const Res(true)\n          : const Res(false, errorMessage: \"Network Error\");\n    },\n    addFolder: (name) async {\n      var res = await HtmangaNetwork().createFolder(name);\n      return res\n          ? const Res(true)\n          : const Res(false, errorMessage: \"Network Error\");\n    },\n    addOrDelFavorite: (id, folder, isAdding) async {\n      if (isAdding) return const Res.error(\"invalid\");\n      var res = await HtmangaNetwork().delFavorite(id);\n      return res;\n    },\n  ),\n  categoryData: const CategoryData(\n    title: \"绅士漫画\",\n    key: \"htmanga\",\n    categories: [\n      FixedCategoryPart(\n        \"最新\",\n        [\"最新漫画\"],\n        \"category\",\n        [\"/albums.html\"],\n      ),\n      FixedCategoryPart(\n        \"同人志\",\n        [\n          \"同人志\",\n          \"同人志-汉化\",\n          \"同人志-日语\",\n          \"同人志-English\",\n          \"同人志-CG画集\",\n          \"同人志-3D漫画\",\n          \"同人志-Cosplay\"\n        ],\n        \"category\",\n        [\n          \"/albums-index-cate-5.html\",\n          \"/albums-index-cate-1.html\",\n          \"/albums-index-cate-12.html\",\n          \"/albums-index-cate-16.html\",\n          \"/albums-index-cate-2.html\",\n          \"/albums-index-cate-22.html\",\n          \"/albums-index-cate-3.html\",\n        ],\n      ),\n      FixedCategoryPart(\n        \"单行本\",\n        [\"单行本\", \"单行本-汉化\", \"单行本-日语\", \"单行本-English\"],\n        \"category\",\n        [\n          \"/albums-index-cate-6.html\",\n          \"/albums-index-cate-9.html\",\n          \"/albums-index-cate-13.html\",\n          \"/albums-index-cate-17.html\",\n        ],\n      ),\n      FixedCategoryPart(\n        \"杂志&短篇\",\n        [\"杂志&短篇\", \"杂志&短篇-汉化\", \"杂志&短篇-日语\", \"杂志&短篇-English\"],\n        \"category\",\n        [\n          \"/albums-index-cate-7.html\",\n          \"/albums-index-cate-10.html\",\n          \"/albums-index-cate-14.html\",\n          \"/albums-index-cate-18.html\",\n        ],\n      ),\n      FixedCategoryPart(\n        \"韩漫\",\n        [\"韩漫\", \"韩漫-汉化\", \"韩漫-其它\"],\n        \"category\",\n        [\n          \"/albums-index-cate-19.html\",\n          \"/albums-index-cate-20.html\",\n          \"/albums-index-cate-21.html\",\n        ],\n      ),\n    ],\n    enableRankingPage: false,\n  ),\n  categoryComicsData: CategoryComicsData.named(\n    load: (category, param, options, page) async {\n      if (!param!.startsWith(\"http\")) {\n        param = HtmangaNetwork.baseUrl + param;\n      }\n      return HtmangaNetwork().getComicList(\n        param,\n        page,\n      );\n    },\n  ),\n  account: AccountConfig.named(\n    registerWebsite: \"https://www.wnacg.com/albums.html\",\n    login: (account, pwd) async {\n      var htManga = ComicSource.find('htmanga')!;\n      var res = await HtmangaNetwork().login(account, pwd);\n      if (!res.error) {\n        htManga.data['name'] = account;\n      }\n      var a = <String>[account, pwd];\n      htManga.data['account'] = a;\n      return res;\n    },\n    logout: () {\n      ComicSource.find('htmanga')!.data['name'] = null;\n      HtmangaNetwork().logout();\n    },\n  ),\n  comicTileBuilderOverride: (context, comic, options) {\n    return _HtComicTile(\n      comic: comic as HtComicBrief,\n      addonMenuOptions: options,\n    );\n  },\n  explorePages: [\n    ExplorePageData.named(\n      title: \"绅士漫画\",\n      type: ExplorePageType.singlePageWithMultiPart,\n      loadMultiPart: () async {\n        var homepage = await HtmangaNetwork().getHomePage();\n        if (homepage.error) {\n          return Res.fromErrorRes(homepage);\n        }\n        var res = <ExplorePagePart>[];\n        for (int i = 0; i < homepage.data.comics.length; i++) {\n          var name = homepage.data.links.keys.elementAt(i);\n          res.add(\n            ExplorePagePart(\n              name,\n              homepage.data.comics[i],\n              \"category:$name@${homepage.data.links[name]}\",\n            ),\n          );\n        }\n        return Res(res);\n      },\n    ),\n  ],\n  searchPageData: SearchPageData.named(\n    loadPage: (keyword, page, options) {\n      return HtmangaNetwork().search(keyword, page);\n    },\n  ),\n  comicPageBuilder: (context, id, cover) {\n    return HtComicPage(\n      id,\n      comicCover: cover,\n    );\n  },\n);\n\nclass _HtComicTile extends ComicTile {\n  const _HtComicTile({required this.comic, this.addonMenuOptions});\n\n  final HtComicBrief comic;\n\n  @override\n  String get description => comic.time.trim();\n\n  @override\n  Widget get image => AnimatedImage(\n        image: CachedImageProvider(\n          comic.image,\n          headers: {\n            \"User-Agent\": webUA,\n          },\n        ),\n        fit: BoxFit.cover,\n        height: double.infinity,\n        width: double.infinity,\n        filterQuality: FilterQuality.medium,\n      );\n\n  @override\n  void onTap_() {\n    App.mainNavigatorKey!.currentContext!.to(() => ComicPage(\n          sourceKey: 'htmanga',\n          id: comic.id,\n          cover: comic.cover,\n        ));\n  }\n\n  @override\n  String get subTitle => \"${comic.pages} Pages\";\n\n  @override\n  ActionFunc? get read => () async {\n        bool cancel = false;\n        var dialog = showLoadingDialog(App.globalContext!,\n            onCancel: () => cancel = true);\n        var res = await HtmangaNetwork().getComicInfo(comic.id);\n        if (cancel) {\n          return;\n        }\n        dialog.close();\n        if (res.error) {\n          showToast(message: res.errorMessage ?? \"Error\");\n        } else {\n          var history = await History.findOrCreate(res.data);\n          App.globalTo(\n            () => ComicReadingPage.htmanga(\n              res.data.id,\n              comic.name,\n              initialPage: history.page,\n            ),\n          );\n        }\n      };\n\n  @override\n  String get title => comic.name.trim();\n\n  @override\n  FavoriteItem? get favoriteItem => FavoriteItem.fromHtcomic(comic);\n\n  @override\n  String get comicID => comic.id;\n\n  @override\n  final List<ComicTileMenuOption>? addonMenuOptions;\n}\n"
  },
  {
    "path": "lib/comic_source/built_in/jm.dart",
    "content": "import 'dart:collection';\n\nimport 'package:flutter/widgets.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/def.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/network/jm_network/jm_image.dart';\nimport 'package:pica_comic/network/jm_network/jm_models.dart';\nimport 'package:pica_comic/network/jm_network/jm_network.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/jm/jm_comic_page.dart';\nimport 'package:pica_comic/pages/jm/week_recommendation_page.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\n\nfinal jm = ComicSource.named(\n  name: '禁漫天堂',\n  key: 'jm',\n  filePath: 'built-in',\n  favoriteData: FavoriteData(\n    key: \"jm\",\n    title: \"禁漫天堂\",\n    multiFolder: true,\n    loadComic: (i, [folder]) => JmNetwork().getFolderComicsPage(folder!, i),\n    loadFolders: ([String? comicId]) => JmNetwork().getFolders(),\n    deleteFolder: (id) => JmNetwork().deleteFolder(id),\n    addFolder: (name) => JmNetwork().createFolder(name),\n    allFavoritesId: \"0\",\n    addOrDelFavorite: (id, folder, isAdding) async {\n      if (isAdding) return const Res.error(\"invalid\");\n      var res = await JmNetwork().favorite(id, folder);\n      return res;\n    },\n  ),\n  categoryData: CategoryData(\n    title: \"禁漫天堂\",\n    key: \"jm\",\n    categories: [\n      const FixedCategoryPart(\n        \"成人A漫\",\n        [\"最新A漫\", \"同人\", \"單本\", \"短篇\", \"其他類\", \"韓漫\", \"美漫\", \"Cosplay\", \"3D\", \"禁漫漢化組\"],\n        \"category\",\n        [\n          \"0\",\n          \"doujin\",\n          \"single\",\n          \"short\",\n          \"another\",\n          \"hanman\",\n          \"meiman\",\n          \"another_cosplay\",\n          \"3D\",\n          \"禁漫漢化組\"\n        ],\n      ),\n      const FixedCategoryPart(\n        \"主題A漫\",\n        [\n          '無修正',\n          '劇情向',\n          '青年漫',\n          '校服',\n          '純愛',\n          '人妻',\n          '教師',\n          '百合',\n          'Yaoi',\n          '性轉',\n          'NTR',\n          '女裝',\n          '癡女',\n          '全彩',\n          '女性向',\n          '完結',\n          '純愛',\n          '禁漫漢化組'\n        ],\n        \"search\",\n      ),\n      const FixedCategoryPart(\n        \"角色扮演\",\n        [\n          '御姐',\n          '熟女',\n          '巨乳',\n          '貧乳',\n          '女性支配',\n          '教師',\n          '女僕',\n          '護士',\n          '泳裝',\n          '眼鏡',\n          '連褲襪',\n          '其他制服',\n          '兔女郎'\n        ],\n        \"search\",\n      ),\n      const FixedCategoryPart(\n        \"特殊PLAY\",\n        [\n          '群交',\n          '足交',\n          '束縛',\n          '肛交',\n          '阿黑顏',\n          '藥物',\n          '扶他',\n          '調教',\n          '野外露出',\n          '催眠',\n          '自慰',\n          '觸手',\n          '獸交',\n          '亞人',\n          '怪物女孩',\n          '皮物',\n          'ryona',\n          '騎大車'\n        ],\n        \"search\",\n      ),\n      const FixedCategoryPart(\n        \"其它\",\n        ['CG', '重口', '獵奇', '非H', '血腥暴力', '站長推薦'],\n        \"search\",\n      ),\n    ],\n    enableRankingPage: true,\n    buttons: [\n      CategoryButtonData(\n        label: \"每周推荐\",\n        onTap: () => App.mainNavigatorKey?.currentContext?.to(\n              () => JmWeekRecommendationPage(),\n        ),\n      ),\n    ],\n  ),\n  categoryComicsData: CategoryComicsData.named(\n    load: (category, param, options, page) async {\n      return JmNetwork().getCategoryComics(\n        param ?? category,\n        ComicsOrder.fromValue(options[0]),\n        page,\n      );\n    },\n    options: [\n      CategoryComicsOptions.named(\n        options: LinkedHashMap.of({\n          \"mr\": \"最新\",\n          \"mv\": \"总排行\",\n          \"mv_m\": \"月排行\",\n          \"mv_w\": \"周排行\",\n          \"mv_t\": \"日排行\",\n          \"mp\": \"最多图片\",\n          \"tf\": \"最多喜欢\",\n        }),\n      ),\n    ],\n    rankingData: RankingData.named(\n      options: {\n        \"mv\": \"总排行\",\n        \"mv_m\": \"月排行\",\n        \"mv_w\": \"周排行\",\n        \"mv_t\": \"日排行\",\n      },\n      load: (option, page) {\n        return JmNetwork()\n            .getCategoryComics('0', ComicsOrder.fromValue(option), page);\n      },\n    ),\n  ),\n  account: AccountConfig.named(\n    registerWebsite: \"https://18comic.vip/signup\",\n    login: (account, pwd) async {\n      var res = await jmNetwork.login(account, pwd);\n      var a = <String>[account, pwd];\n      var source = ComicSource.find('jm')!;\n      source.data['account'] = a;\n      source.saveData();\n      return res;\n    },\n    logout: () {\n      jmNetwork.logout();\n    },\n    infoItems: [\n      AccountInfoItem(\n        title: \"用户名\",\n        data: () => ComicSource.find('jm')!.data['name'] ?? '',\n      ),\n    ],\n  ),\n  comicTileBuilderOverride: (context, comic, options) {\n    return _JmComicTile(\n      comic as JmComicBrief,\n      addonMenuOptions: options,\n    );\n  },\n  explorePages: [\n    ExplorePageData.named(\n      title: \"禁漫主页\",\n      type: ExplorePageType.singlePageWithMultiPart,\n      loadMultiPart: () async {\n        var homePageData = await JmNetwork().getHomePage();\n        if (homePageData.error) {\n          return Res.fromErrorRes(homePageData);\n        }\n        var res = <ExplorePagePart>[];\n        for (var part in homePageData.data.items) {\n          res.add(ExplorePagePart(\n            part.name,\n            part.comics,\n            'category:${part.name}@${part.id}',\n          ));\n        }\n        return Res(res);\n      },\n    ),\n    ExplorePageData.named(\n      title: \"禁漫最新\",\n      type: ExplorePageType.multiPageComicList,\n      loadPage: (page) => JmNetwork().getLatest(page),\n    ),\n  ],\n  idMatcher: RegExp(r\"^(\\d+|jm\\d+)$\"),\n  searchPageData: SearchPageData.named(\n    loadPage: (keyword, page, options) {\n      return JmNetwork().searchNew(\n        keyword,\n        page,\n        ComicsOrder.fromValue(options[0]),\n      );\n    },\n    searchOptions: [\n      SearchOptions.named(\n        label: \"排序\",\n        options: LinkedHashMap.of({\n          \"mr\": \"最新\",\n          \"mv\": \"总排行\",\n          \"mv_m\": \"月排行\",\n          \"mv_w\": \"周排行\",\n          \"mv_t\": \"日排行\",\n          \"mp\": \"最多图片\",\n          \"tf\": \"最多喜欢\",\n        }),\n      ),\n    ],\n  ),\n  comicPageBuilder: (context, id, cover) {\n    return JmComicPage(id);\n  },\n);\n\nclass _JmComicTile extends ComicTile {\n  final JmComicBrief comic;\n\n  const _JmComicTile(this.comic, {this.addonMenuOptions});\n\n  @override\n  String get description => \"JM${comic.id}\";\n\n  @override\n  Widget get image => AnimatedImage(\n        image: CachedImageProvider(\n          getJmCoverUrl(comic.id),\n          headers: {\n            \"User-Agent\": webUA,\n          },\n        ),\n        fit: BoxFit.cover,\n        height: double.infinity,\n        width: double.infinity,\n        filterQuality: FilterQuality.medium,\n      );\n\n  @override\n  void onTap_() {\n    App.mainNavigatorKey!.currentContext!.to(\n      () => ComicPage(sourceKey: 'jm', id: comic.id, cover: comic.cover),\n    );\n  }\n\n  @override\n  String get subTitle => comic.author;\n\n  @override\n  String get title => comic.name;\n\n  @override\n  ActionFunc? get read => () async {\n        bool cancel = false;\n        var dialog = showLoadingDialog(\n          App.globalContext!,\n          onCancel: () => cancel = true,\n        );\n        var res = await JmNetwork().getComicInfo(comic.id);\n        if (cancel) {\n          return;\n        }\n        dialog.close();\n        if (res.error) {\n          showToast(message: res.errorMessage ?? \"Error\");\n        } else {\n          var history = await History.findOrCreate(res.data);\n          App.globalTo(\n                () => ComicReadingPage.jmComic(\n              res.data,\n              history.ep,\n              initialPage: history.page,\n            ),\n          );\n        }\n      };\n\n  @override\n  List<String>? get tags => comic.tags;\n\n  @override\n  FavoriteItem? get favoriteItem => FavoriteItem.fromJmComic(comic);\n\n  @override\n  String get comicID => comic.id;\n\n  @override\n  final List<ComicTileMenuOption>? addonMenuOptions;\n}\n"
  },
  {
    "path": "lib/comic_source/built_in/nhentai.dart",
    "content": "import 'dart:async';\nimport 'dart:collection';\n\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/network/nhentai_network/login.dart';\nimport 'package:pica_comic/network/nhentai_network/nhentai_main_network.dart';\nimport 'package:pica_comic/network/nhentai_network/tags.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/nhentai/comic_page.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\nimport '../../base.dart';\nimport '../../foundation/history.dart';\nimport '../../pages/reader/comic_reading_page.dart';\n\nfinal nhentai = ComicSource.named(\n  name: 'nhentai',\n  key: 'nhentai',\n  filePath: 'built-in',\n  favoriteData: FavoriteData(\n    key: \"nhentai\",\n    title: \"nhentai\",\n    multiFolder: false,\n    loadComic: (i, [folder]) => NhentaiNetwork().getFavorites(i),\n    loadFolders: null,\n  ),\n  categoryData: CategoryData(\n    title: \"nhentai\",\n    key: \"nhentai\",\n    categories: [\n      const FixedCategoryPart(\"language\", [\"中文\", \"日本語\", \"english\"], \"category\",\n          [\"/language/chinese\", \"/language/japanese\", \"/language/english\"]),\n      RandomCategoryPartWithRuntimeData(\n          \"Tags\", () => nhentaiTags.values.toList(), 50, \"search\"),\n    ],\n    enableRankingPage: false,\n    buttons: [\n      CategoryButtonData(\n        label: \"推荐\",\n        onTap: () => App.mainNavigatorKey?.currentContext?.to(\n          () => const ComicPage(sourceKey: \"nhentai\", id: \"\"),\n        ),\n      ),\n    ],\n  ),\n  categoryComicsData: CategoryComicsData.named(\n    load: (category, param, options, page) async {\n      var [_, type, name] = param!.split('/');\n      var lang = int.tryParse(appdata.settings[69]) ?? 0;\n      if (lang != 0) {\n        return NhentaiNetwork().search(\n          \"$type:$name language:${[\"chinese\", \"english\", \"japanese\"][lang-1]}\",\n          page,\n          NhentaiSort.fromValue(options[0]),\n        );\n      }\n      return NhentaiNetwork().getCategoryComics(\n          \"/$type/$name\", page, NhentaiSort.fromValue(options[0]));\n    },\n    options: [\n      CategoryComicsOptions.named(\n        options: LinkedHashMap.of({\n          \"\": \"最近\",\n          \"&sort=popular-today\": \"热门 | 今天\",\n          \"&sort=popular-week\": \"热门 | 一周\",\n          \"&sort=popular-month\": \"热门 | 本月\",\n          \"&sort=popular\": \"热门 | 所有时间\",\n        }),\n        notShowWhen: [\"random\", \"latest\"],\n      ),\n    ],\n  ),\n  account: AccountConfig.named(\n    onLogin: (context) async {\n      var future = Completer<void>();\n      nhLogin(() {\n        future.complete();\n      });\n      await future.future;\n      if (NhentaiNetwork().logged) {\n        var source = ComicSource.find('nhentai')!;\n        source.data[\"account\"] = 'ok';\n        source.saveData();\n      }\n    },\n    logout: () {\n      NhentaiNetwork().logged = false;\n      NhentaiNetwork().logout();\n      var source = ComicSource.find('nhentai')!;\n      source.data[\"account\"] = null;\n      source.saveData();\n    },\n    allowReLogin: false,\n  ),\n  comicTileBuilderOverride: (context, comic, options) {\n    return _NhentaiComicTile(\n      comic as NhentaiComicBrief,\n      addonMenuOptions: options,\n    );\n  },\n  explorePages: [\n    ExplorePageData.named(\n      title: \"nhentai\",\n      type: ExplorePageType.mixed,\n      loadMixed: (index) async {\n        var res = await NhentaiNetwork().getHomePage(index);\n        if (res.error) {\n          return Res.fromErrorRes(res);\n        }\n        if (index == 1) {\n          return Res(<Object>[\n            ExplorePagePart(\n              \"Popular\",\n              res.data.popular,\n              null,\n            ),\n            res.data.latest,\n          ], subData: 20000);\n        } else {\n          return Res([res.data.latest], subData: 20000);\n        }\n      },\n    ),\n  ],\n  idMatcher: RegExp(r\"^(\\d+|nh\\d+|nhentai\\d+)$\"),\n  searchPageData: SearchPageData.named(\n    loadPage: (keyword, page, options) {\n      return NhentaiNetwork()\n          .search(keyword, page, NhentaiSort.fromValue(options[0]));\n    },\n    enableLanguageFilter: true,\n    enableTagsSuggestions: true,\n    searchOptions: [\n      SearchOptions(\n        LinkedHashMap.of({\n          \"\": \"最近\",\n          \"&sort=popular-today\": \"热门 | 今天\",\n          \"&sort=popular-week\": \"热门 | 一周\",\n          \"&sort=popular-month\": \"热门 | 本月\",\n          \"&sort=popular\": \"热门 | 所有时间\",\n        }),\n        '排序',\n      )\n    ],\n  ),\n  comicPageBuilder: (context, id, cover) {\n    return NhentaiComicPage(\n      id,\n      comicCover: cover,\n    );\n  },\n);\n\nclass _NhentaiComicTile extends ComicTile {\n  final NhentaiComicBrief comic;\n\n  const _NhentaiComicTile(this.comic, {this.addonMenuOptions});\n\n  @override\n  String get description => comic.lang;\n\n  @override\n  Widget get image => AnimatedImage(\n        image: CachedImageProvider(\n          comic.cover,\n          headers: {\n            \"User-Agent\": webUA,\n          },\n        ),\n        fit: BoxFit.cover,\n        height: double.infinity,\n        width: double.infinity,\n        filterQuality: FilterQuality.medium,\n      );\n\n  @override\n  void onTap_() {\n    App.mainNavigatorKey!.currentContext!.to(\n      () => ComicPage(\n        sourceKey: 'nhentai',\n        id: comic.id,\n        cover: comic.cover,\n      ),\n    );\n  }\n\n  @override\n  String get subTitle => \"ID: ${comic.id}\";\n\n  @override\n  String get title => comic.title;\n\n  List<String> _generateTags(List<String> tags) {\n    if (App.locale.languageCode != \"zh\") {\n      return tags;\n    }\n    var res = <String>[];\n    for (var tag in tags) {\n      res.add(tag.translateTagsToCN);\n    }\n    return res;\n  }\n\n  @override\n  List<String>? get tags => _generateTags(comic.tags);\n\n  @override\n  ActionFunc? get read => () async {\n        bool cancel = false;\n        var dialog = showLoadingDialog(\n          App.globalContext!,\n          onCancel: () => cancel = true,\n        );\n        var res = await NhentaiNetwork().getComicInfo(comic.id);\n        if (cancel) {\n          return;\n        }\n        dialog.close();\n        if (res.error) {\n          showToast(message: res.errorMessage ?? \"Error\");\n        } else {\n          var history = await History.findOrCreate(res.data);\n          App.globalTo(\n            () => ComicReadingPage.nhentai(\n              res.data.id,\n              res.data.title,\n              initialPage: history.page,\n            ),\n          );\n        }\n      };\n\n  @override\n  FavoriteItem? get favoriteItem => FavoriteItem.fromNhentai(comic);\n\n  @override\n  String get comicID => comic.id;\n\n  @override\n  final List<ComicTileMenuOption>? addonMenuOptions;\n}\n"
  },
  {
    "path": "lib/comic_source/built_in/picacg.dart",
    "content": "import 'dart:collection';\n\nimport 'package:flutter/widgets.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/network/picacg_network/methods.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/picacg/collections_page.dart';\nimport 'package:pica_comic/pages/picacg/comic_page.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nimport '../comic_source.dart';\n\nfinal picacg = ComicSource.named(\n  name: \"picacg\",\n  key: \"picacg\",\n  filePath: 'built-in',\n  favoriteData: FavoriteData(\n    key: \"picacg\",\n    title: \"Picacg\",\n    multiFolder: false,\n    loadComic: (i, [folder]) =>\n        PicacgNetwork().getFavorites(i, appdata.settings[30] == \"1\"),\n    loadFolders: null,\n    addOrDelFavorite: (id, folder, isAdding) async {\n      var res = await PicacgNetwork().favouriteOrUnfavouriteComic(id);\n      return res\n          ? const Res(true)\n          : const Res(false, errorMessage: \"Network Error\");\n    },\n  ),\n  categoryData: CategoryData(\n    title: \"Picacg\",\n    key: \"picacg\",\n    categories: [\n      const FixedCategoryPart(\"分类\", _categories, \"category\"),\n    ],\n    enableRankingPage: true,\n    buttons: [\n      CategoryButtonData(\n        label: \"推荐\",\n        onTap: () => App.mainNavigatorKey?.currentContext?.to(\n          () => const CollectionsPage(),\n        ),\n      ),\n    ],\n  ),\n  account: AccountConfig.named(\n    login: (account, pwd) async {\n      var picacg = ComicSource.find('picacg')!;\n      var res = await network.login(account, pwd);\n      if (res.error) {\n        return Res.fromErrorRes(res);\n      }\n      picacg.data['token'] = res.data;\n      var profile = await network.getProfile();\n      if (profile.error) {\n        picacg.data['token'] = null;\n        return Res.fromErrorRes(res);\n      }\n      network.user = profile.data;\n      picacg.data['user'] = profile.data.toJson();\n      var a = <String>[account, pwd];\n      picacg.data['account'] = a;\n      return const Res(true);\n    },\n    logout: () {\n      var picacg = ComicSource.find('picacg')!;\n      picacg.data['user'] = null;\n      picacg.data['token'] = null;\n      picacg.saveData();\n    },\n    infoItems: [\n      AccountInfoItem(title: \"账号\", data: () => network.user?.email ?? ''),\n      AccountInfoItem(title: \"用户名\", data: () => network.user?.name ?? ''),\n      AccountInfoItem(\n        title: \"等级\",\n        data: () {\n          var user = network.user;\n          return \"Lv${user?.level} ${user?.title} Exp${user?.exp}\";\n        },\n      ),\n      AccountInfoItem(title: \"简介\", data: () => network.user?.slogan ?? ''),\n    ],\n  ),\n  initData: (s) {\n    if (s.data['appChannel'] == null) {\n      s.data['appChannel'] = '3';\n    }\n    if (s.data['imageQuality'] == null) {\n      s.data['imageQuality'] = \"original\";\n    }\n  },\n  comicTileBuilderOverride: (context, comic, options) {\n    comic as ComicItemBrief;\n    return _PicComicTile(\n      comic,\n      addonMenuOptions: options,\n    );\n  },\n  explorePages: [\n    ExplorePageData.named(\n      title: \"picacg\",\n      type: ExplorePageType.singlePageWithMultiPart,\n      loadMultiPart: () async {\n        var [res0, res1] = await Future.wait(\n          [network.getRandomComics(), network.getLatest(1)],\n        );\n        if (res0.error) {\n          return Res.fromErrorRes(res0);\n        }\n        if (res1.error) {\n          return Res.fromErrorRes(res1);\n        }\n        return Res([\n          ExplorePagePart(\"随机\".tl, res0.data, \"category:random\"),\n          ExplorePagePart(\"最新\".tl, res1.data, \"category:latest\"),\n        ]);\n      },\n    ),\n  ],\n  categoryComicsData: CategoryComicsData.named(\n    load: (category, param, options, page) async {\n      if(category == \"random\") {\n        return PicacgNetwork().getRandomComics();\n      } else if (category == \"latest\") {\n        return PicacgNetwork().getLatest(page);\n      }\n      return PicacgNetwork().getCategoryComics(\n        category,\n        page,\n        options[0],\n        param ?? 'c',\n      );\n    },\n    options: [\n      CategoryComicsOptions.named(\n        options: LinkedHashMap.of({\n          \"dd\": \"新到旧\",\n          \"da\": \"旧到新\",\n          \"ld\": \"最多喜欢\",\n          \"vd\": \"最多指名\",\n        }),\n        notShowWhen: [\"random\", \"latest\"],\n      ),\n    ],\n    rankingData: RankingData.named(\n      options: {\n        \"H24\": \"24小时\",\n        \"D7\": \"7天\",\n        \"D30\": \"30天\",\n      },\n      load: (options, page) {\n        return PicacgNetwork().getLeaderboard(options);\n      },\n    ),\n  ),\n  searchPageData: SearchPageData.named(\n    loadPage: (keyword, page, options) {\n      return PicacgNetwork().search(keyword, options[0], page);\n    },\n    searchOptions: [\n      SearchOptions.named(\n        label: \"排序\",\n        options: LinkedHashMap.of({\n          \"dd\": \"新到旧\",\n          \"da\": \"旧到新\",\n          \"ld\": \"最多喜欢\",\n          \"vd\": \"最多指名\",\n        }),\n      ),\n    ],\n  ),\n  comicPageBuilder: (context, id, cover) => PicacgComicPage(id, cover),\n);\n\nclass _PicComicTile extends ComicTile {\n  final ComicItemBrief comic;\n\n  const _PicComicTile(this.comic, {Key? key, this.addonMenuOptions})\n      : super(key: key);\n\n  @override\n  String get description => '${comic.likes} likes';\n\n  @override\n  List<String>? get tags => comic.tags;\n\n  @override\n  Widget get image => AnimatedImage(\n        image: CachedImageProvider(\n          comic.path,\n        ),\n        fit: BoxFit.cover,\n        height: double.infinity,\n        width: double.infinity,\n        filterQuality: FilterQuality.medium,\n      );\n\n  @override\n  ActionFunc? get read => () async {\n        bool cancel = false;\n        var dialog = showLoadingDialog(\n          App.globalContext!,\n          onCancel: () => cancel = true,\n        );\n        var res = await network.getEps(comic.id);\n        if (cancel) {\n          return;\n        }\n        dialog.close();\n        if (res.error) {\n          showToast(message: res.errorMessage ?? \"Error\");\n        } else {\n          var history = await HistoryManager().find(comic.id);\n          if (history == null) {\n            history = History(\n              HistoryType.picacg,\n              DateTime.now(),\n              comic.title,\n              comic.author,\n              comic.cover,\n              0,\n              0,\n              comic.id,\n            );\n            await HistoryManager().addHistory(history);\n          }\n          App.globalTo(\n            () => ComicReadingPage.picacg(\n              comic.id,\n              history!.ep,\n              res.data,\n              comic.title,\n              initialPage: history.page,\n            ),\n          );\n        }\n      };\n\n  @override\n  void onTap_() {\n    App.mainNavigatorKey!.currentContext!.to(\n      () => ComicPage(\n        sourceKey: \"picacg\",\n        id: comic.id,\n        cover: comic.cover,\n      ),\n    );\n  }\n\n  @override\n  String get subTitle => comic.author;\n\n  @override\n  String get title => comic.title;\n\n  @override\n  int? get pages => comic.pages;\n\n  @override\n  FavoriteItem? get favoriteItem => FavoriteItem.fromPicacg(comic);\n\n  @override\n  String get comicID => comic.id;\n\n  @override\n  final List<ComicTileMenuOption>? addonMenuOptions;\n}\n\nconst _categories = [\n  \"大家都在看\",\n  \"大濕推薦\",\n  \"那年今天\",\n  \"官方都在看\",\n  \"嗶咔漢化\",\n  \"全彩\",\n  \"長篇\",\n  \"同人\",\n  \"短篇\",\n  \"圓神領域\",\n  \"碧藍幻想\",\n  \"CG雜圖\",\n  \"英語 ENG\",\n  \"生肉\",\n  \"純愛\",\n  \"百合花園\",\n  \"耽美花園\",\n  \"偽娘哲學\",\n  \"後宮閃光\",\n  \"扶他樂園\",\n  \"單行本\",\n  \"姐姐系\",\n  \"妹妹系\",\n  \"SM\",\n  \"性轉換\",\n  \"足の恋\",\n  \"人妻\",\n  \"NTR\",\n  \"強暴\",\n  \"非人類\",\n  \"艦隊收藏\",\n  \"Love Live\",\n  \"SAO 刀劍神域\",\n  \"Fate\",\n  \"東方\",\n  \"WEBTOON\",\n  \"禁書目錄\",\n  \"歐美\",\n  \"Cosplay\",\n  \"重口地帶\"\n];\n"
  },
  {
    "path": "lib/comic_source/category.dart",
    "content": "part of comic_source;\n\nclass CategoryData {\n  /// The title is displayed in the tab bar.\n  final String title;\n\n  /// 当使用中文语言时, 英文的分类标签将在构建页面时被翻译为中文\n  final List<BaseCategoryPart> categories;\n\n  final bool enableRankingPage;\n\n  final String key;\n\n  final List<CategoryButtonData> buttons;\n\n  /// Data class for building category page.\n  const CategoryData({\n    required this.title,\n    required this.categories,\n    required this.enableRankingPage,\n    required this.key,\n    this.buttons = const [],\n  });\n}\n\nclass CategoryButtonData {\n  final String label;\n\n  final void Function() onTap;\n\n  const CategoryButtonData({\n    required this.label,\n    required this.onTap,\n  });\n}\n\nabstract class BaseCategoryPart {\n  String get title;\n\n  List<String> get categories;\n\n  List<String>? get categoryParams => null;\n\n  bool get enableRandom;\n\n  String get categoryType;\n\n  /// Data class for building a part of category page.\n  const BaseCategoryPart();\n}\n\nclass FixedCategoryPart extends BaseCategoryPart {\n  @override\n  final List<String> categories;\n\n  @override\n  bool get enableRandom => false;\n\n  @override\n  final String title;\n\n  @override\n  final String categoryType;\n\n  @override\n  final List<String>? categoryParams;\n\n  /// A [BaseCategoryPart] that show fixed tags on category page.\n  const FixedCategoryPart(this.title, this.categories, this.categoryType,\n      [this.categoryParams]);\n}\n\nclass RandomCategoryPart extends BaseCategoryPart {\n  final List<String> tags;\n\n  final int randomNumber;\n\n  @override\n  final String title;\n\n  @override\n  bool get enableRandom => true;\n\n  @override\n  final String categoryType;\n\n  List<String> _categories() {\n    if (randomNumber >= tags.length) {\n      return tags;\n    }\n    return tags.sublist(math.Random().nextInt(tags.length - randomNumber));\n  }\n\n  @override\n  List<String> get categories => _categories();\n\n  /// A [BaseCategoryPart] that show random tags on category page.\n  const RandomCategoryPart(\n      this.title, this.tags, this.randomNumber, this.categoryType);\n}\n\nclass RandomCategoryPartWithRuntimeData extends BaseCategoryPart {\n  final Iterable<String> Function() loadTags;\n\n  final int randomNumber;\n\n  @override\n  final String title;\n\n  @override\n  bool get enableRandom => true;\n\n  @override\n  final String categoryType;\n\n  static final random = math.Random();\n\n  List<String> _categories() {\n    var tags = loadTags();\n    if (randomNumber >= tags.length) {\n      return tags.toList();\n    }\n    final start = random.nextInt(tags.length - randomNumber);\n    var res = List.filled(randomNumber, '');\n    int index = -1;\n    for (var s in tags) {\n      index++;\n      if (start > index) {\n        continue;\n      } else if (index == start + randomNumber) {\n        break;\n      }\n      res[index - start] = s;\n    }\n    return res;\n  }\n\n  @override\n  List<String> get categories => _categories();\n\n  /// A [BaseCategoryPart] that show random tags on category page.\n  RandomCategoryPartWithRuntimeData(\n      this.title, this.loadTags, this.randomNumber, this.categoryType);\n}\n\nCategoryData getCategoryDataWithKey(String key) {\n  for (var source in ComicSource.sources) {\n    if (source.categoryData?.key == key) {\n      return source.categoryData!;\n    }\n  }\n  throw \"Unknown category key $key\";\n}\n"
  },
  {
    "path": "lib/comic_source/comic_source.dart",
    "content": "library comic_source;\n\nimport 'dart:async';\nimport 'dart:collection';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'dart:math' as math;\n\nimport 'package:flutter/widgets.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/update.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport '../base.dart';\nimport '../foundation/js_engine.dart';\nimport '../network/base_comic.dart';\nimport '../network/res.dart';\nimport 'built_in/ehentai.dart';\nimport 'built_in/hitomi.dart';\nimport 'built_in/ht_manga.dart';\nimport 'built_in/jm.dart';\nimport 'built_in/nhentai.dart';\nimport 'built_in/picacg.dart';\n\npart 'category.dart';\n\npart 'favorites.dart';\n\npart 'parser.dart';\n\n/// build comic list, [Res.subData] should be maxPage or null if there is no limit.\ntypedef ComicListBuilder = Future<Res<List<BaseComic>>> Function(int page);\n\ntypedef LoginFunction = Future<Res<bool>> Function(String, String);\n\ntypedef LoadComicFunc = Future<Res<ComicInfoData>> Function(String id);\n\ntypedef LoadComicPagesFunc = Future<Res<List<String>>> Function(\n    String id, String? ep);\n\ntypedef CommentsLoader = Future<Res<List<Comment>>> Function(\n    String id, String? subId, int page, String? replyTo);\n\ntypedef SendCommentFunc = Future<Res<bool>> Function(\n    String id, String? subId, String content, String? replyTo);\n\ntypedef GetImageLoadingConfigFunc = Map<String, dynamic> Function(\n    String imageKey, String comicId, String epId)?;\ntypedef GetThumbnailLoadingConfigFunc = Map<String, dynamic> Function(\n    String imageKey)?;\n\nclass ComicSource {\n  static final builtIn = [picacg, ehentai, jm, hitomi, htManga, nhentai];\n\n  static List<ComicSource> sources = [];\n\n  static ComicSource? find(String key) =>\n      sources.firstWhereOrNull((element) => element.key == key);\n\n  static ComicSource? fromIntKey(int key) =>\n      sources.firstWhereOrNull((element) => element.key.hashCode == key);\n\n  static Future<void> init() async {\n    for (var source in builtInSources) {\n      if (appdata.appSettings.isComicSourceEnabled(source)) {\n        var s = builtIn.firstWhere((e) => e.key == source);\n        sources.add(s);\n        await s.loadData();\n        s.initData?.call(s);\n      }\n    }\n    final path = \"${App.dataPath}/comic_source\";\n    if (!(await Directory(path).exists())) {\n      Directory(path).create();\n      return;\n    }\n    await for (var entity in Directory(path).list()) {\n      if (entity is File && entity.path.endsWith(\".js\")) {\n        try {\n          var source = await ComicSourceParser()\n              .parse(await entity.readAsString(), entity.absolute.path);\n          sources.add(source);\n        } catch (e, s) {\n          log(\"$e\\n$s\", \"ComicSource\", LogLevel.error);\n        }\n      }\n    }\n  }\n\n  static Future reload() async {\n    sources.clear();\n    JsEngine().runCode(\"ComicSource.sources = {};\");\n    await init();\n  }\n\n  /// Name of this source.\n  final String name;\n\n  /// Identifier of this source.\n  final String key;\n\n  int get intKey {\n    return key.hashCode;\n  }\n\n  /// Account config.\n  final AccountConfig? account;\n\n  /// Category data used to build a static category tags page.\n  final CategoryData? categoryData;\n\n  /// Category comics data used to build a comics page with a category tag.\n  final CategoryComicsData? categoryComicsData;\n\n  /// Favorite data used to build favorite page.\n  final FavoriteData? favoriteData;\n\n  /// Explore pages.\n  final List<ExplorePageData> explorePages;\n\n  /// Search page.\n  final SearchPageData? searchPageData;\n\n  /// Settings.\n  final List<SettingItem> settings;\n\n  /// Load comic info.\n  final LoadComicFunc? loadComicInfo;\n\n  /// Load comic pages.\n  final LoadComicPagesFunc? loadComicPages;\n\n  final Map<String, dynamic> Function(\n      String imageKey, String comicId, String epId)? getImageLoadingConfig;\n\n  final Map<String, dynamic> Function(String imageKey)?\n      getThumbnailLoadingConfig;\n\n  final String? matchBriefIdReg;\n\n  var data = <String, dynamic>{};\n\n  bool get isLogin => data[\"account\"] != null;\n\n  final String filePath;\n\n  final String url;\n\n  final String version;\n\n  final CommentsLoader? commentsLoader;\n\n  final SendCommentFunc? sendCommentFunc;\n\n  final RegExp? idMatcher;\n\n  final Widget Function(BuildContext context, String id, String? cover)? comicPageBuilder;\n\n  Future<void> loadData() async {\n    var file = File(\"${App.dataPath}/comic_source/$key.data\");\n    if (await file.exists()) {\n      data = Map.from(jsonDecode(await file.readAsString()));\n    }\n  }\n\n  bool _isSaving = false;\n  bool _haveWaitingTask = false;\n\n  Future<void> saveData() async {\n    if (_haveWaitingTask) return;\n    while (_isSaving) {\n      _haveWaitingTask = true;\n      await Future.delayed(const Duration(milliseconds: 20));\n      _haveWaitingTask = false;\n    }\n    _isSaving = true;\n    var file = File(\"${App.dataPath}/comic_source/$key.data\");\n    if (!await file.exists()) {\n      await file.create(recursive: true);\n    }\n    await file.writeAsString(jsonEncode(data));\n    _isSaving = false;\n  }\n\n  Future<bool> reLogin() async {\n    if (data[\"account\"] == null) {\n      return false;\n    }\n    final List accountData = data[\"account\"];\n    var res = await account!.login!(accountData[0], accountData[1]);\n    if (res.error) {\n      Log.error(\"Failed to re-login\", res.errorMessage ?? \"Error\");\n    }\n    return !res.error;\n  }\n\n  // only for built-in comic sources\n  final FutureOr<void> Function(ComicSource source)? initData;\n\n  bool get isBuiltIn => filePath == 'built-in';\n\n  final Widget Function(BuildContext, BaseComic, List<ComicTileMenuOption>?)?\n      comicTileBuilderOverride;\n\n  ComicSource(\n      this.name,\n      this.key,\n      this.account,\n      this.categoryData,\n      this.categoryComicsData,\n      this.favoriteData,\n      this.explorePages,\n      this.searchPageData,\n      this.settings,\n      this.loadComicInfo,\n      this.loadComicPages,\n      this.getImageLoadingConfig,\n      this.getThumbnailLoadingConfig,\n      this.matchBriefIdReg,\n      this.filePath,\n      this.url,\n      this.version,\n      this.commentsLoader,\n      this.sendCommentFunc)\n      : initData = null,\n        comicTileBuilderOverride = null,\n        idMatcher = null,\n        comicPageBuilder = null;\n\n  ComicSource.named({\n    required this.name,\n    required this.key,\n    this.account,\n    this.categoryData,\n    this.categoryComicsData,\n    this.favoriteData,\n    this.explorePages = const [],\n    this.searchPageData,\n    this.settings = const [],\n    this.loadComicInfo,\n    this.loadComicPages,\n    this.getImageLoadingConfig,\n    this.getThumbnailLoadingConfig,\n    this.matchBriefIdReg,\n    required this.filePath,\n    this.url = '',\n    this.version = '',\n    this.commentsLoader,\n    this.sendCommentFunc,\n    this.initData,\n    this.comicTileBuilderOverride,\n    this.idMatcher,\n    this.comicPageBuilder,\n  });\n\n  ComicSource.unknown(this.key)\n      : name = \"Unknown\",\n        account = null,\n        categoryData = null,\n        categoryComicsData = null,\n        favoriteData = null,\n        explorePages = [],\n        searchPageData = null,\n        settings = [],\n        loadComicInfo = null,\n        loadComicPages = null,\n        getImageLoadingConfig = null,\n        getThumbnailLoadingConfig = null,\n        matchBriefIdReg = null,\n        filePath = \"\",\n        url = \"\",\n        version = \"\",\n        commentsLoader = null,\n        sendCommentFunc = null,\n        initData = null,\n        comicTileBuilderOverride = null,\n        idMatcher = null,\n        comicPageBuilder = null;\n}\n\nclass AccountConfig {\n  final LoginFunction? login;\n\n  final FutureOr<void> Function(BuildContext)? onLogin;\n\n  final String? loginWebsite;\n\n  final String? registerWebsite;\n\n  final void Function() logout;\n\n  final bool allowReLogin;\n\n  final List<AccountInfoItem> infoItems;\n\n  const AccountConfig(\n      this.login, this.loginWebsite, this.registerWebsite, this.logout,\n      {this.onLogin})\n      : allowReLogin = true,\n        infoItems = const [];\n\n  const AccountConfig.named({\n    this.login,\n    this.loginWebsite,\n    this.registerWebsite,\n    required this.logout,\n    this.onLogin,\n    this.allowReLogin = true,\n    this.infoItems = const [],\n  });\n}\n\nclass AccountInfoItem {\n  final String title;\n  final String Function()? data;\n  final void Function()? onTap;\n  final WidgetBuilder? builder;\n\n  AccountInfoItem({required this.title, this.data, this.onTap, this.builder});\n}\n\nclass LoadImageRequest {\n  String url;\n\n  Map<String, String> headers;\n\n  LoadImageRequest(this.url, this.headers);\n}\n\nclass ExplorePageData {\n  final String title;\n\n  final ExplorePageType type;\n\n  final ComicListBuilder? loadPage;\n\n  final Future<Res<List<ExplorePagePart>>> Function()? loadMultiPart;\n\n  /// return a `List` contains `List<BaseComic>` or `ExplorePagePart`\n  final Future<Res<List<Object>>> Function(int index)? loadMixed;\n\n  final WidgetBuilder? overridePageBuilder;\n\n  ExplorePageData(this.title, this.type, this.loadPage, this.loadMultiPart)\n      : loadMixed = null,\n        overridePageBuilder = null;\n\n  ExplorePageData.named({\n    required this.title,\n    required this.type,\n    this.loadPage,\n    this.loadMultiPart,\n    this.loadMixed,\n    this.overridePageBuilder,\n  });\n}\n\nclass ExplorePagePart {\n  final String title;\n\n  final List<BaseComic> comics;\n\n  /// If this is not null, the [ExplorePagePart] will show a button to jump to new page.\n  ///\n  /// Value of this field should match the following format:\n  ///   - search:keyword\n  ///   - category:categoryName\n  ///\n  /// End with `@`+`param` if the category has a parameter.\n  final String? viewMore;\n\n  const ExplorePagePart(this.title, this.comics, this.viewMore);\n}\n\nenum ExplorePageType {\n  multiPageComicList,\n  singlePageWithMultiPart,\n  mixed,\n  override,\n}\n\ntypedef SearchFunction = Future<Res<List<BaseComic>>> Function(\n    String keyword, int page, List<String> searchOption);\n\nclass SearchPageData {\n  /// If this is not null, the default value of search options will be first element.\n  final List<SearchOptions>? searchOptions;\n\n  final Widget Function(BuildContext, List<String> initialValues, void Function(List<String>))?\n      customOptionsBuilder;\n\n  final Widget Function(String keyword, List<String> options)?\n      overrideSearchResultBuilder;\n\n  final SearchFunction? loadPage;\n\n  final bool enableLanguageFilter;\n\n  final bool enableTagsSuggestions;\n\n  const SearchPageData(this.searchOptions, this.loadPage)\n      : enableLanguageFilter = false,\n        customOptionsBuilder = null,\n        overrideSearchResultBuilder = null,\n        enableTagsSuggestions = false;\n\n  const SearchPageData.named({\n    this.searchOptions,\n    this.loadPage,\n    this.enableLanguageFilter = false,\n    this.customOptionsBuilder,\n    this.overrideSearchResultBuilder,\n    this.enableTagsSuggestions = false,\n  });\n}\n\nclass SearchOptions {\n  final LinkedHashMap<String, String> options;\n\n  final String label;\n\n  const SearchOptions(this.options, this.label);\n\n  String get defaultValue => options.keys.first;\n\n  const SearchOptions.named({required this.options, required this.label});\n}\n\nclass SettingItem {\n  final String name;\n  final String iconName;\n  final SettingType type;\n  final List<String>? options;\n\n  const SettingItem(this.name, this.iconName, this.type, this.options);\n}\n\nenum SettingType {\n  switcher,\n  selector,\n  input,\n}\n\nclass ComicInfoData with HistoryMixin {\n  @override\n  final String title;\n\n  @override\n  final String? subTitle;\n\n  @override\n  final String cover;\n\n  final String? description;\n\n  final Map<String, List<String>> tags;\n\n  /// id-name\n  final Map<String, String>? chapters;\n\n  final List<String>? thumbnails;\n\n  final Future<Res<List<String>>> Function(String id, int page)?\n      thumbnailLoader;\n\n  final int thumbnailMaxPage;\n\n  final List<BaseComic>? suggestions;\n\n  final String sourceKey;\n\n  final String comicId;\n\n  final bool? isFavorite;\n\n  final String? subId;\n\n  const ComicInfoData(\n      this.title,\n      this.subTitle,\n      this.cover,\n      this.description,\n      this.tags,\n      this.chapters,\n      this.thumbnails,\n      this.thumbnailLoader,\n      this.thumbnailMaxPage,\n      this.suggestions,\n      this.sourceKey,\n      this.comicId,\n      {this.isFavorite,\n      this.subId});\n\n  Map<String, dynamic> toJson() {\n    return {\n      \"title\": title,\n      \"subTitle\": subTitle,\n      \"cover\": cover,\n      \"description\": description,\n      \"tags\": tags,\n      \"chapters\": chapters,\n      \"sourceKey\": sourceKey,\n      \"comicId\": comicId,\n      \"isFavorite\": isFavorite,\n      \"subId\": subId,\n    };\n  }\n\n  static Map<String, List<String>> _generateMap(Map<String, dynamic> map) {\n    var res = <String, List<String>>{};\n    map.forEach((key, value) {\n      res[key] = List<String>.from(value);\n    });\n    return res;\n  }\n\n  ComicInfoData.fromJson(Map<String, dynamic> json)\n      : title = json[\"title\"],\n        subTitle = json[\"subTitle\"],\n        cover = json[\"cover\"],\n        description = json[\"description\"],\n        tags = _generateMap(json[\"tags\"]),\n        chapters = Map<String, String>.from(json[\"chapters\"]),\n        sourceKey = json[\"sourceKey\"],\n        comicId = json[\"comicId\"],\n        thumbnails = null,\n        thumbnailLoader = null,\n        thumbnailMaxPage = 0,\n        suggestions = null,\n        isFavorite = json[\"isFavorite\"],\n        subId = json[\"subId\"];\n\n  @override\n  HistoryType get historyType => HistoryType(sourceKey.hashCode);\n\n  @override\n  String get target => comicId;\n}\n\ntypedef CategoryComicsLoader = Future<Res<List<BaseComic>>> Function(\n    String category, String? param, List<String> options, int page);\n\nclass CategoryComicsData {\n  /// options\n  final List<CategoryComicsOptions> options;\n\n  /// [category] is the one clicked by the user on the category page.\n\n  /// if [BaseCategoryPart.categoryParams] is not null, [param] will be not null.\n  ///\n  /// [Res.subData] should be maxPage or null if there is no limit.\n  final CategoryComicsLoader load;\n\n  final RankingData? rankingData;\n\n  const CategoryComicsData(this.options, this.load, {this.rankingData});\n\n  const CategoryComicsData.named({\n    this.options = const [],\n    required this.load,\n    this.rankingData,\n  });\n}\n\nclass RankingData {\n  final Map<String, String> options;\n\n  final Future<Res<List<BaseComic>>> Function(String option, int page) load;\n\n  const RankingData(this.options, this.load);\n\n  const RankingData.named({\n    required this.options,\n    required this.load,\n  });\n}\n\nclass CategoryComicsOptions {\n  /// Use a [LinkedHashMap] to describe an option list.\n  /// key is for loading comics, value is the name displayed on screen.\n  /// Default value will be the first of the Map.\n  final LinkedHashMap<String, String> options;\n\n  /// If [notShowWhen] contains category's name, the option will not be shown.\n  final List<String> notShowWhen;\n\n  final List<String>? showWhen;\n\n  const CategoryComicsOptions(this.options, this.notShowWhen, this.showWhen);\n\n  const CategoryComicsOptions.named({\n    required this.options,\n    this.notShowWhen = const [],\n    this.showWhen,\n  });\n}\n\nclass Comment {\n  final String userName;\n  final String? avatar;\n  final String content;\n  final String? time;\n  final int? replyCount;\n  final String? id;\n\n  const Comment(this.userName, this.avatar, this.content, this.time,\n      this.replyCount, this.id);\n}\n"
  },
  {
    "path": "lib/comic_source/favorites.dart",
    "content": "part of comic_source;\n\ntypedef AddOrDelFavFunc = Future<Res<bool>> Function(String comicId, String folderId, bool isAdding);\n\nclass FavoriteData{\n  final String key;\n\n  final String title;\n\n  final bool multiFolder;\n\n  final Future<Res<List<BaseComic>>> Function(int page, [String? folder]) loadComic;\n\n  /// key-id, value-name\n  ///\n  /// if comicId is not null, Res.subData is the folders that the comic is in\n  final Future<Res<Map<String, String>>> Function([String? comicId])? loadFolders;\n\n  /// A value of null disables this feature\n  final Future<Res<bool>> Function(String key)? deleteFolder;\n\n  /// A value of null disables this feature\n  final Future<Res<bool>> Function(String name)? addFolder;\n\n  /// A value of null disables this feature\n  final String? allFavoritesId;\n\n  final AddOrDelFavFunc? addOrDelFavorite;\n\n  const FavoriteData({\n    required this.key,\n    required this.title,\n    required this.multiFolder,\n    required this.loadComic,\n    this.loadFolders,\n    this.deleteFolder,\n    this.addFolder,\n    this.allFavoritesId,\n    this.addOrDelFavorite});\n}\n\nFavoriteData getFavoriteData(String key){\n  var source = ComicSource.find(key) ?? (throw \"Unknown source key: $key\");\n  return source.favoriteData!;\n}\n\nFavoriteData? getFavoriteDataOrNull(String key){\n  var source = ComicSource.find(key);\n  return source?.favoriteData;\n}"
  },
  {
    "path": "lib/comic_source/parser.dart",
    "content": "part of comic_source;\n\nclass ComicSourceParseException implements Exception {\n  final String message;\n\n  ComicSourceParseException(this.message);\n\n  @override\n  String toString() {\n    return message;\n  }\n}\n\nclass ComicSourceParser {\n  /// comic source key\n  String? _key;\n\n  String? _name;\n\n  Future<ComicSource> createAndParse(String js, String fileName) async{\n    if(!fileName.endsWith(\"js\")){\n      fileName = \"$fileName.js\";\n    }\n    var file = File(\"${App.dataPath}/comic_source/$fileName\");\n    if(file.existsSync()){\n      int i = 0;\n      while(file.existsSync()){\n        file = File(\"${App.dataPath}/comic_source/$fileName($i).js\");\n        i++;\n      }\n    }\n    await file.writeAsString(js);\n    try{\n      return await parse(js, file.path);\n    } catch (e) {\n      await file.delete();\n      rethrow;\n    }\n  }\n\n  Future<ComicSource> parse(String js, String filePath) async {\n    js = js.replaceAll(\"\\r\\n\", \"\\n\");\n    var line1 = js.split('\\n')\n        .firstWhereOrNull((element) => element.removeAllBlank.isNotEmpty);\n    if(line1 == null || !line1.startsWith(\"class \") || !line1.contains(\"extends ComicSource\")){\n      throw ComicSourceParseException(\"Invalid Content\");\n    }\n    var className = line1.split(\"class\")[1].split(\"extends ComicSource\").first;\n    className = className.trim();\n    JsEngine().runCode(\"\"\"\n      (() => {\n        $js\n        this['temp'] = new $className()\n      }).call()\n    \"\"\");\n    _name = JsEngine().runCode(\"this['temp'].name\")\n        ?? (throw ComicSourceParseException('name is required'));\n    var key = JsEngine().runCode(\"this['temp'].key\")\n        ?? (throw ComicSourceParseException('key is required'));\n    var version = JsEngine().runCode(\"this['temp'].version\")\n        ?? (throw ComicSourceParseException('version is required'));\n    var minAppVersion = JsEngine().runCode(\"this['temp'].minAppVersion\");\n    var url = JsEngine().runCode(\"this['temp'].url\");\n    var matchBriefIdRegex = JsEngine().runCode(\"this['temp'].comic.matchBriefIdRegex\");\n    if(minAppVersion != null){\n      if(compareSemVer(minAppVersion, appVersion.split('-').first)){\n        throw ComicSourceParseException(\"minAppVersion $minAppVersion is required\");\n      }\n    }\n    for(var source in ComicSource.sources){\n      if(source.key == key){\n        throw ComicSourceParseException(\"key($key) already exists\");\n      }\n    }\n    _key = key;\n    _checkKeyValidation();\n\n    JsEngine().runCode(\"\"\"\n      ComicSource.sources.$_key = this['temp'];\n    \"\"\");\n\n    final account = _loadAccountConfig();\n    final explorePageData = _loadExploreData();\n    final categoryPageData = _loadCategoryData();\n    final categoryComicsData =\n    _loadCategoryComicsData();\n    final searchData = _loadSearchData();\n    final loadComicFunc = _parseLoadComicFunc();\n    final loadComicPagesFunc = _parseLoadComicPagesFunc();\n    final getImageLoadingConfigFunc = _parseImageLoadingConfigFunc();\n    final getThumbnailLoadingConfigFunc = _parseThumbnailLoadingConfigFunc();\n    final favoriteData = _loadFavoriteData();\n    final commentsLoader = _parseCommentsLoader();\n    final sendCommentFunc = _parseSendCommentFunc();\n\n    var source =  ComicSource(\n        _name!,\n        key,\n        account,\n        categoryPageData,\n        categoryComicsData,\n        favoriteData,\n        explorePageData,\n        searchData,\n        [],\n        loadComicFunc,\n        loadComicPagesFunc,\n        getImageLoadingConfigFunc,\n        getThumbnailLoadingConfigFunc,\n        matchBriefIdRegex,\n        filePath,\n        url ?? \"\",\n        version ?? \"1.0.0\",\n        commentsLoader,\n        sendCommentFunc);\n\n    await source.loadData();\n\n    Future.delayed(const Duration(milliseconds: 50), () {\n      JsEngine().runCode(\"ComicSource.sources.$_key.init()\");\n    });\n\n    return source;\n  }\n\n  _checkKeyValidation() {\n    // 仅允许数字和字母以及下划线\n    if (!_key!.contains(RegExp(r\"^[a-zA-Z0-9_]+$\"))) {\n      throw ComicSourceParseException(\"key $_key is invalid\");\n    }\n  }\n\n  bool _checkExists(String index){\n    return JsEngine().runCode(\"ComicSource.sources.$_key.$index !== null \"\n        \"&& ComicSource.sources.$_key.$index !== undefined\");\n  }\n\n  dynamic _getValue(String index) {\n    return JsEngine().runCode(\"ComicSource.sources.$_key.$index\");\n  }\n\n  AccountConfig? _loadAccountConfig() {\n    if (!_checkExists(\"account\")) {\n      return null;\n    }\n\n    Future<Res<bool>> login(account, pwd) async {\n      try {\n        await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.account.login(${jsonEncode(account)}, \n          ${jsonEncode(pwd)})\n        \"\"\");\n        var source = ComicSource.sources\n            .firstWhere((element) => element.key == _key);\n        source.data[\"account\"] = <String>[account, pwd];\n        source.saveData();\n        return const Res(true);\n      } catch (e, s) {\n        log(\"$e\\n$s\", \"Network\", LogLevel.error);\n        return Res.error(e.toString());\n      }\n    }\n\n    void logout(){\n      JsEngine().runCode(\"ComicSource.sources.$_key.account.logout()\");\n    }\n\n    return AccountConfig(\n      login,\n      _getValue(\"account.login.website\"),\n      _getValue(\"account.registerWebsite\"),\n      logout\n    );\n  }\n\n  List<ExplorePageData> _loadExploreData() {\n    if (!_checkExists(\"explore\")) {\n      return const [];\n    }\n    var length = JsEngine().runCode(\"ComicSource.sources.$_key.explore.length\");\n    var pages = <ExplorePageData>[];\n    for (int i=0; i<length; i++) {\n      final String title = _getValue(\"explore[$i].title\");\n      final String type = _getValue(\"explore[$i].type\");\n      Future<Res<List<ExplorePagePart>>> Function()? loadMultiPart;\n      Future<Res<List<BaseComic>>> Function(int page)? loadPage;\n      if (type == \"singlePageWithMultiPart\") {\n        loadMultiPart = () async {\n          try {\n            var res = await JsEngine()\n                .runCode(\"ComicSource.sources.$_key.explore[$i].load()\");\n            return Res(List.from(res.keys.map((e) => ExplorePagePart(\n                e,\n                (res[e] as List)\n                    .map<CustomComic>((e) => CustomComic.fromJson(e, _key!))\n                    .toList(),\n                null))\n                .toList()));\n          } catch (e, s) {\n            log(\"$e\\n$s\", \"Data Analysis\", LogLevel.error);\n            return Res.error(e.toString());\n          }\n        };\n      } else if (type == \"multiPageComicList\") {\n        loadPage = (int page) async {\n          try {\n            var res = await JsEngine()\n                .runCode(\"ComicSource.sources.$_key.explore[$i].load(${jsonEncode(page)})\");\n            return Res(\n                List.generate(res[\"comics\"].length,\n                        (index) => CustomComic.fromJson(res[\"comics\"][index], _key!)),\n                subData: res[\"maxPage\"]);\n          } catch (e, s) {\n            log(\"$e\\n$s\", \"Network\", LogLevel.error);\n            return Res.error(e.toString());\n          }\n        };\n      }\n      pages.add(ExplorePageData(\n          title,\n          switch (type) {\n            \"singlePageWithMultiPart\" =>\n              ExplorePageType.singlePageWithMultiPart,\n            \"multiPageComicList\" => ExplorePageType.multiPageComicList,\n            _ =>\n              throw ComicSourceParseException(\"Unknown explore page type $type\")\n          },\n          loadPage,\n          loadMultiPart));\n    }\n    return pages;\n  }\n\n  CategoryData? _loadCategoryData() {\n    var doc = _getValue(\"category\");\n\n    if (doc?[\"title\"] == null) {\n      return null;\n    }\n\n    final String title = doc[\"title\"];\n    final bool? enableRankingPage = doc[\"enableRankingPage\"];\n\n    var categoryParts = <BaseCategoryPart>[];\n\n    for (var c in doc[\"parts\"]) {\n      final String name = c[\"name\"];\n      final String type = c[\"type\"];\n      final List<String> tags = List.from(c[\"categories\"]);\n      final String itemType = c[\"itemType\"];\n      final List<String>? categoryParams =\n          c[\"categoryParams\"] == null ? null : List.from(c[\"categoryParams\"]);\n      if (type == \"fixed\") {\n        categoryParts\n            .add(FixedCategoryPart(name, tags, itemType, categoryParams));\n      } else if (type == \"random\") {\n        categoryParts.add(\n            RandomCategoryPart(name, tags, c[\"randomNumber\"] ?? 1, itemType));\n      }\n    }\n\n    return CategoryData(\n        title: title,\n        categories: categoryParts,\n        enableRankingPage: enableRankingPage ?? false,\n        key: title);\n  }\n\n  CategoryComicsData? _loadCategoryComicsData() {\n    if (!_checkExists(\"categoryComics\")) return null;\n    var options = <CategoryComicsOptions>[];\n    for (var element in _getValue(\"categoryComics.optionList\")) {\n      LinkedHashMap<String, String> map = LinkedHashMap<String, String>();\n      for (var option in element[\"options\"]) {\n        if (option.isEmpty || !option.contains(\"-\")) {\n          continue;\n        }\n        var split = option.split(\"-\");\n        var key = split.removeAt(0);\n        var value = split.join(\"-\");\n        map[key] = value;\n      }\n      options.add(\n          CategoryComicsOptions(\n            map,\n            List.from(element[\"notShowWhen\"] ?? []),\n            element[\"showWhen\"] == null ? null : List.from(element[\"showWhen\"])\n          ));\n    }\n    RankingData? rankingData;\n    if(_checkExists(\"categoryComics.ranking\")){\n      var options = <String, String>{};\n      for(var option in _getValue(\"categoryComics.ranking.options\")){\n        if(option.isEmpty || !option.contains(\"-\")){\n          continue;\n        }\n        var split = option.split(\"-\");\n        var key = split.removeAt(0);\n        var value = split.join(\"-\");\n        options[key] = value;\n      }\n      rankingData = RankingData(options, (option, page) async{\n        try {\n          var res = await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.categoryComics.ranking.load(\n              ${jsonEncode(option)}, ${jsonEncode(page)})\n          \"\"\");\n          return Res(\n              List.generate(res[\"comics\"].length,\n                      (index) => CustomComic.fromJson(res[\"comics\"][index], _key!)),\n              subData: res[\"maxPage\"]);\n        } catch (e, s) {\n          log(\"$e\\n$s\", \"Network\", LogLevel.error);\n          return Res.error(e.toString());\n        }\n      });\n    }\n    return CategoryComicsData(options, (category, param, options, page) async {\n      try {\n        var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.categoryComics.load(\n            ${jsonEncode(category)}, \n            ${jsonEncode(param)}, \n            ${jsonEncode(options)}, \n            ${jsonEncode(page)}\n          )\n        \"\"\");\n        return Res(\n            List.generate(res[\"comics\"].length,\n                (index) => CustomComic.fromJson(res[\"comics\"][index], _key!)),\n            subData: res[\"maxPage\"]);\n      } catch (e, s) {\n        log(\"$e\\n$s\", \"Network\", LogLevel.error);\n        return Res.error(e.toString());\n      }\n    }, rankingData: rankingData);\n  }\n\n  SearchPageData? _loadSearchData() {\n    if (!_checkExists(\"search\")) return null;\n    var options = <SearchOptions>[];\n    for (var element in _getValue(\"search.optionList\") ?? []) {\n      LinkedHashMap<String, String> map = LinkedHashMap<String, String>();\n      for (var option in element[\"options\"]) {\n        if (option.isEmpty || !option.contains(\"-\")) {\n          continue;\n        }\n        var split = option.split(\"-\");\n        var key = split.removeAt(0);\n        var value = split.join(\"-\");\n        map[key] = value;\n      }\n      options.add(SearchOptions(map, element[\"label\"]));\n    }\n    return SearchPageData(options, (keyword, page, searchOption) async {\n      try {\n        var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.search.load(\n            ${jsonEncode(keyword)}, ${jsonEncode(searchOption)}, ${jsonEncode(page)})\n        \"\"\");\n        return Res(\n            List.generate(res[\"comics\"].length,\n                (index) => CustomComic.fromJson(res[\"comics\"][index], _key!)),\n            subData: res[\"maxPage\"]);\n      } catch (e, s) {\n        log(\"$e\\n$s\", \"Network\", LogLevel.error);\n        return Res.error(e.toString());\n      }\n    });\n  }\n\n  LoadComicFunc? _parseLoadComicFunc() {\n    return (id) async {\n      try {\n        var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.loadInfo(${jsonEncode(id)})\n        \"\"\");\n        var tags = <String, List<String>>{};\n        (res[\"tags\"] as Map<String, dynamic>?)\n            ?.forEach((key, value) => tags[key] = List.from(value ?? const []));\n        return Res(ComicInfoData(\n            res[\"title\"],\n            res[\"subTitle\"],\n            res[\"cover\"],\n            res[\"description\"],\n            tags,\n            res[\"chapters\"] == null ? null : Map.from(res[\"chapters\"]),\n            ListOrNull.from(res[\"thumbnails\"]),\n            // TODO: implement thumbnailLoader\n            null,\n            res[\"thumbnailMaxPage\"] ?? 1,\n            (res[\"recommend\"] as List?)\n                ?.map((e) => CustomComic.fromJson(e, _key!))\n                .toList(),\n            _key!,\n            id,\n            isFavorite: res[\"isFavorite\"],\n            subId: res[\"subId\"],));\n      } catch (e, s) {\n        log(\"$e\\n$s\", \"Network\", LogLevel.error);\n        return Res.error(e.toString());\n      }\n    };\n  }\n\n  LoadComicPagesFunc? _parseLoadComicPagesFunc() {\n    return (id, ep) async {\n      try {\n        var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.loadEp(${jsonEncode(id)}, ${jsonEncode(ep)})\n        \"\"\");\n        return Res(List.from(res[\"images\"]));\n      } catch (e, s) {\n        log(\"$e\\n$s\", \"Network\", LogLevel.error);\n        return Res.error(e.toString());\n      }\n    };\n  }\n\n  FavoriteData? _loadFavoriteData() {\n    if (!_checkExists(\"favorites\")) return null;\n\n    final bool multiFolder = _getValue(\"favorites.multiFolder\");\n\n    Future<Res<T>> retryZone<T>(Future<Res<T>> Function() func) async{\n      if(!ComicSource.find(_key!)!.isLogin){\n        return const Res.error(\"Not login\");\n      }\n      var res = await func();\n      if (res.error && res.errorMessage!.contains(\"Login expired\")) {\n        var reLoginRes = await ComicSource.find(_key!)!.reLogin();\n        if (!reLoginRes) {\n          return const Res.error(\"Login expired and re-login failed\");\n        } else {\n          return func();\n        }\n      }\n      return res;\n    }\n\n    Future<Res<bool>> addOrDelFavFunc(comicId, folderId, isAdding) async {\n      func() async {\n        try {\n          await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.favorites.addOrDelFavorite(\n              ${jsonEncode(comicId)}, ${jsonEncode(folderId)}, ${jsonEncode(isAdding)})\n          \"\"\");\n          return const Res(true);\n        } catch (e, s) {\n          log(\"$e\\n$s\", \"Network\", LogLevel.error);\n          return Res<bool>.error(e.toString());\n        }\n      }\n\n      return retryZone(func);\n    }\n\n    Future<Res<List<BaseComic>>> loadComic(int page, [String? folder]) async {\n      Future<Res<List<BaseComic>>> func() async{\n        try {\n          var res = await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.favorites.loadComics(\n              ${jsonEncode(page)}, ${jsonEncode(folder)})\n          \"\"\");\n          return Res(\n              List.generate(res[\"comics\"].length,\n                      (index) => CustomComic.fromJson(res[\"comics\"][index], _key!)),\n              subData: res[\"maxPage\"]);\n        } catch (e, s) {\n          log(\"$e\\n$s\", \"Network\", LogLevel.error);\n          return Res.error(e.toString());\n        }\n      }\n      return retryZone(func);\n    }\n\n    Future<Res<Map<String, String>>> Function([String? comicId])? loadFolders;\n\n    Future<Res<bool>> Function(String name)? addFolder;\n\n    Future<Res<bool>> Function(String key)? deleteFolder;\n\n    if(multiFolder) {\n      loadFolders = ([String? comicId]) async {\n        Future<Res<Map<String, String>>> func() async{\n          try {\n            var res = await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.favorites.loadFolders(${jsonEncode(comicId)})\n          \"\"\");\n            List<String>? subData;\n            if(res[\"favorited\"] != null){\n              subData = List.from(res[\"favorited\"]);\n            }\n            return Res(Map.from(res[\"folders\"]), subData: subData);\n          } catch (e, s) {\n            log(\"$e\\n$s\", \"Network\", LogLevel.error);\n            return Res.error(e.toString());\n          }\n        }\n\n        return retryZone(func);\n      };\n      addFolder = (name) async {\n        try {\n          await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.favorites.addFolder(${jsonEncode(name)})\n          \"\"\");\n          return const Res(true);\n        } catch (e, s) {\n          log(\"$e\\n$s\", \"Network\", LogLevel.error);\n          return Res.error(e.toString());\n        }\n      };\n      deleteFolder = (key) async {\n        try {\n          await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.favorites.deleteFolder(${jsonEncode(key)})\n          \"\"\");\n          return const Res(true);\n        } catch (e, s) {\n          log(\"$e\\n$s\", \"Network\", LogLevel.error);\n          return Res.error(e.toString());\n        }\n      };\n    }\n\n    return FavoriteData(\n        key: _key!,\n        title: _name!,\n        multiFolder: multiFolder,\n        loadComic: loadComic,\n        loadFolders: loadFolders,\n        addFolder: addFolder,\n        deleteFolder: deleteFolder,\n        addOrDelFavorite: addOrDelFavFunc,\n    );\n  }\n\n  CommentsLoader? _parseCommentsLoader(){\n    if(!_checkExists(\"comic.loadComments\")) return null;\n    return (id, subId, page, replyTo) async {\n      try {\n        var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.loadComments(\n            ${jsonEncode(id)}, ${jsonEncode(subId)}, ${jsonEncode(page)}, ${jsonEncode(replyTo)})\n        \"\"\");\n        return Res(\n            (res[\"comments\"] as List).map((e) => Comment(\n                e[\"userName\"], e[\"avatar\"], e[\"content\"], e[\"time\"], e[\"replyCount\"], e[\"id\"].toString()\n            )).toList(),\n            subData: res[\"maxPage\"]);\n      } catch (e, s) {\n        log(\"$e\\n$s\", \"Network\", LogLevel.error);\n        return Res.error(e.toString());\n      }\n    };\n  }\n\n  SendCommentFunc? _parseSendCommentFunc(){\n    if(!_checkExists(\"comic.sendComment\")) return null;\n    return (id, subId, content, replyTo) async {\n      Future<Res<bool>> func() async{\n        try {\n          await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.comic.sendComment(\n              ${jsonEncode(id)}, ${jsonEncode(subId)}, ${jsonEncode(content)}, ${jsonEncode(replyTo)})\n          \"\"\");\n          return const Res(true);\n        } catch (e, s) {\n          log(\"$e\\n$s\", \"Network\", LogLevel.error);\n          return Res.error(e.toString());\n        }\n      }\n      var res = await func();\n      if(res.error && res.errorMessage!.contains(\"Login expired\")){\n        var reLoginRes = await ComicSource.find(_key!)!.reLogin();\n        if (!reLoginRes) {\n          return const Res.error(\"Login expired and re-login failed\");\n        } else {\n          return func();\n        }\n      }\n      return res;\n    };\n  }\n\n  GetImageLoadingConfigFunc? _parseImageLoadingConfigFunc(){\n    if(!_checkExists(\"comic.onImageLoad\")){\n      return null;\n    }\n    return (imageKey, comicId, ep) {\n      return JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.onImageLoad(\n            ${jsonEncode(imageKey)}, ${jsonEncode(comicId)}, ${jsonEncode(ep)})\n        \"\"\") as Map<String, dynamic>;\n    };\n  }\n\n  GetThumbnailLoadingConfigFunc? _parseThumbnailLoadingConfigFunc(){\n    if(!_checkExists(\"comic.onThumbnailLoad\")){\n      return null;\n    }\n    return (imageKey) {\n      var res = JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.onThumbnailLoad(${jsonEncode(imageKey)})\n        \"\"\");\n      if(res is! Map) {\n        Log.error(\"Network\", \"function onThumbnailLoad return invalid data\");\n        throw \"function onThumbnailLoad return invalid data\";\n      }\n      return res as Map<String, dynamic>;\n    };\n  }\n}"
  },
  {
    "path": "lib/components/animated_image.dart",
    "content": "part of 'components.dart';\n\nclass AnimatedImage extends StatefulWidget {\n  /// show animation when loading is complete.\n  AnimatedImage({\n    required ImageProvider image,\n    super.key,\n    double scale = 1.0,\n    this.semanticLabel,\n    this.excludeFromSemantics = false,\n    this.width,\n    this.height,\n    this.color,\n    this.opacity,\n    this.colorBlendMode,\n    this.fit,\n    this.alignment = Alignment.center,\n    this.repeat = ImageRepeat.noRepeat,\n    this.centerSlice,\n    this.matchTextDirection = false,\n    this.gaplessPlayback = false,\n    this.filterQuality = FilterQuality.medium,\n    this.isAntiAlias = false,\n    Map<String, String>? headers,\n    int? cacheWidth,\n    int? cacheHeight,\n  }\n      ): image = ResizeImage.resizeIfNeeded(cacheWidth, cacheHeight, image),\n        assert(cacheWidth == null || cacheWidth > 0),\n        assert(cacheHeight == null || cacheHeight > 0);\n\n  final ImageProvider image;\n\n  final String? semanticLabel;\n\n  final bool excludeFromSemantics;\n\n  final double? width;\n\n  final double? height;\n\n  final bool gaplessPlayback;\n\n  final bool matchTextDirection;\n\n  final Rect? centerSlice;\n\n  final ImageRepeat repeat;\n\n  final AlignmentGeometry alignment;\n\n  final BoxFit? fit;\n\n  final BlendMode? colorBlendMode;\n\n  final FilterQuality filterQuality;\n\n  final Animation<double>? opacity;\n\n  final Color? color;\n\n  final bool isAntiAlias;\n\n  static void clear() => _AnimatedImageState.clear();\n\n  @override\n  State<AnimatedImage> createState() => _AnimatedImageState();\n}\n\nclass _AnimatedImageState extends State<AnimatedImage> with WidgetsBindingObserver {\n  ImageStream? _imageStream;\n  ImageInfo? _imageInfo;\n  ImageChunkEvent? _loadingProgress;\n  bool _isListeningToStream = false;\n  late bool _invertColors;\n  int? _frameNumber;\n  bool _wasSynchronouslyLoaded = false;\n  late DisposableBuildContext<State<AnimatedImage>> _scrollAwareContext;\n  Object? _lastException;\n  ImageStreamCompleterHandle? _completerHandle;\n\n  static final Map<int, Size> _cache = {};\n\n  static clear() => _cache.clear();\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addObserver(this);\n    _scrollAwareContext = DisposableBuildContext<State<AnimatedImage>>(this);\n  }\n\n  @override\n  void dispose() {\n    assert(_imageStream != null);\n    WidgetsBinding.instance.removeObserver(this);\n    _stopListeningToStream();\n    _completerHandle?.dispose();\n    _scrollAwareContext.dispose();\n    _replaceImage(info: null);\n    super.dispose();\n  }\n\n  @override\n  void didChangeDependencies() {\n    _updateInvertColors();\n    _resolveImage();\n\n    if (TickerMode.of(context)) {\n      _listenToStream();\n    } else {\n      _stopListeningToStream(keepStreamAlive: true);\n    }\n\n    super.didChangeDependencies();\n  }\n\n  @override\n  void didUpdateWidget(AnimatedImage oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.image != oldWidget.image) {\n      _resolveImage();\n    }\n  }\n\n  @override\n  void didChangeAccessibilityFeatures() {\n    super.didChangeAccessibilityFeatures();\n    setState(() {\n      _updateInvertColors();\n    });\n  }\n\n  @override\n  void reassemble() {\n    _resolveImage(); // in case the image cache was flushed\n    super.reassemble();\n  }\n\n  void _updateInvertColors() {\n    _invertColors = MediaQuery.maybeInvertColorsOf(context)\n        ?? SemanticsBinding.instance.accessibilityFeatures.invertColors;\n  }\n\n  void _resolveImage() {\n    final ScrollAwareImageProvider provider = ScrollAwareImageProvider<Object>(\n      context: _scrollAwareContext,\n      imageProvider: widget.image,\n    );\n    final ImageStream newStream =\n    provider.resolve(createLocalImageConfiguration(\n      context,\n      size: widget.width != null && widget.height != null ? Size(widget.width!, widget.height!) : null,\n    ));\n    _updateSourceStream(newStream);\n  }\n\n  ImageStreamListener? _imageStreamListener;\n  ImageStreamListener _getListener({bool recreateListener = false}) {\n    if(_imageStreamListener == null || recreateListener) {\n      _lastException = null;\n      _imageStreamListener = ImageStreamListener(\n        _handleImageFrame,\n        onChunk: _handleImageChunk,\n        onError: (Object error, StackTrace? stackTrace) {\n          setState(() {\n            _lastException = error;\n          });\n        },\n      );\n    }\n    return _imageStreamListener!;\n  }\n\n  void _handleImageFrame(ImageInfo imageInfo, bool synchronousCall) {\n    setState(() {\n      _replaceImage(info: imageInfo);\n      _loadingProgress = null;\n      _lastException = null;\n      _frameNumber = _frameNumber == null ? 0 : _frameNumber! + 1;\n      _wasSynchronouslyLoaded = _wasSynchronouslyLoaded | synchronousCall;\n    });\n  }\n\n  void _handleImageChunk(ImageChunkEvent event) {\n    setState(() {\n      _loadingProgress = event;\n      _lastException = null;\n    });\n  }\n\n  void _replaceImage({required ImageInfo? info}) {\n    final ImageInfo? oldImageInfo = _imageInfo;\n    SchedulerBinding.instance.addPostFrameCallback((_) => oldImageInfo?.dispose());\n    _imageInfo = info;\n  }\n\n  // Updates _imageStream to newStream, and moves the stream listener\n  // registration from the old stream to the new stream (if a listener was\n  // registered).\n  void _updateSourceStream(ImageStream newStream) {\n    if (_imageStream?.key == newStream.key) {\n      return;\n    }\n\n    if (_isListeningToStream) {\n      _imageStream!.removeListener(_getListener());\n    }\n\n    if (!widget.gaplessPlayback) {\n      setState(() { _replaceImage(info: null); });\n    }\n\n    setState(() {\n      _loadingProgress = null;\n      _frameNumber = null;\n      _wasSynchronouslyLoaded = false;\n    });\n\n    _imageStream = newStream;\n    if (_isListeningToStream) {\n      _imageStream!.addListener(_getListener());\n    }\n  }\n\n  void _listenToStream() {\n    if (_isListeningToStream) {\n      return;\n    }\n\n    _imageStream!.addListener(_getListener());\n    _completerHandle?.dispose();\n    _completerHandle = null;\n\n    _isListeningToStream = true;\n  }\n\n  /// Stops listening to the image stream, if this state object has attached a\n  /// listener.\n  ///\n  /// If the listener from this state is the last listener on the stream, the\n  /// stream will be disposed. To keep the stream alive, set `keepStreamAlive`\n  /// to true, which create [ImageStreamCompleterHandle] to keep the completer\n  /// alive and is compatible with the [TickerMode] being off.\n  void _stopListeningToStream({bool keepStreamAlive = false}) {\n    if (!_isListeningToStream) {\n      return;\n    }\n\n    if (keepStreamAlive && _completerHandle == null && _imageStream?.completer != null) {\n      _completerHandle = _imageStream!.completer!.keepAlive();\n    }\n\n    _imageStream!.removeListener(_getListener());\n    _isListeningToStream = false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget result;\n\n    if(_imageInfo != null){\n      // build image\n      result = RawImage(\n        // Do not clone the image, because RawImage is a stateless wrapper.\n        // The image will be disposed by this state object when it is not needed\n        // anymore, such as when it is unmounted or when the image stream pushes\n        // a new image.\n        image: _imageInfo?.image,\n        width: widget.width,\n        height: widget.height,\n        debugImageLabel: _imageInfo?.debugLabel,\n        scale: _imageInfo?.scale ?? 1.0,\n        color: widget.color,\n        opacity: widget.opacity,\n        colorBlendMode: widget.colorBlendMode,\n        fit: appdata.settings[66] == \"0\" ? BoxFit.cover : BoxFit.contain,\n        alignment: widget.alignment,\n        repeat: widget.repeat,\n        centerSlice: widget.centerSlice,\n        matchTextDirection: widget.matchTextDirection,\n        invertColors: _invertColors,\n        isAntiAlias: widget.isAntiAlias,\n        filterQuality: widget.filterQuality,\n      );\n    } else if (_lastException != null) {\n      result = const Center(\n        child: Icon(Icons.error),\n      );\n\n      if (!widget.excludeFromSemantics) {\n        result = Semantics(\n          container: widget.semanticLabel != null,\n          image: true,\n          label: widget.semanticLabel ?? '',\n          child: result,\n        );\n      }\n    } else{\n      result = const Center();\n    }\n\n    return AnimatedSwitcher(\n      duration: const Duration(milliseconds: 200),\n      reverseDuration: const Duration(milliseconds: 200),\n      child: result,\n    );\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder description) {\n    super.debugFillProperties(description);\n    description.add(DiagnosticsProperty<ImageStream>('stream', _imageStream));\n    description.add(DiagnosticsProperty<ImageInfo>('pixels', _imageInfo));\n    description.add(DiagnosticsProperty<ImageChunkEvent>('loadingProgress', _loadingProgress));\n    description.add(DiagnosticsProperty<int>('frameNumber', _frameNumber));\n    description.add(DiagnosticsProperty<bool>('wasSynchronouslyLoaded', _wasSynchronouslyLoaded));\n  }\n}\n"
  },
  {
    "path": "lib/components/appbar.dart",
    "content": "part of 'components.dart';\n\nclass Appbar extends StatefulWidget implements PreferredSizeWidget {\n  const Appbar(\n      {required this.title,\n      this.leading,\n      this.actions,\n      this.backgroundColor,\n      super.key});\n\n  final Widget title;\n\n  final Widget? leading;\n\n  final List<Widget>? actions;\n\n  final Color? backgroundColor;\n\n  @override\n  State<Appbar> createState() => _AppbarState();\n\n  @override\n  Size get preferredSize => const Size.fromHeight(56);\n}\n\nclass _AppbarState extends State<Appbar> {\n  ScrollNotificationObserverState? _scrollNotificationObserver;\n  bool _scrolledUnder = false;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    _scrollNotificationObserver?.removeListener(_handleScrollNotification);\n    _scrollNotificationObserver = ScrollNotificationObserver.maybeOf(context);\n    _scrollNotificationObserver?.addListener(_handleScrollNotification);\n  }\n\n  @override\n  void dispose() {\n    if (_scrollNotificationObserver != null) {\n      _scrollNotificationObserver!.removeListener(_handleScrollNotification);\n      _scrollNotificationObserver = null;\n    }\n    super.dispose();\n  }\n\n  void _handleScrollNotification(ScrollNotification notification) {\n    if (notification is ScrollUpdateNotification &&\n        defaultScrollNotificationPredicate(notification)) {\n      final bool oldScrolledUnder = _scrolledUnder;\n      final ScrollMetrics metrics = notification.metrics;\n      switch (metrics.axisDirection) {\n        case AxisDirection.up:\n          // Scroll view is reversed\n          _scrolledUnder = metrics.extentAfter > 0;\n        case AxisDirection.down:\n          _scrolledUnder = metrics.extentBefore > 0;\n        case AxisDirection.right:\n        case AxisDirection.left:\n          // Scrolled under is only supported in the vertical axis, and should\n          // not be altered based on horizontal notifications of the same\n          // predicate since it could be a 2D scroller.\n          break;\n      }\n\n      if (_scrolledUnder != oldScrolledUnder) {\n        setState(() {\n          // React to a change in MaterialState.scrolledUnder\n        });\n      }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var content = SizedBox(\n      height: _kAppBarHeight,\n      child: Row(\n        children: [\n          const SizedBox(width: 8),\n          widget.leading ??\n              Tooltip(\n                message: \"返回\".tl,\n                child: IconButton(\n                  icon: const Icon(Icons.arrow_back),\n                  onPressed: () => Navigator.pop(context),\n                ),\n              ),\n          const SizedBox(\n            width: 16,\n          ),\n          Expanded(\n            child: DefaultTextStyle(\n              style: DefaultTextStyle.of(context).style.copyWith(fontSize: 20),\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n              child: widget.title,\n            ),\n          ),\n          ...?widget.actions,\n          const SizedBox(\n            width: 8,\n          )\n        ],\n      ),\n    ).paddingTop(context.padding.top);\n    if (widget.backgroundColor != Colors.transparent) {\n      return Material(\n        elevation: (_scrolledUnder && UiMode.m1(context)) ? 1 : 0,\n        surfaceTintColor: Theme.of(context).colorScheme.surfaceTint,\n        color: widget.backgroundColor ?? Theme.of(context).colorScheme.surface,\n        child: content,\n      );\n    }\n    return content;\n  }\n}\n\nclass SliverAppbar extends StatelessWidget {\n  const SliverAppbar({\n    super.key,\n    required this.title,\n    this.leading,\n    this.actions,\n    this.color,\n    this.radius = 0,\n  });\n\n  final Widget? leading;\n\n  final Widget title;\n\n  final List<Widget>? actions;\n\n  final Color? color;\n\n  final double radius;\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverPersistentHeader(\n      pinned: true,\n      delegate: _MySliverAppBarDelegate(\n        leading: leading,\n        title: title,\n        actions: actions,\n        topPadding: MediaQuery.of(context).padding.top,\n        color: color,\n        radius: radius,\n      ),\n    );\n  }\n}\n\nconst _kAppBarHeight = 58.0;\n\nclass _MySliverAppBarDelegate extends SliverPersistentHeaderDelegate {\n  final Widget? leading;\n\n  final Widget title;\n\n  final List<Widget>? actions;\n\n  final double topPadding;\n\n  final Color? color;\n\n  final double radius;\n\n  _MySliverAppBarDelegate(\n      {this.leading,\n      required this.title,\n      this.actions,\n      this.color,\n      required this.topPadding,\n      this.radius = 0});\n\n  @override\n  Widget build(\n      BuildContext context, double shrinkOffset, bool overlapsContent) {\n    return SizedBox.expand(\n      child: Material(\n        color: color,\n        elevation: 0,\n        borderRadius: BorderRadius.circular(radius),\n        child: Row(\n          children: [\n            const SizedBox(width: 8),\n            leading ??\n                (Navigator.of(context).canPop()\n                    ? Tooltip(\n                        message: \"返回\".tl,\n                        child: IconButton(\n                          icon: const Icon(Icons.arrow_back),\n                          onPressed: () => Navigator.pop(context),\n                        ),\n                      )\n                    : const SizedBox()),\n            const SizedBox(\n              width: 24,\n            ),\n            Expanded(\n              child: DefaultTextStyle(\n                style:\n                    DefaultTextStyle.of(context).style.copyWith(fontSize: 20),\n                maxLines: 1,\n                overflow: TextOverflow.ellipsis,\n                child: title,\n              ),\n            ),\n            ...?actions,\n            const SizedBox(\n              width: 8,\n            )\n          ],\n        ).paddingTop(topPadding),\n      ),\n    );\n  }\n\n  @override\n  double get maxExtent => _kAppBarHeight + topPadding;\n\n  @override\n  double get minExtent => _kAppBarHeight + topPadding;\n\n  @override\n  bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {\n    return oldDelegate is! _MySliverAppBarDelegate ||\n        leading != oldDelegate.leading ||\n        title != oldDelegate.title ||\n        actions != oldDelegate.actions;\n  }\n}\n\nclass FloatingSearchBar extends StatefulWidget {\n  const FloatingSearchBar({\n    Key? key,\n    this.height = 56,\n    this.trailing,\n    required this.onSearch,\n    required this.controller,\n    this.onChanged,\n  }) : super(key: key);\n\n  /// height of search bar\n  final double height;\n\n  /// end of search bar\n  final Widget? trailing;\n\n  /// callback when user do search\n  final void Function(String) onSearch;\n\n  /// controller of [TextField]\n  final TextEditingController controller;\n\n  final void Function(String)? onChanged;\n\n  @override\n  State<FloatingSearchBar> createState() => _FloatingSearchBarState();\n}\n\nclass _FloatingSearchBarState extends State<FloatingSearchBar> {\n  double get effectiveHeight {\n    return math.max(widget.height, 53);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final ColorScheme colorScheme = Theme.of(context).colorScheme;\n    var text = widget.controller.text;\n    if (text.isEmpty) {\n      text = \"Search\";\n    }\n    var padding = 12.0;\n    return Container(\n      padding: EdgeInsets.fromLTRB(padding, 9, padding, 0),\n      width: double.infinity,\n      height: effectiveHeight,\n      child: Material(\n        elevation: 0,\n        color: colorScheme.primaryContainer,\n        borderRadius: BorderRadius.circular(effectiveHeight / 2),\n        child: Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 8),\n          child: Row(children: [\n            Tooltip(\n              message: \"返回\".tl,\n              child: IconButton(\n                icon: const Icon(Icons.arrow_back),\n                onPressed: () => context.pop(),\n              ),\n            ),\n            Expanded(\n              child: Padding(\n                padding: const EdgeInsets.only(right: 8),\n                child: TextField(\n                  controller: widget.controller,\n                  decoration: const InputDecoration(\n                    border: InputBorder.none,\n                  ),\n                  onSubmitted: (s) {\n                    widget.onSearch(s);\n                  },\n                  onChanged: widget.onChanged,\n                ),\n              ),\n            ),\n            if (widget.trailing != null) widget.trailing!\n          ]),\n        ),\n      ),\n    );\n  }\n}\n\nclass FilledTabBar extends StatefulWidget {\n  const FilledTabBar({super.key, this.controller, required this.tabs});\n\n  final TabController? controller;\n\n  final List<Tab> tabs;\n\n  @override\n  State<FilledTabBar> createState() => _FilledTabBarState();\n}\n\nclass _FilledTabBarState extends State<FilledTabBar> {\n  late TabController _controller;\n\n  late List<GlobalKey> keys;\n\n  static const _kTabHeight = 48.0;\n\n  static const tabPadding = EdgeInsets.symmetric(horizontal: 6, vertical: 6);\n\n  static const tabRadius = 12.0;\n\n  _IndicatorPainter? painter;\n\n  var scrollController = ScrollController();\n\n  var tabBarKey = GlobalKey();\n\n  var offsets = <double>[];\n\n  @override\n  void initState() {\n    keys = widget.tabs.map((e) => GlobalKey()).toList();\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n  }\n\n  @override\n  void didChangeDependencies() {\n    _controller = widget.controller ?? DefaultTabController.of(context);\n    _controller.animation!.addListener(onTabChanged);\n    initPainter();\n    super.didChangeDependencies();\n  }\n\n  @override\n  void didUpdateWidget(covariant FilledTabBar oldWidget) {\n    if (widget.controller != oldWidget.controller) {\n      _controller = widget.controller ?? DefaultTabController.of(context);\n      _controller.animation!.addListener(onTabChanged);\n      initPainter();\n    }\n    super.didUpdateWidget(oldWidget);\n  }\n\n  void initPainter() {\n    var old = painter;\n    painter = _IndicatorPainter(\n      controller: _controller,\n      color: context.colorScheme.primary,\n      padding: tabPadding,\n      radius: tabRadius,\n    );\n    if (old != null) {\n      painter!.update(old.offsets!, old.itemHeight!);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedBuilder(\n      animation: _controller,\n      builder: buildTabBar,\n    );\n  }\n\n  void _tabLayoutCallback(List<double> offsets, double itemHeight) {\n    painter!.update(offsets, itemHeight);\n    this.offsets = offsets;\n  }\n\n  Widget buildTabBar(BuildContext context, Widget? _) {\n    var child = SmoothScrollProvider(\n      controller: scrollController,\n      builder: (context, controller, physics) {\n        return SingleChildScrollView(\n          scrollDirection: Axis.horizontal,\n          padding: EdgeInsets.zero,\n          controller: controller,\n          physics: physics,\n          child: CustomPaint(\n            painter: painter,\n            child: _TabRow(\n              callback: _tabLayoutCallback,\n              children: List.generate(widget.tabs.length, buildTab),\n            ),\n          ).paddingHorizontal(4),\n        );\n      },\n    );\n    return Container(\n      key: tabBarKey,\n      height: _kTabHeight,\n      width: double.infinity,\n      decoration: BoxDecoration(\n        border: Border(\n          bottom: BorderSide(\n            color: context.colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n        ),\n      ),\n      child: widget.tabs.isEmpty\n          ? const SizedBox()\n          : child\n    );\n  }\n\n  int? previousIndex;\n\n  void onTabChanged() {\n    final int i = _controller.index;\n    if (i == previousIndex) {\n      return;\n    }\n    updateScrollOffset(i);\n    previousIndex = i;\n  }\n\n  void updateScrollOffset(int i) {\n    // try to scroll to center the tab\n    final RenderBox tabBarBox =\n        tabBarKey.currentContext!.findRenderObject() as RenderBox;\n    final double tabLeft = offsets[i];\n    final double tabRight = offsets[i + 1];\n    final double tabWidth = tabRight - tabLeft;\n    final double tabCenter = tabLeft + tabWidth / 2;\n    final double tabBarWidth = tabBarBox.size.width;\n    final double scrollOffset = tabCenter - tabBarWidth / 2;\n    if (scrollOffset == scrollController.offset) {\n      return;\n    }\n    scrollController.animateTo(\n      scrollOffset,\n      duration: const Duration(milliseconds: 200),\n      curve: Curves.easeInOut,\n    );\n  }\n\n  void onTabClicked(int i) {\n    _controller.animateTo(i);\n  }\n\n  Widget buildTab(int i) {\n    return InkWell(\n      onTap: () => onTabClicked(i),\n      borderRadius: BorderRadius.circular(tabRadius),\n      child: KeyedSubtree(\n        key: keys[i],\n        child: Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 16),\n          child: DefaultTextStyle(\n            style: DefaultTextStyle.of(context).style.copyWith(\n              color: i == _controller.index\n                  ? context.colorScheme.primary\n                  : context.colorScheme.onSurface,\n              fontWeight: FontWeight.w500,\n            ),\n            child: widget.tabs[i],\n          ),\n        ),\n      ),\n    ).padding(tabPadding);\n  }\n}\n\ntypedef _TabRenderCallback = void Function(\n  List<double> offsets,\n  double itemHeight,\n);\n\nclass _TabRow extends Row {\n  const _TabRow({required this.callback, required super.children});\n\n  final _TabRenderCallback callback;\n\n  @override\n  RenderFlex createRenderObject(BuildContext context) {\n    return _RenderTabFlex(\n        direction: Axis.horizontal,\n        mainAxisSize: MainAxisSize.min,\n        mainAxisAlignment: MainAxisAlignment.start,\n        crossAxisAlignment: CrossAxisAlignment.center,\n        textDirection: Directionality.of(context),\n        verticalDirection: VerticalDirection.down,\n        callback: callback);\n  }\n\n  @override\n  void updateRenderObject(BuildContext context, _RenderTabFlex renderObject) {\n    super.updateRenderObject(context, renderObject);\n    renderObject.callback = callback;\n  }\n}\n\nclass _RenderTabFlex extends RenderFlex {\n  _RenderTabFlex({\n    required super.direction,\n    required super.mainAxisSize,\n    required super.mainAxisAlignment,\n    required super.crossAxisAlignment,\n    required TextDirection super.textDirection,\n    required super.verticalDirection,\n    required this.callback,\n  });\n\n  _TabRenderCallback callback;\n\n  @override\n  void performLayout() {\n    super.performLayout();\n    RenderBox? child = firstChild;\n    final List<double> xOffsets = <double>[];\n    while (child != null) {\n      final FlexParentData childParentData =\n          child.parentData! as FlexParentData;\n      xOffsets.add(childParentData.offset.dx);\n      assert(child.parentData == childParentData);\n      child = childParentData.nextSibling;\n    }\n    xOffsets.add(size.width);\n    callback(xOffsets, firstChild!.size.height);\n  }\n}\n\nclass _IndicatorPainter extends CustomPainter {\n  _IndicatorPainter({\n    required this.controller,\n    required this.color,\n    required this.padding,\n    this.radius = 4.0,\n  }) : super(repaint: controller.animation);\n\n  final TabController controller;\n  final Color color;\n  final EdgeInsets padding;\n  final double radius;\n\n  List<double>? offsets;\n  double? itemHeight;\n  Rect? _currentRect;\n\n  void update(List<double> offsets, double itemHeight) {\n    this.offsets = offsets;\n    this.itemHeight = itemHeight;\n  }\n\n  int get maxTabIndex => offsets!.length - 2;\n\n  Rect indicatorRect(Size tabBarSize, int tabIndex) {\n    assert(offsets != null);\n    assert(offsets!.isNotEmpty);\n    assert(tabIndex >= 0);\n    assert(tabIndex <= maxTabIndex);\n    var (tabLeft, tabRight) = (offsets![tabIndex], offsets![tabIndex + 1]);\n\n    const horizontalPadding = 12.0;\n\n    var rect = Rect.fromLTWH(\n      tabLeft + padding.left + horizontalPadding,\n      _FilledTabBarState._kTabHeight - 3.6,\n      tabRight - tabLeft - padding.horizontal - horizontalPadding * 2,\n      3,\n    );\n\n    return rect;\n  }\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    if (offsets == null || itemHeight == null) {\n      return;\n    }\n    final double index = controller.index.toDouble();\n    final double value = controller.animation!.value;\n    final bool ltr = index > value;\n    final int from = (ltr ? value.floor() : value.ceil()).clamp(0, maxTabIndex);\n    final int to = (ltr ? from + 1 : from - 1).clamp(0, maxTabIndex);\n    final Rect fromRect = indicatorRect(size, from);\n    final Rect toRect = indicatorRect(size, to);\n    _currentRect = Rect.lerp(fromRect, toRect, (value - from).abs());\n    final Paint paint = Paint()..color = color;\n    final RRect rrect =\n        RRect.fromRectAndCorners(_currentRect!, topLeft: Radius.circular(radius), topRight: Radius.circular(radius));\n    canvas.drawRRect(rrect, paint);\n  }\n\n  @override\n  bool shouldRepaint(covariant CustomPainter oldDelegate) {\n    return false;\n  }\n}\n"
  },
  {
    "path": "lib/components/avatar.dart",
    "content": "part of 'components.dart';\n\nclass Avatar extends StatelessWidget {\n  const Avatar(\n      {Key? key,\n      required this.size,\n      this.avatarUrl,\n      this.frame,\n      this.couldBeShown = false,\n      this.name = \"\",\n      this.slogan,\n      this.level = 0})\n      : super(key: key);\n  final double size;\n  final String? avatarUrl;\n  final String? frame;\n  final bool couldBeShown;\n  final String name;\n  final String? slogan;\n  final int level;\n\n  @override\n  Widget build(BuildContext context) {\n    var avatarUrl = this.avatarUrl;\n    if(avatarUrl != null && !avatarUrl.isURL){\n      avatarUrl = null;\n    }\n    return GestureDetector(\n      onTap: () {\n        if (couldBeShown) {\n          showUserInfo(context, avatarUrl, frame, name, slogan, level);\n        } else if(avatarUrl != null && avatarUrl != \"DEFAULT AVATAR URL\"){\n          App.globalTo(() => ShowImagePageWithHero(avatarUrl!, \"avatar\"));\n        }\n      },\n      child: Container(\n        width: size,\n        height: size,\n        clipBehavior: Clip.antiAlias,\n        decoration: BoxDecoration(borderRadius: BorderRadius.circular(size)),\n        child: Stack(\n          children: [\n            Positioned(\n              top: size * 0.25 / 2,\n              left: size * 0.25 / 2,\n              child: Container(\n                width: size * 0.75,\n                height: size * 0.75,\n                clipBehavior: Clip.antiAlias,\n                decoration:\n                    BoxDecoration(\n                        borderRadius: BorderRadius.circular(size),\n                      color: Theme.of(context).colorScheme.secondaryContainer\n                    ),\n                child: (avatarUrl == null || avatarUrl == \"DEFAULT AVATAR URL\")\n                    ? const Image(\n                        image: AssetImage(\"images/avatar_small.png\"),\n                        fit: BoxFit.cover,\n                      )\n                    : AnimatedImage(\n                        image: CachedImageProvider(avatarUrl,\n                            headers: {\"User-Agent\": webUA}),\n                        fit: BoxFit.cover,\n                        filterQuality: FilterQuality.medium),\n              ),\n            ),\n            if (frame != null && appdata.settings[5] == \"1\")\n              Positioned(\n                child: Image(\n                  image: CachedImageProvider(\n                    frame!,\n                  ),\n                ),\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\nvoid showUserInfo(BuildContext context, String? avatarUrl, String? frameUrl, String name, String? slogan, int level){\n  showDialog(context: context, builder: (dialogContext){\n    return SimpleDialog(\n      contentPadding: const EdgeInsets.all(20),\n      children: [\n        Align(\n          alignment: Alignment.center,\n          child: Column(\n            children: [\n              Avatar(size: 80, avatarUrl: avatarUrl, frame: frameUrl,),\n              Text(name,style: const TextStyle(fontSize: 16,fontWeight: FontWeight.w600),),\n              Text(\"Lv${level.toString()}\"),\n              const SizedBox(height: 10,width: 0,),\n              SizedBox(width: 400,child: Align(\n                alignment: Alignment.center,\n                child: Text(slogan??\"\"),\n              ),)\n            ],\n          ),\n        )\n      ],\n    );\n  });\n}\n"
  },
  {
    "path": "lib/components/button.dart",
    "content": "part of 'components.dart';\n\nclass HoverBox extends StatefulWidget {\n  const HoverBox(\n      {super.key, required this.child, this.borderRadius = BorderRadius.zero});\n\n  final Widget child;\n\n  final BorderRadius borderRadius;\n\n  @override\n  State<HoverBox> createState() => _HoverBoxState();\n}\n\nclass _HoverBoxState extends State<HoverBox> {\n  bool isHover = false;\n\n  @override\n  Widget build(BuildContext context) {\n    return MouseRegion(\n      onEnter: (_) => setState(() => isHover = true),\n      onExit: (_) => setState(() => isHover = false),\n      cursor: SystemMouseCursors.click,\n      child: AnimatedContainer(\n        duration: const Duration(milliseconds: 200),\n        decoration: BoxDecoration(\n            color:\n                isHover ? Theme.of(context).colorScheme.surfaceContainer : null,\n            borderRadius: widget.borderRadius),\n        child: widget.child,\n      ),\n    );\n  }\n}\n\nenum ButtonType { filled, outlined, text, normal }\n\nclass Button extends StatefulWidget {\n  const Button(\n      {super.key,\n      required this.type,\n      required this.child,\n      this.isLoading = false,\n      this.width,\n      this.height,\n      this.padding,\n      this.color,\n      this.onPressedAt,\n      this.disabled = false,\n      required this.onPressed});\n\n  const Button.filled(\n      {super.key,\n      required this.child,\n      required this.onPressed,\n      this.width,\n      this.height,\n      this.padding,\n      this.color,\n      this.onPressedAt,\n      this.disabled = false,\n      this.isLoading = false})\n      : type = ButtonType.filled;\n\n  const Button.outlined(\n      {super.key,\n      required this.child,\n      required this.onPressed,\n      this.width,\n      this.height,\n      this.padding,\n      this.color,\n      this.onPressedAt,\n      this.disabled = false,\n      this.isLoading = false})\n      : type = ButtonType.outlined;\n\n  const Button.text(\n      {super.key,\n      required this.child,\n      required this.onPressed,\n      this.width,\n      this.height,\n      this.padding,\n      this.color,\n      this.onPressedAt,\n      this.disabled = false,\n      this.isLoading = false})\n      : type = ButtonType.text;\n\n  const Button.normal(\n      {super.key,\n      required this.child,\n      required this.onPressed,\n      this.width,\n      this.height,\n      this.padding,\n      this.color,\n      this.onPressedAt,\n      this.disabled = false,\n      this.isLoading = false})\n      : type = ButtonType.normal;\n\n  static Widget icon(\n      {Key? key,\n      required Widget icon,\n      required VoidCallback onPressed,\n      double? size,\n      Color? color,\n      String? tooltip,\n      bool isLoading = false,\n      HitTestBehavior behavior = HitTestBehavior.deferToChild}) {\n    return _IconButton(\n      key: key,\n      icon: icon,\n      onPressed: onPressed,\n      size: size,\n      color: color,\n      tooltip: tooltip,\n      behavior: behavior,\n      isLoading: isLoading,\n    );\n  }\n\n  final ButtonType type;\n\n  final Widget child;\n\n  final bool isLoading;\n\n  final void Function() onPressed;\n\n  final void Function(Offset location)? onPressedAt;\n\n  final double? width;\n\n  final double? height;\n\n  final EdgeInsets? padding;\n\n  final Color? color;\n\n  final bool disabled;\n\n  @override\n  State<Button> createState() => _ButtonState();\n}\n\nclass _ButtonState extends State<Button> {\n  bool isHover = false;\n\n  bool isLoading = false;\n\n  @override\n  void didUpdateWidget(covariant Button oldWidget) {\n    if (oldWidget.isLoading != widget.isLoading) {\n      setState(() => isLoading = widget.isLoading);\n    }\n    super.didUpdateWidget(oldWidget);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var padding = widget.padding ??\n        const EdgeInsets.symmetric(horizontal: 24, vertical: 6);\n    var width = widget.width;\n    if (width != null) {\n      width = width - padding.horizontal;\n    }\n    var height = widget.height;\n    if (height != null) {\n      height = height - padding.vertical;\n    }\n    bool fixed = width != null || height != null;\n    Widget child = IconTheme(\n        data: IconThemeData(color: textColor),\n        child: DefaultTextStyle(\n          style: TextStyle(\n            color: textColor,\n            fontSize: 16,\n          ),\n          child: isLoading\n              ? CircularProgressIndicator(\n                  color: widget.type == ButtonType.filled\n                      ? context.colorScheme.inversePrimary\n                      : context.colorScheme.primary,\n                  strokeWidth: 1.8,\n                ).fixWidth(18).fixHeight(18)\n              : widget.child,\n        ));\n    if (width != null || height != null) {\n      child = child.toCenter();\n    }\n    return MouseRegion(\n      onEnter: (_) => setState(() => isHover = true),\n      onExit: (_) => setState(() => isHover = false),\n      cursor: !widget.disabled ? SystemMouseCursors.click : MouseCursor.defer,\n      child: GestureDetector(\n        onTap: () {\n          if (widget.disabled) {\n            return;\n          }\n          if (isLoading) return;\n          widget.onPressed();\n          if (widget.onPressedAt != null) {\n            var renderBox = context.findRenderObject() as RenderBox;\n            var offset = renderBox.localToGlobal(Offset.zero);\n            widget.onPressedAt!(offset);\n          }\n        },\n        child: AnimatedContainer(\n          duration: const Duration(milliseconds: 160),\n          padding: padding,\n          decoration: BoxDecoration(\n            color: buttonColor,\n            borderRadius: BorderRadius.circular(16),\n            border: widget.type == ButtonType.outlined\n                ? Border.all(\n                    color: widget.color ??\n                        Theme.of(context).colorScheme.outlineVariant,\n                    width: 0.6)\n                : null,\n          ),\n          child: fixed\n              ? SizedBox(\n                  width: width,\n                  height: height,\n                  child: child,\n                )\n              : AnimatedSize(\n                  duration: _fastAnimationDuration,\n                  child: child,\n                ),\n        ),\n      ),\n    );\n  }\n\n  Color get buttonColor {\n    if (widget.type == ButtonType.filled) {\n      if (widget.disabled) {\n        return context.colorScheme.primaryContainer.withOpacity(0.6);\n      }\n      var color = widget.color ?? context.colorScheme.primary;\n      if (isHover) {\n        return color.withOpacity(0.9);\n      } else {\n        return color;\n      }\n    }\n    if (isHover && !widget.disabled) {\n      return context.colorScheme.outline.withOpacity(0.2);\n    }\n    return Colors.transparent;\n  }\n\n  Color get textColor {\n    if (widget.disabled) {\n      return context.colorScheme.outline;\n    }\n    if (widget.type == ButtonType.outlined) {\n      return widget.color ?? context.colorScheme.onSurface;\n    }\n    return widget.type == ButtonType.filled\n        ? context.colorScheme.onPrimary\n        : (widget.type == ButtonType.text\n            ? widget.color ?? context.colorScheme.primary\n            : context.colorScheme.onSurface);\n  }\n}\n\nclass _IconButton extends StatefulWidget {\n  const _IconButton({\n    super.key,\n    required this.icon,\n    required this.onPressed,\n    this.size,\n    this.color,\n    this.tooltip,\n    this.isLoading = false,\n    this.behavior = HitTestBehavior.deferToChild,\n  });\n\n  final Widget icon;\n\n  final VoidCallback onPressed;\n\n  final double? size;\n\n  final String? tooltip;\n\n  final Color? color;\n\n  final HitTestBehavior behavior;\n\n  final bool isLoading;\n\n  @override\n  State<_IconButton> createState() => _IconButtonState();\n}\n\nclass _IconButtonState extends State<_IconButton> {\n  bool isHover = false;\n\n  @override\n  Widget build(BuildContext context) {\n    var iconSize = widget.size ?? 24;\n    Widget icon = IconTheme(\n      data: IconThemeData(\n        size: iconSize,\n        color: widget.color ?? context.colorScheme.primary,\n      ),\n      child: widget.icon,\n    );\n    if (widget.isLoading) {\n      icon = const CircularProgressIndicator(\n        strokeWidth: 1.5,\n      ).paddingAll(2).fixWidth(iconSize).fixHeight(iconSize);\n    }\n    return MouseRegion(\n      onEnter: (_) => setState(() => isHover = true),\n      onExit: (_) => setState(() => isHover = false),\n      cursor: SystemMouseCursors.click,\n      child: GestureDetector(\n        behavior: widget.behavior,\n        onTap: () {\n          if (widget.isLoading) return;\n          widget.onPressed();\n        },\n        child: Tooltip(\n          message: widget.tooltip ?? \"\",\n          child: Container(\n            decoration: BoxDecoration(\n              color: isHover\n                  ? Theme.of(context)\n                      .colorScheme\n                      .outlineVariant\n                      .withOpacity(0.4)\n                  : null,\n              borderRadius: BorderRadius.circular((iconSize + 12) / 2),\n            ),\n            padding: const EdgeInsets.all(6),\n            child: icon,\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass StatefulSwitch extends StatefulWidget {\n  const StatefulSwitch(\n      {required this.initialValue, required this.onChanged, super.key});\n\n  final bool initialValue;\n\n  final void Function(bool) onChanged;\n\n  @override\n  State<StatefulSwitch> createState() => _StatefulSwitchState();\n}\n\nclass _StatefulSwitchState extends State<StatefulSwitch> {\n  late bool value;\n\n  @override\n  void initState() {\n    value = widget.initialValue;\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Switch(\n        value: value,\n        onChanged: (b) {\n          setState(() {\n            value = b;\n            widget.onChanged(b);\n          });\n        });\n  }\n}\n"
  },
  {
    "path": "lib/components/comic_tile.dart",
    "content": "part of 'components.dart';\n\nclass ComicTileMenuOption {\n  final String title;\n  final IconData icon;\n  final void Function(String? comicId) onTap;\n\n  const ComicTileMenuOption(this.title, this.icon, this.onTap);\n}\n\nabstract class ComicTile extends StatelessWidget {\n  /// Show a comic brief information. Usually displayed in comic list page.\n  const ComicTile({Key? key}) : super(key: key);\n\n  Widget get image;\n\n  Widget? buildSubDescription(BuildContext context) => null;\n\n  String get title;\n\n  String get subTitle;\n\n  String get description;\n\n  String? get badge => null;\n\n  List<String>? get tags => null;\n\n  int get maxLines => 2;\n\n  FavoriteItem? get favoriteItem => null;\n\n  ActionFunc? get read => null;\n\n  bool get enableLongPressed => true;\n\n  int? get pages => null;\n\n  List<ComicTileMenuOption>? get addonMenuOptions => null;\n\n  /// Comic ID, used to identify a comic.\n  String? get comicID => null;\n\n  bool get showFavorite => true;\n\n  void showBlockPane() {\n    showDialog(\n      context: App.globalContext!,\n      builder: (context) => _BlockingPane(comic: this),\n    );\n  }\n\n  void onLongTap_() {\n    bool favorite = false;\n    showDialog(\n      context: App.globalContext!,\n      builder: (context) {\n        return StatefulBuilder(builder: (context, setState) {\n          Widget child;\n          if (!favorite) {\n            child = Dialog(\n              child: ConstrainedBox(\n                constraints: const BoxConstraints(maxWidth: 400),\n                child: Column(\n                  key: const Key(\"1\"),\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Padding(\n                      padding: const EdgeInsets.fromLTRB(16, 16, 16, 8),\n                      child: SelectableText(\n                        title.replaceAll(\"\\n\", \"\"),\n                        style: const TextStyle(fontSize: 22),\n                      ),\n                    ),\n                    const Divider(),\n                    ListTile(\n                      leading: const Icon(Icons.article),\n                      title: Text(\"查看详情\".tl),\n                      onTap: () {\n                        context.pop();\n                        onTap_();\n                      },\n                    ),\n                    if (favoriteItem != null)\n                      ListTile(\n                        leading: const Icon(Icons.bookmark_rounded),\n                        title: Text(\"本地收藏\".tl),\n                        onTap: () {\n                          setState(() {\n                            favorite = true;\n                          });\n                        },\n                      ),\n                    if (read != null)\n                      ListTile(\n                        leading: const Icon(Icons.chrome_reader_mode),\n                        title: Text(\"阅读\".tl),\n                        onTap: () {\n                          context.pop();\n                          read!();\n                        },\n                      ),\n                    ListTile(\n                      leading: const Icon(Icons.search),\n                      title: Text(\"搜索\".tl),\n                      onTap: () {\n                        context.pop();\n                        context.to(() => PreSearchPage(\n                              initialValue: title,\n                            ));\n                      },\n                    ),\n                    ListTile(\n                      leading: const Icon(Icons.block),\n                      title: Text(\"屏蔽\".tl),\n                      onTap: () {\n                        context.pop();\n                        showBlockPane();\n                      },\n                    ),\n                    if (addonMenuOptions != null)\n                      for (var option in addonMenuOptions!)\n                        ListTile(\n                          leading: Icon(option.icon),\n                          title: Text(option.title),\n                          onTap: () => option.onTap(comicID),\n                        ),\n                    const SizedBox(\n                      height: 16,\n                    ),\n                  ],\n                ),\n              ),\n            );\n          } else {\n            child = buildFavoriteDialog(context);\n          }\n          return AnimatedSwitcher(\n            duration: const Duration(milliseconds: 200),\n            child: child,\n          );\n        });\n      },\n    );\n  }\n\n  Widget buildFavoriteDialog(BuildContext context) {\n    String? folder = appdata.settings[51];\n    int? initialFolderIndex =\n        LocalFavoritesManager().folderNames.indexOf(appdata.settings[51]);\n    if (initialFolderIndex == -1) {\n      folder = null;\n      initialFolderIndex = null;\n    }\n    return SimpleDialog(\n      title: Text(\"添加收藏\".tl),\n      children: [\n        ListTile(\n          title: Text(\"收藏夹\".tl),\n          trailing: Select(\n            outline: true,\n            width: 156,\n            values: LocalFavoritesManager().folderNames,\n            initialValue: initialFolderIndex,\n            onChange: (i) => folder = LocalFavoritesManager().folderNames[i],\n          ),\n        ),\n        const SizedBox(\n          height: 16,\n        ),\n        Center(\n          child: FilledButton(\n            child: const Text(\"确认\"),\n            onPressed: () {\n              LocalFavoritesManager().addComic(folder!, favoriteItem!);\n              context.pop();\n            },\n          ),\n        ),\n        const SizedBox(\n          height: 16,\n        ),\n      ],\n    );\n  }\n\n  void onTap_();\n\n  void onSecondaryTap_(TapDownDetails details) {\n    showDesktopMenu(App.globalContext!,\n        Offset(details.globalPosition.dx, details.globalPosition.dy), [\n      DesktopMenuEntry(\n        text: \"查看\".tl,\n        onClick: () => Future.microtask(onTap_),\n      ),\n      if (read != null)\n        DesktopMenuEntry(\n          text: \"阅读\".tl,\n          onClick: () => Future.microtask(read!),\n        ),\n      DesktopMenuEntry(\n        text: \"搜索\".tl,\n        onClick: () => Future.microtask(\n          () {\n            App.mainNavigatorKey!.currentContext!.to(\n              () => PreSearchPage(\n                initialValue: title,\n              ),\n            );\n          },\n        ),\n      ),\n      DesktopMenuEntry(\n        text: \"本地收藏\".tl,\n        onClick: () => Future.microtask(() => showDialog(\n            context: App.globalContext!,\n            builder: (context) => buildFavoriteDialog(context))),\n      ),\n      DesktopMenuEntry(\n        text: \"屏蔽\".tl,\n        onClick: () => Future.microtask(showBlockPane),\n      ),\n      if (addonMenuOptions != null)\n        for (var option in addonMenuOptions!)\n          DesktopMenuEntry(\n            text: option.title,\n            onClick: () => option.onTap(comicID),\n          ),\n    ]);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var type = appdata.settings[44].split(',').first;\n    Widget child;\n    bool detailedMode;\n    if (type == \"0\" || type == \"3\") {\n      detailedMode = true;\n      child = _buildDetailedMode(context);\n    } else {\n      detailedMode = false;\n      child = _buildBriefMode(context);\n    }\n    if (comicID == null) {\n      return child;\n    }\n\n    var isFavorite = appdata.settings[72] == '1'\n        ? LocalFavoritesManager().isExist(comicID!)\n        : false;\n    var history = appdata.settings[73] == '1'\n        ? HistoryManager().findSync(comicID!)\n        : null;\n    if (history?.page == 0) {\n      history!.page = 1;\n    }\n\n    if (!isFavorite && history == null) {\n      return child;\n    }\n\n    return Stack(\n      children: [\n        Positioned.fill(\n          child: child,\n        ),\n        Positioned(\n          left: detailedMode ? 16 : 6,\n          top: 8,\n          child: Container(\n            height: 24,\n            decoration: BoxDecoration(\n              borderRadius: BorderRadius.circular(4),\n            ),\n            clipBehavior: Clip.antiAlias,\n            child: Row(\n              children: [\n                if (isFavorite)\n                  Container(\n                    height: 24,\n                    width: 24,\n                    color: Colors.green,\n                    child: const Icon(\n                      Icons.bookmark_rounded,\n                      size: 16,\n                      color: Colors.white,\n                    ),\n                  ),\n                if (history != null)\n                  Container(\n                    height: 24,\n                    color: Colors.blue.withOpacity(0.9),\n                    constraints: const BoxConstraints(minWidth: 24),\n                    padding: const EdgeInsets.symmetric(horizontal: 4),\n                    child: CustomPaint(\n                      painter:\n                          _ReadingHistoryPainter(history.page, history.maxPage),\n                    ),\n                  )\n              ],\n            ),\n          ),\n        )\n      ],\n    );\n  }\n\n  Widget _buildDetailedMode(BuildContext context) {\n    return LayoutBuilder(builder: (context, constrains) {\n      final height = constrains.maxHeight - 16;\n      return InkWell(\n          borderRadius: BorderRadius.circular(12),\n          onTap: onTap_,\n          onLongPress: enableLongPressed ? onLongTap_ : null,\n          onSecondaryTapDown: onSecondaryTap_,\n          child: Padding(\n            padding: const EdgeInsets.fromLTRB(16, 8, 24, 8),\n            child: Row(\n              children: [\n                Container(\n                    width: height * 0.68,\n                    height: double.infinity,\n                    decoration: BoxDecoration(\n                        color: Theme.of(context).colorScheme.secondaryContainer,\n                        borderRadius: BorderRadius.circular(8)),\n                    clipBehavior: Clip.antiAlias,\n                    child: image),\n                SizedBox.fromSize(\n                  size: const Size(16, 5),\n                ),\n                Expanded(\n                  child: _ComicDescription(\n                    //标题中不应出现换行符, 爬虫可能多爬取换行符, 为避免麻烦, 直接在此处删去\n                    title: pages == null\n                        ? title.replaceAll(\"\\n\", \"\")\n                        : \"[${pages}P]${title.replaceAll(\"\\n\", \"\")}\",\n                    user: subTitle,\n                    description: description,\n                    subDescription: buildSubDescription(context),\n                    badge: badge,\n                    tags: tags,\n                    maxLines: maxLines,\n                  ),\n                ),\n              ],\n            ),\n          ));\n    });\n  }\n\n  Widget _buildBriefMode(BuildContext context) {\n    return Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 8),\n      child: Material(\n        color: Colors.transparent,\n        borderRadius: BorderRadius.circular(8),\n        elevation: 1,\n        child: Stack(\n          children: [\n            Positioned.fill(\n                child: Container(\n                    decoration: BoxDecoration(\n                        color: Theme.of(context).colorScheme.secondaryContainer,\n                        borderRadius: BorderRadius.circular(8)),\n                    clipBehavior: Clip.antiAlias,\n                    child: image)),\n            Positioned(\n                bottom: 0,\n                left: 0,\n                right: 0,\n                child: Container(\n                  width: double.infinity,\n                  decoration: BoxDecoration(\n                      gradient: LinearGradient(\n                          begin: Alignment.topCenter,\n                          end: Alignment.bottomCenter,\n                          colors: [\n                            Colors.transparent,\n                            Colors.black.withOpacity(0.3),\n                            Colors.black.withOpacity(0.5),\n                          ]),\n                      borderRadius: const BorderRadius.only(\n                          bottomLeft: Radius.circular(8),\n                          bottomRight: Radius.circular(8))),\n                  child: Padding(\n                    padding: const EdgeInsets.fromLTRB(8, 4, 8, 4),\n                    child: Text(\n                      title.replaceAll(\"\\n\", \"\"),\n                      style: const TextStyle(\n                        fontWeight: FontWeight.w500,\n                        fontSize: 14.0,\n                        color: Colors.white,\n                      ),\n                      maxLines: 2,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                  ),\n                )),\n            Positioned.fill(\n              child: Material(\n                color: Colors.transparent,\n                child: InkWell(\n                  onTap: onTap_,\n                  onLongPress: enableLongPressed ? onLongTap_ : null,\n                  onSecondaryTapDown: onSecondaryTap_,\n                  borderRadius: BorderRadius.circular(8),\n                  child: const SizedBox.expand(),\n                ),\n              ),\n            )\n          ],\n        ),\n      ),\n    );\n  }\n}\n\nclass _ComicDescription extends StatelessWidget {\n  const _ComicDescription(\n      {required this.title,\n      required this.user,\n      required this.description,\n      this.subDescription,\n      this.badge,\n      this.maxLines = 2,\n      this.tags});\n\n  final String title;\n  final String user;\n  final String description;\n  final Widget? subDescription;\n  final String? badge;\n  final List<String>? tags;\n  final int maxLines;\n\n  @override\n  Widget build(BuildContext context) {\n    if (tags != null) {\n      tags!.removeWhere((element) => element.removeAllBlank == \"\");\n    }\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: <Widget>[\n        Text(\n          title,\n          style: const TextStyle(\n            fontWeight: FontWeight.w500,\n            fontSize: 14.0,\n          ),\n          maxLines: maxLines,\n          overflow: TextOverflow.ellipsis,\n        ),\n        if (user != \"\")\n          Text(\n            user,\n            style: const TextStyle(fontSize: 10.0),\n            maxLines: 1,\n          ),\n        const SizedBox(\n          height: 4,\n        ),\n        if (tags != null)\n          Expanded(\n            child: LayoutBuilder(\n              builder: (context, constraints) => Padding(\n                padding: EdgeInsets.only(bottom: constraints.maxHeight % 23),\n                child: Wrap(\n                  runAlignment: WrapAlignment.start,\n                  clipBehavior: Clip.antiAlias,\n                  crossAxisAlignment: WrapCrossAlignment.end,\n                  children: [\n                    for (var s in tags!)\n                      Padding(\n                        padding: const EdgeInsets.fromLTRB(0, 0, 4, 3),\n                        child: Container(\n                          padding: const EdgeInsets.fromLTRB(3, 1, 3, 3),\n                          decoration: BoxDecoration(\n                            color: s == \"Unavailable\"\n                                ? Theme.of(context).colorScheme.errorContainer\n                                : Theme.of(context)\n                                    .colorScheme\n                                    .secondaryContainer,\n                            borderRadius:\n                                const BorderRadius.all(Radius.circular(8)),\n                          ),\n                          child: Text(\n                            s,\n                            style: const TextStyle(fontSize: 12),\n                          ),\n                        ),\n                      )\n                  ],\n                ),\n              ),\n            ),\n          ),\n        const SizedBox(\n          height: 2,\n        ),\n        Row(\n          crossAxisAlignment: CrossAxisAlignment.end,\n          children: [\n            Expanded(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  if (subDescription != null) subDescription!,\n                  Text(\n                    description,\n                    style: const TextStyle(\n                      fontSize: 12.0,\n                    ),\n                  ),\n                ],\n              ),\n            ),\n            if (badge != null)\n              Container(\n                padding: const EdgeInsets.fromLTRB(6, 4, 6, 4),\n                decoration: BoxDecoration(\n                  color: Theme.of(context).colorScheme.tertiaryContainer,\n                  borderRadius: const BorderRadius.all(Radius.circular(8)),\n                ),\n                child: Text(\n                  badge!,\n                  style: const TextStyle(fontSize: 12),\n                ),\n              )\n          ],\n        )\n      ],\n    );\n  }\n}\n\nclass _ReadingHistoryPainter extends CustomPainter {\n  final int page;\n  final int? maxPage;\n\n  const _ReadingHistoryPainter(this.page, this.maxPage);\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    if (maxPage == null) {\n      // 在中央绘制page\n      final textPainter = TextPainter(\n        text: TextSpan(\n          text: \"$page\",\n          style: TextStyle(\n            fontSize: size.width * 0.8,\n            color: Colors.white,\n          ),\n        ),\n        textDirection: TextDirection.ltr,\n      );\n      textPainter.layout();\n      textPainter.paint(\n          canvas,\n          Offset((size.width - textPainter.width) / 2,\n              (size.height - textPainter.height) / 2));\n    } else if (page == maxPage) {\n      // 在中央绘制勾\n      final paint = Paint()\n        ..color = Colors.white\n        ..strokeWidth = 2\n        ..style = PaintingStyle.stroke;\n      canvas.drawLine(Offset(size.width * 0.2, size.height * 0.5),\n          Offset(size.width * 0.45, size.height * 0.75), paint);\n      canvas.drawLine(Offset(size.width * 0.45, size.height * 0.75),\n          Offset(size.width * 0.85, size.height * 0.3), paint);\n    } else {\n      // 在左上角绘制page, 在右下角绘制maxPage\n      final textPainter = TextPainter(\n        text: TextSpan(\n          text: \"$page\",\n          style: TextStyle(\n            fontSize: size.width * 0.8,\n            color: Colors.white,\n          ),\n        ),\n        textDirection: TextDirection.ltr,\n      );\n      textPainter.layout();\n      textPainter.paint(canvas, const Offset(0, 0));\n      final textPainter2 = TextPainter(\n        text: TextSpan(\n          text: \"/$maxPage\",\n          style: TextStyle(\n            fontSize: size.width * 0.5,\n            color: Colors.white,\n          ),\n        ),\n        textDirection: TextDirection.ltr,\n      );\n      textPainter2.layout();\n      textPainter2.paint(\n          canvas,\n          Offset(size.width - textPainter2.width,\n              size.height - textPainter2.height));\n    }\n  }\n\n  @override\n  bool shouldRepaint(covariant CustomPainter oldDelegate) {\n    return oldDelegate is! _ReadingHistoryPainter ||\n        oldDelegate.page != page ||\n        oldDelegate.maxPage != maxPage;\n  }\n}\n\nclass NormalComicTile extends ComicTile {\n  const NormalComicTile(\n      {required this.description_,\n      required this.coverPath,\n      required this.name,\n      required this.subTitle_,\n      required this.onTap,\n      this.onLongTap,\n      this.badgeName,\n      this.headers,\n      this.tags,\n      this.sourceKey,\n      super.key});\n\n  final String description_;\n  final String coverPath;\n  final void Function() onTap;\n  final String subTitle_;\n  final String name;\n  final void Function()? onLongTap;\n  final String? badgeName;\n  final Map<String, String>? headers;\n  final String? sourceKey;\n\n  @override\n  final List<String>? tags;\n\n  @override\n  String get description => description_;\n\n  @override\n  void onLongTap_() => onLongTap?.call();\n\n  @override\n  String? get badge => badgeName;\n\n  @override\n  Widget get image => AnimatedImage(\n        image: CachedImageProvider(\n          coverPath,\n          headers: headers,\n          sourceKey: sourceKey,\n        ),\n        fit: BoxFit.cover,\n        width: double.infinity,\n        height: double.infinity,\n      );\n\n  @override\n  void onTap_() => onTap();\n\n  @override\n  String get subTitle => subTitle_;\n\n  @override\n  String get title => name;\n}\n\nclass ComicTilePlaceholder extends StatelessWidget {\n  const ComicTilePlaceholder({super.key, this.type = 'full'});\n\n  final String type;\n\n  @override\n  Widget build(BuildContext context) {\n    var type = appdata.settings[44].split(',').first;\n    Widget child;\n    if (type == \"0\" || type == \"3\") {\n      child = _buildDetailedMode(context);\n    } else {\n      child = _buildBriefMode(context);\n    }\n    return child;\n  }\n\n  Widget _buildDetailedMode(BuildContext context) {\n    return LayoutBuilder(builder: (context, constrains) {\n      final height = constrains.maxHeight - 16;\n      return Container(\n        padding: const EdgeInsets.fromLTRB(16, 8, 24, 8),\n        child: Row(\n          children: [\n            Container(\n              width: height * 0.68,\n              height: double.infinity,\n              decoration: BoxDecoration(\n                borderRadius: BorderRadius.circular(12),\n                color: context.colorScheme.secondaryContainer.withAlpha(140),\n              ),\n            ),\n            SizedBox.fromSize(\n              size: const Size(16, 5),\n            ),\n            if (type != 'full')\n              const Spacer()\n            else\n              Expanded(\n                child: Column(\n                  children: [\n                    const SizedBox(\n                      height: 3,\n                    ),\n                    Container(\n                      decoration: BoxDecoration(\n                        borderRadius: BorderRadius.circular(16),\n                        color: context.colorScheme.tertiaryContainer\n                            .withAlpha(140),\n                      ),\n                      height: 26,\n                    ),\n                    const SizedBox(\n                      height: 4,\n                    ),\n                    Container(\n                      decoration: BoxDecoration(\n                        borderRadius: BorderRadius.circular(16),\n                        color: context.colorScheme.tertiaryContainer\n                            .withAlpha(140),\n                      ),\n                      height: 18,\n                    ),\n                    const Spacer(),\n                    Container(\n                      decoration: BoxDecoration(\n                        borderRadius: BorderRadius.circular(16),\n                        color: context.colorScheme.tertiaryContainer\n                            .withAlpha(140),\n                      ),\n                      height: 18,\n                    ),\n                  ],\n                ),\n              ),\n            const SizedBox(\n              width: 16,\n            ),\n          ],\n        ),\n      );\n    });\n  }\n\n  Widget _buildBriefMode(BuildContext context) {\n    return Container(\n      margin: const EdgeInsets.symmetric(horizontal: 6, vertical: 8),\n      decoration: BoxDecoration(\n        color: context.colorScheme.secondaryContainer.withAlpha(80),\n        borderRadius: BorderRadius.circular(8),\n      ),\n    );\n  }\n}\n\nclass CustomComicTile extends ComicTile {\n  const CustomComicTile(this.comic, {super.key, this.addonMenuOptions});\n\n  final CustomComic comic;\n\n  @override\n  String get description => comic.description;\n\n  @override\n  Widget get image => AnimatedImage(\n        image: StreamImageProvider(\n            () =>\n                ImageManager().getCustomThumbnail(comic.cover, comic.sourceKey),\n            comic.id),\n        fit: BoxFit.cover,\n        width: double.infinity,\n        height: double.infinity,\n      );\n\n  @override\n  void onTap_() {\n    App.mainNavigatorKey!.currentContext!.to(() => ComicPage(\n          sourceKey: comic.sourceKey,\n          id: comic.id,\n          cover: comic.cover,\n        ));\n  }\n\n  @override\n  String get subTitle => comic.subTitle;\n\n  @override\n  String get title => comic.title;\n\n  @override\n  FavoriteItem? get favoriteItem => FavoriteItem.custom(comic);\n\n  @override\n  List<String>? get tags => comic.tags;\n\n  @override\n  final List<ComicTileMenuOption>? addonMenuOptions;\n\n  @override\n  String? get comicID => comic.id;\n\n  @override\n  get read => () async {\n        bool cancel = false;\n        var dialog = showLoadingDialog(\n          App.globalContext!,\n          onCancel: () => cancel = true,\n        );\n        var comicSource = ComicSource.find(comic.sourceKey)!;\n        var res = await comicSource.loadComicInfo!(comic.id);\n        if (cancel) return;\n        dialog.close();\n        if (res.error) {\n          showToast(message: res.errorMessage ?? \"Error\");\n        } else {\n          var history = await History.findOrCreate(res.data);\n          App.globalTo(\n            () => ComicReadingPage(\n              CustomReadingData(\n                res.data.target,\n                res.data.title,\n                comicSource,\n                res.data.chapters,\n              ),\n              history.page,\n              history.ep,\n            ),\n          );\n        }\n      };\n}\n\nWidget buildComicTile(BuildContext context, BaseComic item, String sourceKey,\n    {List<ComicTileMenuOption>? addonMenuOptions}) {\n  var source = ComicSource.find(sourceKey);\n  if (source == null) {\n    throw \"Comic Source $sourceKey Not Found\";\n  }\n  if (!appdata.appSettings.fullyHideBlockedWorks || sourceKey == 'hitomi') {\n    var blockWord = isBlocked(item);\n    if (blockWord != null) {\n      return Stack(\n        children: [\n          const Positioned.fill(\n              child: ComicTilePlaceholder(\n            type: '',\n          )),\n          Positioned.fill(\n            child: Center(\n              child: Container(\n                padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),\n                decoration: BoxDecoration(\n                  color: context.colorScheme.primaryContainer,\n                  borderRadius: BorderRadius.circular(12),\n                ),\n                child: Text(\n                  \"${\"屏蔽\".tl}: $blockWord\",\n                ),\n              ),\n            ),\n          ),\n        ],\n      );\n    }\n  }\n  if (source.comicTileBuilderOverride != null) {\n    return source.comicTileBuilderOverride!(\n      context,\n      item,\n      addonMenuOptions,\n    );\n  } else {\n    return CustomComicTile(item as CustomComic,\n        addonMenuOptions: addonMenuOptions);\n  }\n}\n\n/// return the first blocked keyword, or null if not blocked\nString? isBlocked(BaseComic item) {\n  for (var word in appdata.blockingKeyword) {\n    if (item.title.contains(word)) {\n      return word;\n    }\n    if (item.subTitle.contains(word)) {\n      return word;\n    }\n    if (item.description.contains(word)) {\n      return word;\n    }\n    for (var tag in item.tags) {\n      if (tag == word) {\n        return word;\n      }\n      if (tag.contains(':')) {\n        tag = tag.split(':')[1];\n        if (tag == word) {\n          return word;\n        }\n      }\n      if (item.enableTagsTranslation && tag.translateTagsToCN == word) {\n        return word;\n      }\n    }\n  }\n  return null;\n}\n\nclass _BlockingPane extends StatefulWidget {\n  const _BlockingPane({required this.comic});\n\n  final ComicTile comic;\n\n  @override\n  State<_BlockingPane> createState() => _BlockingPaneState();\n}\n\nclass _BlockingPaneState extends State<_BlockingPane> {\n  var controller = TextEditingController();\n\n  @override\n  Widget build(BuildContext context) {\n    var content = Column(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        Appbar(\n          title: Text(\"屏蔽\".tl),\n          backgroundColor: Colors.transparent,\n        ),\n        SizedBox(\n          width: double.infinity,\n          child: Wrap(\n            spacing: 8,\n            runSpacing: 8,\n            children: buildTags().toList(),\n          ).paddingVertical(8),\n        ).paddingHorizontal(16),\n        SizedBox(\n          height: 42,\n          child: TextField(\n            controller: controller,\n            onChanged: (_) => setState(() {}),\n            decoration: InputDecoration(\n              hintText: \"屏蔽关键词\".tl,\n              contentPadding: const EdgeInsets.symmetric(horizontal: 4),\n            ),\n          ),\n        ).paddingHorizontal(16),\n        const SizedBox(height: 16),\n        Button.filled(onPressed: onSubmit, child: Text(\"提交\".tl)),\n        const SizedBox(height: 16),\n      ],\n    );\n\n    if (context.width > 400) {\n      return Dialog(\n        elevation: 0,\n        backgroundColor: context.colorScheme.surface,\n        child: ConstrainedBox(\n          constraints: const BoxConstraints(maxWidth: 600),\n          child: content,\n        ),\n      );\n    } else {\n      return Dialog.fullscreen(\n        backgroundColor: context.colorScheme.surface,\n        child: content,\n      );\n    }\n  }\n\n  Iterable<Widget> buildTags() sync* {\n    yield buildTag(widget.comic.title);\n    yield buildTag(widget.comic.subTitle);\n    for (var tag in widget.comic.tags ?? []) {\n      yield buildTag(tag);\n    }\n  }\n\n  bool _isExisted(String text) {\n    if (text.contains(':')) {\n      text = text.split(':')[1];\n    }\n    return controller.text.split(';').contains(text);\n  }\n\n  Widget buildTag(String text) {\n    var isExisted = _isExisted(text);\n    if (isExisted) {\n      return Container(\n        padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),\n        decoration: BoxDecoration(\n          borderRadius: BorderRadius.circular(16),\n          color: context.colorScheme.primaryContainer.withOpacity(0.4),\n        ),\n        child: Text(text),\n      );\n    }\n    return GestureDetector(\n      onTap: () => handleText(text),\n      child: HoverBox(\n        borderRadius: BorderRadius.circular(16),\n        child: Container(\n          key: Key(text),\n          padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),\n          decoration: BoxDecoration(\n            borderRadius: BorderRadius.circular(16),\n            color: context.colorScheme.primaryContainer,\n          ),\n          child: Text(text),\n        ),\n      ),\n    );\n  }\n\n  void handleText(String text) {\n    if (text.contains(':')) {\n      text = text.split(':')[1];\n    }\n    controller.text += \"$text;\";\n    setState(() {});\n  }\n\n  void onSubmit() {\n    for (var word in controller.text.split(';')) {\n      if (word.isNotEmpty && !appdata.blockingKeyword.contains(word)) {\n        appdata.blockingKeyword.add(word);\n      }\n    }\n    appdata.writeData();\n    for (var c in StateController.findAll<ComicsPageLogic>()) {\n      c.update();\n    }\n    for (var c in StateController.findAll<SliverGridComicsController>()) {\n      c.update();\n    }\n    context.pop();\n  }\n}\n"
  },
  {
    "path": "lib/components/comics_list.dart",
    "content": "part of 'components.dart';\n\nclass ComicsPageLogic<T> extends StateController {\n  bool loading = true;\n\n  ///用于正常模式下的漫画数据储存\n  List<T>? comics;\n\n  ///用于分页模式下的漫画数据储存\n  Map<int, List<T>>? dividedComics;\n\n  ///错误信息, null表示没有错误\n  String? message;\n\n  /// 最大页数, 为null表示不知道或者无穷\n  int? maxPage;\n\n  ///当前的页面序号\n  int current = 1;\n\n  ///是否正在获取数据， 用于在顺序浏览模式下， 避免同时进行多个网络请求\n  bool loadingData = false;\n\n  bool showFloatingButton = true;\n\n  void get(Future<Res<List<T>>> Function(int) getComics) async {\n    if (loadingData) return;\n    loadingData = true;\n    Future.microtask(() => update());\n    if (comics == null) {\n      var res = await getComics(1);\n      if (res.error) {\n        message = res.errorMessage;\n      } else {\n        comics = res.data;\n        dividedComics = {};\n        dividedComics![1] = res.data;\n        if (res.subData is int) {\n          maxPage = res.subData;\n        }\n        if (res.data.isEmpty) {\n          maxPage = 1;\n        }\n      }\n      loading = false;\n      loadingData = false;\n      update();\n    } else {\n      var res = await getComics(current);\n      if (res.error) {\n        message = res.errorMessage;\n      } else {\n        dividedComics![current] = res.data;\n      }\n      loading = false;\n      loadingData = false;\n      update();\n    }\n  }\n\n  int _emptyPageCount = 0;\n\n  void loadNextPage(Future<Res<List<T>>> Function(int) getComics) async {\n    if (maxPage != null && current >= maxPage!) return;\n    if (loadingData) return;\n    loadingData = true;\n    Future.microtask(() => update());\n    var res = await getComics(current + 1);\n    if (res.error) {\n      showToast(message: res.errorMessage!);\n    } else {\n      if (res.subData is int) {\n        maxPage = res.subData;\n      }\n      if (res.data.isEmpty) {\n        _emptyPageCount++;\n        if (_emptyPageCount > 3 && maxPage == null) {\n          // 某些漫画源不会返回总页数, 而app的网络代码会根据用户设置进行屏蔽操作\n          // 空页面既可能是因为没有更多页面, 也可能是因为被屏蔽了\n          // 如果连续3次加载空页面, 则认为已经加载完毕\n          maxPage = current;\n        }\n        // 等待一会儿再加载, 避免因为某些错误导致无限加载\n        await Future.delayed(const Duration(seconds: 1));\n      } else {\n        _emptyPageCount = 0;\n        comics!.addAll(res.data);\n      }\n    }\n    current++;\n    loadingData = false;\n    update();\n  }\n\n  @override\n  void refresh() {\n    loading = true;\n    comics = null;\n    message = null;\n    update();\n  }\n}\n\n/// 漫画列表页面\n///\n/// T为漫画信息模型\nabstract class ComicsPage<T extends BaseComic> extends StatelessWidget {\n  const ComicsPage({super.key});\n\n  ///标题\n  String? get title;\n\n  /// 是否居中标题\n  bool get centerTitle => true;\n\n  /// 获取图片, 参数为页面序号, **从1开始**\n  ///\n  /// 返回值Res的subData为页面总数\n  Future<Res<List<T>>> getComics(int i);\n\n  /// 漫画源标识符\n  String get sourceKey;\n\n  /// 显示一个刷新按钮, 需要Scaffold启用\n  bool get withRefreshFloatingButton => false;\n\n  String? get tag;\n\n  Widget? get tailing => null;\n\n  Widget? get header => null;\n\n  bool get showPageIndicator => true;\n\n  List<ComicTileMenuOption>? get addonMenuOptions => null;\n\n  /// 刷新页面\n  void refresh() {\n    StateController.find<ComicsPageLogic<T>>(tag: tag).refresh();\n  }\n\n  @override\n  Widget build(context) {\n    Widget? removeSliver(Widget? widget) {\n      if (widget == null) return null;\n\n      if (widget is SliverToBoxAdapter) {\n        return widget.child;\n      }\n\n      if (widget is SliverPersistentHeader) {\n        return SizedBox(\n          height: widget.delegate.minExtent,\n          child: widget.delegate.build(\n            context,\n            widget.delegate.minExtent,\n            false,\n          ),\n        );\n      }\n\n      return widget;\n    }\n\n    Widget body = StateBuilder<ComicsPageLogic<T>>(\n        init: ComicsPageLogic<T>(),\n        tag: tag,\n        builder: (logic) {\n          if (logic.dividedComics?[logic.current] == null &&\n              logic.message == null &&\n              appdata.settings[25] != \"0\") {\n            logic.loading = true;\n          }\n          if (logic.loading) {\n            logic.get(getComics);\n            return Column(\n              children: [\n                if (title != null) const Appbar(title: Text(\"\")),\n                removeSliver(header) ?? const SizedBox(),\n                const Expanded(\n                  child: Center(\n                    child: CircularProgressIndicator(),\n                  ),\n                )\n              ],\n            );\n          } else if (logic.message != null) {\n            return Column(\n              children: [\n                removeSliver(header) ?? const SizedBox(),\n                Expanded(\n                    child: NetworkError(\n                  message: logic.message ?? \"Network Error\",\n                  retry: logic.refresh,\n                  withAppbar: title != null,\n                ))\n              ],\n            );\n          } else {\n            if (appdata.settings[25] == \"0\") {\n              List<T> comics = [];\n              if (appdata.appSettings.fullyHideBlockedWorks) {\n                for (var comic in logic.comics!) {\n                  if (isBlocked(comic) == null) {\n                    comics.add(comic);\n                  }\n                }\n              } else {\n                comics = logic.comics!;\n              }\n              return SmoothCustomScrollView(\n                slivers: [\n                  if (title != null)\n                    SliverAppbar(\n                      title: Text(title!),\n                      actions: tailing != null ? [tailing!] : null,\n                    ),\n                  if (header != null) header!,\n                  SliverGrid(\n                    delegate: SliverChildBuilderDelegate(\n                        childCount: comics.length, (context, i) {\n                      if (i == comics.length - 1) {\n                        logic.loadNextPage(getComics);\n                      }\n                      return buildItem(context, comics[i]);\n                    }),\n                    gridDelegate: SliverGridDelegateWithComics(),\n                  ),\n                  if (logic.current < (logic.maxPage ?? 114514) &&\n                      logic.loadingData)\n                    const SliverToBoxAdapter(\n                      child: ListLoadingIndicator(),\n                    )\n                  else\n                    const SliverToBoxAdapter(\n                      child: SizedBox(\n                        height: 80,\n                      ),\n                    )\n                ],\n              );\n            } else {\n              List<T> comics = [];\n              if (appdata.appSettings.fullyHideBlockedWorks) {\n                for (var comic in logic.dividedComics![logic.current]!) {\n                  if (isBlocked(comic) == null) {\n                    comics.add(comic);\n                  }\n                }\n              } else {\n                comics = logic.dividedComics![logic.current]!;\n              }\n              Widget body = SmoothCustomScrollView(\n                slivers: [\n                  if (title != null)\n                    SliverAppbar(\n                      title: Text(title!),\n                      actions: tailing != null ? [tailing!] : null,\n                    ),\n                  if (header != null) header!,\n                  if (showPageIndicator &&\n                      appdata.settings[64] == \"0\" &&\n                      logic.maxPage != 1)\n                    buildPageSelector(context, logic),\n                  SliverGrid(\n                    delegate: SliverChildBuilderDelegate(\n                        childCount: comics.length, (context, i) {\n                      return buildItem(context, comics[i]);\n                    }),\n                    gridDelegate: SliverGridDelegateWithComics(),\n                  ),\n                  if (showPageIndicator &&\n                      appdata.settings[64] == \"0\" &&\n                      logic.maxPage != 1)\n                    buildPageSelector(context, logic),\n                  SliverPadding(\n                      padding: EdgeInsets.only(\n                          bottom: MediaQuery.of(context).padding.bottom))\n                ],\n              );\n\n              body = NotificationListener<ScrollUpdateNotification>(\n                onNotification: (notifications) {\n                  if (notifications.scrollDelta != null) {\n                    if (notifications.scrollDelta! > 0 &&\n                        logic.showFloatingButton) {\n                      logic.showFloatingButton = false;\n                      logic.update();\n                    } else if ((notifications.scrollDelta! < 0 ||\n                            notifications.metrics.pixels ==\n                                notifications.metrics.minScrollExtent ||\n                            notifications.metrics.pixels ==\n                                notifications.metrics.maxScrollExtent) &&\n                        !logic.showFloatingButton) {\n                      logic.showFloatingButton = true;\n                      logic.update();\n                    }\n                  }\n                  return false;\n                },\n                child: body,\n              );\n\n              if (showPageIndicator && appdata.settings[64] == \"1\") {\n                return Stack(\n                  children: [\n                    Positioned.fill(\n                      child: body,\n                    ),\n                    Positioned(\n                      left: 0,\n                      right: 12,\n                      top: 0,\n                      bottom: 0,\n                      child: buildPageSelectorRight(context, logic),\n                    )\n                  ],\n                );\n              } else {\n                return body;\n              }\n            }\n          }\n        });\n\n    if (header != null && UiMode.m1(context)) {\n      body = SafeArea(\n        bottom: false,\n        child: body,\n      );\n    }\n\n    if (withRefreshFloatingButton) {\n      return Scaffold(\n        floatingActionButton: FloatingActionButton(\n          child: const Icon(Icons.refresh),\n          onPressed: () {\n            refresh();\n          },\n        ),\n        body: body,\n      );\n    } else {\n      return Material(\n        child: body,\n      );\n    }\n  }\n\n  Widget buildPageSelector(BuildContext context, ComicsPageLogic logic) {\n    return SliverToBoxAdapter(\n      child: Material(\n        color: Colors.transparent,\n        child: Padding(\n          padding: const EdgeInsets.only(bottom: 8, top: 8),\n          child: SizedBox(\n            width: 300,\n            height: 42,\n            child: Row(\n              children: [\n                const SizedBox(\n                  width: 16,\n                ),\n                FilledButton.tonal(\n                    onPressed: () => prevPage(logic), child: Text(\"上一页\".tl)),\n                const Spacer(),\n                ActionChip(\n                  label: Text(\n                      \"${\"页面\".tl}: ${logic.current}/${logic.maxPage?.toString() ?? \"?\"}\"),\n                  onPressed: () async {\n                    selectPage(logic);\n                  },\n                  elevation: 1,\n                  side: BorderSide.none,\n                ),\n                const Spacer(),\n                FilledButton.tonal(\n                    onPressed: () => nextPage(logic), child: Text(\"下一页\".tl)),\n                const SizedBox(\n                  width: 16,\n                ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildPageSelectorRight(BuildContext context, ComicsPageLogic logic) {\n    return Align(\n        alignment: Alignment.centerRight,\n        child: AnimatedSlide(\n          offset: logic.showFloatingButton\n              ? const Offset(0, 0)\n              : const Offset(1.5, 0),\n          duration: const Duration(milliseconds: 200),\n          child: Material(\n            color: Theme.of(context).colorScheme.secondaryContainer,\n            borderRadius: BorderRadius.circular(16),\n            elevation: 3,\n            child: SizedBox(\n              height: 156,\n              width: 58,\n              child: Column(\n                children: [\n                  Expanded(\n                    child: InkWell(\n                      borderRadius: const BorderRadius.only(\n                          topLeft: Radius.circular(16),\n                          topRight: Radius.circular(16)),\n                      onTap: () {\n                        prevPage(logic);\n                      },\n                      child: const SizedBox.expand(\n                        child: Center(\n                          child: Icon(Icons.keyboard_arrow_left),\n                        ),\n                      ),\n                    ),\n                  ),\n                  const Divider(\n                    height: 1,\n                  ),\n                  Expanded(\n                      child: InkWell(\n                    onTap: () {\n                      selectPage(logic);\n                    },\n                    child: SizedBox.expand(\n                      child: Center(\n                        child: Text(\n                            \"${logic.current}/${logic.maxPage?.toString() ?? \"?\"}\"),\n                      ),\n                    ),\n                  )),\n                  const Divider(\n                    height: 1,\n                  ),\n                  Expanded(\n                    child: InkWell(\n                      borderRadius: const BorderRadius.only(\n                          bottomLeft: Radius.circular(16),\n                          bottomRight: Radius.circular(16)),\n                      onTap: () {\n                        nextPage(logic);\n                      },\n                      child: const SizedBox.expand(\n                        child: Center(\n                          child: Icon(Icons.keyboard_arrow_right),\n                        ),\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ));\n  }\n\n  void nextPage(ComicsPageLogic logic) {\n    if (logic.current == logic.maxPage || logic.current == 0) {\n      showToast(message: \"已经是最后一页了\".tl);\n    } else {\n      logic.current++;\n      logic.update();\n    }\n  }\n\n  void prevPage(ComicsPageLogic logic) {\n    if (logic.current == 1 || logic.current == 0) {\n      showToast(message: \"已经是第一页了\".tl);\n    } else {\n      logic.current--;\n      logic.update();\n    }\n  }\n\n  void selectPage(ComicsPageLogic logic) async {\n    String res = \"\";\n    await showDialog(\n        context: App.globalContext!,\n        builder: (dialogContext) {\n          var controller = TextEditingController();\n          return SimpleDialog(\n            title: const Text(\"切换页面\"),\n            children: [\n              const SizedBox(\n                width: 300,\n              ),\n              Padding(\n                padding: const EdgeInsets.fromLTRB(16, 10, 16, 20),\n                child: TextField(\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    labelText: \"页码\".tl,\n                    suffixText:\n                        \"${\"输入范围: \".tl}1-${logic.maxPage?.toString() ?? \"?\"}\",\n                  ),\n                  controller: controller,\n                  onSubmitted: (s) {\n                    res = s;\n                    App.globalBack();\n                  },\n                ),\n              ),\n              Center(\n                child: FilledButton(\n                  child: Text(\"提交\".tl),\n                  onPressed: () {\n                    res = controller.text;\n                    App.globalBack();\n                  },\n                ),\n              )\n            ],\n          );\n        });\n    if (res.isNum) {\n      int i = int.parse(res);\n      if (logic.maxPage == null || (i > 0 && i <= logic.maxPage!)) {\n        logic.current = i;\n        logic.update();\n        return;\n      }\n    }\n    if (res != \"\") {\n      showToast(message: \"输入的数字不正确\".tl);\n    }\n  }\n\n  Widget buildItem(BuildContext context, T item) {\n    return buildComicTile(context, item, sourceKey, addonMenuOptions: addonMenuOptions);\n  }\n}\n\nclass SliverGridComicsController extends StateController {}\n\nclass SliverGridComics extends StatelessWidget {\n  const SliverGridComics({\n    super.key,\n    required this.comics,\n    required this.sourceKey,\n    this.onLastItemBuild,\n  });\n\n  final List<BaseComic> comics;\n\n  final String sourceKey;\n\n  final void Function()? onLastItemBuild;\n\n  @override\n  Widget build(BuildContext context) {\n    return StateBuilder<SliverGridComicsController>(\n      init: SliverGridComicsController(),\n      builder: (controller) {\n        List<BaseComic> comics = [];\n        if (appdata.appSettings.fullyHideBlockedWorks) {\n          for (var comic in this.comics) {\n            if (isBlocked(comic) == null) {\n              comics.add(comic);\n            }\n          }\n        } else {\n          comics = this.comics;\n        }\n        return _SliverGridComics(\n          comics: comics,\n          sourceKey: sourceKey,\n          onLastItemBuild: onLastItemBuild,\n        );\n      },\n    );\n  }\n}\n\nclass _SliverGridComics extends StatelessWidget {\n  const _SliverGridComics({\n    required this.comics,\n    required this.sourceKey,\n    this.onLastItemBuild,\n  });\n\n  final List<BaseComic> comics;\n\n  final String sourceKey;\n\n  final void Function()? onLastItemBuild;\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverGrid(\n      delegate: SliverChildBuilderDelegate(\n            (context, index) {\n          if (index == comics.length - 1) {\n            onLastItemBuild?.call();\n          }\n          return buildComicTile(context, comics[index], sourceKey);\n        },\n        childCount: comics.length,\n      ),\n      gridDelegate: SliverGridDelegateWithComics(),\n    );\n  }\n}"
  },
  {
    "path": "lib/components/comment.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport 'components.dart';\n\nclass CommentTile extends StatelessWidget {\n  const CommentTile(\n      {Key? key,\n      required this.avatarUrl,\n      this.frameUrl,\n      required this.name,\n      required this.content,\n      this.onTap,\n      this.slogan,\n      this.level,\n      this.time,\n      this.tailing,\n      this.likes,\n      this.liked,\n      this.comments,\n      this.leading,\n      this.like})\n      : super(key: key);\n  final String? avatarUrl;\n  final String? frameUrl;\n  final String name;\n  final String content;\n  final String? slogan;\n  final String? time;\n  final int? likes;\n  final bool? liked;\n  final int? comments;\n  final int? level;\n  final void Function()? onTap;\n  final Widget? tailing;\n  final void Function()? like;\n  final Widget? leading;\n\n  @override\n  Widget build(BuildContext context) {\n    return InkWell(\n      borderRadius: const BorderRadius.all(Radius.circular(16)),\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(8, 12, 8, 12),\n        child: SizedBox(\n          width: double.infinity,\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              if(avatarUrl != null)\n                Avatar(\n                  size: 58,\n                  avatarUrl: avatarUrl,\n                  frame: frameUrl,\n                  slogan: slogan,\n                  name: name,\n                  couldBeShown: level != null,\n                  level: level ?? 0,\n                ),\n              if(leading != null)\n                leading!,\n              const SizedBox(\n                width: 8,\n              ),\n              Expanded(\n                child: Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(\n                      name,\n                      style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w600),\n                    ),\n                    const SizedBox(\n                      height: 12,\n                    ),\n                    SelectableText(content, style: const TextStyle(fontSize: 15),),\n                    const SizedBox(\n                      height: 4,\n                    ),\n                    Row(\n                      children: [\n                        if (time != null)\n                          Text(\n                            time!,\n                            style: const TextStyle(fontSize: 12),\n                          ),\n                        const Spacer(),\n                        if(like != null)\n                          InkWell(\n                            borderRadius: const BorderRadius.all(Radius.circular(8)),\n                            onTap: like,\n                            child: Padding(\n                              padding: const EdgeInsets.fromLTRB(3, 5, 3, 5),\n                              child: SizedBox(\n                                width: 50,\n                                child: Row(\n                                  crossAxisAlignment: CrossAxisAlignment.center,\n                                  mainAxisAlignment: MainAxisAlignment.center,\n                                  children: [\n                                    liked!?Icon(\n                                      Icons.favorite,\n                                      size: 15,\n                                      color: Theme.of(context).colorScheme.primary,\n                                    ):const Icon(\n                                      Icons.favorite_outline,\n                                      size: 15,\n                                    ),\n                                    const SizedBox(width: 5,),\n                                    Text(likes.toString())\n                                  ],\n                                ),\n                              ),\n                            ),\n                          ),\n                        if(like != null)\n                          const SizedBox(width: 16,),\n                        if(comments != null)\n                          InkWell(\n                            borderRadius: const BorderRadius.all(Radius.circular(8)),\n                            onTap: onTap,\n                            child: Padding(\n                              padding: const EdgeInsets.fromLTRB(3, 6, 3, 5),\n                              child: SizedBox(\n                                width: 50,\n                                child: Row(\n                                  mainAxisAlignment: MainAxisAlignment.center,\n                                  crossAxisAlignment: CrossAxisAlignment.center,\n                                  children: [\n                                    const Icon(\n                                      Icons.mode_comment_outlined,\n                                      size: 15,\n                                    ),\n                                    const SizedBox(width: 5,),\n                                    Text(comments.toString())\n                                  ],\n                                ),\n                              ),\n                            ),\n                          )\n                      ],\n                    )\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/components.dart",
    "content": "library components;\n\nimport 'dart:async';\nimport 'dart:collection';\nimport 'dart:math' as math;\nimport 'dart:ui';\n\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/app_page_route.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/foundation/image_loader/stream_image_provider.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/network/base_comic.dart';\nimport 'package:pica_comic/network/cloudflare.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/pre_search_page.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/pages/show_image_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nimport '../base.dart';\nimport '../foundation/ui_mode.dart';\n\npart 'animated_image.dart';\npart 'appbar.dart';\npart 'avatar.dart';\npart 'button.dart';\npart 'comic_tile.dart';\npart 'comics_list.dart';\npart 'consts.dart';\npart 'flyout.dart';\npart 'layout.dart';\npart 'loading.dart';\npart 'menu.dart';\npart 'message.dart';\npart 'navigation_bar.dart';\npart 'pop_up_widget.dart';\npart 'scroll.dart';\npart 'select.dart';\npart 'side_bar.dart';"
  },
  {
    "path": "lib/components/consts.dart",
    "content": "part of 'components.dart';\n\nconst _fastAnimationDuration = Duration(milliseconds: 160);"
  },
  {
    "path": "lib/components/custom_slider.dart",
    "content": "import 'package:flutter/material.dart';\n\n/// copied from flutter source\nclass _SliderDefaultsM3 extends SliderThemeData {\n  _SliderDefaultsM3(this.context)\n      : super(trackHeight: 4.0);\n\n  final BuildContext context;\n  late final ColorScheme _colors = Theme.of(context).colorScheme;\n\n  @override\n  Color? get activeTrackColor => _colors.primary;\n\n  @override\n  Color? get inactiveTrackColor => _colors.surfaceContainerHighest;\n\n  @override\n  Color? get secondaryActiveTrackColor => _colors.primary.withOpacity(0.54);\n\n  @override\n  Color? get disabledActiveTrackColor => _colors.onSurface.withOpacity(0.38);\n\n  @override\n  Color? get disabledInactiveTrackColor => _colors.onSurface.withOpacity(0.12);\n\n  @override\n  Color? get disabledSecondaryActiveTrackColor => _colors.onSurface.withOpacity(0.12);\n\n  @override\n  Color? get activeTickMarkColor => _colors.onPrimary.withOpacity(0.38);\n\n  @override\n  Color? get inactiveTickMarkColor => _colors.onSurfaceVariant.withOpacity(0.38);\n\n  @override\n  Color? get disabledActiveTickMarkColor => _colors.onSurface.withOpacity(0.38);\n\n  @override\n  Color? get disabledInactiveTickMarkColor => _colors.onSurface.withOpacity(0.38);\n\n  @override\n  Color? get thumbColor => _colors.primary;\n\n  @override\n  Color? get disabledThumbColor => Color.alphaBlend(_colors.onSurface.withOpacity(0.38), _colors.surface);\n\n  @override\n  Color? get overlayColor => WidgetStateColor.resolveWith((Set<WidgetState> states) {\n    if (states.contains(WidgetState.hovered)) {\n      return _colors.primary.withOpacity(0.08);\n    }\n    if (states.contains(WidgetState.focused)) {\n      return _colors.primary.withOpacity(0.12);\n    }\n    if (states.contains(WidgetState.dragged)) {\n      return _colors.primary.withOpacity(0.12);\n    }\n\n    return Colors.transparent;\n  });\n\n  @override\n  TextStyle? get valueIndicatorTextStyle => Theme.of(context).textTheme.labelMedium!.copyWith(\n    color: _colors.onPrimary,\n  );\n\n  @override\n  SliderComponentShape? get valueIndicatorShape => const DropSliderValueIndicatorShape();\n}\n\nclass CustomSlider extends StatefulWidget {\n  const CustomSlider({required this.min, required this.max, required this.value, required this.divisions, required this.onChanged, this.reversed = false, super.key});\n\n  final double min;\n\n  final double max;\n\n  final double value;\n\n  final int divisions;\n\n  final void Function(double) onChanged;\n\n  final bool reversed;\n\n  @override\n  State<CustomSlider> createState() => _CustomSliderState();\n}\n\nclass _CustomSliderState extends State<CustomSlider> {\n  late double value;\n\n  @override\n  void initState() {\n    super.initState();\n    value = widget.value;\n  }\n\n  @override\n  void didUpdateWidget(CustomSlider oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.value != oldWidget.value) {\n      setState(() {\n        value = widget.value;\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = Theme.of(context).colorScheme;\n    final theme = _SliderDefaultsM3(context);\n    return Padding(\n      padding: const EdgeInsets.fromLTRB(24, 12, 24, 12),\n      child: LayoutBuilder(\n        builder: (context, constrains) => MouseRegion(\n          cursor: SystemMouseCursors.click,\n          child: GestureDetector(\n            behavior: HitTestBehavior.translucent,\n            onTapDown: (details){\n              var dx = details.localPosition.dx;\n              if(widget.reversed){\n                dx = constrains.maxWidth - dx;\n              }\n              var gap = constrains.maxWidth / widget.divisions;\n              var gapValue = (widget.max - widget.min)  / widget.divisions;\n              widget.onChanged.call((dx / gap).round() * gapValue + widget.min);\n            },\n            onVerticalDragUpdate: (details){\n              var dx = details.localPosition.dx;\n              if(dx > constrains.maxWidth || dx < 0)  return;\n              if(widget.reversed){\n                dx = constrains.maxWidth - dx;\n              }\n              var gap = constrains.maxWidth / widget.divisions;\n              var gapValue = (widget.max - widget.min)  / widget.divisions;\n              widget.onChanged.call((dx / gap).round() * gapValue + widget.min);\n            },\n            child: SizedBox(\n              height: 24,\n              child: Center(\n                child: SizedBox(\n                  height: 24,\n                  child: Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      Positioned.fill(\n                        child: Center(\n                          child: Container(\n                            width: double.infinity,\n                            height: 6,\n                            decoration: BoxDecoration(\n                                color: theme.inactiveTrackColor,\n                                borderRadius: const BorderRadius.all(Radius.circular(10))\n                            ),\n                          ),\n                        ),\n                      ),\n                      if(constrains.maxWidth / widget.divisions > 10)\n                        Positioned.fill(\n                          child: Row(\n                            children: (){\n                              var res = <Widget>[];\n                              for(int i = 0; i<widget.divisions-1; i++){\n                                res.add(const Spacer());\n                                res.add(Container(\n                                  width: 4,\n                                  height: 4,\n                                  decoration: BoxDecoration(\n                                    color: colorScheme.surface.withRed(10),\n                                    shape: BoxShape.circle,\n                                  ),\n                                ));\n                              }\n                              res.add(const Spacer());\n                              return res;\n                            }.call(),\n                          ),\n                        ),\n                      Positioned(\n                        top: 0,\n                        bottom: 0,\n                        left: widget.reversed ? null : 0,\n                        right: widget.reversed ? 0 : null,\n                        child: Center(\n                          child: Container(\n                            width: constrains.maxWidth * ((value - widget.min) / (widget.max - widget.min)),\n                            height: 8,\n                            decoration: BoxDecoration(\n                                color: theme.activeTrackColor,\n                                borderRadius: const BorderRadius.all(Radius.circular(10))\n                            ),\n                          ),\n                        )\n                      ),\n                      Positioned(\n                        top: 0,\n                        bottom: 0,\n                        left: widget.reversed ? null : constrains.maxWidth * ((value - widget.min) / (widget.max - widget.min))-11,\n                        right: !widget.reversed ? null : constrains.maxWidth * ((value - widget.min) / (widget.max - widget.min))-11,\n                        child: Center(\n                          child: Container(\n                            width: 22,\n                            height: 22,\n                            decoration: BoxDecoration(\n                              color: theme.activeTrackColor,\n                              shape: BoxShape.circle,\n                            ),\n                          ),\n                        ),\n                      )\n                    ],\n                  ),\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/flyout.dart",
    "content": "part of \"components.dart\";\n\nconst minFlyoutWidth = 256.0;\nconst minFlyoutHeight = 128.0;\n\nclass FlyoutController {\n  Function? _show;\n\n  void show() {\n    if (_show == null) {\n      throw \"FlyoutController is not attached to a Flyout\";\n    }\n    _show!();\n  }\n}\n\nclass Flyout extends StatefulWidget {\n  const Flyout(\n      {super.key,\n      required this.flyoutBuilder,\n      required this.child,\n      this.enableTap = false,\n      this.enableDoubleTap = false,\n      this.enableLongPress = false,\n      this.enableSecondaryTap = false,\n      this.withInkWell = false,\n      this.borderRadius = 0,\n      this.controller,\n      this.navigator});\n\n  final WidgetBuilder flyoutBuilder;\n\n  final Widget child;\n\n  final bool enableTap;\n\n  final bool enableDoubleTap;\n\n  final bool enableLongPress;\n\n  final bool enableSecondaryTap;\n\n  final bool withInkWell;\n\n  final double borderRadius;\n\n  final NavigatorState? navigator;\n\n  final FlyoutController? controller;\n\n  @override\n  State<Flyout> createState() => _FlyoutState();\n}\n\nclass _FlyoutState extends State<Flyout> {\n  @override\n  void initState() {\n    if (widget.controller != null) {\n      widget.controller?._show = show;\n    }\n    super.initState();\n  }\n\n  @override\n  void didChangeDependencies() {\n    if (widget.controller != null) {\n      widget.controller?._show = show;\n    }\n    super.didChangeDependencies();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (widget.withInkWell) {\n      return InkWell(\n        borderRadius: BorderRadius.circular(widget.borderRadius),\n        onTap: widget.enableTap ? show : null,\n        onDoubleTap: widget.enableDoubleTap ? show : null,\n        onLongPress: widget.enableLongPress ? show : null,\n        onSecondaryTap: widget.enableSecondaryTap ? show : null,\n        child: widget.child,\n      );\n    }\n    return GestureDetector(\n      onTap: widget.enableTap ? show : null,\n      onDoubleTap: widget.enableDoubleTap ? show : null,\n      onLongPress: widget.enableLongPress ? show : null,\n      onSecondaryTap: widget.enableSecondaryTap ? show : null,\n      child: widget.child,\n    );\n  }\n\n  void show() {\n    var renderBox = context.findRenderObject() as RenderBox;\n    var rect = renderBox.localToGlobal(Offset.zero) & renderBox.size;\n    var navigator = widget.navigator ?? Navigator.of(context);\n    navigator.push(PageRouteBuilder(\n        fullscreenDialog: true,\n        barrierDismissible: true,\n        opaque: false,\n        transitionDuration: _fastAnimationDuration,\n        reverseTransitionDuration: _fastAnimationDuration,\n        pageBuilder: (context, animation, secondaryAnimation) {\n          var left = rect.left;\n          var top = rect.bottom;\n\n          if (left + minFlyoutWidth > MediaQuery.of(context).size.width) {\n            left = MediaQuery.of(context).size.width - minFlyoutWidth;\n          }\n          if (top + minFlyoutHeight > MediaQuery.of(context).size.height) {\n            top = MediaQuery.of(context).size.height - minFlyoutHeight;\n          }\n\n          Widget transition(BuildContext context, Animation<double> animation,\n              Animation<double> secondaryAnimation, Widget flyout) {\n            return SlideTransition(\n              position: Tween<Offset>(\n                begin: const Offset(0, -0.05),\n                end: const Offset(0, 0),\n              ).animate(animation),\n              child: flyout,\n            );\n          }\n\n          return Stack(\n            children: [\n              Positioned.fill(\n                child: GestureDetector(\n                  behavior: HitTestBehavior.opaque,\n                  onTap: navigator.pop,\n                  child: AnimatedBuilder(\n                    animation: animation,\n                    builder: (context, builder) {\n                      return ColoredBox(\n                        color: Colors.black.withOpacity(0.3 * animation.value),\n                      );\n                    },\n                  ),\n                ),\n              ),\n              Positioned(\n                left: left,\n                right: 0,\n                top: top,\n                bottom: 0,\n                child: transition(\n                    context,\n                    animation,\n                    secondaryAnimation,\n                    Align(\n                      alignment: Alignment.topLeft,\n                      child: widget.flyoutBuilder(context),\n                    )),\n              )\n            ],\n          );\n        }));\n  }\n}\n\nclass FlyoutContent extends StatelessWidget {\n  const FlyoutContent(\n      {super.key, required this.title, required this.actions, this.content});\n\n  final String title;\n\n  final String? content;\n\n  final List<Widget> actions;\n\n  @override\n  Widget build(BuildContext context) {\n    return IntrinsicWidth(\n      child: Material(\n        borderRadius: BorderRadius.circular(16),\n        type: MaterialType.card,\n        elevation: 1,\n        surfaceTintColor: Theme.of(context).colorScheme.surfaceTint,\n        child: Container(\n          constraints: const BoxConstraints(\n            minWidth: minFlyoutWidth,\n          ),\n          padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              Text(title,\n                  style: const TextStyle(\n                      fontWeight: FontWeight.bold, fontSize: 16)),\n              if (content != null)\n                Padding(\n                  padding: const EdgeInsets.all(8),\n                  child: Text(content!, style: const TextStyle(fontSize: 12)),\n                ),\n              const SizedBox(\n                height: 12,\n              ),\n              Row(\n                mainAxisSize: MainAxisSize.min,\n                mainAxisAlignment: MainAxisAlignment.end,\n                children: [const Spacer(), ...actions],\n              ),\n            ],\n          ),\n        ),\n      ).paddingAll(4),\n    );\n  }\n}\n\nclass FlyoutTextButton extends StatefulWidget {\n  const FlyoutTextButton(\n      {super.key,\n      required this.child,\n      required this.flyoutBuilder,\n      this.navigator});\n\n  final Widget child;\n\n  final WidgetBuilder flyoutBuilder;\n\n  final NavigatorState? navigator;\n\n  @override\n  State<FlyoutTextButton> createState() => _FlyoutTextButtonState();\n}\n\nclass _FlyoutTextButtonState extends State<FlyoutTextButton> {\n  final FlyoutController _controller = FlyoutController();\n\n  @override\n  Widget build(BuildContext context) {\n    return Flyout(\n        controller: _controller,\n        flyoutBuilder: widget.flyoutBuilder,\n        navigator: widget.navigator,\n        child: TextButton(\n          onPressed: () {\n            _controller.show();\n          },\n          child: widget.child,\n        ));\n  }\n}\n\nclass FlyoutIconButton extends StatefulWidget {\n  const FlyoutIconButton(\n      {super.key,\n      required this.icon,\n      required this.flyoutBuilder,\n      this.navigator});\n\n  final Widget icon;\n\n  final WidgetBuilder flyoutBuilder;\n\n  final NavigatorState? navigator;\n\n  @override\n  State<FlyoutIconButton> createState() => _FlyoutIconButtonState();\n}\n\nclass _FlyoutIconButtonState extends State<FlyoutIconButton> {\n  final FlyoutController _controller = FlyoutController();\n\n  @override\n  Widget build(BuildContext context) {\n    return Flyout(\n        controller: _controller,\n        flyoutBuilder: widget.flyoutBuilder,\n        navigator: widget.navigator,\n        child: IconButton(\n          onPressed: () {\n            _controller.show();\n          },\n          icon: widget.icon,\n        ));\n  }\n}\n\nclass FlyoutFilledButton extends StatefulWidget {\n  const FlyoutFilledButton(\n      {super.key,\n      required this.child,\n      required this.flyoutBuilder,\n      this.navigator});\n\n  final Widget child;\n\n  final WidgetBuilder flyoutBuilder;\n\n  final NavigatorState? navigator;\n\n  @override\n  State<FlyoutFilledButton> createState() => _FlyoutFilledButtonState();\n}\n\nclass _FlyoutFilledButtonState extends State<FlyoutFilledButton> {\n  final FlyoutController _controller = FlyoutController();\n\n  @override\n  Widget build(BuildContext context) {\n    return Flyout(\n        controller: _controller,\n        flyoutBuilder: widget.flyoutBuilder,\n        navigator: widget.navigator,\n        child: ElevatedButton(\n          onPressed: () {\n            _controller.show();\n          },\n          child: widget.child,\n        ));\n  }\n}\n"
  },
  {
    "path": "lib/components/layout.dart",
    "content": "part of 'components.dart';\n\nclass SliverGridViewWithFixedItemHeight extends StatelessWidget {\n  const SliverGridViewWithFixedItemHeight(\n      {required this.delegate,\n        required this.maxCrossAxisExtent,\n        required this.itemHeight,\n        super.key});\n\n  final SliverChildDelegate delegate;\n\n  final double maxCrossAxisExtent;\n\n  final double itemHeight;\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverLayoutBuilder(\n        builder: ((context, constraints) => SliverGrid(\n          delegate: delegate,\n          gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(\n              maxCrossAxisExtent: maxCrossAxisExtent,\n              childAspectRatio:\n              calcChildAspectRatio(constraints.crossAxisExtent)),\n        )));\n  }\n\n  double calcChildAspectRatio(double width) {\n    var crossItems = width ~/ maxCrossAxisExtent;\n    if (width % maxCrossAxisExtent != 0) {\n      crossItems += 1;\n    }\n    final itemWidth = width / crossItems;\n    return itemWidth / itemHeight;\n  }\n}\n\nclass SliverGridDelegateWithFixedHeight extends SliverGridDelegate{\n  const SliverGridDelegateWithFixedHeight({\n    required this.maxCrossAxisExtent,\n    required this.itemHeight,\n  });\n\n  final double maxCrossAxisExtent;\n\n  final double itemHeight;\n\n  @override\n  SliverGridLayout getLayout(SliverConstraints constraints) {\n    final width = constraints.crossAxisExtent;\n    var crossItems = width ~/ maxCrossAxisExtent;\n    if (width % maxCrossAxisExtent != 0) {\n      crossItems += 1;\n    }\n    return SliverGridRegularTileLayout(\n        crossAxisCount: crossItems,\n        mainAxisStride: itemHeight,\n        crossAxisStride: width / crossItems,\n        childMainAxisExtent: itemHeight,\n        childCrossAxisExtent: width / crossItems,\n        reverseCrossAxis: false\n    );\n  }\n\n  @override\n  bool shouldRelayout(covariant SliverGridDelegate oldDelegate) {\n    if(oldDelegate is! SliverGridDelegateWithFixedHeight) return true;\n    if(oldDelegate.maxCrossAxisExtent != maxCrossAxisExtent\n        || oldDelegate.itemHeight != itemHeight){\n      return true;\n    }\n    return false;\n  }\n\n}\n\nclass SliverGridDelegateWithComics extends SliverGridDelegate{\n  SliverGridDelegateWithComics([this.useBriefMode = false, this.scale]);\n\n  final bool useBriefMode;\n\n  final String? scale;\n\n  @override\n  SliverGridLayout getLayout(SliverConstraints constraints) {\n    var setting = appdata.settings[44].split(',');\n    if(setting.length == 1){\n      setting.add(\"1.0\");\n    }\n    if(setting[0] == \"1\" || setting[0] == \"2\" || useBriefMode){\n      return getBriefModeLayout(constraints, double.parse(scale ?? setting[1]));\n    } else {\n      return getDetailedModeLayout(constraints, double.parse(scale ?? setting[1]));\n    }\n  }\n\n  SliverGridLayout getDetailedModeLayout(SliverConstraints constraints, double scale){\n    const maxCrossAxisExtent = 650;\n    final itemHeight = 164 * scale;\n    final width = constraints.crossAxisExtent;\n    var crossItems = width ~/ maxCrossAxisExtent;\n    if (width % maxCrossAxisExtent != 0) {\n      crossItems += 1;\n    }\n    return SliverGridRegularTileLayout(\n        crossAxisCount: crossItems,\n        mainAxisStride: itemHeight,\n        crossAxisStride: width / crossItems,\n        childMainAxisExtent: itemHeight,\n        childCrossAxisExtent: width / crossItems,\n        reverseCrossAxis: false\n    );\n  }\n\n  SliverGridLayout getBriefModeLayout(SliverConstraints constraints, double scale){\n    final maxCrossAxisExtent = 192.0 * scale;\n    const childAspectRatio = 0.72;\n    const crossAxisSpacing = 0.0;\n    int crossAxisCount = (constraints.crossAxisExtent / (maxCrossAxisExtent + crossAxisSpacing)).ceil();\n    // Ensure a minimum count of 1, can be zero and result in an infinite extent\n    // below when the window size is 0.\n    crossAxisCount = math.max(1, crossAxisCount);\n    final double usableCrossAxisExtent = math.max(\n      0.0,\n      constraints.crossAxisExtent - crossAxisSpacing * (crossAxisCount - 1),\n    );\n    final double childCrossAxisExtent = usableCrossAxisExtent / crossAxisCount;\n    final double childMainAxisExtent = childCrossAxisExtent / childAspectRatio;\n    return SliverGridRegularTileLayout(\n      crossAxisCount: crossAxisCount,\n      mainAxisStride: childMainAxisExtent,\n      crossAxisStride: childCrossAxisExtent + crossAxisSpacing,\n      childMainAxisExtent: childMainAxisExtent,\n      childCrossAxisExtent: childCrossAxisExtent,\n      reverseCrossAxis: axisDirectionIsReversed(constraints.crossAxisDirection),\n    );\n  }\n\n  @override\n  bool shouldRelayout(covariant SliverGridDelegate oldDelegate) {\n    return true;\n  }\n}"
  },
  {
    "path": "lib/components/loading.dart",
    "content": "part of 'components.dart';\n\nclass NetworkError extends StatelessWidget {\n  const NetworkError({\n    super.key,\n    required this.message,\n    this.retry,\n    this.withAppbar = true,\n  });\n\n  final String message;\n\n  final void Function()? retry;\n\n  final bool withAppbar;\n\n  @override\n  Widget build(BuildContext context) {\n    var cfe = CloudflareException.fromString(message);\n    Widget body = Center(\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          const Icon(\n            Icons.error_outline,\n            size: 60,\n          ),\n          const SizedBox(\n            height: 4,\n          ),\n          Text(\n            cfe == null ? message : \"需要进行Cloudflare验证\".tl,\n            textAlign: TextAlign.center,\n            maxLines: 3,\n          ),\n          if (retry != null)\n            const SizedBox(\n              height: 4,\n            ),\n          if (retry != null)\n            if (cfe != null)\n              FilledButton(\n                onPressed: () => passCloudflare(CloudflareException.fromString(message)!, retry!),\n                child: Text('继续'.tl),\n              )\n            else\n              FilledButton(onPressed: retry, child: Text('重试'.tl))\n        ],\n      ),\n    );\n    if (withAppbar) {\n      body = Column(\n        children: [\n          const Appbar(title: Text(\"\")),\n          Expanded(\n            child: body,\n          )\n        ],\n      );\n    }\n    return Material(\n      child: body,\n    );\n  }\n}\n\nclass ListLoadingIndicator extends StatelessWidget {\n  const ListLoadingIndicator({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return const SizedBox(\n      width: double.infinity,\n      height: 80,\n      child: Center(\n        child: FiveDotLoadingAnimation(),\n      ),\n    );\n  }\n}\n\nabstract class LoadingState<T extends StatefulWidget, S extends Object>\n    extends State<T> {\n  bool isLoading = false;\n\n  S? data;\n\n  String? error;\n\n  Future<Res<S>> loadData();\n\n  Widget buildContent(BuildContext context, S data);\n\n  Widget? buildFrame(BuildContext context, Widget child) => null;\n\n  Widget buildLoading() {\n    return Center(\n      child: const CircularProgressIndicator(\n        strokeWidth: 2,\n      ).fixWidth(32).fixHeight(32),\n    );\n  }\n\n  void retry() {\n    setState(() {\n      isLoading = true;\n      error = null;\n    });\n    loadData().then((value) {\n      if (value.success) {\n        setState(() {\n          isLoading = false;\n          data = value.data;\n        });\n      } else {\n        setState(() {\n          isLoading = false;\n          error = value.errorMessage!;\n        });\n      }\n    });\n  }\n\n  Widget buildError() {\n    return Center(\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Text(\n            error!,\n            maxLines: 3,\n          ),\n          const SizedBox(height: 12),\n          Button.text(\n            onPressed: retry,\n            child: const Text(\"Retry\"),\n          )\n        ],\n      ),\n    ).paddingHorizontal(16);\n  }\n\n  @override\n  @mustCallSuper\n  void initState() {\n    isLoading = true;\n    Future.microtask(() {\n      loadData().then((value) {\n        if (value.success) {\n          setState(() {\n            isLoading = false;\n            data = value.data;\n          });\n        } else {\n          setState(() {\n            isLoading = false;\n            error = value.errorMessage!;\n          });\n        }\n      });\n    });\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget child;\n\n    if (isLoading) {\n      child = buildLoading();\n    } else if (error != null) {\n      child = buildError();\n    } else {\n      child = buildContent(context, data!);\n    }\n\n    return buildFrame(context, child) ?? child;\n  }\n}\n\nabstract class MultiPageLoadingState<T extends StatefulWidget, S extends Object>\n    extends State<T> {\n  bool _isFirstLoading = true;\n\n  bool _isLoading = false;\n\n  List<S>? data;\n\n  String? _error;\n\n  int _page = 1;\n\n  int _maxPage = 1;\n\n  Future<Res<List<S>>> loadData(int page);\n\n  Widget? buildFrame(BuildContext context, Widget child) => null;\n\n  Widget buildContent(BuildContext context, List<S> data);\n\n  bool get isLoading => _isLoading || _isFirstLoading;\n\n  bool get isFirstLoading => _isFirstLoading;\n\n  bool get haveNextPage => _page <= _maxPage;\n\n  void nextPage() {\n    if (_page > _maxPage) return;\n    if (_isLoading) return;\n    _isLoading = true;\n    loadData(_page).then((value) {\n      _isLoading = false;\n      if (mounted) {\n        if (value.success) {\n          _page++;\n          if (value.subData is int) {\n            _maxPage = value.subData as int;\n          }\n          setState(() {\n            data!.addAll(value.data);\n          });\n        } else {\n          var message = value.errorMessage ?? \"Network Error\";\n          if (message.length > 20) {\n            message = \"${message.substring(0, 20)}...\";\n          }\n          context.showMessage(message: message);\n        }\n      }\n    });\n  }\n\n  void reset() {\n    setState(() {\n      _isFirstLoading = true;\n      _isLoading = false;\n      data = null;\n      _error = null;\n      _page = 1;\n    });\n    firstLoad();\n  }\n\n  void firstLoad() {\n    Future.microtask(() {\n      loadData(_page).then((value) {\n        if (!mounted) return;\n        if (value.success) {\n          _page++;\n          if (value.subData is int) {\n            _maxPage = value.subData as int;\n          }\n          setState(() {\n            _isFirstLoading = false;\n            data = value.data;\n          });\n        } else {\n          setState(() {\n            _isFirstLoading = false;\n            _error = value.errorMessage!;\n          });\n        }\n      });\n    });\n  }\n\n  @override\n  void initState() {\n    firstLoad();\n    super.initState();\n  }\n\n  Widget buildLoading(BuildContext context) {\n    return Center(\n      child: const CircularProgressIndicator(\n        strokeWidth: 2,\n      ).fixWidth(32).fixHeight(32),\n    );\n  }\n\n  Widget buildError(BuildContext context, String error) {\n    return Center(\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Text(error, maxLines: 3),\n          const SizedBox(height: 12),\n          Button.outlined(\n            onPressed: () {\n              reset();\n            },\n            child: const Text(\"Retry\"),\n          )\n        ],\n      ),\n    ).paddingHorizontal(16);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget child;\n\n    if (_isFirstLoading) {\n      child = buildLoading(context);\n    } else if (_error != null) {\n      child = buildError(context, _error!);\n    } else {\n      child = NotificationListener<ScrollNotification>(\n        onNotification: (notification) {\n          if (notification.metrics.pixels ==\n              notification.metrics.maxScrollExtent) {\n            nextPage();\n          }\n          return false;\n        },\n        child: buildContent(context, data!),\n      );\n    }\n\n    return buildFrame(context, child) ?? child;\n  }\n}\n\nclass FiveDotLoadingAnimation extends StatefulWidget {\n  const FiveDotLoadingAnimation({super.key});\n\n  @override\n  State<FiveDotLoadingAnimation> createState() =>\n      _FiveDotLoadingAnimationState();\n}\n\nclass _FiveDotLoadingAnimationState extends State<FiveDotLoadingAnimation>\n    with SingleTickerProviderStateMixin {\n  late AnimationController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 1200),\n      upperBound: 6,\n    )..repeat(min: 0, max: 5.2, period: const Duration(milliseconds: 1200));\n  }\n\n  @override\n  void dispose() {\n    _controller.dispose();\n    super.dispose();\n  }\n\n  static const _colors = [\n    Colors.red,\n    Colors.green,\n    Colors.blue,\n    Colors.yellow,\n    Colors.purple\n  ];\n\n  static const _padding = 12.0;\n\n  static const _dotSize = 12.0;\n\n  static const _height = 24.0;\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedBuilder(\n        animation: _controller,\n        builder: (context, child) {\n          return SizedBox(\n            width: _dotSize * 5 + _padding * 6,\n            height: _height,\n            child: Stack(\n              children: List.generate(5, (index) => buildDot(index)),\n            ),\n          );\n        });\n  }\n\n  Widget buildDot(int index) {\n    var value = _controller.value;\n    var startValue = index * 0.8;\n    return Positioned(\n      left: index * _dotSize + (index + 1) * _padding,\n      bottom: (math.sin(math.pi / 2 * (value - startValue).clamp(0, 2))) *\n          (_height - _dotSize),\n      child: Container(\n        width: _dotSize,\n        height: _dotSize,\n        decoration: BoxDecoration(\n          color: _colors[index],\n          shape: BoxShape.circle,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/menu.dart",
    "content": "part of \"components.dart\";\n\nvoid showDesktopMenu(\n    BuildContext context, Offset location, List<DesktopMenuEntry> entries) {\n  Navigator.of(context).push(DesktopMenuRoute(entries, location));\n}\n\nclass DesktopMenuRoute<T> extends PopupRoute<T> {\n  final List<DesktopMenuEntry> entries;\n\n  final Offset location;\n\n  DesktopMenuRoute(this.entries, this.location);\n\n  @override\n  Color? get barrierColor => Colors.transparent;\n\n  @override\n  bool get barrierDismissible => true;\n\n  @override\n  String? get barrierLabel => \"menu\";\n\n  @override\n  Widget buildPage(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation) {\n    const width = 196.0;\n    final size = MediaQuery.of(context).size;\n    var left = location.dx;\n    if (left + width > size.width - 10) {\n      left = size.width - width - 10;\n    }\n    var top = location.dy;\n    var height = 16 + 32 * entries.length;\n    if (top + height > size.height - 15) {\n      top = size.height - height - 15;\n    }\n    return Stack(\n      children: [\n        Positioned(\n          left: left,\n          top: top,\n          child: Container(\n            width: width,\n            padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 6),\n            decoration: BoxDecoration(\n                color: App.colors(context).surface,\n                borderRadius: BorderRadius.circular(4),\n                boxShadow: [\n                  BoxShadow(\n                    color: Colors.black.withOpacity(0.2),\n                    blurRadius: 4,\n                    offset: const Offset(0, 2),\n                  ),\n                ]),\n            child: Material(\n              child: Column(\n                mainAxisSize: MainAxisSize.min,\n                children: entries.map((e) => buildEntry(e, context)).toList(),\n              ),\n            ),\n          ),\n        )\n      ],\n    );\n  }\n\n  Widget buildEntry(DesktopMenuEntry entry, BuildContext context) {\n    return InkWell(\n      borderRadius: BorderRadius.circular(4),\n      onTap: () {\n        Navigator.of(context).pop();\n        entry.onClick();\n      },\n      child: SizedBox(\n        height: 32,\n        child: Row(\n          children: [\n            const SizedBox(\n              width: 4,\n            ),\n            if (entry.icon != null)\n              Icon(\n                entry.icon,\n                size: 18,\n              ),\n            const SizedBox(\n              width: 4,\n            ),\n            Text(entry.text),\n          ],\n        ),\n      ),\n    );\n  }\n\n  @override\n  Duration get transitionDuration => const Duration(milliseconds: 200);\n\n  @override\n  Widget buildTransitions(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation, Widget child) {\n    return FadeTransition(\n      opacity: animation.drive(Tween<double>(begin: 0, end: 1)\n          .chain(CurveTween(curve: Curves.ease))),\n      child: child,\n    );\n  }\n}\n\nclass DesktopMenuEntry {\n  final String text;\n  final IconData? icon;\n  final void Function() onClick;\n\n  DesktopMenuEntry({required this.text, this.icon, required this.onClick});\n}\n"
  },
  {
    "path": "lib/components/message.dart",
    "content": "part of \"components.dart\";\n\nvoid hideAllMessages() {\n  _OverlayWidgetState.removeAll();\n}\n\nvoid showToast({required String message, Widget? icon, Widget? trailing}) {\n  var newEntry = OverlayEntry(\n      builder: (context) => _ToastOverlay(\n            message: message,\n            icon: icon,\n            trailing: trailing,\n          ));\n\n  _OverlayWidgetState.addOverlay(newEntry);\n\n  Timer(const Duration(seconds: 2), () => _OverlayWidgetState.remove(newEntry));\n}\n\nclass _ToastOverlay extends StatelessWidget {\n  const _ToastOverlay({required this.message, this.icon, this.trailing});\n\n  final String message;\n\n  final Widget? icon;\n\n  final Widget? trailing;\n\n  @override\n  Widget build(BuildContext context) {\n    return Positioned(\n      bottom: 24 + MediaQuery.of(context).viewInsets.bottom,\n      left: 0,\n      right: 0,\n      child: Align(\n        alignment: Alignment.bottomCenter,\n        child: Material(\n          color: Theme.of(context).colorScheme.surface,\n          surfaceTintColor: Theme.of(context).colorScheme.surfaceTint,\n          borderRadius: BorderRadius.circular(12),\n          elevation: 2,\n          child: Container(\n            padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 16),\n            child: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                if (icon != null) icon!.paddingRight(8),\n                Text(\n                  message,\n                  style: const TextStyle(\n                      fontSize: 16, fontWeight: FontWeight.w500),\n                  maxLines: 3,\n                ),\n                if (trailing != null) trailing!.paddingLeft(8)\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass OverlayWidget extends StatefulWidget {\n  const OverlayWidget(this.child, {super.key});\n\n  final Widget child;\n\n  static void addOverlay(OverlayEntry entry) =>\n      _OverlayWidgetState.addOverlay(entry);\n\n  static void removeAll() => _OverlayWidgetState.removeAll();\n\n  @override\n  State<OverlayWidget> createState() => _OverlayWidgetState();\n}\n\nclass _OverlayWidgetState extends State<OverlayWidget> {\n  static var overlayKey = GlobalKey<OverlayState>();\n\n  static var entries = <OverlayEntry>[];\n\n  static void addOverlay(OverlayEntry entry) {\n    if (overlayKey.currentState != null) {\n      overlayKey.currentState!.insert(entry);\n      entries.add(entry);\n    }\n  }\n\n  static void remove(OverlayEntry entry) {\n    if (entries.remove(entry)) {\n      entry.remove();\n    }\n  }\n\n  static void removeAll() {\n    for (var entry in entries) {\n      entry.remove();\n    }\n    entries.clear();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Overlay(\n      key: overlayKey,\n      initialEntries: [OverlayEntry(builder: (context) => widget.child)],\n    );\n  }\n}\n\nvoid showDialogMessage(BuildContext context, String title, String message) {\n  showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n            title: Text(title),\n            content: Text(message),\n            actions: [\n              TextButton(\n                  onPressed: () => App.back(context), child: Text(\"了解\".tl))\n            ],\n          ));\n}\n\nvoid showConfirmDialog(BuildContext context, String title, String content,\n    void Function() onConfirm) {\n  showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n            title: Text(title),\n            content: Text(content),\n            actions: [\n              TextButton(\n                  onPressed: () => App.back(context), child: Text(\"取消\".tl)),\n              TextButton(\n                  onPressed: () {\n                    App.back(context);\n                    onConfirm();\n                  },\n                  child: Text(\"确认\".tl)),\n            ],\n          ));\n}\n\nclass LoadingDialogController {\n  void Function()? closeDialog;\n\n  bool closed = false;\n\n  void close() {\n    if (closed) {\n      return;\n    }\n    closed = true;\n    if (closeDialog == null) {\n      Future.microtask(closeDialog!);\n    } else {\n      closeDialog!();\n    }\n  }\n}\n\nLoadingDialogController showLoadingDialog(BuildContext context,\n    {void Function()? onCancel,\n    bool barrierDismissible = true,\n    bool allowCancel = true,\n    String? message,\n    String cancelButtonText = \"Cancel\"}) {\n  var controller = LoadingDialogController();\n\n  var loadingDialogRoute = DialogRoute(\n      context: context,\n      barrierDismissible: barrierDismissible,\n      builder: (BuildContext context) {\n        return Dialog(\n          child: Container(\n            width: 100,\n            padding: const EdgeInsets.all(16.0),\n            child: Row(\n              children: [\n                const SizedBox(\n                  width: 30,\n                  height: 30,\n                  child: CircularProgressIndicator(),\n                ),\n                const SizedBox(\n                  width: 16,\n                ),\n                Text(\n                  message ?? 'Loading',\n                  style: const TextStyle(fontSize: 16),\n                ),\n                const Spacer(),\n                if (allowCancel)\n                  TextButton(\n                      onPressed: () {\n                        controller.close();\n                        onCancel?.call();\n                      },\n                      child: Text(cancelButtonText.tl))\n              ],\n            ),\n          ),\n        );\n      });\n\n  var navigator = Navigator.of(context);\n\n  navigator.push(loadingDialogRoute).then((value) => controller.closed = true);\n\n  controller.closeDialog = () {\n    navigator.removeRoute(loadingDialogRoute);\n  };\n\n  return controller;\n}\n\nclass ContentDialog extends StatelessWidget {\n  const ContentDialog({\n    super.key,\n    required this.title,\n    required this.content,\n    this.actions = const [],\n  });\n\n  final String title;\n\n  final Widget content;\n\n  final List<Widget> actions;\n\n  @override\n  Widget build(BuildContext context) {\n    var content = Column(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        Appbar(\n          title: Text(title),\n          backgroundColor: Colors.transparent,\n        ),\n        this.content,\n        const SizedBox(height: 16),\n        Row(\n          mainAxisAlignment: MainAxisAlignment.end,\n          children: actions,\n        ).paddingRight(12),\n        const SizedBox(height: 16),\n      ],\n    );\n    return Dialog(\n      insetPadding: context.width < 400\n          ? const EdgeInsets.symmetric(horizontal: 4)\n          : const EdgeInsets.symmetric(horizontal: 16),\n      child: IntrinsicWidth(\n        child: ConstrainedBox(\n          constraints: BoxConstraints(\n            maxWidth: 600,\n            minWidth: math.min(400, context.width - 16),\n          ),\n          child: MediaQuery.removePadding(\n            removeTop: true,\n            removeBottom: true,\n            context: context,\n            child: content,\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/navigation_bar.dart",
    "content": "part of 'components.dart';\n\nclass PaneItemEntry {\n  String label;\n\n  IconData icon;\n\n  IconData activeIcon;\n\n  PaneItemEntry(\n      {required this.label, required this.icon, required this.activeIcon});\n}\n\nclass PaneActionEntry {\n  String label;\n\n  IconData icon;\n\n  VoidCallback onTap;\n\n  PaneActionEntry(\n      {required this.label, required this.icon, required this.onTap});\n}\n\nclass NaviPane extends StatefulWidget {\n  const NaviPane(\n      {required this.paneItems,\n      required this.paneActions,\n      required this.pageBuilder,\n      this.initialPage = 0,\n      this.onPageChange,\n      required this.observer,\n      super.key});\n\n  final List<PaneItemEntry> paneItems;\n\n  final List<PaneActionEntry> paneActions;\n\n  final Widget Function(int page) pageBuilder;\n\n  final void Function(int index)? onPageChange;\n\n  final int initialPage;\n\n  final NaviObserver observer;\n\n  @override\n  State<NaviPane> createState() => _NaviPaneState();\n}\n\nclass _NaviPaneState extends State<NaviPane>\n    with SingleTickerProviderStateMixin {\n  late int _currentPage = widget.initialPage;\n\n  int get currentPage => _currentPage;\n\n  set currentPage(int value) {\n    if (value == _currentPage) return;\n    _currentPage = value;\n    widget.onPageChange?.call(value);\n  }\n\n  late AnimationController controller;\n\n  static const _kBottomBarHeight = 58.0;\n\n  static const _kFoldedSideBarWidth = 80.0;\n\n  static const _kSideBarWidth = 256.0;\n\n  static const _kTopBarHeight = 48.0;\n\n  double get bottomBarHeight =>\n      _kBottomBarHeight + MediaQuery.of(context).padding.bottom;\n\n  void onNavigatorStateChange() {\n    onRebuild(context);\n  }\n\n  @override\n  void initState() {\n    controller = AnimationController(\n        duration: const Duration(milliseconds: 250),\n        lowerBound: 0,\n        upperBound: 3,\n        vsync: this);\n    widget.observer.addListener(onNavigatorStateChange);\n    StateController.put(NaviPaddingWidgetController());\n    super.initState();\n  }\n\n  @override\n  void didChangeDependencies() {\n    controller.value = targetFormContext(context);\n    super.didChangeDependencies();\n  }\n\n  @override\n  void dispose() {\n    StateController.remove<NaviPaddingWidgetController>();\n    controller.dispose();\n    widget.observer.removeListener(onNavigatorStateChange);\n    super.dispose();\n  }\n\n  double targetFormContext(BuildContext context) {\n    var width = MediaQuery.of(context).size.width;\n    double target = 0;\n    if (widget.observer.pageCount > 1) {\n      target = 1;\n    }\n    if (width > changePoint) {\n      target = 2;\n    }\n    if (width > changePoint2) {\n      target = 3;\n    }\n    return target;\n  }\n\n  double? animationTarget;\n\n  void onRebuild(BuildContext context) {\n    double target = targetFormContext(context);\n    if (controller.value != target || animationTarget != target) {\n      if (controller.isAnimating) {\n        if (animationTarget == target) {\n          return;\n        } else {\n          controller.stop();\n        }\n      }\n      if (target == 1) {\n        StateController.find<NaviPaddingWidgetController>()\n            .setWithPadding(true);\n        controller.value = target;\n      } else if (controller.value == 1 && target == 0) {\n        StateController.findOrNull<NaviPaddingWidgetController>()\n            ?.setWithPadding(false);\n        controller.value = target;\n      } else {\n        controller.animateTo(target,\n            duration: const Duration(milliseconds: 160), curve: Curves.ease);\n      }\n      animationTarget = target;\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    onRebuild(context);\n    return _NaviPopScope(\n      action: () {\n        if (App.mainNavigatorKey!.currentState!.canPop()) {\n          App.mainNavigatorKey!.currentState!.pop();\n        } else {\n          SystemNavigator.pop();\n        }\n      },\n      popGesture: App.isIOS && !UiMode.m1(context),\n      child: AnimatedBuilder(\n        animation: controller,\n        builder: (context, child) {\n          final value = controller.value;\n          return Stack(\n            children: [\n              if (value <= 1)\n                Positioned(\n                  left: 0,\n                  right: 0,\n                  bottom: bottomBarHeight * (0 - value),\n                  child: buildBottom(),\n                ),\n              if (value <= 1)\n                Positioned(\n                  left: 0,\n                  right: 0,\n                  top: _kTopBarHeight * (0 - value) +\n                      MediaQuery.of(context).padding.top * (1 - value),\n                  child: buildTop(),\n                ),\n              Positioned(\n                left: _kFoldedSideBarWidth * ((value - 2.0).clamp(-1.0, 0.0)),\n                top: 0,\n                bottom: 0,\n                child: buildLeft(),\n              ),\n              Positioned(\n                top: _kTopBarHeight * ((1 - value).clamp(0, 1)) +\n                    MediaQuery.of(context).padding.top * (value == 1 ? 0 : 1),\n                left: _kFoldedSideBarWidth * ((value - 1).clamp(0, 1)) +\n                    (_kSideBarWidth - _kFoldedSideBarWidth) *\n                        ((value - 2).clamp(0, 1)),\n                right: 0,\n                bottom: bottomBarHeight * ((1 - value).clamp(0, 1)),\n                child: MediaQuery.removePadding(\n                  removeTop: value >= 2 || value == 0,\n                  context: context,\n                  child: Material(child: widget.pageBuilder(currentPage)),\n                ),\n              ),\n            ],\n          );\n        },\n      ),\n    );\n  }\n\n  Widget buildTop() {\n    return Material(\n      child: Container(\n        padding: const EdgeInsets.only(left: 16, right: 16),\n        height: _kTopBarHeight,\n        width: double.infinity,\n        child: Row(\n          children: [\n            Text(\n              widget.paneItems[currentPage].label,\n              style: const TextStyle(fontSize: 18),\n            ),\n            const Spacer(),\n            for (var action in widget.paneActions)\n              Tooltip(\n                message: action.label,\n                child: IconButton(\n                  icon: Icon(action.icon),\n                  onPressed: action.onTap,\n                ),\n              )\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildBottom() {\n    return Material(\n      textStyle: Theme.of(context).textTheme.labelSmall,\n      elevation: 0,\n      child: Container(\n        height: _kBottomBarHeight + MediaQuery.of(context).padding.bottom,\n        decoration: BoxDecoration(\n          border: Border(\n            top: BorderSide(\n              color: Theme.of(context).colorScheme.outlineVariant,\n              width: 0.6,\n            ),\n          ),\n        ),\n        child: Padding(\n          padding:\n              EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom),\n          child: Row(\n            children: List<Widget>.generate(\n                widget.paneItems.length,\n                (index) => Expanded(\n                        child: _SingleBottomNaviWidget(\n                      enabled: currentPage == index,\n                      entry: widget.paneItems[index],\n                      onTap: () {\n                        setState(() {\n                          currentPage = index;\n                        });\n                      },\n                      key: ValueKey(index),\n                    ))),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildLeft() {\n    final value = controller.value;\n    const paddingHorizontal = 12.0;\n    return Material(\n      child: Container(\n        width: _kFoldedSideBarWidth +\n            (_kSideBarWidth - _kFoldedSideBarWidth) * ((value - 2).clamp(0, 1)),\n        height: double.infinity,\n        padding: const EdgeInsets.symmetric(horizontal: paddingHorizontal),\n        child: Row(\n          children: [\n            SizedBox(\n              width: value == 3\n                  ? (_kSideBarWidth - paddingHorizontal * 2)\n                  : (_kFoldedSideBarWidth - paddingHorizontal * 2),\n              child: Column(\n                children: [\n                  const SizedBox(\n                    height: 16,\n                  ),\n                  SizedBox(\n                    height: MediaQuery.of(context).padding.top,\n                  ),\n                  ...List<Widget>.generate(\n                    widget.paneItems.length,\n                    (index) => _SideNaviWidget(\n                      enabled: currentPage == index,\n                      entry: widget.paneItems[index],\n                      showTitle: value == 3,\n                      onTap: () {\n                        setState(() {\n                          currentPage = index;\n                        });\n                      },\n                      key: ValueKey(index),\n                    ),\n                  ),\n                  const Spacer(),\n                  ...List<Widget>.generate(\n                    widget.paneActions.length,\n                    (index) => _PaneActionWidget(\n                      entry: widget.paneActions[index],\n                      showTitle: value == 3,\n                      key: ValueKey(index + widget.paneItems.length),\n                    ),\n                  ),\n                  const SizedBox(\n                    height: 16,\n                  )\n                ],\n              ),\n            ),\n            const Spacer(),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\nclass _SideNaviWidget extends StatefulWidget {\n  const _SideNaviWidget(\n      {required this.enabled,\n      required this.entry,\n      required this.onTap,\n      required this.showTitle,\n      super.key});\n\n  final bool enabled;\n\n  final PaneItemEntry entry;\n\n  final VoidCallback onTap;\n\n  final bool showTitle;\n\n  @override\n  State<_SideNaviWidget> createState() => _SideNaviWidgetState();\n}\n\nclass _SideNaviWidgetState extends State<_SideNaviWidget> {\n  bool isHovering = false;\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = Theme.of(context).colorScheme;\n    final icon =\n        Icon(widget.enabled ? widget.entry.activeIcon : widget.entry.icon);\n    return MouseRegion(\n      cursor: SystemMouseCursors.click,\n      onEnter: (details) => setState(() => isHovering = true),\n      onExit: (details) => setState(() => isHovering = false),\n      child: GestureDetector(\n        behavior: HitTestBehavior.translucent,\n        onTap: widget.onTap,\n        child: AnimatedContainer(\n            duration: const Duration(milliseconds: 180),\n            margin: const EdgeInsets.symmetric(vertical: 4),\n            padding: const EdgeInsets.symmetric(horizontal: 16),\n            width: double.infinity,\n            height: widget.showTitle ? 42 : 34,\n            decoration: BoxDecoration(\n                color: widget.enabled\n                    ? colorScheme.primaryContainer\n                    : isHovering\n                        ? colorScheme.surfaceContainerHigh\n                        : null,\n                borderRadius: BorderRadius.circular(16)),\n            child: widget.showTitle\n                ? Row(\n                    children: [\n                      icon,\n                      const SizedBox(\n                        width: 12,\n                      ),\n                      Text(widget.entry.label)\n                    ],\n                  )\n                : Center(\n                    child: icon,\n                  )),\n      ),\n    );\n  }\n}\n\nclass _PaneActionWidget extends StatefulWidget {\n  const _PaneActionWidget(\n      {required this.entry, required this.showTitle, super.key});\n\n  final PaneActionEntry entry;\n\n  final bool showTitle;\n\n  @override\n  State<_PaneActionWidget> createState() => _PaneActionWidgetState();\n}\n\nclass _PaneActionWidgetState extends State<_PaneActionWidget> {\n  bool isHovering = false;\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = Theme.of(context).colorScheme;\n    final icon = Icon(widget.entry.icon);\n    return MouseRegion(\n      cursor: SystemMouseCursors.click,\n      onEnter: (details) => setState(() => isHovering = true),\n      onExit: (details) => setState(() => isHovering = false),\n      child: GestureDetector(\n        behavior: HitTestBehavior.translucent,\n        onTap: widget.entry.onTap,\n        child: AnimatedContainer(\n            duration: const Duration(milliseconds: 180),\n            margin: const EdgeInsets.symmetric(vertical: 4),\n            padding: const EdgeInsets.symmetric(horizontal: 16),\n            width: double.infinity,\n            height: widget.showTitle ? 42 : 34,\n            decoration: BoxDecoration(\n                color: isHovering ? colorScheme.surfaceContainerHigh : null,\n                borderRadius: BorderRadius.circular(16)),\n            child: widget.showTitle\n                ? Row(\n                    children: [\n                      icon,\n                      const SizedBox(\n                        width: 12,\n                      ),\n                      Text(widget.entry.label)\n                    ],\n                  )\n                : Center(\n                    child: icon,\n                  )),\n      ),\n    );\n  }\n}\n\nclass _SingleBottomNaviWidget extends StatefulWidget {\n  const _SingleBottomNaviWidget(\n      {required this.enabled,\n      required this.entry,\n      required this.onTap,\n      super.key});\n\n  final bool enabled;\n\n  final PaneItemEntry entry;\n\n  final VoidCallback onTap;\n\n  @override\n  State<_SingleBottomNaviWidget> createState() =>\n      _SingleBottomNaviWidgetState();\n}\n\nclass _SingleBottomNaviWidgetState extends State<_SingleBottomNaviWidget>\n    with SingleTickerProviderStateMixin {\n  late AnimationController controller;\n\n  bool isHovering = false;\n\n  @override\n  void dispose() {\n    controller.dispose();\n    super.dispose();\n  }\n\n  @override\n  void didUpdateWidget(covariant _SingleBottomNaviWidget oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.enabled != widget.enabled) {\n      if (widget.enabled) {\n        controller.forward(from: 0);\n      } else {\n        controller.reverse(from: 1);\n      }\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    controller = AnimationController(\n      value: widget.enabled ? 1 : 0,\n      vsync: this,\n      duration: _fastAnimationDuration,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedBuilder(\n      animation: CurvedAnimation(parent: controller, curve: Curves.ease),\n      builder: (context, child) {\n        return MouseRegion(\n          cursor: SystemMouseCursors.click,\n          onEnter: (details) => setState(() => isHovering = true),\n          onExit: (details) => setState(() => isHovering = false),\n          child: GestureDetector(\n            behavior: HitTestBehavior.translucent,\n            onTap: widget.onTap,\n            child: buildContent(),\n          ),\n        );\n      },\n    );\n  }\n\n  Widget buildContent() {\n    final value = controller.value;\n    final colorScheme = Theme.of(context).colorScheme;\n    final icon =\n        Icon(widget.enabled ? widget.entry.activeIcon : widget.entry.icon);\n    return Center(\n      child: Container(\n        width: 64,\n        height: 28,\n        decoration: BoxDecoration(\n          borderRadius: const BorderRadius.all(Radius.circular(32)),\n          color: isHovering ? colorScheme.surfaceContainer : Colors.transparent,\n        ),\n        child: Center(\n          child: Container(\n            width: 32 + value * 32,\n            height: 28,\n            decoration: BoxDecoration(\n              borderRadius: const BorderRadius.all(Radius.circular(32)),\n              color: value != 0\n                  ? colorScheme.secondaryContainer\n                  : Colors.transparent,\n            ),\n            child: Center(child: icon),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass NaviObserver extends NavigatorObserver implements Listenable {\n  var routes = Queue<Route>();\n\n  int get pageCount => routes.length;\n\n  @override\n  void didPop(Route route, Route? previousRoute) {\n    routes.removeLast();\n    notifyListeners();\n  }\n\n  @override\n  void didPush(Route route, Route? previousRoute) {\n    routes.addLast(route);\n    notifyListeners();\n  }\n\n  @override\n  void didRemove(Route route, Route? previousRoute) {\n    routes.remove(route);\n    notifyListeners();\n  }\n\n  @override\n  void didReplace({Route? newRoute, Route? oldRoute}) {\n    routes.remove(oldRoute);\n    if (newRoute != null) {\n      routes.add(newRoute);\n    }\n    notifyListeners();\n  }\n\n  List<VoidCallback> listeners = [];\n\n  @override\n  void addListener(VoidCallback listener) {\n    listeners.add(listener);\n  }\n\n  @override\n  void removeListener(VoidCallback listener) {\n    listeners.remove(listener);\n  }\n\n  void notifyListeners() {\n    for (var listener in listeners) {\n      listener();\n    }\n  }\n}\n\nclass _NaviPopScope extends StatelessWidget {\n  const _NaviPopScope(\n      {required this.child, this.popGesture = false, required this.action});\n\n  final Widget child;\n  final bool popGesture;\n  final VoidCallback action;\n\n  static bool panStartAtEdge = false;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget res = App.isIOS\n        ? child\n        : PopScope(\n            canPop: App.isAndroid ? false : true,\n            onPopInvokedWithResult: (value, result) {\n              action();\n            },\n            child: child,\n          );\n    if (popGesture) {\n      res = GestureDetector(\n          onPanStart: (details) {\n            if (details.globalPosition.dx < 64) {\n              panStartAtEdge = true;\n            }\n          },\n          onPanEnd: (details) {\n            if (details.velocity.pixelsPerSecond.dx < 0 ||\n                details.velocity.pixelsPerSecond.dx > 0) {\n              if (panStartAtEdge) {\n                action();\n              }\n            }\n            panStartAtEdge = false;\n          },\n          child: res);\n    }\n    return res;\n  }\n}\n\nclass NaviPaddingWidgetController extends StateController {\n  NaviPaddingWidgetController() {\n    print(\"init\");\n  }\n\n  bool _withPadding = false;\n\n  void setWithPadding(bool value) {\n    _withPadding = value;\n    update();\n  }\n}\n\nclass NaviPaddingWidget extends StatelessWidget {\n  const NaviPaddingWidget({super.key, required this.child});\n\n  final Widget child;\n\n  @override\n  Widget build(BuildContext context) {\n    return StateBuilder<NaviPaddingWidgetController>(\n      builder: (controller) {\n        return Padding(\n          padding: controller._withPadding ? EdgeInsets.only(\n            top: _NaviPaneState._kTopBarHeight + context.padding.top,\n            bottom: _NaviPaneState._kBottomBarHeight + context.padding.bottom,\n          ) : EdgeInsets.zero,\n          child: child,\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/pop_up_widget.dart",
    "content": "part of 'components.dart';\n\nclass PopUpWidget<T> extends PopupRoute<T> {\n  PopUpWidget(this.widget);\n\n  final Widget widget;\n\n  @override\n  Color? get barrierColor => Colors.black54;\n\n  @override\n  bool get barrierDismissible => true;\n\n  @override\n  String? get barrierLabel => \"exit\";\n\n  @override\n  Widget buildPage(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation) {\n    var height = MediaQuery.of(context).size.height * 0.9;\n    bool showPopUp = MediaQuery.of(context).size.width > 500;\n    Widget body = PopupIndicatorWidget(\n      child: Container(\n        decoration: showPopUp\n            ? const BoxDecoration(\n                borderRadius: BorderRadius.all(Radius.circular(12)),\n              )\n            : null,\n        clipBehavior: showPopUp ? Clip.antiAlias : Clip.none,\n        width: showPopUp ? 500 : double.infinity,\n        height: showPopUp ? height : double.infinity,\n        child: ClipRect(\n          child: Navigator(\n            onGenerateRoute: (settings) => MaterialPageRoute(\n              builder: (context) => widget,\n            ),\n          ),\n        ),\n      ),\n    );\n    if (App.isIOS) {\n      body = IOSBackGestureDetector(\n        enabledCallback: () => true,\n        gestureWidth: 20.0,\n        onStartPopGesture: () =>\n            IOSBackGestureController(controller!, navigator!),\n        child: body,\n      );\n    }\n    if (showPopUp) {\n      return MediaQuery.removePadding(\n        removeTop: true,\n        context: context,\n        child: Center(\n          child: body,\n        ),\n      );\n    }\n    return body;\n  }\n\n  @override\n  Duration get transitionDuration => const Duration(milliseconds: 350);\n\n  @override\n  Widget buildTransitions(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation, Widget child) {\n    return FadeTransition(\n      opacity: animation.drive(\n        Tween(begin: 0.0, end: 1.0).chain(CurveTween(curve: Curves.ease)),\n      ),\n      child: child,\n    );\n  }\n}\n\nclass PopupIndicatorWidget extends InheritedWidget {\n  const PopupIndicatorWidget({super.key, required super.child});\n\n  @override\n  bool updateShouldNotify(covariant InheritedWidget oldWidget) => false;\n\n  static PopupIndicatorWidget? maybeOf(BuildContext context) {\n    return context.dependOnInheritedWidgetOfExactType<PopupIndicatorWidget>();\n  }\n}\n\nFuture<T> showPopUpWidget<T>(BuildContext context, Widget widget) async {\n  return await Navigator.of(context).push(PopUpWidget(widget));\n}\n\nclass PopUpWidgetScaffold extends StatefulWidget {\n  const PopUpWidgetScaffold(\n      {required this.title, required this.body, this.tailing, Key? key})\n      : super(key: key);\n  final Widget body;\n  final List<Widget>? tailing;\n  final String title;\n\n  @override\n  State<PopUpWidgetScaffold> createState() => _PopUpWidgetScaffoldState();\n}\n\nclass _PopUpWidgetScaffoldState extends State<PopUpWidgetScaffold> {\n  bool top = true;\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      child: Column(\n        children: [\n          Container(\n            height: 56 + context.padding.top,\n            padding: EdgeInsets.only(top: context.padding.top),\n            width: double.infinity,\n            decoration: BoxDecoration(\n              color: top\n                  ? null\n                  : Theme.of(context).colorScheme.surfaceTint.withAlpha(20),\n            ),\n            child: Row(\n              children: [\n                const SizedBox(\n                  width: 8,\n                ),\n                Tooltip(\n                  message: \"返回\".tl,\n                  child: IconButton(\n                      icon: const Icon(Icons.arrow_back_sharp),\n                      onPressed: () => Navigator.of(context).canPop()\n                          ? Navigator.of(context).pop()\n                          : App.globalBack()),\n                ),\n                const SizedBox(\n                  width: 16,\n                ),\n                Text(\n                  widget.title,\n                  style: const TextStyle(\n                      fontSize: 22, fontWeight: FontWeight.w500),\n                ),\n                const Spacer(),\n                if (widget.tailing != null) ...widget.tailing!,\n                const SizedBox(width: 8),\n              ],\n            ),\n          ),\n          NotificationListener<ScrollNotification>(\n            onNotification: (notifications) {\n              if (notifications.metrics.pixels ==\n                      notifications.metrics.minScrollExtent &&\n                  !top) {\n                setState(() {\n                  top = true;\n                });\n              } else if (notifications.metrics.pixels !=\n                      notifications.metrics.minScrollExtent &&\n                  top) {\n                setState(() {\n                  top = false;\n                });\n              }\n              return false;\n            },\n            child: MediaQuery.removePadding(\n              removeTop: true,\n              context: context,\n              child: Expanded(child: widget.body),\n            ),\n          ),\n          SizedBox(\n            height: MediaQuery.of(context).viewInsets.bottom -\n                        0.05 * MediaQuery.of(context).size.height >\n                    0\n                ? MediaQuery.of(context).viewInsets.bottom -\n                    0.05 * MediaQuery.of(context).size.height\n                : 0,\n          )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/scroll.dart",
    "content": "part of 'components.dart';\n\nclass SmoothCustomScrollView extends StatelessWidget {\n  const SmoothCustomScrollView({super.key, required this.slivers, this.controller});\n\n  final ScrollController? controller;\n\n  final List<Widget> slivers;\n\n  @override\n  Widget build(BuildContext context) {\n    return SmoothScrollProvider(\n      controller: controller,\n      builder: (context, controller, physics) {\n        return CustomScrollView(\n          controller: controller,\n          physics: physics,\n          slivers: slivers,\n        );\n      },\n    );\n  }\n}\n\n\nclass SmoothScrollProvider extends StatefulWidget {\n  const SmoothScrollProvider({super.key, this.controller, required this.builder});\n\n  final ScrollController? controller;\n\n  final Widget Function(BuildContext, ScrollController, ScrollPhysics) builder;\n\n  static bool get isMouseScroll => _SmoothScrollProviderState._isMouseScroll;\n\n  @override\n  State<SmoothScrollProvider> createState() => _SmoothScrollProviderState();\n}\n\nclass _SmoothScrollProviderState extends State<SmoothScrollProvider> {\n  late final ScrollController _controller;\n\n  double? _futurePosition;\n\n  static bool _isMouseScroll = App.isDesktop;\n\n  @override\n  void initState() {\n    _controller = widget.controller ?? ScrollController();\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if(App.isMacOS) {\n      return widget.builder(\n        context,\n        _controller,\n        const ClampingScrollPhysics(),\n      );\n    }\n    return Listener(\n      behavior: HitTestBehavior.translucent,\n      onPointerDown: (event) {\n        if (_isMouseScroll) {\n          setState(() {\n            _isMouseScroll = false;\n          });\n        }\n      },\n      onPointerSignal: (pointerSignal) {\n        if (pointerSignal is PointerScrollEvent) {\n          if (pointerSignal.kind == PointerDeviceKind.mouse &&\n              !_isMouseScroll) {\n            setState(() {\n              _isMouseScroll = true;\n            });\n          }\n          if (!_isMouseScroll) return;\n          var currentLocation = _controller.position.pixels;\n          _futurePosition ??= currentLocation;\n          double k = (_futurePosition! - currentLocation).abs() / 1600 + 1;\n          _futurePosition =\n              _futurePosition! + pointerSignal.scrollDelta.dy * k;\n          _futurePosition = _futurePosition!.clamp(\n              _controller.position.minScrollExtent,\n              _controller.position.maxScrollExtent);\n          _controller.animateTo(_futurePosition!,\n              duration: _fastAnimationDuration, curve: Curves.linear);\n        }\n      },\n      child: widget.builder(\n        context,\n        _controller,\n        _isMouseScroll\n            ? const NeverScrollableScrollPhysics()\n            : const ClampingScrollPhysics(),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/scrollable_list/scrollable_positioned_list.dart",
    "content": "// Copyright 2019 The Fuchsia Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nexport 'src/item_positions_listener.dart';\nexport 'src/scrollable_positioned_list.dart';\n"
  },
  {
    "path": "lib/components/scrollable_list/src/element_registry.dart",
    "content": "// Copyright 2019 The Fuchsia Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/widgets.dart';\n\n/// A registry to track some [Element]s in the tree.\nclass RegistryWidget extends StatefulWidget {\n  /// Creates a [RegistryWidget].\n  const RegistryWidget({Key? key, this.elementNotifier, required this.child})\n      : super(key: key);\n\n  /// The widget below this widget in the tree.\n  final Widget child;\n\n  /// Contains the current set of all [Element]s created by\n  /// [RegisteredElementWidget]s in the tree below this widget.\n  ///\n  /// Note that if there is another [RegistryWidget] in this widget's subtree\n  /// that registry, and not this one, will collect elements in its subtree.\n  final ValueNotifier<Set<Element>?>? elementNotifier;\n\n  @override\n  State<StatefulWidget> createState() => _RegistryWidgetState();\n}\n\n/// A widget whose [Element] will be added its nearest ancestor\n/// [RegistryWidget].\nclass RegisteredElementWidget extends ProxyWidget {\n  /// Creates a [RegisteredElementWidget].\n  const RegisteredElementWidget({Key? key, required Widget child})\n      : super(key: key, child: child);\n\n  @override\n  Element createElement() => _RegisteredElement(this);\n}\n\nclass _RegistryWidgetState extends State<RegistryWidget> {\n  final Set<Element> registeredElements = {};\n\n  @override\n  Widget build(BuildContext context) => _InheritedRegistryWidget(\n        state: this,\n        child: widget.child,\n      );\n}\n\nclass _InheritedRegistryWidget extends InheritedWidget {\n  final _RegistryWidgetState state;\n\n  const _InheritedRegistryWidget(\n      {Key? key, required this.state, required Widget child})\n      : super(key: key, child: child);\n\n  @override\n  bool updateShouldNotify(InheritedWidget oldWidget) => true;\n}\n\nclass _RegisteredElement extends ProxyElement {\n  _RegisteredElement(ProxyWidget widget) : super(widget);\n\n  @override\n  void notifyClients(ProxyWidget oldWidget) {}\n\n  late _RegistryWidgetState _registryWidgetState;\n\n  @override\n  void mount(Element? parent, dynamic newSlot) {\n    super.mount(parent, newSlot);\n    final inheritedRegistryWidget =\n        dependOnInheritedWidgetOfExactType<_InheritedRegistryWidget>()!;\n    _registryWidgetState = inheritedRegistryWidget.state;\n    _registryWidgetState.registeredElements.add(this);\n    _registryWidgetState.widget.elementNotifier?.value =\n        _registryWidgetState.registeredElements;\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    final inheritedRegistryWidget =\n        dependOnInheritedWidgetOfExactType<_InheritedRegistryWidget>()!;\n    _registryWidgetState = inheritedRegistryWidget.state;\n    _registryWidgetState.registeredElements.add(this);\n    _registryWidgetState.widget.elementNotifier?.value =\n        _registryWidgetState.registeredElements;\n  }\n\n  @override\n  void unmount() {\n    _registryWidgetState.registeredElements.remove(this);\n    _registryWidgetState.widget.elementNotifier?.value =\n        _registryWidgetState.registeredElements;\n    super.unmount();\n  }\n}\n"
  },
  {
    "path": "lib/components/scrollable_list/src/item_positions_listener.dart",
    "content": "// Copyright 2019 The Fuchsia Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/foundation.dart';\n\nimport 'item_positions_notifier.dart';\nimport 'scrollable_positioned_list.dart';\n\n/// Provides a listenable iterable of [itemPositions] of items that are on\n/// screen and their locations.\nabstract class ItemPositionsListener {\n  /// Creates an [ItemPositionsListener] that can be used by a\n  /// [ScrollablePositionedList] to return the current position of items.\n  factory ItemPositionsListener.create() => ItemPositionsNotifier();\n\n  /// The position of items that are at least partially visible in the viewport.\n  ValueListenable<Iterable<ItemPosition>> get itemPositions;\n}\n\n/// Position information for an item in the list.\nclass ItemPosition {\n  /// Create an [ItemPosition].\n  const ItemPosition(\n      {required this.index,\n      required this.itemLeadingEdge,\n      required this.itemTrailingEdge});\n\n  /// Index of the item.\n  final int index;\n\n  /// Distance in proportion of the viewport's main axis length from the leading\n  /// edge of the viewport to the leading edge of the item.\n  ///\n  /// May be negative if the item is partially visible.\n  final double itemLeadingEdge;\n\n  /// Distance in proportion of the viewport's main axis length from the leading\n  /// edge of the viewport to the trailing edge of the item.\n  ///\n  /// May be greater than one if the item is partially visible.\n  final double itemTrailingEdge;\n\n  @override\n  bool operator ==(Object other) {\n    if (other.runtimeType != runtimeType) return false;\n    final otherPosition = other as ItemPosition;\n    return otherPosition.index == index &&\n        otherPosition.itemLeadingEdge == itemLeadingEdge &&\n        otherPosition.itemTrailingEdge == itemTrailingEdge;\n  }\n\n  @override\n  int get hashCode =>\n      31 * (31 * (7 + index.hashCode) + itemLeadingEdge.hashCode) +\n      itemTrailingEdge.hashCode;\n\n  @override\n  String toString() =>\n      'ItemPosition(index: $index, itemLeadingEdge: $itemLeadingEdge, itemTrailingEdge: $itemTrailingEdge)';\n}\n"
  },
  {
    "path": "lib/components/scrollable_list/src/item_positions_notifier.dart",
    "content": "// Copyright 2019 The Fuchsia Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/foundation.dart';\n\nimport 'item_positions_listener.dart';\n\n/// Internal implementation of [ItemPositionsListener].\nclass ItemPositionsNotifier implements ItemPositionsListener {\n  @override\n  final ValueNotifier<Iterable<ItemPosition>> itemPositions = ValueNotifier([]);\n}\n"
  },
  {
    "path": "lib/components/scrollable_list/src/positioned_list.dart",
    "content": "// Copyright 2019 The Fuchsia Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/widgets.dart';\n\nimport 'element_registry.dart';\nimport 'item_positions_listener.dart';\nimport 'item_positions_notifier.dart';\nimport 'scroll_view.dart';\nimport 'wrapping.dart';\n\n/// A list of widgets similar to [ListView], except scroll control\n/// and position reporting is based on index rather than pixel offset.\n///\n/// [PositionedList] lays out children in the same way as [ListView].\n///\n/// The list can be displayed with the item at [positionIndex] positioned at a\n/// particular [alignment].  See [ItemScrollController.jumpTo] for an\n/// explanation of alignment.\n///\n/// All other parameters are the same as specified in [ListView].\nclass PositionedList extends StatefulWidget {\n  /// Create a [PositionedList].\n  const PositionedList({\n    Key? key,\n    required this.itemCount,\n    required this.itemBuilder,\n    this.separatorBuilder,\n    this.controller,\n    this.itemPositionsNotifier,\n    this.positionedIndex = 0,\n    this.alignment = 0,\n    this.scrollDirection = Axis.vertical,\n    this.reverse = false,\n    this.shrinkWrap = false,\n    this.physics,\n    this.padding,\n    this.cacheExtent,\n    this.semanticChildCount,\n    this.addSemanticIndexes = true,\n    this.addRepaintBoundaries = true,\n    this.addAutomaticKeepAlives = true,\n    this.scrollBehavior,\n  })  : assert((positionedIndex == 0) || (positionedIndex < itemCount)),\n        super(key: key);\n\n  /// Number of items the [itemBuilder] can produce.\n  final int itemCount;\n\n  /// Called to build children for the list with\n  /// 0 <= index < itemCount.\n  final IndexedWidgetBuilder itemBuilder;\n\n  /// If not null, called to build separators for between each item in the list.\n  /// Called with 0 <= index < itemCount - 1.\n  final IndexedWidgetBuilder? separatorBuilder;\n\n  /// An object that can be used to control the position to which this scroll\n  /// view is scrolled.\n  final ScrollController? controller;\n\n  /// Notifier that reports the items laid out in the list after each frame.\n  final ItemPositionsNotifier? itemPositionsNotifier;\n\n  /// Index of an item to initially align to a position within the viewport\n  /// defined by [alignment].\n  final int positionedIndex;\n\n  /// Determines where the leading edge of the item at [positionedIndex]\n  /// should be placed.\n  ///\n  /// See [ItemScrollController.jumpTo] for an explanation of alignment.\n  final double alignment;\n\n  /// The axis along which the scroll view scrolls.\n  ///\n  /// Defaults to [Axis.vertical].\n  final Axis scrollDirection;\n\n  /// Whether the view scrolls in the reading direction.\n  ///\n  /// Defaults to false.\n  ///\n  /// See [ScrollView.reverse].\n  final bool reverse;\n\n  /// Whether the extent of the scroll view in the [scrollDirection] should be\n  /// determined by the contents being viewed.\n  ///\n  ///  Defaults to false.\n  ///\n  /// See [ScrollView.shrinkWrap].\n  final bool shrinkWrap;\n\n  /// How the scroll view should respond to user input.\n  ///\n  /// For example, determines how the scroll view continues to animate after the\n  /// user stops dragging the scroll view.\n  ///\n  /// See [ScrollView.physics].\n  final ScrollPhysics? physics;\n\n  /// {@macro flutter.widgets.scrollable.cacheExtent}\n  final double? cacheExtent;\n\n  /// The number of children that will contribute semantic information.\n  ///\n  /// See [ScrollView.semanticChildCount] for more information.\n  final int? semanticChildCount;\n\n  /// Whether to wrap each child in an [IndexedSemantics].\n  ///\n  /// See [SliverChildBuilderDelegate.addSemanticIndexes].\n  final bool addSemanticIndexes;\n\n  /// The amount of space by which to inset the children.\n  final EdgeInsets? padding;\n\n  /// Whether to wrap each child in a [RepaintBoundary].\n  ///\n  /// See [SliverChildBuilderDelegate.addRepaintBoundaries].\n  final bool addRepaintBoundaries;\n\n  /// Whether to wrap each child in an [AutomaticKeepAlive].\n  ///\n  /// See [SliverChildBuilderDelegate.addAutomaticKeepAlives].\n  final bool addAutomaticKeepAlives;\n\n  final ScrollBehavior? scrollBehavior;\n\n  @override\n  State<StatefulWidget> createState() => _PositionedListState();\n}\n\nclass _PositionedListState extends State<PositionedList> {\n  final Key _centerKey = UniqueKey();\n\n  final registeredElements = ValueNotifier<Set<Element>?>(null);\n  late final ScrollController scrollController;\n\n  bool updateScheduled = false;\n\n  @override\n  void initState() {\n    super.initState();\n    scrollController = widget.controller ?? ScrollController();\n    scrollController.addListener(_schedulePositionNotificationUpdate);\n    _schedulePositionNotificationUpdate();\n  }\n\n  @override\n  void dispose() {\n    scrollController.removeListener(_schedulePositionNotificationUpdate);\n    super.dispose();\n  }\n\n  @override\n  void didUpdateWidget(PositionedList oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    _schedulePositionNotificationUpdate();\n  }\n\n  @override\n  Widget build(BuildContext context) => RegistryWidget(\n        elementNotifier: registeredElements,\n        child: UnboundedCustomScrollView(\n          anchor: widget.alignment,\n          center: _centerKey,\n          controller: scrollController,\n          scrollDirection: widget.scrollDirection,\n          reverse: widget.reverse,\n          cacheExtent: widget.cacheExtent,\n          physics: widget.physics,\n          shrinkWrap: widget.shrinkWrap,\n          semanticChildCount: widget.semanticChildCount ?? widget.itemCount,\n          scrollBehavior: widget.scrollBehavior,\n          slivers: <Widget>[\n            if (widget.positionedIndex > 0)\n              SliverPadding(\n                padding: _leadingSliverPadding,\n                sliver: SliverList(\n                  delegate: SliverChildBuilderDelegate(\n                    (context, index) => widget.separatorBuilder == null\n                        ? _buildItem(widget.positionedIndex - (index + 1))\n                        : _buildSeparatedListElement(\n                            2 * widget.positionedIndex - (index + 1)),\n                    childCount: widget.separatorBuilder == null\n                        ? widget.positionedIndex\n                        : 2 * widget.positionedIndex,\n                    addSemanticIndexes: false,\n                    addRepaintBoundaries: widget.addRepaintBoundaries,\n                    addAutomaticKeepAlives: widget.addAutomaticKeepAlives,\n                  ),\n                ),\n              ),\n            SliverPadding(\n              key: _centerKey,\n              padding: _centerSliverPadding,\n              sliver: SliverList(\n                delegate: SliverChildBuilderDelegate(\n                  (context, index) => widget.separatorBuilder == null\n                      ? _buildItem(index + widget.positionedIndex)\n                      : _buildSeparatedListElement(\n                          index + 2 * widget.positionedIndex),\n                  childCount: widget.itemCount != 0 ? 1 : 0,\n                  addSemanticIndexes: false,\n                  addRepaintBoundaries: widget.addRepaintBoundaries,\n                  addAutomaticKeepAlives: widget.addAutomaticKeepAlives,\n                ),\n              ),\n            ),\n            if (widget.positionedIndex >= 0 &&\n                widget.positionedIndex < widget.itemCount - 1)\n              SliverPadding(\n                padding: _trailingSliverPadding,\n                sliver: SliverList(\n                  delegate: SliverChildBuilderDelegate(\n                    (context, index) => widget.separatorBuilder == null\n                        ? _buildItem(index + widget.positionedIndex + 1)\n                        : _buildSeparatedListElement(\n                            index + 2 * widget.positionedIndex + 1),\n                    childCount: widget.separatorBuilder == null\n                        ? widget.itemCount - widget.positionedIndex - 1\n                        : 2 * (widget.itemCount - widget.positionedIndex - 1),\n                    addSemanticIndexes: false,\n                    addRepaintBoundaries: widget.addRepaintBoundaries,\n                    addAutomaticKeepAlives: widget.addAutomaticKeepAlives,\n                  ),\n                ),\n              ),\n          ],\n        ),\n      );\n\n  Widget _buildSeparatedListElement(int index) {\n    if (index.isEven) {\n      return _buildItem(index ~/ 2);\n    } else {\n      return widget.separatorBuilder!(context, index ~/ 2);\n    }\n  }\n\n  Widget _buildItem(int index) {\n    return RegisteredElementWidget(\n      key: ValueKey(index),\n      child: widget.addSemanticIndexes\n          ? IndexedSemantics(\n              index: index, child: widget.itemBuilder(context, index))\n          : widget.itemBuilder(context, index),\n    );\n  }\n\n  EdgeInsets get _leadingSliverPadding =>\n      (widget.scrollDirection == Axis.vertical\n          ? widget.reverse\n              ? widget.padding?.copyWith(top: 0)\n              : widget.padding?.copyWith(bottom: 0)\n          : widget.reverse\n              ? widget.padding?.copyWith(left: 0)\n              : widget.padding?.copyWith(right: 0)) ??\n      const EdgeInsets.all(0);\n\n  EdgeInsets get _centerSliverPadding => widget.scrollDirection == Axis.vertical\n      ? widget.reverse\n          ? widget.padding?.copyWith(\n                  top: widget.positionedIndex == widget.itemCount - 1\n                      ? widget.padding!.top\n                      : 0,\n                  bottom: widget.positionedIndex == 0\n                      ? widget.padding!.bottom\n                      : 0) ??\n              const EdgeInsets.all(0)\n          : widget.padding?.copyWith(\n                  top: widget.positionedIndex == 0 ? widget.padding!.top : 0,\n                  bottom: widget.positionedIndex == widget.itemCount - 1\n                      ? widget.padding!.bottom\n                      : 0) ??\n              const EdgeInsets.all(0)\n      : widget.reverse\n          ? widget.padding?.copyWith(\n                  left: widget.positionedIndex == widget.itemCount - 1\n                      ? widget.padding!.left\n                      : 0,\n                  right: widget.positionedIndex == 0\n                      ? widget.padding!.right\n                      : 0) ??\n              const EdgeInsets.all(0)\n          : widget.padding?.copyWith(\n                left: widget.positionedIndex == 0 ? widget.padding!.left : 0,\n                right: widget.positionedIndex == widget.itemCount - 1\n                    ? widget.padding!.right\n                    : 0,\n              ) ??\n              const EdgeInsets.all(0);\n\n  EdgeInsets get _trailingSliverPadding =>\n      widget.scrollDirection == Axis.vertical\n          ? widget.reverse\n              ? widget.padding?.copyWith(bottom: 0) ?? const EdgeInsets.all(0)\n              : widget.padding?.copyWith(top: 0) ?? const EdgeInsets.all(0)\n          : widget.reverse\n              ? widget.padding?.copyWith(right: 0) ?? const EdgeInsets.all(0)\n              : widget.padding?.copyWith(left: 0) ?? const EdgeInsets.all(0);\n\n  void _schedulePositionNotificationUpdate() {\n    if (!updateScheduled) {\n      updateScheduled = true;\n      SchedulerBinding.instance.addPostFrameCallback((_) {\n        final elements = registeredElements.value;\n        if (elements == null) {\n          updateScheduled = false;\n          return;\n        }\n        final positions = <ItemPosition>[];\n        RenderViewportBase? viewport;\n        for (var element in elements) {\n          final RenderBox box = element.renderObject as RenderBox;\n          viewport ??= RenderAbstractViewport.of(box) as RenderViewportBase?;\n          var anchor = 0.0;\n          if (viewport is RenderViewport) {\n            anchor = viewport.anchor;\n          }\n\n          if (viewport is CustomRenderViewport) {\n            anchor = viewport.anchor;\n          }\n\n          final ValueKey<int> key = element.widget.key as ValueKey<int>;\n          // Skip this element if `box` has never been laid out.\n          if (!box.hasSize) continue;\n          if (widget.scrollDirection == Axis.vertical) {\n            final reveal = viewport!.getOffsetToReveal(box, 0).offset;\n            if (!reveal.isFinite) continue;\n            final itemOffset =\n                reveal - viewport.offset.pixels + anchor * viewport.size.height;\n            positions.add(ItemPosition(\n                index: key.value,\n                itemLeadingEdge: itemOffset.round() /\n                    scrollController.position.viewportDimension,\n                itemTrailingEdge: (itemOffset + box.size.height).round() /\n                    scrollController.position.viewportDimension));\n          } else {\n            final itemOffset =\n                box.localToGlobal(Offset.zero, ancestor: viewport).dx;\n            positions.add(ItemPosition(\n                index: key.value,\n                itemLeadingEdge: (widget.reverse\n                            ? scrollController.position.viewportDimension -\n                                (itemOffset + box.size.width)\n                            : itemOffset)\n                        .round() /\n                    scrollController.position.viewportDimension,\n                itemTrailingEdge: (widget.reverse\n                            ? scrollController.position.viewportDimension -\n                                itemOffset\n                            : (itemOffset + box.size.width))\n                        .round() /\n                    scrollController.position.viewportDimension));\n          }\n        }\n        widget.itemPositionsNotifier?.itemPositions.value = positions;\n        updateScheduled = false;\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "lib/components/scrollable_list/src/post_mount_callback.dart",
    "content": "// Copyright 2019 The Fuchsia Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/widgets.dart';\n\n/// Widget whose [Element] calls a callback when the element is mounted.\nclass PostMountCallback extends StatelessWidget {\n  /// Creates a [PostMountCallback] widget.\n  const PostMountCallback({required this.child, this.callback, Key? key})\n      : super(key: key);\n\n  /// The widget below this widget in the tree.\n  final Widget child;\n\n  /// Callback to call when the element for this widget is mounted.\n  final void Function()? callback;\n\n  @override\n  StatelessElement createElement() => _PostMountCallbackElement(this);\n\n  @override\n  Widget build(BuildContext context) => child;\n}\n\nclass _PostMountCallbackElement extends StatelessElement {\n  _PostMountCallbackElement(PostMountCallback widget) : super(widget);\n\n  @override\n  void mount(Element? parent, dynamic newSlot) {\n    super.mount(parent, newSlot);\n    final PostMountCallback postMountCallback = widget as PostMountCallback;\n    postMountCallback.callback?.call();\n  }\n}\n"
  },
  {
    "path": "lib/components/scrollable_list/src/scroll_view.dart",
    "content": "// Copyright 2019 The Fuchsia Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/widgets.dart';\n\nimport 'wrapping.dart';\nimport 'viewport.dart';\n\n/// A version of [CustomScrollView] that allows does not constrict the extents\n/// to be within 0 and 1. See [CustomScrollView] for more information.\nclass UnboundedCustomScrollView extends CustomScrollView {\n  final bool _shrinkWrap;\n\n  const UnboundedCustomScrollView({\n    Key? key,\n    Axis scrollDirection = Axis.vertical,\n    bool reverse = false,\n    ScrollController? controller,\n    bool? primary,\n    ScrollPhysics? physics,\n    bool shrinkWrap = false,\n    Key? center,\n    double anchor = 0.0,\n    double? cacheExtent,\n    List<Widget> slivers = const <Widget>[],\n    int? semanticChildCount,\n    DragStartBehavior dragStartBehavior = DragStartBehavior.down,\n    ScrollBehavior? scrollBehavior\n  })  : _shrinkWrap = shrinkWrap,\n        _anchor = anchor,\n        super(\n          key: key,\n          scrollDirection: scrollDirection,\n          reverse: reverse,\n          controller: controller,\n          primary: primary,\n          physics: physics,\n          shrinkWrap: false,\n          center: center,\n          cacheExtent: cacheExtent,\n          semanticChildCount: semanticChildCount,\n          dragStartBehavior: dragStartBehavior,\n          slivers: slivers,\n          scrollBehavior: scrollBehavior,\n        );\n\n  // [CustomScrollView] enforces constraints on [CustomScrollView.anchor], so\n  // we need our own version.\n  final double _anchor;\n\n  @override\n  double get anchor => _anchor;\n\n  /// Build the viewport.\n  @override\n  @protected\n  Widget buildViewport(\n    BuildContext context,\n    ViewportOffset offset,\n    AxisDirection axisDirection,\n    List<Widget> slivers,\n  ) {\n    if (_shrinkWrap) {\n      return CustomShrinkWrappingViewport(\n        axisDirection: axisDirection,\n        offset: offset,\n        slivers: slivers,\n        cacheExtent: cacheExtent,\n        center: center,\n        anchor: anchor,\n      );\n    }\n    return UnboundedViewport(\n      axisDirection: axisDirection,\n      offset: offset,\n      slivers: slivers,\n      cacheExtent: cacheExtent,\n      center: center,\n      anchor: anchor,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/scrollable_list/src/scrollable_positioned_list.dart",
    "content": "// Copyright 2019 The Fuchsia Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:async';\nimport 'dart:math';\n\nimport 'package:collection/collection.dart' show IterableExtension;\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/widgets.dart';\n\nimport 'item_positions_listener.dart';\nimport 'item_positions_notifier.dart';\nimport 'positioned_list.dart';\nimport 'post_mount_callback.dart';\n\n/// Number of screens to scroll when scrolling a long distance.\nconst int _screenScrollCount = 2;\n\n/// A scrollable list of widgets similar to [ListView], except scroll control\n/// and position reporting is based on index rather than pixel offset.\n///\n/// [ScrollablePositionedList] lays out children in the same way as [ListView].\n///\n/// The list can be displayed with the item at [initialScrollIndex] positioned\n/// at a particular [initialAlignment].\n///\n/// The [itemScrollController] can be used to scroll or jump to particular items\n/// in the list.  The [itemPositionsNotifier] can be used to get a list of items\n/// currently laid out by the list.\n///\n/// All other parameters are the same as specified in [ListView].\nclass ScrollablePositionedList extends StatefulWidget {\n  /// Create a [ScrollablePositionedList] whose items are provided by\n  /// [itemBuilder].\n  const ScrollablePositionedList.builder({\n    required this.itemCount,\n    required this.itemBuilder,\n    Key? key,\n    this.itemScrollController,\n    this.shrinkWrap = false,\n    ItemPositionsListener? itemPositionsListener,\n    this.initialScrollIndex = 0,\n    this.initialAlignment = 0,\n    this.scrollDirection = Axis.vertical,\n    this.reverse = false,\n    this.physics,\n    this.semanticChildCount,\n    this.padding,\n    this.addSemanticIndexes = true,\n    this.addAutomaticKeepAlives = true,\n    this.addRepaintBoundaries = true,\n    this.minCacheExtent, required this.scrollController,\n    this.scrollBehavior\n  })  : itemPositionsNotifier = itemPositionsListener as ItemPositionsNotifier?,\n        separatorBuilder = null,\n        super(key: key);\n\n  /// Create a [ScrollablePositionedList] whose items are provided by\n  /// [itemBuilder] and separators provided by [separatorBuilder].\n  const ScrollablePositionedList.separated({\n    required this.itemCount,\n    required this.itemBuilder,\n    required this.separatorBuilder,\n    required this.scrollController,\n    Key? key,\n    this.shrinkWrap = false,\n    this.itemScrollController,\n    ItemPositionsListener? itemPositionsListener,\n    this.initialScrollIndex = 0,\n    this.initialAlignment = 0,\n    this.scrollDirection = Axis.vertical,\n    this.reverse = false,\n    this.physics,\n    this.semanticChildCount,\n    this.padding,\n    this.addSemanticIndexes = true,\n    this.addAutomaticKeepAlives = true,\n    this.addRepaintBoundaries = true,\n    this.minCacheExtent,\n    this.scrollBehavior\n  })  : assert(separatorBuilder != null),\n        itemPositionsNotifier = itemPositionsListener as ItemPositionsNotifier?,\n        super(key: key);\n\n  /// Number of items the [itemBuilder] can produce.\n  final int itemCount;\n\n  final ScrollController scrollController;\n\n  /// Called to build children for the list with\n  /// 0 <= index < itemCount.\n  final IndexedWidgetBuilder itemBuilder;\n\n  /// Called to build separators for between each item in the list.\n  /// Called with 0 <= index < itemCount - 1.\n  final IndexedWidgetBuilder? separatorBuilder;\n\n  /// Controller for jumping or scrolling to an item.\n  final ItemScrollController? itemScrollController;\n\n  /// Notifier that reports the items laid out in the list after each frame.\n  final ItemPositionsNotifier? itemPositionsNotifier;\n\n  /// Index of an item to initially align within the viewport.\n  final int initialScrollIndex;\n\n  /// Determines where the leading edge of the item at [initialScrollIndex]\n  /// should be placed.\n  ///\n  /// See [ItemScrollController.jumpTo] for an explanation of alignment.\n  final double initialAlignment;\n\n  /// The axis along which the scroll view scrolls.\n  ///\n  /// Defaults to [Axis.vertical].\n  final Axis scrollDirection;\n\n  /// Whether the view scrolls in the reading direction.\n  ///\n  /// Defaults to false.\n  ///\n  /// See [ScrollView.reverse].\n  final bool reverse;\n\n  /// Whether the extent of the scroll view in the [scrollDirection] should be\n  /// determined by the contents being viewed.\n  ///\n  ///  Defaults to false.\n  ///\n  /// See [ScrollView.shrinkWrap].\n  final bool shrinkWrap;\n\n  /// How the scroll view should respond to user input.\n  ///\n  /// For example, determines how the scroll view continues to animate after the\n  /// user stops dragging the scroll view.\n  ///\n  /// See [ScrollView.physics].\n  final ScrollPhysics? physics;\n\n  /// The number of children that will contribute semantic information.\n  ///\n  /// See [ScrollView.semanticChildCount] for more information.\n  final int? semanticChildCount;\n\n  /// The amount of space by which to inset the children.\n  final EdgeInsets? padding;\n\n  /// Whether to wrap each child in an [IndexedSemantics].\n  ///\n  /// See [SliverChildBuilderDelegate.addSemanticIndexes].\n  final bool addSemanticIndexes;\n\n  /// Whether to wrap each child in an [AutomaticKeepAlive].\n  ///\n  /// See [SliverChildBuilderDelegate.addAutomaticKeepAlives].\n  final bool addAutomaticKeepAlives;\n\n  /// Whether to wrap each child in a [RepaintBoundary].\n  ///\n  /// See [SliverChildBuilderDelegate.addRepaintBoundaries].\n  final bool addRepaintBoundaries;\n\n  /// The minimum cache extent used by the underlying scroll lists.\n  /// See [ScrollView.cacheExtent].\n  ///\n  /// Note that the [ScrollablePositionedList] uses two lists to simulate long\n  /// scrolls, so using the [ScrollController.scrollTo] method may result\n  /// in builds of widgets that would otherwise already be built in the\n  /// cache extent.\n  final double? minCacheExtent;\n\n  final ScrollBehavior? scrollBehavior;\n\n  @override\n  State<StatefulWidget> createState() => _ScrollablePositionedListState();\n}\n\n/// Controller to jump or scroll to a particular position in a\n/// [ScrollablePositionedList].\nclass ItemScrollController {\n  /// Whether any ScrollablePositionedList objects are attached this object.\n  ///\n  /// If `false`, then [jumpTo] and [scrollTo] must not be called.\n  bool get isAttached => _scrollableListState != null;\n\n  _ScrollablePositionedListState? _scrollableListState;\n\n  /// Immediately, without animation, reconfigure the list so that the item at\n  /// [index]'s leading edge is at the given [alignment].\n  ///\n  /// The [alignment] specifies the desired position for the leading edge of the\n  /// item.  The [alignment] is expected to be a value in the range \\[0.0, 1.0\\]\n  /// and represents a proportion along the main axis of the viewport.\n  ///\n  /// For a vertically scrolling view that is not reversed:\n  /// * 0 aligns the top edge of the item with the top edge of the view.\n  /// * 1 aligns the top edge of the item with the bottom of the view.\n  /// * 0.5 aligns the top edge of the item with the center of the view.\n  ///\n  /// For a horizontally scrolling view that is not reversed:\n  /// * 0 aligns the left edge of the item with the left edge of the view\n  /// * 1 aligns the left edge of the item with the right edge of the view.\n  /// * 0.5 aligns the left edge of the item with the center of the view.\n  void jumpTo({required int index, double alignment = 0}) {\n    _scrollableListState!._jumpTo(index: index, alignment: alignment);\n  }\n\n  /// Animate the list over [duration] using the given [curve] such that the\n  /// item at [index] ends up with its leading edge at the given [alignment].\n  /// See [jumpTo] for an explanation of alignment.\n  ///\n  /// The [duration] must be greater than 0; otherwise, use [jumpTo].\n  ///\n  /// When item position is not available, because it's too far, the scroll\n  /// is composed into three phases:\n  ///\n  ///  1. The currently displayed list view starts scrolling.\n  ///  2. Another list view, which scrolls with the same speed, fades over the\n  ///     first one and shows items that are close to the scroll target.\n  ///  3. The second list view scrolls and stops on the target.\n  ///\n  /// The [opacityAnimationWeights] can be used to apply custom weights to these\n  /// three stages of this animation. The default weights, `[40, 20, 40]`, are\n  /// good with default [Curves.linear].  Different weights might be better for\n  /// other cases.  For example, if you use [Curves.easeOut], consider setting\n  /// [opacityAnimationWeights] to `[20, 20, 60]`.\n  ///\n  /// See [TweenSequenceItem.weight] for more info.\n  Future<void> scrollTo({\n    required int index,\n    double alignment = 0,\n    required Duration duration,\n    Curve curve = Curves.linear,\n    List<double> opacityAnimationWeights = const [40, 20, 40],\n  }) {\n    assert(_scrollableListState != null);\n    assert(opacityAnimationWeights.length == 3);\n    assert(duration > Duration.zero);\n    return _scrollableListState!._scrollTo(\n      index: index,\n      alignment: alignment,\n      duration: duration,\n      curve: curve,\n      opacityAnimationWeights: opacityAnimationWeights,\n    );\n  }\n\n  void _attach(_ScrollablePositionedListState scrollableListState) {\n    assert(_scrollableListState == null);\n    _scrollableListState = scrollableListState;\n  }\n\n  void _detach() {\n    _scrollableListState = null;\n  }\n}\n\nclass _ScrollablePositionedListState extends State<ScrollablePositionedList>\n    with TickerProviderStateMixin {\n  /// Details for the primary (active) [ListView].\n  late _ListDisplayDetails primary = _ListDisplayDetails(widget.scrollController,const ValueKey('Ping'),);\n\n  /// Details for the secondary (transitional) [ListView] that is temporarily\n  /// shown when scrolling a long distance.\n  late var secondary = _ListDisplayDetails(widget.scrollController,const ValueKey('Pong'));\n\n  final opacity = ProxyAnimation(const AlwaysStoppedAnimation<double>(0));\n\n  void Function() startAnimationCallback = () {};\n\n  bool _isTransitioning = false;\n\n  AnimationController? _animationController;\n\n  @override\n  void initState() {\n    super.initState();\n    ItemPosition? initialPosition = PageStorage.of(context).readState(context);\n    primary.target = initialPosition?.index ?? widget.initialScrollIndex;\n    primary.alignment =\n        initialPosition?.itemLeadingEdge ?? widget.initialAlignment;\n    if (widget.itemCount > 0 && primary.target > widget.itemCount - 1) {\n      primary.target = widget.itemCount - 1;\n    }\n    widget.itemScrollController?._attach(this);\n    primary.itemPositionsNotifier.itemPositions.addListener(_updatePositions);\n    secondary.itemPositionsNotifier.itemPositions.addListener(_updatePositions);\n  }\n\n  @override\n  void deactivate() {\n    widget.itemScrollController?._detach();\n    super.deactivate();\n  }\n\n  @override\n  void dispose() {\n    primary.itemPositionsNotifier.itemPositions\n        .removeListener(_updatePositions);\n    secondary.itemPositionsNotifier.itemPositions\n        .removeListener(_updatePositions);\n    _animationController?.dispose();\n    super.dispose();\n  }\n\n  @override\n  void didUpdateWidget(ScrollablePositionedList oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.itemScrollController?._scrollableListState == this) {\n      oldWidget.itemScrollController?._detach();\n    }\n    if (widget.itemScrollController?._scrollableListState != this) {\n      widget.itemScrollController?._detach();\n      widget.itemScrollController?._attach(this);\n    }\n\n    if (widget.itemCount == 0) {\n      setState(() {\n        primary.target = 0;\n        secondary.target = 0;\n      });\n    } else {\n      if (primary.target > widget.itemCount - 1) {\n        setState(() {\n          primary.target = widget.itemCount - 1;\n        });\n      }\n      if (secondary.target > widget.itemCount - 1) {\n        setState(() {\n          secondary.target = widget.itemCount - 1;\n        });\n      }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return LayoutBuilder(\n      builder: (context, constraints) {\n        final cacheExtent = _cacheExtent(constraints);\n        return GestureDetector(\n          child: Stack(\n            children: <Widget>[\n              PostMountCallback(\n                key: primary.key,\n                callback: startAnimationCallback,\n                child: FadeTransition(\n                  opacity: ReverseAnimation(opacity),\n                  child: NotificationListener<ScrollNotification>(\n                    onNotification: (_) => _isTransitioning,\n                    child: PositionedList(\n                      itemBuilder: widget.itemBuilder,\n                      separatorBuilder: widget.separatorBuilder,\n                      itemCount: widget.itemCount,\n                      positionedIndex: primary.target,\n                      controller: primary.scrollController,\n                      itemPositionsNotifier: primary.itemPositionsNotifier,\n                      scrollDirection: widget.scrollDirection,\n                      reverse: widget.reverse,\n                      cacheExtent: cacheExtent,\n                      alignment: primary.alignment,\n                      physics: widget.physics,\n                      shrinkWrap: widget.shrinkWrap,\n                      addSemanticIndexes: widget.addSemanticIndexes,\n                      semanticChildCount: widget.semanticChildCount,\n                      padding: widget.padding,\n                      addAutomaticKeepAlives: widget.addAutomaticKeepAlives,\n                      addRepaintBoundaries: widget.addRepaintBoundaries,\n                      scrollBehavior: widget.scrollBehavior,\n                    ),\n                  ),\n                ),\n              ),\n              if (_isTransitioning)\n                PostMountCallback(\n                  key: secondary.key,\n                  callback: startAnimationCallback,\n                  child: FadeTransition(\n                    opacity: opacity,\n                    child: NotificationListener<ScrollNotification>(\n                      onNotification: (_) => false,\n                      child: PositionedList(\n                        itemBuilder: widget.itemBuilder,\n                        separatorBuilder: widget.separatorBuilder,\n                        itemCount: widget.itemCount,\n                        itemPositionsNotifier: secondary.itemPositionsNotifier,\n                        positionedIndex: secondary.target,\n                        controller: secondary.scrollController,\n                        scrollDirection: widget.scrollDirection,\n                        reverse: widget.reverse,\n                        cacheExtent: cacheExtent,\n                        alignment: secondary.alignment,\n                        physics: widget.physics,\n                        shrinkWrap: widget.shrinkWrap,\n                        addSemanticIndexes: widget.addSemanticIndexes,\n                        semanticChildCount: widget.semanticChildCount,\n                        padding: widget.padding,\n                        addAutomaticKeepAlives: widget.addAutomaticKeepAlives,\n                        addRepaintBoundaries: widget.addRepaintBoundaries,\n                        scrollBehavior: widget.scrollBehavior,\n                      ),\n                    ),\n                  ),\n                ),\n            ],\n          ),\n        );\n      },\n    );\n  }\n\n  double _cacheExtent(BoxConstraints constraints) => max(\n        constraints.maxHeight * _screenScrollCount,\n        widget.minCacheExtent ?? 0,\n      );\n\n  void _jumpTo({required int index, required double alignment}) {\n    _stopScroll(canceled: true);\n    if (index > widget.itemCount - 1) {\n      index = widget.itemCount - 1;\n    }\n    setState(() {\n      primary.scrollController.jumpTo(0);\n      primary.target = index;\n      primary.alignment = alignment;\n    });\n  }\n\n  Future<void> _scrollTo({\n    required int index,\n    required double alignment,\n    required Duration duration,\n    Curve curve = Curves.linear,\n    required List<double> opacityAnimationWeights,\n  }) async {\n    if (index > widget.itemCount - 1) {\n      index = widget.itemCount - 1;\n    }\n    if (_isTransitioning) {\n      _stopScroll(canceled: true);\n      SchedulerBinding.instance.addPostFrameCallback((_) {\n        _startScroll(\n          index: index,\n          alignment: alignment,\n          duration: duration,\n          curve: curve,\n          opacityAnimationWeights: opacityAnimationWeights,\n        );\n      });\n    } else {\n      await _startScroll(\n        index: index,\n        alignment: alignment,\n        duration: duration,\n        curve: curve,\n        opacityAnimationWeights: opacityAnimationWeights,\n      );\n    }\n  }\n\n  Future<void> _startScroll({\n    required int index,\n    required double alignment,\n    required Duration duration,\n    Curve curve = Curves.linear,\n    required List<double> opacityAnimationWeights,\n  }) async {\n    final direction = index > primary.target ? 1 : -1;\n    final itemPosition = primary.itemPositionsNotifier.itemPositions.value\n        .firstWhereOrNull(\n            (ItemPosition itemPosition) => itemPosition.index == index);\n    if (itemPosition != null) {\n      // Scroll directly.\n      final localScrollAmount = itemPosition.itemLeadingEdge *\n          primary.scrollController.position.viewportDimension;\n      await primary.scrollController.animateTo(\n          primary.scrollController.offset +\n              localScrollAmount -\n              alignment * primary.scrollController.position.viewportDimension,\n          duration: duration,\n          curve: curve);\n    } else {\n      final scrollAmount = _screenScrollCount *\n          primary.scrollController.position.viewportDimension;\n      final startCompleter = Completer<void>();\n      final endCompleter = Completer<void>();\n      startAnimationCallback = () {\n        SchedulerBinding.instance.addPostFrameCallback((_) {\n          startAnimationCallback = () {};\n          _animationController?.dispose();\n          _animationController =\n              AnimationController(vsync: this, duration: duration)..forward();\n          opacity.parent = _opacityAnimation(opacityAnimationWeights)\n              .animate(_animationController!);\n          secondary.scrollController.jumpTo(-direction *\n              (_screenScrollCount *\n                      primary.scrollController.position.viewportDimension -\n                  alignment *\n                      secondary.scrollController.position.viewportDimension));\n\n          startCompleter.complete(primary.scrollController.animateTo(\n              primary.scrollController.offset + direction * scrollAmount,\n              duration: duration,\n              curve: curve));\n          endCompleter.complete(secondary.scrollController\n              .animateTo(0, duration: duration, curve: curve));\n        });\n      };\n      setState(() {\n        secondary.target = index;\n        secondary.alignment = alignment;\n        _isTransitioning = true;\n      });\n      await Future.wait<void>([startCompleter.future, endCompleter.future]);\n      _stopScroll();\n    }\n  }\n\n  void _stopScroll({bool canceled = false}) {\n    if (!_isTransitioning) {\n      return;\n    }\n\n    if (canceled) {\n      if (primary.scrollController.hasClients) {\n        primary.scrollController.jumpTo(primary.scrollController.offset);\n      }\n      if (secondary.scrollController.hasClients) {\n        secondary.scrollController.jumpTo(secondary.scrollController.offset);\n      }\n    }\n\n    if (mounted) {\n      setState(() {\n        if (opacity.value >= 0.5) {\n          // Secondary [ListView] is more visible than the primary; make it the\n          // new primary.\n          var temp = primary;\n          primary = secondary;\n          secondary = temp;\n        }\n        _isTransitioning = false;\n        opacity.parent = const AlwaysStoppedAnimation<double>(0);\n      });\n    }\n  }\n\n  Animatable<double> _opacityAnimation(List<double> opacityAnimationWeights) {\n    const startOpacity = 0.0;\n    const endOpacity = 1.0;\n    return TweenSequence<double>(<TweenSequenceItem<double>>[\n      TweenSequenceItem<double>(\n          tween: ConstantTween<double>(startOpacity),\n          weight: opacityAnimationWeights[0]),\n      TweenSequenceItem<double>(\n          tween: Tween<double>(begin: startOpacity, end: endOpacity),\n          weight: opacityAnimationWeights[1]),\n      TweenSequenceItem<double>(\n          tween: ConstantTween<double>(endOpacity),\n          weight: opacityAnimationWeights[2]),\n    ]);\n  }\n\n  void _updatePositions() {\n    final itemPositions = primary.itemPositionsNotifier.itemPositions.value\n        .where((ItemPosition position) =>\n            position.itemLeadingEdge < 1 && position.itemTrailingEdge > 0);\n    if (itemPositions.isNotEmpty) {\n      PageStorage.of(context).writeState(\n          context,\n          itemPositions.reduce((value, element) =>\n              value.itemLeadingEdge < element.itemLeadingEdge\n                  ? value\n                  : element));\n    }\n    widget.itemPositionsNotifier?.itemPositions.value = itemPositions;\n  }\n}\n\nclass _ListDisplayDetails {\n  _ListDisplayDetails(this.scrollController,this.key);\n\n  final itemPositionsNotifier = ItemPositionsNotifier();\n  final ScrollController scrollController;\n\n  /// The index of the item to scroll to.\n  int target = 0;\n\n  /// The desired alignment for [target].\n  ///\n  /// See [ItemScrollController.jumpTo] for an explanation of alignment.\n  double alignment = 0;\n\n  final Key key;\n}\n"
  },
  {
    "path": "lib/components/scrollable_list/src/viewport.dart",
    "content": "// Copyright 2019 The Fuchsia Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:math' as math;\n\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/widgets.dart';\n\n/// A render object that is bigger on the inside.\n///\n/// Version of [Viewport] with some modifications to how extents are\n/// computed to allow scroll extents outside 0 to 1.  See [Viewport]\n/// for more information.\nclass UnboundedViewport extends Viewport {\n  UnboundedViewport({\n    Key? key,\n    AxisDirection axisDirection = AxisDirection.down,\n    AxisDirection? crossAxisDirection,\n    double anchor = 0.0,\n    required ViewportOffset offset,\n    Key? center,\n    double? cacheExtent,\n    List<Widget> slivers = const <Widget>[],\n  })  : _anchor = anchor,\n        super(\n            key: key,\n            axisDirection: axisDirection,\n            crossAxisDirection: crossAxisDirection,\n            offset: offset,\n            center: center,\n            cacheExtent: cacheExtent,\n            slivers: slivers);\n\n  // [Viewport] enforces constraints on [Viewport.anchor], so we need our own\n  // version.\n  final double _anchor;\n\n  @override\n  double get anchor => _anchor;\n\n  @override\n  RenderViewport createRenderObject(BuildContext context) {\n    return UnboundedRenderViewport(\n      axisDirection: axisDirection,\n      crossAxisDirection: crossAxisDirection ??\n          Viewport.getDefaultCrossAxisDirection(context, axisDirection),\n      anchor: anchor,\n      offset: offset,\n      cacheExtent: cacheExtent,\n    );\n  }\n}\n\n/// A render object that is bigger on the inside.\n///\n/// Version of [RenderViewport] with some modifications to how extents are\n/// computed to allow scroll extents outside 0 to 1.  See [RenderViewport]\n/// for more information.\n///\n// Differences from [RenderViewport] are marked with a //***** Differences\n// comment.\nclass UnboundedRenderViewport extends RenderViewport {\n  /// Creates a viewport for [RenderSliver] objects.\n  UnboundedRenderViewport({\n    AxisDirection axisDirection = AxisDirection.down,\n    required AxisDirection crossAxisDirection,\n    required ViewportOffset offset,\n    double anchor = 0.0,\n    List<RenderSliver>? children,\n    RenderSliver? center,\n    double? cacheExtent,\n  })  : _anchor = anchor,\n        super(\n            axisDirection: axisDirection,\n            crossAxisDirection: crossAxisDirection,\n            offset: offset,\n            center: center,\n            cacheExtent: cacheExtent,\n            children: children);\n\n  static const int _maxLayoutCycles = 10;\n\n  double _anchor;\n\n  // Out-of-band data computed during layout.\n  late double _minScrollExtent;\n  late double _maxScrollExtent;\n  bool _hasVisualOverflow = false;\n\n  /// This value is set during layout based on the [CacheExtentStyle].\n  ///\n  /// When the style is [CacheExtentStyle.viewport], it is the main axis extent\n  /// of the viewport multiplied by the requested cache extent, which is still\n  /// expressed in pixels.\n  double? _calculatedCacheExtent;\n\n  @override\n  double get anchor => _anchor;\n\n  @override\n  set anchor(double value) {\n    if (value == _anchor) return;\n    _anchor = value;\n    markNeedsLayout();\n  }\n\n  @override\n  void performResize() {\n    super.performResize();\n    // TODO: Figure out why this override is needed as a result of\n    // https://github.com/flutter/flutter/pull/61973 and see if it can be\n    // removed somehow.\n    switch (axis) {\n      case Axis.vertical:\n        offset.applyViewportDimension(size.height);\n        break;\n      case Axis.horizontal:\n        offset.applyViewportDimension(size.width);\n        break;\n    }\n  }\n\n  @override\n  Rect describeSemanticsClip(RenderSliver? child) {\n\n    if (_calculatedCacheExtent == null) {\n      return semanticBounds;\n    }\n\n    switch (axis) {\n      case Axis.vertical:\n        return Rect.fromLTRB(\n          semanticBounds.left,\n          semanticBounds.top - _calculatedCacheExtent!,\n          semanticBounds.right,\n          semanticBounds.bottom + _calculatedCacheExtent!,\n        );\n      default:\n        return Rect.fromLTRB(\n          semanticBounds.left - _calculatedCacheExtent!,\n          semanticBounds.top,\n          semanticBounds.right + _calculatedCacheExtent!,\n          semanticBounds.bottom,\n        );\n    }\n  }\n\n  @override\n  void performLayout() {\n    if (center == null) {\n      assert(firstChild == null);\n      _minScrollExtent = 0.0;\n      _maxScrollExtent = 0.0;\n      _hasVisualOverflow = false;\n      offset.applyContentDimensions(0.0, 0.0);\n      return;\n    }\n    assert(center!.parent == this);\n\n    late double mainAxisExtent;\n    late double crossAxisExtent;\n    switch (axis) {\n      case Axis.vertical:\n        mainAxisExtent = size.height;\n        crossAxisExtent = size.width;\n        break;\n      case Axis.horizontal:\n        mainAxisExtent = size.width;\n        crossAxisExtent = size.height;\n        break;\n    }\n\n    final centerOffsetAdjustment = center!.centerOffsetAdjustment;\n\n    double correction;\n    var count = 0;\n    do {\n      correction = _attemptLayout(mainAxisExtent, crossAxisExtent,\n          offset.pixels + centerOffsetAdjustment);\n      if (correction != 0.0) {\n        offset.correctBy(correction);\n      } else {\n        // *** Difference from [RenderViewport].\n        final top = _minScrollExtent + mainAxisExtent * anchor;\n        final bottom = _maxScrollExtent - mainAxisExtent * (1.0 - anchor);\n        final maxScrollOffset = math.max(math.min(0.0, top), bottom);\n        final minScrollOffset = math.min(top, maxScrollOffset);\n        if (offset.applyContentDimensions(minScrollOffset, maxScrollOffset)) {\n          break;\n        }\n        // *** End of difference from [RenderViewport].\n      }\n      count += 1;\n    } while (count < _maxLayoutCycles);\n    assert(() {\n      if (count >= _maxLayoutCycles) {\n        assert(count != 1);\n        throw FlutterError(\n            'A RenderViewport exceeded its maximum number of layout cycles.\\n'\n            'RenderViewport render objects, during layout, can retry if either their '\n            'slivers or their ViewportOffset decide that the offset should be corrected '\n            'to take into account information collected during that layout.\\n'\n            'In the case of this RenderViewport object, however, this happened $count '\n            'times and still there was no consensus on the scroll offset. This usually '\n            'indicates a bug. Specifically, it means that one of the following three '\n            'problems is being experienced by the RenderViewport object:\\n'\n            ' * One of the RenderSliver children or the ViewportOffset have a bug such'\n            ' that they always think that they need to correct the offset regardless.\\n'\n            ' * Some combination of the RenderSliver children and the ViewportOffset'\n            ' have a bad interaction such that one applies a correction then another'\n            ' applies a reverse correction, leading to an infinite loop of corrections.\\n'\n            ' * There is a pathological case that would eventually resolve, but it is'\n            ' so complicated that it cannot be resolved in any reasonable number of'\n            ' layout passes.');\n      }\n      return true;\n    }());\n  }\n\n  double _attemptLayout(\n      double mainAxisExtent, double crossAxisExtent, double correctedOffset) {\n    assert(!mainAxisExtent.isNaN);\n    assert(mainAxisExtent >= 0.0);\n    assert(crossAxisExtent.isFinite);\n    assert(crossAxisExtent >= 0.0);\n    assert(correctedOffset.isFinite);\n    _minScrollExtent = 0.0;\n    _maxScrollExtent = 0.0;\n    _hasVisualOverflow = false;\n\n    // centerOffset is the offset from the leading edge of the RenderViewport\n    // to the zero scroll offset (the line between the forward slivers and the\n    // reverse slivers).\n    final double centerOffset = mainAxisExtent * anchor - correctedOffset;\n    final double reverseDirectionRemainingPaintExtent =\n        centerOffset.clamp(0.0, mainAxisExtent);\n    final double forwardDirectionRemainingPaintExtent =\n        (mainAxisExtent - centerOffset).clamp(0.0, mainAxisExtent);\n\n    switch (cacheExtentStyle) {\n      case CacheExtentStyle.pixel:\n        _calculatedCacheExtent = cacheExtent;\n        break;\n      case CacheExtentStyle.viewport:\n        _calculatedCacheExtent = mainAxisExtent * cacheExtent!;\n        break;\n    }\n\n    final double fullCacheExtent = mainAxisExtent + 2 * _calculatedCacheExtent!;\n    final double centerCacheOffset = centerOffset + _calculatedCacheExtent!;\n    final double reverseDirectionRemainingCacheExtent =\n        centerCacheOffset.clamp(0.0, fullCacheExtent);\n    final double forwardDirectionRemainingCacheExtent =\n        (fullCacheExtent - centerCacheOffset).clamp(0.0, fullCacheExtent);\n\n    final RenderSliver? leadingNegativeChild = childBefore(center!);\n\n    if (leadingNegativeChild != null) {\n      // negative scroll offsets\n      final double result = layoutChildSequence(\n        child: leadingNegativeChild,\n        scrollOffset: math.max(mainAxisExtent, centerOffset) - mainAxisExtent,\n        overlap: 0.0,\n        layoutOffset: forwardDirectionRemainingPaintExtent,\n        remainingPaintExtent: reverseDirectionRemainingPaintExtent,\n        mainAxisExtent: mainAxisExtent,\n        crossAxisExtent: crossAxisExtent,\n        growthDirection: GrowthDirection.reverse,\n        advance: childBefore,\n        remainingCacheExtent: reverseDirectionRemainingCacheExtent,\n        cacheOrigin: (mainAxisExtent - centerOffset)\n            .clamp(-_calculatedCacheExtent!, 0.0),\n      );\n      if (result != 0.0) return -result;\n    }\n\n    // positive scroll offsets\n    return layoutChildSequence(\n      child: center,\n      scrollOffset: math.max(0.0, -centerOffset),\n      overlap:\n          leadingNegativeChild == null ? math.min(0.0, -centerOffset) : 0.0,\n      layoutOffset: centerOffset >= mainAxisExtent\n          ? centerOffset\n          : reverseDirectionRemainingPaintExtent,\n      remainingPaintExtent: forwardDirectionRemainingPaintExtent,\n      mainAxisExtent: mainAxisExtent,\n      crossAxisExtent: crossAxisExtent,\n      growthDirection: GrowthDirection.forward,\n      advance: childAfter,\n      remainingCacheExtent: forwardDirectionRemainingCacheExtent,\n      cacheOrigin: centerOffset.clamp(-_calculatedCacheExtent!, 0.0),\n    );\n  }\n\n  @override\n  bool get hasVisualOverflow => _hasVisualOverflow;\n\n  @override\n  void updateOutOfBandData(\n      GrowthDirection growthDirection, SliverGeometry childLayoutGeometry) {\n    switch (growthDirection) {\n      case GrowthDirection.forward:\n        _maxScrollExtent += childLayoutGeometry.scrollExtent;\n        break;\n      case GrowthDirection.reverse:\n        _minScrollExtent -= childLayoutGeometry.scrollExtent;\n        break;\n    }\n    if (childLayoutGeometry.hasVisualOverflow) _hasVisualOverflow = true;\n  }\n}\n"
  },
  {
    "path": "lib/components/scrollable_list/src/wrapping.dart",
    "content": "import 'dart:math' as math;\n\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/widgets.dart';\n\n/// A widget that is bigger on the inside and shrink wraps its children in the\n/// main axis.\n///\n/// [ShrinkWrappingViewport] displays a subset of its children according to its\n/// own dimensions and the given [offset]. As the offset varies, different\n/// children are visible through the viewport.\n///\n/// [ShrinkWrappingViewport] differs from [Viewport] in that [Viewport] expands\n/// to fill the main axis whereas [ShrinkWrappingViewport] sizes itself to match\n/// its children in the main axis. This shrink wrapping behavior is expensive\n/// because the children, and hence the viewport, could potentially change size\n/// whenever the [offset] changes (e.g., because of a collapsing header).\n///\n/// [ShrinkWrappingViewport] cannot contain box children directly. Instead, use\n/// a [SliverList], [SliverFixedExtentList], [SliverGrid], or a\n/// [SliverToBoxAdapter], for example.\n///\n/// See also:\n///\n///  * [ListView], [PageView], [GridView], and [CustomScrollView], which combine\n///    [Scrollable] and [ShrinkWrappingViewport] into widgets that are easier to\n///    use.\n///  * [SliverToBoxAdapter], which allows a box widget to be placed inside a\n///    sliver context (the opposite of this widget).\n///  * [Viewport], a viewport that does not shrink-wrap its contents.\nclass CustomShrinkWrappingViewport extends CustomViewport {\n  /// Creates a widget that is bigger on the inside and shrink wraps its\n  /// children in the main axis.\n  ///\n  /// The viewport listens to the [offset], which means you do not need to\n  /// rebuild this widget when the [offset] changes.\n  ///\n  /// The [offset] argument must not be null.\n  CustomShrinkWrappingViewport({\n    Key? key,\n    AxisDirection axisDirection = AxisDirection.down,\n    AxisDirection? crossAxisDirection,\n    double anchor = 0.0,\n    required ViewportOffset offset,\n    List<RenderSliver>? children,\n    Key? center,\n    double? cacheExtent,\n    List<Widget> slivers = const <Widget>[],\n  })  : _anchor = anchor,\n        super(\n            key: key,\n            axisDirection: axisDirection,\n            crossAxisDirection: crossAxisDirection,\n            offset: offset,\n            center: center,\n            cacheExtent: cacheExtent,\n            slivers: slivers);\n\n  // [Viewport] enforces constraints on [Viewport.anchor], so we need our own\n  // version.\n  final double _anchor;\n\n  @override\n  double get anchor => _anchor;\n\n  @override\n  CustomRenderShrinkWrappingViewport createRenderObject(BuildContext context) {\n    return CustomRenderShrinkWrappingViewport(\n      axisDirection: axisDirection,\n      crossAxisDirection: crossAxisDirection ??\n          Viewport.getDefaultCrossAxisDirection(context, axisDirection),\n      offset: offset,\n      anchor: anchor,\n      cacheExtent: cacheExtent,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n      BuildContext context, CustomRenderShrinkWrappingViewport renderObject) {\n    renderObject\n      ..axisDirection = axisDirection\n      ..crossAxisDirection = crossAxisDirection ??\n          Viewport.getDefaultCrossAxisDirection(context, axisDirection)\n      ..anchor = anchor\n      ..offset = offset\n      ..cacheExtent = cacheExtent\n      ..cacheExtentStyle = cacheExtentStyle\n      ..clipBehavior = clipBehavior;\n  }\n}\n\n/// A render object that is bigger on the inside and shrink wraps its children\n/// in the main axis.\n///\n/// [RenderShrinkWrappingViewport] displays a subset of its children according\n/// to its own dimensions and the given [offset]. As the offset varies, different\n/// children are visible through the viewport.\n///\n/// [RenderShrinkWrappingViewport] differs from [RenderViewport] in that\n/// [RenderViewport] expands to fill the main axis whereas\n/// [RenderShrinkWrappingViewport] sizes itself to match its children in the\n/// main axis. This shrink wrapping behavior is expensive because the children,\n/// and hence the viewport, could potentially change size whenever the [offset]\n/// changes (e.g., because of a collapsing header).\n///\n/// [RenderShrinkWrappingViewport] cannot contain [RenderBox] children directly.\n/// Instead, use a [RenderSliverList], [RenderSliverFixedExtentList],\n/// [RenderSliverGrid], or a [RenderSliverToBoxAdapter], for example.\n///\n/// See also:\n///\n///  * [RenderViewport], a viewport that does not shrink-wrap its contents.\n///  * [RenderSliver], which explains more about the Sliver protocol.\n///  * [RenderBox], which explains more about the Box protocol.\n///  * [RenderSliverToBoxAdapter], which allows a [RenderBox] object to be\n///    placed inside a [RenderSliver] (the opposite of this class).\nclass CustomRenderShrinkWrappingViewport extends CustomRenderViewport {\n  /// Creates a viewport (for [RenderSliver] objects) that shrink-wraps its\n  /// contents.\n  ///\n  /// The [offset] must be specified. For testing purposes, consider passing a\n  /// [ViewportOffset.zero] or [ViewportOffset.fixed].\n  CustomRenderShrinkWrappingViewport({\n    AxisDirection axisDirection = AxisDirection.down,\n    required AxisDirection crossAxisDirection,\n    required ViewportOffset offset,\n    double anchor = 0.0,\n    List<RenderSliver>? children,\n    RenderSliver? center,\n    double? cacheExtent,\n  })  : _anchor = anchor,\n        super(\n          axisDirection: axisDirection,\n          crossAxisDirection: crossAxisDirection,\n          offset: offset,\n          center: center,\n          cacheExtent: cacheExtent,\n          children: children,\n        );\n\n  double _anchor;\n\n  @override\n  double get anchor => _anchor;\n\n  @override\n  bool get sizedByParent => false;\n\n  double lastMainAxisExtent = -1;\n\n  @override\n  set anchor(double value) {\n    if (value == _anchor) return;\n    _anchor = value;\n    markNeedsLayout();\n  }\n\n  late double _shrinkWrapExtent;\n\n  /// This value is set during layout based on the [CacheExtentStyle].\n  ///\n  /// When the style is [CacheExtentStyle.viewport], it is the main axis extent\n  /// of the viewport multiplied by the requested cache extent, which is still\n  /// expressed in pixels.\n  double? _calculatedCacheExtent;\n\n  /// While List in a wrapping container, eg. ListView，the mainAxisExtent will\n  /// be infinite. This time need to change mainAxisExtent to this value.\n  final double _maxMainAxisExtent = double.maxFinite;\n\n  @override\n  void performLayout() {\n    if (center == null) {\n      assert(firstChild == null);\n      _minScrollExtent = 0.0;\n      _maxScrollExtent = 0.0;\n      _hasVisualOverflow = false;\n      offset.applyContentDimensions(0.0, 0.0);\n      return;\n    }\n\n    assert(center!.parent == this);\n\n    final BoxConstraints constraints = this.constraints;\n    if (firstChild == null) {\n      switch (axis) {\n        case Axis.vertical:\n          assert(constraints.hasBoundedWidth);\n          size = Size(constraints.maxWidth, constraints.minHeight);\n          break;\n        case Axis.horizontal:\n          assert(constraints.hasBoundedHeight);\n          size = Size(constraints.minWidth, constraints.maxHeight);\n          break;\n      }\n      offset.applyViewportDimension(0.0);\n      _maxScrollExtent = 0.0;\n      _shrinkWrapExtent = 0.0;\n      _hasVisualOverflow = false;\n      offset.applyContentDimensions(0.0, 0.0);\n      return;\n    }\n\n    double mainAxisExtent;\n    final double crossAxisExtent;\n    switch (axis) {\n      case Axis.vertical:\n        assert(constraints.hasBoundedWidth);\n        mainAxisExtent = constraints.maxHeight;\n        crossAxisExtent = constraints.maxWidth;\n        break;\n      case Axis.horizontal:\n        assert(constraints.hasBoundedHeight);\n        mainAxisExtent = constraints.maxWidth;\n        crossAxisExtent = constraints.maxHeight;\n        break;\n    }\n\n    if (mainAxisExtent.isInfinite) {\n      mainAxisExtent = _maxMainAxisExtent;\n    }\n\n    final centerOffsetAdjustment = center!.centerOffsetAdjustment;\n\n    double correction;\n    double effectiveExtent;\n    do {\n      correction = _attemptLayout(mainAxisExtent, crossAxisExtent,\n          offset.pixels + centerOffsetAdjustment);\n      if (correction != 0.0) {\n        offset.correctBy(correction);\n      } else {\n        switch (axis) {\n          case Axis.vertical:\n            effectiveExtent = constraints.constrainHeight(_shrinkWrapExtent);\n            break;\n          case Axis.horizontal:\n            effectiveExtent = constraints.constrainWidth(_shrinkWrapExtent);\n            break;\n        }\n        // *** Difference from [RenderViewport].\n        final top = _minScrollExtent + mainAxisExtent * anchor;\n        final bottom = _maxScrollExtent - mainAxisExtent * (1.0 - anchor);\n\n        final maxScrollOffset = math.max(math.min(0.0, top), bottom);\n        final minScrollOffset = math.min(top, maxScrollOffset);\n\n        final bool didAcceptViewportDimension =\n            offset.applyViewportDimension(effectiveExtent);\n        final bool didAcceptContentDimension =\n            offset.applyContentDimensions(minScrollOffset, maxScrollOffset);\n        if (didAcceptViewportDimension && didAcceptContentDimension) {\n          break;\n        }\n      }\n    } while (true);\n    switch (axis) {\n      case Axis.vertical:\n        size =\n            constraints.constrainDimensions(crossAxisExtent, effectiveExtent);\n        break;\n      case Axis.horizontal:\n        size =\n            constraints.constrainDimensions(effectiveExtent, crossAxisExtent);\n        break;\n    }\n  }\n\n  double _attemptLayout(\n      double mainAxisExtent, double crossAxisExtent, double correctedOffset) {\n    assert(!mainAxisExtent.isNaN);\n    assert(mainAxisExtent >= 0.0);\n    assert(crossAxisExtent.isFinite);\n    assert(crossAxisExtent >= 0.0);\n    assert(correctedOffset.isFinite);\n    _minScrollExtent = 0.0;\n    _maxScrollExtent = 0.0;\n    _hasVisualOverflow = false;\n    _shrinkWrapExtent = 0.0;\n\n    // centerOffset is the offset from the leading edge of the RenderViewport\n    // to the zero scroll offset (the line between the forward slivers and the\n    // reverse slivers).\n    final centerOffset = mainAxisExtent * anchor - correctedOffset;\n    final reverseDirectionRemainingPaintExtent =\n        centerOffset.clamp(0.0, mainAxisExtent);\n    final forwardDirectionRemainingPaintExtent =\n        (mainAxisExtent - centerOffset).clamp(0.0, mainAxisExtent);\n\n    switch (cacheExtentStyle) {\n      case CacheExtentStyle.pixel:\n        _calculatedCacheExtent = cacheExtent;\n        break;\n      case CacheExtentStyle.viewport:\n        _calculatedCacheExtent = mainAxisExtent * cacheExtent!;\n        break;\n    }\n\n    final fullCacheExtent = mainAxisExtent + 2 * _calculatedCacheExtent!;\n    final centerCacheOffset = centerOffset + _calculatedCacheExtent!;\n    final reverseDirectionRemainingCacheExtent =\n        centerCacheOffset.clamp(0.0, fullCacheExtent);\n    final forwardDirectionRemainingCacheExtent =\n        (fullCacheExtent - centerCacheOffset).clamp(0.0, fullCacheExtent);\n\n    final leadingNegativeChild = childBefore(center!);\n\n    if (leadingNegativeChild != null) {\n      // negative scroll offsets\n      final result = layoutChildSequence(\n        child: leadingNegativeChild,\n        scrollOffset: math.max(mainAxisExtent, centerOffset) - mainAxisExtent,\n        overlap: 0.0,\n        layoutOffset: forwardDirectionRemainingPaintExtent,\n        remainingPaintExtent: reverseDirectionRemainingPaintExtent,\n        mainAxisExtent: mainAxisExtent,\n        crossAxisExtent: crossAxisExtent,\n        growthDirection: GrowthDirection.reverse,\n        advance: childBefore,\n        remainingCacheExtent: reverseDirectionRemainingCacheExtent,\n        cacheOrigin: (mainAxisExtent - centerOffset)\n            .clamp(-_calculatedCacheExtent!, 0.0),\n      );\n      if (result != 0.0) return -result;\n    }\n\n    // positive scroll offsets\n    return layoutChildSequence(\n      child: center,\n      scrollOffset: math.max(0.0, -centerOffset),\n      overlap:\n          leadingNegativeChild == null ? math.min(0.0, -centerOffset) : 0.0,\n      layoutOffset: centerOffset >= mainAxisExtent\n          ? centerOffset\n          : reverseDirectionRemainingPaintExtent,\n      remainingPaintExtent: forwardDirectionRemainingPaintExtent,\n      mainAxisExtent: mainAxisExtent,\n      crossAxisExtent: crossAxisExtent,\n      growthDirection: GrowthDirection.forward,\n      advance: childAfter,\n      remainingCacheExtent: forwardDirectionRemainingCacheExtent,\n      cacheOrigin: centerOffset.clamp(-_calculatedCacheExtent!, 0.0),\n    );\n  }\n\n  @override\n  bool get hasVisualOverflow => _hasVisualOverflow;\n\n  @override\n  void updateOutOfBandData(\n      GrowthDirection growthDirection, SliverGeometry childLayoutGeometry) {\n    switch (growthDirection) {\n      case GrowthDirection.forward:\n        _maxScrollExtent += childLayoutGeometry.scrollExtent;\n        break;\n      case GrowthDirection.reverse:\n        _minScrollExtent -= childLayoutGeometry.scrollExtent;\n        break;\n    }\n    if (childLayoutGeometry.hasVisualOverflow) _hasVisualOverflow = true;\n    _shrinkWrapExtent += childLayoutGeometry.maxPaintExtent;\n    growSize = _shrinkWrapExtent;\n  }\n\n  @override\n  String labelForChild(int index) => 'child $index';\n}\n\n/// A widget that is bigger on the inside.\n///\n/// [Viewport] is the visual workhorse of the scrolling machinery. It displays a\n/// subset of its children according to its own dimensions and the given\n/// [offset]. As the offset varies, different children are visible through\n/// the viewport.\n///\n/// [Viewport] hosts a bidirectional list of slivers, anchored on a [center]\n/// sliver, which is placed at the zero scroll offset. The center widget is\n/// displayed in the viewport according to the [anchor] property.\n///\n/// Slivers that are earlier in the child list than [center] are displayed in\n/// reverse order in the reverse [axisDirection] starting from the [center]. For\n/// example, if the [axisDirection] is [AxisDirection.down], the first sliver\n/// before [center] is placed above the [center]. The slivers that are later in\n/// the child list than [center] are placed in order in the [axisDirection]. For\n/// example, in the preceding scenario, the first sliver after [center] is\n/// placed below the [center].\n///\n/// [Viewport] cannot contain box children directly. Instead, use a\n/// [SliverList], [SliverFixedExtentList], [SliverGrid], or a\n/// [SliverToBoxAdapter], for example.\n///\n/// See also:\n///\n///  * [ListView], [PageView], [GridView], and [CustomScrollView], which combine\n///    [Scrollable] and [Viewport] into widgets that are easier to use.\n///  * [SliverToBoxAdapter], which allows a box widget to be placed inside a\n///    sliver context (the opposite of this widget).\n///  * [ShrinkWrappingViewport], a variant of [Viewport] that shrink-wraps its\n///    contents along the main axis.\nabstract class CustomViewport extends MultiChildRenderObjectWidget {\n  /// Creates a widget that is bigger on the inside.\n  ///\n  /// The viewport listens to the [offset], which means you do not need to\n  /// rebuild this widget when the [offset] changes.\n  ///\n  /// The [offset] argument must not be null.\n  ///\n  /// The [cacheExtent] must be specified if the [cacheExtentStyle] is\n  /// not [CacheExtentStyle.pixel].\n  CustomViewport({\n    Key? key,\n    this.axisDirection = AxisDirection.down,\n    this.crossAxisDirection,\n    this.anchor = 0.0,\n    required this.offset,\n    this.center,\n    this.cacheExtent,\n    this.cacheExtentStyle = CacheExtentStyle.pixel,\n    this.clipBehavior = Clip.hardEdge,\n    List<Widget> slivers = const <Widget>[],\n  })  : assert(center == null ||\n            slivers.where((Widget child) => child.key == center).length == 1),\n        assert(cacheExtentStyle != CacheExtentStyle.viewport ||\n            cacheExtent != null),\n        super(key: key, children: slivers);\n\n  /// The direction in which the [offset]'s [ViewportOffset.pixels] increases.\n  ///\n  /// For example, if the [axisDirection] is [AxisDirection.down], a scroll\n  /// offset of zero is at the top of the viewport and increases towards the\n  /// bottom of the viewport.\n  final AxisDirection axisDirection;\n\n  /// The direction in which child should be laid out in the cross axis.\n  ///\n  /// If the [axisDirection] is [AxisDirection.down] or [AxisDirection.up], this\n  /// property defaults to [AxisDirection.left] if the ambient [Directionality]\n  /// is [TextDirection.rtl] and [AxisDirection.right] if the ambient\n  /// [Directionality] is [TextDirection.ltr].\n  ///\n  /// If the [axisDirection] is [AxisDirection.left] or [AxisDirection.right],\n  /// this property defaults to [AxisDirection.down].\n  final AxisDirection? crossAxisDirection;\n\n  /// The relative position of the zero scroll offset.\n  ///\n  /// For example, if [anchor] is 0.5 and the [axisDirection] is\n  /// [AxisDirection.down] or [AxisDirection.up], then the zero scroll offset is\n  /// vertically centered within the viewport. If the [anchor] is 1.0, and the\n  /// [axisDirection] is [AxisDirection.right], then the zero scroll offset is\n  /// on the left edge of the viewport.\n  final double anchor;\n\n  /// Which part of the content inside the viewport should be visible.\n  ///\n  /// The [ViewportOffset.pixels] value determines the scroll offset that the\n  /// viewport uses to select which part of its content to display. As the user\n  /// scrolls the viewport, this value changes, which changes the content that\n  /// is displayed.\n  ///\n  /// Typically a [ScrollPosition].\n  final ViewportOffset offset;\n\n  /// The first child in the [GrowthDirection.forward] growth direction.\n  ///\n  /// Children after [center] will be placed in the [axisDirection] relative to\n  /// the [center]. Children before [center] will be placed in the opposite of\n  /// the [axisDirection] relative to the [center].\n  ///\n  /// The [center] must be the key of a child of the viewport.\n  final Key? center;\n\n  /// {@macro flutter.rendering.RenderViewportBase.cacheExtent}\n  ///\n  /// See also:\n  ///\n  ///  * [cacheExtentStyle], which controls the units of the [cacheExtent].\n  final double? cacheExtent;\n\n  /// {@macro flutter.rendering.RenderViewportBase.cacheExtentStyle}\n  final CacheExtentStyle cacheExtentStyle;\n\n  /// {@macro flutter.material.Material.clipBehavior}\n  ///\n  /// Defaults to [Clip.hardEdge].\n  final Clip clipBehavior;\n\n  /// Given a [BuildContext] and an [AxisDirection], determine the correct cross\n  /// axis direction.\n  ///\n  /// This depends on the [Directionality] if the `axisDirection` is vertical;\n  /// otherwise, the default cross axis direction is downwards.\n  static AxisDirection getDefaultCrossAxisDirection(\n      BuildContext context, AxisDirection axisDirection) {\n    switch (axisDirection) {\n      case AxisDirection.up:\n        assert(debugCheckHasDirectionality(\n          context,\n          why:\n              'to determine the cross-axis direction when the viewport has an \\'up\\' axisDirection',\n          alternative:\n              'Alternatively, consider specifying the \\'crossAxisDirection\\' argument on the Viewport.',\n        ));\n        return textDirectionToAxisDirection(Directionality.of(context));\n      case AxisDirection.right:\n        return AxisDirection.down;\n      case AxisDirection.down:\n        assert(debugCheckHasDirectionality(\n          context,\n          why:\n              'to determine the cross-axis direction when the viewport has a \\'down\\' axisDirection',\n          alternative:\n              'Alternatively, consider specifying the \\'crossAxisDirection\\' argument on the Viewport.',\n        ));\n        return textDirectionToAxisDirection(Directionality.of(context));\n      case AxisDirection.left:\n        return AxisDirection.down;\n    }\n  }\n\n  @override\n  CustomRenderViewport createRenderObject(BuildContext context);\n\n  @override\n  _ViewportElement createElement() => _ViewportElement(this);\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties.add(EnumProperty<AxisDirection>('axisDirection', axisDirection));\n    properties.add(EnumProperty<AxisDirection>(\n        'crossAxisDirection', crossAxisDirection,\n        defaultValue: null));\n    properties.add(DoubleProperty('anchor', anchor));\n    properties.add(DiagnosticsProperty<ViewportOffset>('offset', offset));\n    if (center != null) {\n      properties.add(DiagnosticsProperty<Key>('center', center));\n    } else if (children.isNotEmpty && children.first.key != null) {\n      properties.add(DiagnosticsProperty<Key>('center', children.first.key,\n          tooltip: 'implicit'));\n    }\n    properties.add(DiagnosticsProperty<double>('cacheExtent', cacheExtent));\n    properties.add(DiagnosticsProperty<CacheExtentStyle>(\n        'cacheExtentStyle', cacheExtentStyle));\n  }\n}\n\nclass _ViewportElement extends MultiChildRenderObjectElement {\n  /// Creates an element that uses the given widget as its configuration.\n  _ViewportElement(CustomViewport widget) : super(widget);\n\n  @override\n  CustomViewport get widget => super.widget as CustomViewport;\n\n  @override\n  CustomRenderViewport get renderObject =>\n      super.renderObject as CustomRenderViewport;\n\n  @override\n  void mount(Element? parent, dynamic newSlot) {\n    super.mount(parent, newSlot);\n    _updateCenter();\n  }\n\n  @override\n  void update(MultiChildRenderObjectWidget newWidget) {\n    super.update(newWidget);\n    _updateCenter();\n  }\n\n  void _updateCenter() {\n    if (widget.center != null) {\n      renderObject.center = children\n          .singleWhere((Element element) => element.widget.key == widget.center)\n          .renderObject as RenderSliver?;\n    } else if (children.isNotEmpty) {\n      renderObject.center = children.first.renderObject as RenderSliver?;\n    } else {\n      renderObject.center = null;\n    }\n  }\n\n  @override\n  void debugVisitOnstageChildren(ElementVisitor visitor) {\n    children.where((Element e) {\n      final RenderSliver renderSliver = e.renderObject! as RenderSliver;\n      return renderSliver.geometry!.visible;\n    }).forEach(visitor);\n  }\n}\n\nclass CustomSliverPhysicalContainerParentData\n    extends SliverPhysicalContainerParentData {\n  /// The position of the child relative to the zero scroll offset.\n  ///\n  /// The number of pixels from from the zero scroll offset of the parent sliver\n  /// (the line at which its [SliverConstraints.scrollOffset] is zero) to the\n  /// side of the child closest to that offset. A [layoutOffset] can be null\n  /// when it cannot be determined. The value will be set after layout.\n  ///\n  /// In a typical list, this does not change as the parent is scrolled.\n  ///\n  /// Defaults to null.\n  double? layoutOffset;\n\n  GrowthDirection? growthDirection;\n}\n\n/// A render object that is bigger on the inside.\n///\n/// [RenderViewport] is the visual workhorse of the scrolling machinery. It\n/// displays a subset of its children according to its own dimensions and the\n/// given [offset]. As the offset varies, different children are visible through\n/// the viewport.\n///\n/// [RenderViewport] hosts a bidirectional list of slivers, anchored on a\n/// [center] sliver, which is placed at the zero scroll offset. The center\n/// widget is displayed in the viewport according to the [anchor] property.\n///\n/// Slivers that are earlier in the child list than [center] are displayed in\n/// reverse order in the reverse [axisDirection] starting from the [center]. For\n/// example, if the [axisDirection] is [AxisDirection.down], the first sliver\n/// before [center] is placed above the [center]. The slivers that are later in\n/// the child list than [center] are placed in order in the [axisDirection]. For\n/// example, in the preceding scenario, the first sliver after [center] is\n/// placed below the [center].\n///\n/// [RenderViewport] cannot contain [RenderBox] children directly. Instead, use\n/// a [RenderSliverList], [RenderSliverFixedExtentList], [RenderSliverGrid], or\n/// a [RenderSliverToBoxAdapter], for example.\n///\n/// See also:\n///\n///  * [RenderSliver], which explains more about the Sliver protocol.\n///  * [RenderBox], which explains more about the Box protocol.\n///  * [RenderSliverToBoxAdapter], which allows a [RenderBox] object to be\n///    placed inside a [RenderSliver] (the opposite of this class).\n///  * [RenderShrinkWrappingViewport], a variant of [RenderViewport] that\n///    shrink-wraps its contents along the main axis.\nabstract class CustomRenderViewport\n    extends RenderViewportBase<CustomSliverPhysicalContainerParentData> {\n  /// Creates a viewport for [RenderSliver] objects.\n  ///\n  /// If the [center] is not specified, then the first child in the `children`\n  /// list, if any, is used.\n  ///\n  /// The [offset] must be specified. For testing purposes, consider passing a\n  /// [ViewportOffset.zero] or [ViewportOffset.fixed].\n  CustomRenderViewport({\n    AxisDirection axisDirection = AxisDirection.down,\n    required AxisDirection crossAxisDirection,\n    required ViewportOffset offset,\n    double anchor = 0.0,\n    List<RenderSliver>? children,\n    RenderSliver? center,\n    double? cacheExtent,\n    CacheExtentStyle cacheExtentStyle = CacheExtentStyle.pixel,\n    Clip clipBehavior = Clip.hardEdge,\n  })  : assert(anchor >= 0.0 && anchor <= 1.0),\n        assert(cacheExtentStyle != CacheExtentStyle.viewport ||\n            cacheExtent != null),\n        _center = center,\n        super(\n          axisDirection: axisDirection,\n          crossAxisDirection: crossAxisDirection,\n          offset: offset,\n          cacheExtent: cacheExtent,\n          cacheExtentStyle: cacheExtentStyle,\n          clipBehavior: clipBehavior,\n        ) {\n    addAll(children);\n    if (center == null && firstChild != null) _center = firstChild;\n  }\n\n  /// If a [RenderAbstractViewport] overrides\n  /// [RenderObject.describeSemanticsConfiguration] to add the [SemanticsTag]\n  /// [useTwoPaneSemantics] to its [SemanticsConfiguration], two semantics nodes\n  /// will be used to represent the viewport with its associated scrolling\n  /// actions in the semantics tree.\n  ///\n  /// Two semantics nodes (an inner and an outer node) are necessary to exclude\n  /// certain child nodes (via the [excludeFromScrolling] tag) from the\n  /// scrollable area for semantic purposes: The [SemanticsNode]s of children\n  /// that should be excluded from scrolling will be attached to the outer node.\n  /// The semantic scrolling actions and the [SemanticsNode]s of scrollable\n  /// children will be attached to the inner node, which itself is a child of\n  /// the outer node.\n  ///\n  /// See also:\n  ///\n  /// * [RenderViewportBase.describeSemanticsConfiguration], which adds this\n  ///   tag to its [SemanticsConfiguration].\n  static const SemanticsTag useTwoPaneSemantics =\n      SemanticsTag('RenderViewport.twoPane');\n\n  /// When a top-level [SemanticsNode] below a [RenderAbstractViewport] is\n  /// tagged with [excludeFromScrolling] it will not be part of the scrolling\n  /// area for semantic purposes.\n  ///\n  /// This behavior is only active if the [RenderAbstractViewport]\n  /// tagged its [SemanticsConfiguration] with [useTwoPaneSemantics].\n  /// Otherwise, the [excludeFromScrolling] tag is ignored.\n  ///\n  /// As an example, a [RenderSliver] that stays on the screen within a\n  /// [Scrollable] even though the user has scrolled past it (e.g. a pinned app\n  /// bar) can tag its [SemanticsNode] with [excludeFromScrolling] to indicate\n  /// that it should no longer be considered for semantic actions related to\n  /// scrolling.\n  static const SemanticsTag excludeFromScrolling =\n      SemanticsTag('RenderViewport.excludeFromScrolling');\n\n  @override\n  void setupParentData(RenderObject child) {\n    if (child.parentData is! CustomSliverPhysicalContainerParentData) {\n      child.parentData = CustomSliverPhysicalContainerParentData();\n    }\n  }\n\n  /// The relative position of the zero scroll offset.\n  ///\n  /// For example, if [anchor] is 0.5 and the [axisDirection] is\n  /// [AxisDirection.down] or [AxisDirection.up], then the zero scroll offset is\n  /// vertically centered within the viewport. If the [anchor] is 1.0, and the\n  /// [axisDirection] is [AxisDirection.right], then the zero scroll offset is\n  /// on the left edge of the viewport.\n  double get anchor;\n\n  set anchor(double value);\n\n  /// The first child in the [GrowthDirection.forward] growth direction.\n  ///\n  /// This child that will be at the position defined by [anchor] when the\n  /// [ViewportOffset.pixels] of [offset] is `0`.\n  ///\n  /// Children after [center] will be placed in the [axisDirection] relative to\n  /// the [center]. Children before [center] will be placed in the opposite of\n  /// the [axisDirection] relative to the [center].\n  ///\n  /// The [center] must be a child of the viewport.\n  RenderSliver? get center => _center;\n  RenderSliver? _center;\n\n  set center(RenderSliver? value) {\n    if (value == _center) return;\n    _center = value;\n    markNeedsLayout();\n  }\n\n  @override\n  bool get sizedByParent => true;\n\n  @override\n  Size computeDryLayout(BoxConstraints constraints) {\n    assert(() {\n      if (!constraints.hasBoundedHeight || !constraints.hasBoundedWidth) {\n        switch (axis) {\n          case Axis.vertical:\n            if (!constraints.hasBoundedHeight) {\n              throw FlutterError.fromParts(<DiagnosticsNode>[\n                ErrorSummary('Vertical viewport was given unbounded height.'),\n                ErrorDescription(\n                    'Viewports expand in the scrolling direction to fill their container. '\n                    'In this case, a vertical viewport was given an unlimited amount of '\n                    'vertical space in which to expand. This situation typically happens '\n                    'when a scrollable widget is nested inside another scrollable widget.'),\n                ErrorHint(\n                    'If this widget is always nested in a scrollable widget there '\n                    'is no need to use a viewport because there will always be enough '\n                    'vertical space for the children. In this case, consider using a '\n                    'Column instead. Otherwise, consider using the \"shrinkWrap\" property '\n                    '(or a ShrinkWrappingViewport) to size the height of the viewport '\n                    'to the sum of the heights of its children.')\n              ]);\n            }\n            if (!constraints.hasBoundedWidth) {\n              throw FlutterError(\n                  'Vertical viewport was given unbounded width.\\n'\n                  'Viewports expand in the cross axis to fill their container and '\n                  'constrain their children to match their extent in the cross axis. '\n                  'In this case, a vertical viewport was given an unlimited amount of '\n                  'horizontal space in which to expand.');\n            }\n            break;\n          case Axis.horizontal:\n            if (!constraints.hasBoundedWidth) {\n              throw FlutterError.fromParts(<DiagnosticsNode>[\n                ErrorSummary('Horizontal viewport was given unbounded width.'),\n                ErrorDescription(\n                    'Viewports expand in the scrolling direction to fill their container. '\n                    'In this case, a horizontal viewport was given an unlimited amount of '\n                    'horizontal space in which to expand. This situation typically happens '\n                    'when a scrollable widget is nested inside another scrollable widget.'),\n                ErrorHint(\n                    'If this widget is always nested in a scrollable widget there '\n                    'is no need to use a viewport because there will always be enough '\n                    'horizontal space for the children. In this case, consider using a '\n                    'Row instead. Otherwise, consider using the \"shrinkWrap\" property '\n                    '(or a ShrinkWrappingViewport) to size the width of the viewport '\n                    'to the sum of the widths of its children.')\n              ]);\n            }\n            if (!constraints.hasBoundedHeight) {\n              throw FlutterError(\n                  'Horizontal viewport was given unbounded height.\\n'\n                  'Viewports expand in the cross axis to fill their container and '\n                  'constrain their children to match their extent in the cross axis. '\n                  'In this case, a horizontal viewport was given an unlimited amount of '\n                  'vertical space in which to expand.');\n            }\n            break;\n        }\n      }\n      return true;\n    }());\n    return constraints.biggest;\n  }\n\n  // Out-of-band data computed during layout.\n  late double _minScrollExtent;\n  late double _maxScrollExtent;\n  bool _hasVisualOverflow = false;\n\n  double growSize = 0;\n\n  @override\n  bool get hasVisualOverflow => _hasVisualOverflow;\n\n  @override\n  void updateOutOfBandData(\n      GrowthDirection growthDirection, SliverGeometry childLayoutGeometry) {\n    switch (growthDirection) {\n      case GrowthDirection.forward:\n        _maxScrollExtent += childLayoutGeometry.scrollExtent;\n        break;\n      case GrowthDirection.reverse:\n        _minScrollExtent -= childLayoutGeometry.scrollExtent;\n        break;\n    }\n    if (childLayoutGeometry.hasVisualOverflow) _hasVisualOverflow = true;\n  }\n\n  @override\n  void updateChildLayoutOffset(RenderSliver child, double layoutOffset,\n      GrowthDirection growthDirection) {\n    final CustomSliverPhysicalContainerParentData childParentData =\n        child.parentData! as CustomSliverPhysicalContainerParentData;\n    childParentData.layoutOffset = layoutOffset;\n    childParentData.growthDirection = growthDirection;\n  }\n\n  @override\n  Offset paintOffsetOf(RenderSliver child) {\n    final CustomSliverPhysicalContainerParentData childParentData =\n        child.parentData! as CustomSliverPhysicalContainerParentData;\n    return computeAbsolutePaintOffset(\n        child, childParentData.layoutOffset!, childParentData.growthDirection!);\n  }\n\n  @override\n  double scrollOffsetOf(RenderSliver child, double scrollOffsetWithinChild) {\n    assert(child.parent == this);\n    final GrowthDirection growthDirection = child.constraints.growthDirection;\n    switch (growthDirection) {\n      case GrowthDirection.forward:\n        double scrollOffsetToChild = 0.0;\n        RenderSliver? current = center;\n        while (current != child) {\n          scrollOffsetToChild += current!.geometry!.scrollExtent;\n          current = childAfter(current);\n        }\n        return scrollOffsetToChild + scrollOffsetWithinChild;\n      case GrowthDirection.reverse:\n        double scrollOffsetToChild = 0.0;\n        RenderSliver? current = childBefore(center!);\n        while (current != child) {\n          scrollOffsetToChild -= current!.geometry!.scrollExtent;\n          current = childBefore(current);\n        }\n        return scrollOffsetToChild - scrollOffsetWithinChild;\n    }\n  }\n\n  @override\n  double maxScrollObstructionExtentBefore(RenderSliver child) {\n    assert(child.parent == this);\n    final GrowthDirection growthDirection = child.constraints.growthDirection;\n    switch (growthDirection) {\n      case GrowthDirection.forward:\n        double pinnedExtent = 0.0;\n        RenderSliver? current = center;\n        while (current != child) {\n          pinnedExtent += current!.geometry!.maxScrollObstructionExtent;\n          current = childAfter(current);\n        }\n        return pinnedExtent;\n      case GrowthDirection.reverse:\n        double pinnedExtent = 0.0;\n        RenderSliver? current = childBefore(center!);\n        while (current != child) {\n          pinnedExtent += current!.geometry!.maxScrollObstructionExtent;\n          current = childBefore(current);\n        }\n        return pinnedExtent;\n    }\n  }\n\n  @override\n  void applyPaintTransform(RenderObject child, Matrix4 transform) {\n    final Offset offset = paintOffsetOf(child as RenderSliver);\n    transform.translate(offset.dx, offset.dy);\n  }\n\n  @override\n  double computeChildMainAxisPosition(\n      RenderSliver child, double parentMainAxisPosition) {\n    final CustomSliverPhysicalContainerParentData childParentData =\n        child.parentData! as CustomSliverPhysicalContainerParentData;\n    switch (applyGrowthDirectionToAxisDirection(\n        child.constraints.axisDirection, child.constraints.growthDirection)) {\n      case AxisDirection.down:\n      case AxisDirection.right:\n        return parentMainAxisPosition - childParentData.layoutOffset!;\n      case AxisDirection.up:\n        return (size.height - parentMainAxisPosition) -\n            childParentData.layoutOffset!;\n      case AxisDirection.left:\n        return (size.width - parentMainAxisPosition) -\n            childParentData.layoutOffset!;\n    }\n  }\n\n  @override\n  int get indexOfFirstChild {\n    assert(center != null);\n    assert(center!.parent == this);\n    assert(firstChild != null);\n    int count = 0;\n    RenderSliver? child = center;\n    while (child != firstChild) {\n      count -= 1;\n      child = childBefore(child!);\n    }\n    return count;\n  }\n\n  @override\n  String labelForChild(int index) {\n    if (index == 0) return 'center child';\n    return 'child $index';\n  }\n\n  @override\n  Iterable<RenderSliver> get childrenInPaintOrder sync* {\n    if (firstChild == null) return;\n    RenderSliver? child = firstChild;\n    while (child != center) {\n      yield child!;\n      child = childAfter(child);\n    }\n    child = lastChild;\n    while (true) {\n      yield child!;\n      if (child == center) return;\n      child = childBefore(child);\n    }\n  }\n\n  @override\n  Iterable<RenderSliver> get childrenInHitTestOrder sync* {\n    if (firstChild == null) return;\n    RenderSliver? child = center;\n    while (child != null) {\n      yield child;\n      child = childAfter(child);\n    }\n    child = childBefore(center!);\n    while (child != null) {\n      yield child;\n      child = childBefore(child);\n    }\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties.add(DoubleProperty('anchor', anchor));\n  }\n}\n"
  },
  {
    "path": "lib/components/select.dart",
    "content": "part of 'components.dart';\n\nclass Select extends StatefulWidget {\n  const Select({\n    required this.initialValue,\n    this.width = 120,\n    required this.onChange,\n    Key? key,\n    required this.values,\n    this.disabledValues = const [],\n    this.outline = false,\n  }) : super(key: key);\n\n  ///初始值, 提供values的下标\n  final int? initialValue;\n\n  ///可供选取的值\n  final List<String> values;\n\n  ///宽度\n  final double width;\n\n  ///发生改变时的回调\n  final void Function(int) onChange;\n\n  /// 禁用的值\n  final List<int> disabledValues;\n\n  /// 是否为边框模式\n  final bool outline;\n\n  @override\n  State<Select> createState() => _SelectState();\n}\n\nclass _SelectState extends State<Select> {\n  late int? value = widget.initialValue;\n  bool isHover = false;\n\n  @override\n  Widget build(BuildContext context) {\n    if (value != null && value! < 0) value = null;\n    return MouseRegion(\n      onEnter: (_) => setState(() => isHover = true),\n      onExit: (_) => setState(() => isHover = false),\n      cursor: SystemMouseCursors.click,\n      child: GestureDetector(\n        onTap: () {\n          if (widget.values.isEmpty) {\n            return;\n          }\n          final renderBox = context.findRenderObject() as RenderBox;\n          var offset = renderBox.localToGlobal(Offset.zero);\n          var size = MediaQuery.of(context).size;\n          showMenu<int>(\n              context: App.globalContext!,\n              initialValue: value,\n              position: RelativeRect.fromLTRB(offset.dx, offset.dy,\n                  offset.dx + widget.width, size.height - offset.dy),\n              constraints: BoxConstraints(\n                maxWidth: widget.width,\n                minWidth: widget.width,\n              ),\n              color: context.colorScheme.surfaceContainerLowest,\n              items: [\n                for (int i = 0; i < widget.values.length; i++)\n                  if (!widget.disabledValues.contains(i))\n                    PopupMenuItem(\n                      value: i,\n                      height: App.isDesktop ? 38 : 42,\n                      onTap: () {\n                        setState(() {\n                          value = i;\n                          widget.onChange(i);\n                        });\n                      },\n                      child: Text(widget.values[i]),\n                    )\n              ]);\n        },\n        child: AnimatedContainer(\n          duration: _fastAnimationDuration,\n          decoration: BoxDecoration(\n            color: color,\n            borderRadius: BorderRadius.circular(widget.outline ? 4 : 8),\n            border: widget.outline\n                ? Border.all(\n                    color: context.colorScheme.outline,\n                    width: 1,\n                  )\n                : null,\n          ),\n          width: widget.width,\n          height: 38,\n          child: Row(\n            children: [\n              const SizedBox(\n                width: 12,\n              ),\n              Expanded(\n                child: Text(\n                  value == null ? \"\" : widget.values[value!],\n                  overflow: TextOverflow.fade,\n                  style: Theme.of(context).textTheme.bodyMedium,\n                ),\n              ),\n              const Icon(Icons.arrow_drop_down_sharp),\n              const SizedBox(\n                width: 4,\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Color get color {\n    if (widget.outline) {\n      return isHover\n          ? context.colorScheme.outline.withOpacity(0.1)\n          : Colors.transparent;\n    } else {\n      var color = context.colorScheme.surfaceContainerHigh;\n      if (isHover) {\n        color = color.withOpacity(0.8);\n      }\n      return color;\n    }\n  }\n}\n\nclass FilterChipFixedWidth extends StatefulWidget {\n  const FilterChipFixedWidth(\n      {required this.label,\n      required this.selected,\n      required this.onSelected,\n      super.key});\n\n  final Widget label;\n\n  final bool selected;\n\n  final void Function(bool) onSelected;\n\n  @override\n  State<FilterChipFixedWidth> createState() => _FilterChipFixedWidthState();\n}\n\nclass _FilterChipFixedWidthState extends State<FilterChipFixedWidth> {\n  get selected => widget.selected;\n\n  double? labelWidth;\n\n  double? labelHeight;\n\n  var key = GlobalKey();\n\n  @override\n  void initState() {\n    Future.microtask(measureSize);\n    super.initState();\n  }\n\n  void measureSize() {\n    final RenderBox renderBox =\n        key.currentContext!.findRenderObject() as RenderBox;\n    labelWidth = renderBox.size.width;\n    labelHeight = renderBox.size.height;\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      textStyle: Theme.of(context).textTheme.labelLarge,\n      child: InkWell(\n        onTap: () => widget.onSelected(true),\n        borderRadius: const BorderRadius.all(Radius.circular(8)),\n        child: AnimatedContainer(\n          duration: _fastAnimationDuration,\n          decoration: BoxDecoration(\n            border: Border.all(color: Theme.of(context).colorScheme.outline),\n            borderRadius: const BorderRadius.all(Radius.circular(8)),\n            color: selected\n                ? Theme.of(context).colorScheme.primaryContainer\n                : null,\n          ),\n          padding: const EdgeInsets.fromLTRB(12, 8, 12, 8),\n          child: labelWidth == null ? firstBuild() : buildContent(),\n        ),\n      ),\n    );\n  }\n\n  Widget firstBuild() {\n    return Center(\n      child: SizedBox(\n        key: key,\n        child: widget.label,\n      ),\n    );\n  }\n\n  Widget buildContent() {\n    const iconSize = 18.0;\n    const gap = 4.0;\n    return SizedBox(\n      width: iconSize + labelWidth! + gap,\n      height: math.max(iconSize, labelHeight!),\n      child: Stack(\n        children: [\n          AnimatedPositioned(\n            duration: _fastAnimationDuration,\n            left: selected ? (iconSize + gap) : (iconSize + gap) / 2,\n            child: widget.label,\n          ),\n          if (selected)\n            Positioned(\n              left: 0,\n              top: 0,\n              bottom: 0,\n              right: labelWidth! + gap,\n              child: const AnimatedCheckIcon(size: iconSize).toCenter(),\n            )\n        ],\n      ),\n    );\n  }\n}\n\nclass AnimatedCheckWidget extends AnimatedWidget {\n  const AnimatedCheckWidget({\n    super.key,\n    required Animation<double> animation,\n    this.size,\n  }) : super(listenable: animation);\n\n  final double? size;\n\n  @override\n  Widget build(BuildContext context) {\n    var iconSize = size ?? IconTheme.of(context).size ?? 25;\n    final animation = listenable as Animation<double>;\n    return SizedBox(\n      width: iconSize,\n      height: iconSize,\n      child: Align(\n        alignment: Alignment.centerLeft,\n        child: FractionallySizedBox(\n          widthFactor: animation.value,\n          child: ClipRRect(\n            child: Icon(\n              Icons.check,\n              size: iconSize,\n              color: Theme.of(context).colorScheme.primary,\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass AnimatedCheckIcon extends StatefulWidget {\n  const AnimatedCheckIcon({this.size, super.key});\n\n  final double? size;\n\n  @override\n  State<AnimatedCheckIcon> createState() => _AnimatedCheckIconState();\n}\n\nclass _AnimatedCheckIconState extends State<AnimatedCheckIcon>\n    with SingleTickerProviderStateMixin {\n  late Animation<double> animation;\n  late AnimationController controller;\n\n  @override\n  void initState() {\n    controller = AnimationController(\n      vsync: this,\n      duration: _fastAnimationDuration,\n    );\n    animation = Tween<double>(begin: 0, end: 1).animate(controller)\n      ..addListener(() {\n        setState(() {});\n      });\n    controller.forward();\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    controller.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedCheckWidget(\n      animation: animation,\n      size: widget.size,\n    );\n  }\n}\n\nclass OptionChip extends StatelessWidget {\n  const OptionChip(\n      {super.key,\n      required this.text,\n      required this.isSelected,\n      required this.onTap});\n\n  final String text;\n\n  final bool isSelected;\n\n  final void Function() onTap;\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      decoration: BoxDecoration(\n        color: isSelected\n            ? context.colorScheme.primaryContainer\n            : context.colorScheme.surface,\n        border: isSelected\n            ? Border.all(color: context.colorScheme.primaryContainer)\n            : Border.all(color: context.colorScheme.outline),\n        borderRadius: BorderRadius.circular(8),\n      ),\n      child: Material(\n        color: Colors.transparent,\n        child: InkWell(\n          borderRadius: BorderRadius.circular(8),\n          onTap: onTap,\n          child: Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6),\n            child: Text(text),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/select_download_eps.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nclass SelectDownloadChapter extends StatefulWidget {\n  const SelectDownloadChapter(this.eps, this.finishSelect, this.downloadedEps,\n      {Key? key})\n      : super(key: key);\n  final List<String> eps;\n  final void Function(List<int>) finishSelect;\n  final List<int> downloadedEps;\n\n  @override\n  State<SelectDownloadChapter> createState() => _SelectDownloadChapterState();\n}\n\nclass _SelectDownloadChapterState extends State<SelectDownloadChapter> {\n  List<int> selected = [];\n\n  @override\n  Widget build(BuildContext context) {\n    return Padding(\n      padding: const EdgeInsets.only(left: 16, right: 16),\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Padding(\n            padding: const EdgeInsets.fromLTRB(0, 16, 0, 16),\n            child: Text(\n              \"下载漫画\".tl,\n              style: const TextStyle(fontSize: 22),\n            ),\n          ),\n          Expanded(\n            child: GridView.builder(\n              gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(\n                maxCrossAxisExtent: 300,\n                childAspectRatio: 4,\n              ),\n              itemBuilder: (BuildContext context, int i) {\n                return Padding(\n                  padding: const EdgeInsets.all(4),\n                  child: InkWell(\n                    borderRadius: const BorderRadius.all(Radius.circular(16)),\n                    onTap: widget.downloadedEps.contains(i)\n                        ? null\n                        : () {\n                            setState(() {\n                              if (selected.contains(i)) {\n                                selected.remove(i);\n                              } else {\n                                selected.add(i);\n                              }\n                            });\n                          },\n                    child: AnimatedContainer(\n                      decoration: BoxDecoration(\n                        borderRadius:\n                            const BorderRadius.all(Radius.circular(16)),\n                        color: (selected.contains(i) ||\n                                widget.downloadedEps.contains(i))\n                            ? Theme.of(context).colorScheme.primaryContainer\n                            : Theme.of(context)\n                                .colorScheme\n                                .surfaceContainerHighest,\n                      ),\n                      duration: const Duration(milliseconds: 200),\n                      child: Row(\n                        children: [\n                          const SizedBox(\n                            width: 16,\n                          ),\n                          Expanded(\n                            child: Text(\n                              widget.eps[i],\n                              overflow: TextOverflow.ellipsis,\n                            ),\n                          ),\n                          if (selected.contains(i)) const Icon(Icons.done),\n                          if (widget.downloadedEps.contains(i))\n                            const Icon(Icons.download_done),\n                          const SizedBox(\n                            width: 16,\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                );\n              },\n              itemCount: widget.eps.length,\n            ),\n          ),\n          SizedBox(\n            height: 50,\n            child: Row(\n              children: [\n                const SizedBox(\n                  width: 16,\n                ),\n                Expanded(\n                  child: FilledButton.tonal(\n                      onPressed: () {\n                        var res = <int>[];\n                        for (int i = 0; i < widget.eps.length; i++) {\n                          if (!widget.downloadedEps.contains(i)) {\n                            res.add(i);\n                          }\n                        }\n                        widget.finishSelect(res);\n                      },\n                      child: Text(\"下载全部\".tl)),\n                ),\n                const SizedBox(\n                  width: 16,\n                ),\n                Expanded(\n                  child: FilledButton.tonal(\n                      onPressed: () {\n                        widget.finishSelect(selected);\n                      },\n                      child: Text(\"下载选择\".tl)),\n                ),\n                const SizedBox(\n                  width: 16,\n                ),\n              ],\n            ),\n          ),\n          SizedBox(\n            height: MediaQuery.of(context).padding.bottom + 4,\n          )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/side_bar.dart",
    "content": "part of 'components.dart';\n\n///显示侧边栏的变换\n///\n/// 此组件会自动适应窗口大小:\n/// 大于600显示为右侧的侧边栏\n/// 小于600显示为从侧边划入的页面\nclass SideBarRoute<T> extends PopupRoute<T> {\n  SideBarRoute(this.title, this.widget,\n      {this.showBarrier = true,\n      this.useSurfaceTintColor = false,\n      required this.width,\n      this.addBottomPadding = true,\n      this.addTopPadding = true});\n\n  ///标题\n  final String? title;\n\n  ///子组件\n  final Widget widget;\n\n  ///是否显示Barrier\n  final bool showBarrier;\n\n  ///使用SurfaceTintColor作为背景色\n  final bool useSurfaceTintColor;\n\n  ///宽度\n  final double width;\n\n  final bool addTopPadding;\n\n  final bool addBottomPadding;\n\n  @override\n  Color? get barrierColor => showBarrier ? Colors.black54 : Colors.transparent;\n\n  @override\n  bool get barrierDismissible => true;\n\n  @override\n  String? get barrierLabel => \"exit\";\n\n  @override\n  Widget buildPage(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation) {\n    bool showSideBar = MediaQuery.of(context).size.width > width;\n\n    Widget body = SidebarBody(\n      title: title,\n      widget: widget,\n      autoChangeTitleBarColor: !useSurfaceTintColor,\n    );\n\n    if (addTopPadding) {\n      body = Padding(\n        padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),\n        child: MediaQuery.removePadding(\n          context: context,\n          removeTop: true,\n          child: body,\n        ),\n      );\n    }\n\n    final sideBarWidth = math.min(width, MediaQuery.of(context).size.width);\n\n    body = Container(\n      decoration: BoxDecoration(\n          borderRadius: showSideBar\n              ? const BorderRadius.horizontal(left: Radius.circular(16))\n              : null,\n          color: Theme.of(context).colorScheme.surfaceTint),\n      clipBehavior: Clip.antiAlias,\n      constraints: BoxConstraints(maxWidth: sideBarWidth),\n      height: MediaQuery.of(context).size.height,\n      child: GestureDetector(\n        child: Material(\n          child: ClipRect(\n            clipBehavior: Clip.antiAlias,\n            child: Container(\n              padding: EdgeInsets.fromLTRB(\n                  0,\n                  0,\n                  MediaQuery.of(context).padding.right,\n                  addBottomPadding\n                      ? MediaQuery.of(context).padding.bottom +\n                          MediaQuery.of(context).viewInsets.bottom\n                      : 0),\n              color: useSurfaceTintColor\n                  ? Theme.of(context).colorScheme.surfaceTint.withAlpha(20)\n                  : null,\n              child: body,\n            ),\n          ),\n        ),\n      ),\n    );\n\n    if (App.isIOS) {\n      body = IOSBackGestureDetector(\n        enabledCallback: () => true,\n        gestureWidth: 20.0,\n        onStartPopGesture: () => IOSBackGestureController(controller!, navigator!),\n        child: body,\n      );\n    }\n\n    return Align(\n      alignment: Alignment.centerRight,\n      child: body,\n    );\n  }\n\n  @override\n  Duration get transitionDuration => const Duration(milliseconds: 300);\n\n  @override\n  Widget buildTransitions(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation, Widget child) {\n    var offset =\n        Tween<Offset>(begin: const Offset(1, 0), end: const Offset(0, 0));\n    return SlideTransition(\n      position: offset.animate(CurvedAnimation(\n        parent: animation,\n        curve: Curves.fastOutSlowIn,\n      )),\n      child: child,\n    );\n  }\n}\n\nclass SidebarBody extends StatefulWidget {\n  const SidebarBody(\n      {required this.title,\n      required this.widget,\n      required this.autoChangeTitleBarColor,\n      super.key});\n\n  final String? title;\n  final Widget widget;\n  final bool autoChangeTitleBarColor;\n\n  @override\n  State<SidebarBody> createState() => _SidebarBodyState();\n}\n\nclass _SidebarBodyState extends State<SidebarBody> {\n  bool top = true;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget body = Expanded(child: widget.widget);\n\n    if (widget.autoChangeTitleBarColor) {\n      body = NotificationListener<ScrollNotification>(\n        onNotification: (notifications) {\n          if (notifications.metrics.pixels ==\n                  notifications.metrics.minScrollExtent &&\n              !top) {\n            setState(() {\n              top = true;\n            });\n          } else if (notifications.metrics.pixels !=\n                  notifications.metrics.minScrollExtent &&\n              top) {\n            setState(() {\n              top = false;\n            });\n          }\n          return false;\n        },\n        child: body,\n      );\n    }\n\n    return Column(\n      children: [\n        if (widget.title != null)\n          Container(\n            height: 60 + MediaQuery.of(context).padding.top,\n            color: top\n                ? null\n                : Theme.of(context).colorScheme.surfaceTint.withAlpha(20),\n            padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),\n            child: Row(\n              children: [\n                const SizedBox(\n                  width: 8,\n                ),\n                Tooltip(\n                  message: \"返回\",\n                  child: IconButton(\n                    iconSize: 25,\n                    icon: const Icon(Icons.arrow_back),\n                    onPressed: () => Navigator.of(context).pop(),\n                  ),\n                ),\n                const SizedBox(\n                  width: 10,\n                ),\n                Text(\n                  widget.title!,\n                  style: const TextStyle(fontSize: 22),\n                )\n              ],\n            ),\n          ),\n        body\n      ],\n    );\n  }\n}\n\n///显示侧边栏\n///\n/// 此组件会自动适应窗口大小:\n/// 大于600显示为右侧的侧边栏\n/// 小于600显示为从侧边划入的页面\n///\n/// [width] 侧边栏的宽度\n///\n/// [title] 标题, 为空时不显示顶部的Appbar\nvoid showSideBar(BuildContext context, Widget widget,\n    {String? title,\n    bool showBarrier = true,\n    bool useSurfaceTintColor = false,\n    double width = 500,\n    bool addTopPadding = false}) {\n  Navigator.of(context).push(SideBarRoute(title, widget,\n      showBarrier: showBarrier,\n      useSurfaceTintColor: useSurfaceTintColor,\n      width: width,\n      addTopPadding: addTopPadding,\n      addBottomPadding: true));\n}\n"
  },
  {
    "path": "lib/components/window_frame.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/pages/accounts_page.dart';\nimport 'package:pica_comic/pages/history_page.dart';\nimport 'package:pica_comic/pages/image_favorites.dart';\nimport 'package:pica_comic/pages/main_page.dart';\nimport 'package:pica_comic/pages/pre_search_page.dart';\nimport 'package:pica_comic/pages/settings/settings_page.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/pages/download_page.dart';\nimport 'package:pica_comic/pages/downloading_page.dart';\nimport 'package:window_manager/window_manager.dart';\nimport 'components.dart';\n\nconst _kTitleBarHeight = 36.0;\n\nclass WindowFrameController extends StateController {\n  bool useDarkTheme = false;\n\n  bool isHideWindowFrame = false;\n\n  void setDarkTheme() {\n    useDarkTheme = true;\n    update();\n  }\n\n  void resetTheme() {\n    useDarkTheme = false;\n    update();\n  }\n\n  VoidCallback openSideBar = () {};\n\n  void hideWindowFrame() {\n    isHideWindowFrame = true;\n    update();\n  }\n\n  void showWindowFrame() {\n    isHideWindowFrame = false;\n    update();\n  }\n}\n\nclass WindowFrame extends StatelessWidget {\n  const WindowFrame(this.child, {super.key});\n\n  final Widget child;\n\n  @override\n  Widget build(BuildContext context) {\n    StateController.putIfNotExists<WindowFrameController>(\n        WindowFrameController());\n    if (App.isMobile) return child;\n    return StateBuilder<WindowFrameController>(builder: (controller) {\n      if (controller.isHideWindowFrame) return child;\n\n      var body = Stack(\n        children: [\n          Positioned.fill(\n              child: MediaQuery(\n            data: MediaQuery.of(context).copyWith(\n                padding: const EdgeInsets.only(top: _kTitleBarHeight)),\n            child: child,\n          )),\n          const _SideBar(),\n          Positioned(\n            top: 0,\n            left: 0,\n            right: 0,\n            child: Material(\n              color: Colors.transparent,\n              child: Theme(\n                data: Theme.of(context).copyWith(\n                  brightness: controller.useDarkTheme ? Brightness.dark : null,\n                ),\n                child: Builder(builder: (context) {\n                  return SizedBox(\n                    height: _kTitleBarHeight,\n                    child: Row(\n                      children: [\n                        if (!App.isMacOS)\n                          buildMenuButton(controller, context)\n                              .toAlign(Alignment.centerLeft)\n                        else\n                          const DragToMoveArea(\n                            child: SizedBox(\n                              height: double.infinity,\n                              width: 16,\n                            ),\n                          ).paddingRight(52),\n                        Expanded(\n                          child: DragToMoveArea(\n                            child: Text(\n                              'Pica Comic',\n                              style: TextStyle(\n                                fontSize: 13,\n                                color: (controller.useDarkTheme ||\n                                    context.brightness == Brightness.dark)\n                                    ? Colors.white\n                                    : Colors.black,\n                              ),\n                            ).toAlign(Alignment.centerLeft).paddingLeft(4),\n                          ),\n                        ),\n                        if (!App.isMacOS)\n                          const WindowButtons()\n                        else\n                          buildMenuButton(controller, context)\n                              .toAlign(Alignment.centerRight),\n                      ],\n                    ),\n                  );\n                }),\n              ),\n            ),\n          )\n        ],\n      );\n\n      if(App.isLinux) {\n        return VirtualWindowFrame(child: body);\n      } else {\n        return body;\n      }\n    });\n  }\n\n  Widget buildMenuButton(\n      WindowFrameController controller, BuildContext context) {\n    return InkWell(\n        onTap: () {\n          controller.openSideBar();\n        },\n        child: SizedBox(\n          width: 42,\n          height: double.infinity,\n          child: Center(\n            child: CustomPaint(\n              size: const Size(18, 20),\n              painter: _MenuPainter(\n                  color: (controller.useDarkTheme ||\n                          Theme.of(context).brightness == Brightness.dark)\n                      ? Colors.white\n                      : Colors.black),\n            ),\n          ),\n        ));\n  }\n}\n\nclass _MenuPainter extends CustomPainter {\n  final Color color;\n\n  _MenuPainter({this.color = Colors.black});\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    final paint = getPaint(color);\n    final path = Path()\n      ..moveTo(0, size.height / 4)\n      ..lineTo(size.width, size.height / 4)\n      ..moveTo(0, size.height / 4 * 2)\n      ..lineTo(size.width, size.height / 4 * 2)\n      ..moveTo(0, size.height / 4 * 3)\n      ..lineTo(size.width, size.height / 4 * 3);\n    canvas.drawPath(path, paint);\n  }\n\n  @override\n  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;\n}\n\nclass _SideBar extends StatefulWidget {\n  const _SideBar();\n\n  @override\n  State<_SideBar> createState() => __SideBarState();\n}\n\nclass __SideBarState extends State<_SideBar>\n    with SingleTickerProviderStateMixin {\n  late AnimationController _controller;\n\n  void run() {\n    if (_controller.isAnimating) return;\n    if (_controller.isCompleted) {\n      _controller.reverse();\n    } else {\n      _controller.forward();\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = AnimationController(\n        vsync: this, duration: const Duration(milliseconds: 160), value: 0);\n    var controller = StateController.find<WindowFrameController>();\n    controller.openSideBar = run;\n  }\n\n  @override\n  void dispose() {\n    _controller.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedBuilder(\n        animation: CurvedAnimation(\n            parent: _controller, curve: Curves.fastEaseInToSlowEaseOut),\n        builder: (context, child) {\n          var value = _controller.value;\n          return Stack(\n            children: [\n              Positioned.fill(\n                  child: GestureDetector(\n                onTap: run,\n                child: Container(\n                  width: double.infinity,\n                  height: double.infinity,\n                  color:\n                      value == 0 ? null : Colors.black.withOpacity(0.2 * value),\n                ),\n              )),\n              Positioned(\n                left: !App.isMacOS ? (1 - _controller.value) * (-300) : null,\n                right: App.isMacOS ? (_controller.value - 1) * 300 : null,\n                top: 0,\n                bottom: 0,\n                child: Material(\n                  color: Theme.of(context).colorScheme.surface,\n                  surfaceTintColor: Theme.of(context).colorScheme.surfaceTint,\n                  elevation: 2,\n                  borderRadius: const BorderRadius.only(\n                    topRight: Radius.circular(8),\n                    bottomRight: Radius.circular(8),\n                  ),\n                  child: SizedBox(\n                    width: 300,\n                    height: double.infinity,\n                    child: const SingleChildScrollView(\n                      child: _SideBarBody(),\n                    ).paddingTop(_kTitleBarHeight),\n                  ),\n                ),\n              )\n            ],\n          );\n        });\n  }\n}\n\nclass _SideBarBody extends StatelessWidget {\n  const _SideBarBody();\n\n  void toPage(Widget Function() builder) {\n    var context = App.mainNavigatorKey!.currentContext!;\n    MainPage.of(context).to(builder, preventDuplicate: true);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        const SizedBox(height: 8),\n        buildItem(\n            icon: Icons.person_outline,\n            title: '账号管理'.tl,\n            onTap: () {\n              StateController.find<WindowFrameController>().openSideBar();\n              showPopUpWidget(App.globalContext!, const AccountsPage());\n            }),\n        buildItem(\n            icon: Icons.history,\n            title: '历史记录'.tl,\n            onTap: () {\n              StateController.find<WindowFrameController>().openSideBar();\n              toPage(() => const HistoryPage());\n            }),\n        buildItem(\n            icon: Icons.download_outlined,\n            title: '已下载'.tl,\n            onTap: () {\n              StateController.find<WindowFrameController>().openSideBar();\n              toPage(() => const DownloadPage());\n            }),\n        buildItem(\n            icon: Icons.downloading,\n            title: '下载管理器'.tl,\n            onTap: () {\n              StateController.find<WindowFrameController>().openSideBar();\n              showPopUpWidget(App.globalContext!, const DownloadingPage());\n            }),\n        buildItem(\n            icon: Icons.image_outlined,\n            title: '图片收藏'.tl,\n            onTap: () {\n              StateController.find<WindowFrameController>().openSideBar();\n              toPage(() => const ImageFavoritesPage());\n            }),\n        const Divider().paddingHorizontal(8),\n        buildItem(\n            icon: Icons.search,\n            title: '搜索'.tl,\n            onTap: () {\n              StateController.find<WindowFrameController>().openSideBar();\n              toPage(() => PreSearchPage());\n            }),\n        buildItem(\n            icon: Icons.settings,\n            title: '设置'.tl,\n            onTap: () {\n              StateController.find<WindowFrameController>().openSideBar();\n              SettingsPage.open();\n            }),\n      ],\n    );\n  }\n\n  Widget buildItem(\n      {required IconData icon,\n      required String title,\n      required VoidCallback onTap}) {\n    return InkWell(\n      onTap: onTap,\n      borderRadius: BorderRadius.circular(8),\n      child: Container(\n        padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12),\n        child: Row(\n          children: [\n            Icon(icon, size: 20),\n            const SizedBox(width: 16),\n            Text(title, style: const TextStyle(fontSize: 14)),\n          ],\n        ),\n      ),\n    ).paddingHorizontal(8);\n  }\n}\n\nclass WindowButtons extends StatefulWidget {\n  const WindowButtons({super.key});\n\n  @override\n  State<WindowButtons> createState() => _WindowButtonsState();\n}\n\nclass _WindowButtonsState extends State<WindowButtons> with WindowListener {\n  bool isMaximized = false;\n\n  @override\n  void initState() {\n    windowManager.addListener(this);\n    windowManager.isMaximized().then((value) {\n      if (value) {\n        setState(() {\n          isMaximized = true;\n        });\n      }\n    });\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    windowManager.removeListener(this);\n    super.dispose();\n  }\n\n  @override\n  void onWindowMaximize() {\n    setState(() {\n      isMaximized = true;\n    });\n    super.onWindowMaximize();\n  }\n\n  @override\n  void onWindowUnmaximize() {\n    setState(() {\n      isMaximized = false;\n    });\n    super.onWindowUnmaximize();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final dark = Theme.of(context).brightness == Brightness.dark;\n    final color = dark ? Colors.white : Colors.black;\n    final hoverColor = dark ? Colors.white30 : Colors.black12;\n\n    return SizedBox(\n      width: 138,\n      height: _kTitleBarHeight,\n      child: Row(\n        children: [\n          WindowButton(\n            icon: MinimizeIcon(color: color),\n            hoverColor: hoverColor,\n            onPressed: () async {\n              bool isMinimized = await windowManager.isMinimized();\n              if (isMinimized) {\n                windowManager.restore();\n              } else {\n                windowManager.minimize();\n              }\n            },\n          ),\n          if (isMaximized)\n            WindowButton(\n              icon: RestoreIcon(\n                color: color,\n              ),\n              hoverColor: hoverColor,\n              onPressed: () {\n                windowManager.unmaximize();\n              },\n            )\n          else\n            WindowButton(\n              icon: MaximizeIcon(\n                color: color,\n              ),\n              hoverColor: hoverColor,\n              onPressed: () {\n                windowManager.maximize();\n              },\n            ),\n          WindowButton(\n            icon: CloseIcon(\n              color: color,\n            ),\n            hoverIcon: CloseIcon(\n              color: !dark ? Colors.white : Colors.black,\n            ),\n            hoverColor: Colors.red,\n            onPressed: () {\n              if (appdata.implicitData[2] == '0') {\n                showDialog(\n                    context: App.navigatorKey.currentContext!,\n                    builder: (context) {\n                      bool isCheck = false;\n                      return AlertDialog(\n                        title: Text('是否退出程序？'.tl),\n                        content: StatefulBuilder(builder: (context, setState) {\n                          return Row(\n                            children: [\n                              Checkbox(\n                                value: isCheck,\n                                onChanged: (value) {\n                                  setState(() {\n                                    isCheck = value!;\n                                  });\n                                },\n                              ),\n                              Text('不再提示'.tl),\n                            ],\n                          );\n                        }),\n                        actions: [\n                          TextButton(\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            child: Text('否'.tl),\n                          ),\n                          TextButton(\n                            onPressed: () {\n                              if (isCheck) {\n                                appdata.implicitData[2] = '1';\n                                appdata.writeImplicitData();\n                              }\n                              windowManager.close();\n                            },\n                            child: Text('是'.tl),\n                          ),\n                        ],\n                      );\n                    });\n              } else {\n                windowManager.close();\n              }\n            },\n          )\n        ],\n      ),\n    );\n  }\n}\n\nclass WindowButton extends StatefulWidget {\n  const WindowButton(\n      {required this.icon,\n      required this.onPressed,\n      required this.hoverColor,\n      this.hoverIcon,\n      super.key});\n\n  final Widget icon;\n\n  final void Function() onPressed;\n\n  final Color hoverColor;\n\n  final Widget? hoverIcon;\n\n  @override\n  State<WindowButton> createState() => _WindowButtonState();\n}\n\nclass _WindowButtonState extends State<WindowButton> {\n  bool isHovering = false;\n\n  @override\n  Widget build(BuildContext context) {\n    return MouseRegion(\n      onEnter: (event) => setState(() {\n        isHovering = true;\n      }),\n      onExit: (event) => setState(() {\n        isHovering = false;\n      }),\n      child: GestureDetector(\n        onTap: widget.onPressed,\n        child: Container(\n          width: 46,\n          height: double.infinity,\n          decoration:\n              BoxDecoration(color: isHovering ? widget.hoverColor : null),\n          child: isHovering ? widget.hoverIcon ?? widget.icon : widget.icon,\n        ),\n      ),\n    );\n  }\n}\n\n/// Close\nclass CloseIcon extends StatelessWidget {\n  final Color color;\n\n  const CloseIcon({super.key, required this.color});\n\n  @override\n  Widget build(BuildContext context) => _AlignedPaint(_ClosePainter(color));\n}\n\nclass _ClosePainter extends _IconPainter {\n  _ClosePainter(super.color);\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    Paint p = getPaint(color, true);\n    canvas.drawLine(const Offset(0, 0), Offset(size.width, size.height), p);\n    canvas.drawLine(Offset(0, size.height), Offset(size.width, 0), p);\n  }\n}\n\n/// Maximize\nclass MaximizeIcon extends StatelessWidget {\n  final Color color;\n\n  const MaximizeIcon({super.key, required this.color});\n\n  @override\n  Widget build(BuildContext context) => _AlignedPaint(_MaximizePainter(color));\n}\n\nclass _MaximizePainter extends _IconPainter {\n  _MaximizePainter(super.color);\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    Paint p = getPaint(color);\n    canvas.drawRect(Rect.fromLTRB(0, 0, size.width - 1, size.height - 1), p);\n  }\n}\n\n/// Restore\nclass RestoreIcon extends StatelessWidget {\n  final Color color;\n\n  const RestoreIcon({\n    super.key,\n    required this.color,\n  });\n\n  @override\n  Widget build(BuildContext context) => _AlignedPaint(_RestorePainter(color));\n}\n\nclass _RestorePainter extends _IconPainter {\n  _RestorePainter(super.color);\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    Paint p = getPaint(color);\n    canvas.drawRect(Rect.fromLTRB(0, 2, size.width - 2, size.height), p);\n    canvas.drawLine(const Offset(2, 2), const Offset(2, 0), p);\n    canvas.drawLine(const Offset(2, 0), Offset(size.width, 0), p);\n    canvas.drawLine(\n        Offset(size.width, 0), Offset(size.width, size.height - 2), p);\n    canvas.drawLine(Offset(size.width, size.height - 2),\n        Offset(size.width - 2, size.height - 2), p);\n  }\n}\n\n/// Minimize\nclass MinimizeIcon extends StatelessWidget {\n  final Color color;\n\n  const MinimizeIcon({super.key, required this.color});\n\n  @override\n  Widget build(BuildContext context) => _AlignedPaint(_MinimizePainter(color));\n}\n\nclass _MinimizePainter extends _IconPainter {\n  _MinimizePainter(super.color);\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    Paint p = getPaint(color);\n    canvas.drawLine(\n        Offset(0, size.height / 2), Offset(size.width, size.height / 2), p);\n  }\n}\n\n/// Helpers\nabstract class _IconPainter extends CustomPainter {\n  _IconPainter(this.color);\n\n  final Color color;\n\n  @override\n  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;\n}\n\nclass _AlignedPaint extends StatelessWidget {\n  const _AlignedPaint(this.painter);\n\n  final CustomPainter painter;\n\n  @override\n  Widget build(BuildContext context) {\n    return Align(\n        alignment: Alignment.center,\n        child: CustomPaint(size: const Size(10, 10), painter: painter));\n  }\n}\n\nPaint getPaint(Color color, [bool isAntiAlias = false]) => Paint()\n  ..color = color\n  ..style = PaintingStyle.stroke\n  ..isAntiAlias = isAntiAlias\n  ..strokeWidth = 1;\n\nclass WindowPlacement {\n  final Rect rect;\n\n  final bool isMaximized;\n\n  const WindowPlacement(this.rect, this.isMaximized);\n\n  Future<void> applyToWindow() async {\n    await windowManager.setBounds(rect);\n\n    if (!validate(rect)) {\n      await windowManager.center();\n    }\n\n    if (isMaximized) {\n      await windowManager.maximize();\n    }\n  }\n\n  Future<void> writeToFile() async {\n    var file = File(\"${App.dataPath}/window_placement\");\n    await file.writeAsString(jsonEncode({\n      'width': rect.width,\n      'height': rect.height,\n      'x': rect.topLeft.dx,\n      'y': rect.topLeft.dy,\n      'isMaximized': isMaximized\n    }));\n  }\n\n  static Future<WindowPlacement> loadFromFile() async {\n    try {\n      var file = File(\"${App.dataPath}/window_placement\");\n      if (!file.existsSync()) {\n        return defaultPlacement;\n      }\n      var json = jsonDecode(await file.readAsString());\n      var rect =\n          Rect.fromLTWH(json['x'], json['y'], json['width'], json['height']);\n      return WindowPlacement(rect, json['isMaximized']);\n    } catch (e) {\n      return defaultPlacement;\n    }\n  }\n\n  static Future<WindowPlacement> get current async {\n    var rect = await windowManager.getBounds();\n    var isMaximized = await windowManager.isMaximized();\n    return WindowPlacement(rect, isMaximized);\n  }\n\n  static const defaultPlacement =\n      WindowPlacement(Rect.fromLTWH(10, 10, 900, 600), false);\n\n  static WindowPlacement cache = defaultPlacement;\n\n  static Timer? timer;\n\n  static void loop() async {\n    timer ??= Timer.periodic(const Duration(milliseconds: 100), (timer) async {\n      var placement = await WindowPlacement.current;\n      if (!validate(placement.rect)) {\n        return;\n      }\n      if (placement.rect != cache.rect ||\n          placement.isMaximized != cache.isMaximized) {\n        cache = placement;\n        await placement.writeToFile();\n      }\n    });\n  }\n\n  static bool validate(Rect rect) {\n    return rect.topLeft.dx >= 0 && rect.topLeft.dy >= 0;\n  }\n}\n\nclass VirtualWindowFrame extends StatefulWidget {\n  const VirtualWindowFrame({\n    super.key,\n    required this.child,\n  });\n\n  /// The [child] contained by the VirtualWindowFrame.\n  final Widget child;\n\n  @override\n  State<StatefulWidget> createState() => _VirtualWindowFrameState();\n}\n\nclass _VirtualWindowFrameState extends State<VirtualWindowFrame>\n    with WindowListener {\n  bool _isFocused = true;\n  bool _isMaximized = false;\n  bool _isFullScreen = false;\n\n  @override\n  void initState() {\n    windowManager.addListener(this);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    windowManager.removeListener(this);\n    super.dispose();\n  }\n\n  Widget _buildVirtualWindowFrame(BuildContext context) {\n    return DecoratedBox(\n      decoration: BoxDecoration(\n        color: Colors.transparent,\n        border: Border.all(\n          color: Theme.of(context).dividerColor,\n          width: (_isMaximized || _isFullScreen) ? 0 : 1,\n        ),\n        boxShadow: <BoxShadow>[\n          if (!_isMaximized && !_isFullScreen)\n            BoxShadow(\n              color: Colors.black.withOpacity(0.1),\n              offset: Offset(0.0, _isFocused ? 4 : 2),\n              blurRadius: 6,\n            )],\n      ),\n      child: widget.child,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return DragToResizeArea(\n        enableResizeEdges: (_isMaximized || _isFullScreen) ? [] : null,\n        child: _buildVirtualWindowFrame(context),\n      );\n  }\n\n  @override\n  void onWindowFocus() {\n    setState(() {\n      _isFocused = true;\n    });\n  }\n\n  @override\n  void onWindowBlur() {\n    setState(() {\n      _isFocused = false;\n    });\n  }\n\n  @override\n  void onWindowMaximize() {\n    setState(() {\n      _isMaximized = true;\n    });\n  }\n\n  @override\n  void onWindowUnmaximize() {\n    setState(() {\n      _isMaximized = false;\n    });\n  }\n\n  @override\n  void onWindowEnterFullScreen() {\n    setState(() {\n      _isFullScreen = true;\n    });\n  }\n\n  @override\n  void onWindowLeaveFullScreen() {\n    setState(() {\n      _isFullScreen = false;\n    });\n  }\n}\n\n// ignore: non_constant_identifier_names\nTransitionBuilder VirtualWindowFrameInit() {\n  return (_, Widget? child) {\n    return VirtualWindowFrame(\n      child: child!,\n    );\n  };\n}\n"
  },
  {
    "path": "lib/foundation/app.dart",
    "content": "import 'dart:io';\nimport 'dart:ui';\nimport 'package:flutter/material.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:pica_comic/foundation/app_page_route.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport '../base.dart';\n\nexport 'state_controller.dart';\nexport 'widget_utils.dart';\n\nclass App {\n  // platform\n  static bool get isAndroid => Platform.isAndroid;\n  static bool get isIOS => Platform.isIOS;\n  static bool get isWindows => Platform.isWindows;\n  static bool get isLinux => Platform.isLinux;\n  static bool get isMacOS => Platform.isMacOS;\n  static bool get isDesktop =>\n      Platform.isWindows || Platform.isLinux || Platform.isMacOS;\n  static bool get isMobile => Platform.isAndroid || Platform.isIOS;\n\n  static BuildContext? get globalContext => navigatorKey.currentContext;\n\n  static final navigatorKey = GlobalKey<NavigatorState>();\n\n  static GlobalKey<NavigatorState>? mainNavigatorKey;\n\n  /// get ui mode\n  static UiModes uiMode([BuildContext? context]) {\n    context ??= globalContext;\n    if (MediaQuery.of(context!).size.shortestSide < 600) {\n      return UiModes.m1;\n    } else if (!(MediaQuery.of(context).size.shortestSide < 600) &&\n        !(MediaQuery.of(context).size.width > 1400)) {\n      return UiModes.m2;\n    } else {\n      return UiModes.m3;\n    }\n  }\n\n  /// Path to store app cache.\n  ///\n  /// **Warning: The end of String is not '/'**\n  static late final String cachePath;\n\n  /// Path to store app data.\n  ///\n  /// **Warning: The end of String is not '/'**\n  static late final String dataPath;\n\n  static Future<void> init() async {\n    cachePath = (await getApplicationCacheDirectory()).path;\n    dataPath = (await getApplicationSupportDirectory()).path;\n  }\n\n  static back(BuildContext context) {\n    if (Navigator.canPop(context)) {\n      Navigator.of(context).pop();\n    }\n  }\n\n  static globalBack() {\n    if (Navigator.canPop(globalContext!)) {\n      Navigator.of(globalContext!).pop();\n    }\n  }\n\n  static off(BuildContext context, Widget Function() page) {\n    LogManager.addLog(LogLevel.info, \"App Status\",\n        \"Going to Page /${page.runtimeType.toString().replaceFirst(\"() => \", \"\")}\");\n    Navigator.of(context).pushReplacement(AppPageRoute(builder: (context) => page()));\n  }\n\n  static globalOff(Widget Function() page) {\n    LogManager.addLog(LogLevel.info, \"App Status\",\n        \"Going to Page /${page.runtimeType.toString().replaceFirst(\"() => \", \"\")}\");\n    Navigator.of(globalContext!).pushReplacement(AppPageRoute(builder: (context) => page()));\n  }\n\n  static offAll(Widget Function() page) {\n    Navigator.of(globalContext!)\n        .pushAndRemoveUntil(AppPageRoute(builder: (context) => page()), (route) => false);\n  }\n\n  static Future<T?> to<T extends Object?>(BuildContext context, Widget Function() page,\n      [bool enableIOSGesture = true]) {\n    LogManager.addLog(LogLevel.info, \"App Status\",\n        \"Going to Page /${page.runtimeType.toString().replaceFirst(\"() => \", \"\")}\");\n    return Navigator.of(context).push<T>(AppPageRoute(builder: (context) => page()));\n  }\n\n  static Future<T?> globalTo<T extends Object?>(Widget Function() page, {bool preventDuplicates = false}) {\n    return Navigator.of(globalContext!).push<T>(AppPageRoute(builder: (context) => page()));\n  }\n\n  static bool get enablePopGesture => isIOS;\n\n  static String? _currentRoute() {\n    return ModalRoute.of(globalContext!)?.toString();\n  }\n\n  static String? get currentRoute => _currentRoute();\n\n  static bool get canPop => Navigator.of(globalContext!).canPop();\n\n  static bool temporaryDisablePopGesture = false;\n\n  static Locale get locale {\n    Locale deviceLocale = PlatformDispatcher.instance.locale;\n    if (deviceLocale.languageCode == \"zh\" && deviceLocale.scriptCode == \"Hant\") {\n      deviceLocale = const Locale(\"zh\", \"TW\");\n    }\n    return switch (appdata.settings[50]) {\n      \"cn\" => const Locale(\"zh\", \"CN\"),\n      \"tw\" => const Locale(\"zh\", \"TW\"),\n      \"en\" => const Locale(\"en\", \"US\"),\n      _ => deviceLocale,\n    };\n  }\n\n\n  /// size of screen\n  static Size screenSize(BuildContext context) => MediaQuery.of(context).size;\n\n  static ColorScheme colors(BuildContext context) => Theme.of(context).colorScheme;\n}\n\nenum UiModes {\n  /// The screen have a short width. Usually the device is phone.\n  m1,\n\n  /// The screen's width is medium size. Usually the device is tablet.\n  m2,\n\n  /// The screen's width is long. Usually the device is PC.\n  m3\n}\n"
  },
  {
    "path": "lib/foundation/app_page_route.dart",
    "content": "import 'dart:math';\nimport 'dart:ui';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/foundation/app.dart';\n\nconst double _kBackGestureWidth = 20.0;\nconst int _kMaxDroppedSwipePageForwardAnimationTime = 800;\nconst int _kMaxPageBackAnimationTime = 300;\nconst double _kMinFlingVelocity = 1.0;\n\nclass AppPageRoute<T> extends PageRoute<T> with _AppRouteTransitionMixin{\n  /// Construct a MaterialPageRoute whose contents are defined by [builder].\n  AppPageRoute({\n    required this.builder,\n    super.settings,\n    this.maintainState = true,\n    super.fullscreenDialog,\n    super.allowSnapshotting = true,\n    super.barrierDismissible = false,\n    this.enableIOSGesture = true,\n    this.preventRebuild = true,\n    this.isRootRoute = false,\n  }) {\n    assert(opaque);\n  }\n\n  /// Builds the primary contents of the route.\n  final WidgetBuilder builder;\n\n  String? label;\n\n  @override\n  toString() => \"/$label\";\n\n  @override\n  Widget buildContent(BuildContext context) {\n    var widget = builder(context);\n    label = widget.runtimeType.toString();\n    return widget;\n  }\n\n  @override\n  final bool maintainState;\n\n  @override\n  String get debugLabel => '${super.debugLabel}(${settings.name})';\n\n  @override\n  final bool enableIOSGesture;\n\n  @override\n  final bool preventRebuild;\n\n  @override\n  final bool isRootRoute;\n}\n\nmixin _AppRouteTransitionMixin<T> on PageRoute<T> {\n  /// Builds the primary contents of the route.\n  @protected\n  Widget buildContent(BuildContext context);\n\n  @override\n  Duration get transitionDuration => const Duration(milliseconds: 300);\n\n  @override\n  Color? get barrierColor => null;\n\n  @override\n  String? get barrierLabel => null;\n\n  @override\n  bool canTransitionTo(TransitionRoute<dynamic> nextRoute) {\n    // Don't perform outgoing animation if the next route is a fullscreen dialog.\n    return nextRoute is PageRoute && !nextRoute.fullscreenDialog;\n  }\n\n  bool get enableIOSGesture;\n\n  bool get preventRebuild;\n\n  bool get isRootRoute;\n\n  Widget? _child;\n\n  @override\n  Widget buildPage(\n      BuildContext context,\n      Animation<double> animation,\n      Animation<double> secondaryAnimation,\n      ) {\n    Widget result;\n\n    if(preventRebuild){\n      result = _child ?? (_child = buildContent(context));\n    } else {\n      result = buildContent(context);\n    }\n\n    return Semantics(\n      scopesRoute: true,\n      explicitChildNodes: true,\n      child: result,\n    );\n  }\n\n  static bool _isPopGestureEnabled<T>(PageRoute<T> route) {\n    if (route.isFirst ||\n        route.willHandlePopInternally ||\n        route.popDisposition == RoutePopDisposition.doNotPop ||\n        route.fullscreenDialog ||\n        route.animation!.status != AnimationStatus.completed ||\n        route.secondaryAnimation!.status != AnimationStatus.dismissed ||\n        route.navigator!.userGestureInProgress ||\n        App.temporaryDisablePopGesture) {\n      return false;\n    }\n\n    return true;\n  }\n\n  @override\n  Widget buildTransitions(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {\n    if(isRootRoute) {\n      return FadeTransition(\n        opacity: Tween<double>(begin: 0, end: 1.0).animate(CurvedAnimation(\n            parent: animation,\n            curve: Curves.ease\n        )),\n        child: FadeTransition(\n          opacity: Tween<double>(begin: 1.0, end: 0).animate(CurvedAnimation(\n              parent: secondaryAnimation,\n              curve: Curves.ease\n          )),\n          child: child,\n        ),\n      );\n    }\n\n    return SlidePageTransitionBuilder().buildTransitions(\n        this,\n        context,\n        animation,\n        secondaryAnimation,\n        App.enablePopGesture && enableIOSGesture\n            ? IOSBackGestureDetector(\n            gestureWidth: _kBackGestureWidth,\n            enabledCallback: () => _isPopGestureEnabled<T>(this),\n            onStartPopGesture: () => _startPopGesture(this),\n            child: child)\n            : child);\n  }\n\n  IOSBackGestureController _startPopGesture(PageRoute<T> route) {\n    return IOSBackGestureController(route.controller!, route.navigator!);\n  }\n}\n\nclass IOSBackGestureController {\n  final AnimationController controller;\n\n  final NavigatorState navigator;\n\n  IOSBackGestureController(this.controller, this.navigator) {\n    navigator.didStartUserGesture();\n  }\n\n  void dragEnd(double velocity) {\n    const Curve animationCurve = Curves.fastLinearToSlowEaseIn;\n    final bool animateForward;\n\n    if (velocity.abs() >= _kMinFlingVelocity) {\n      animateForward = velocity <= 0;\n    } else {\n      animateForward = controller.value > 0.5;\n    }\n\n    if (animateForward) {\n      final droppedPageForwardAnimationTime = min(\n        lerpDouble(\n                _kMaxDroppedSwipePageForwardAnimationTime, 0, controller.value)!\n            .floor(),\n        _kMaxPageBackAnimationTime,\n      );\n      controller.animateTo(1.0,\n          duration: Duration(milliseconds: droppedPageForwardAnimationTime),\n          curve: animationCurve);\n    } else {\n      navigator.pop();\n      if (controller.isAnimating) {\n        final droppedPageBackAnimationTime = lerpDouble(\n                0, _kMaxDroppedSwipePageForwardAnimationTime, controller.value)!\n            .floor();\n        controller.animateBack(0.0,\n            duration: Duration(milliseconds: droppedPageBackAnimationTime),\n            curve: animationCurve);\n      }\n    }\n\n    if (controller.isAnimating) {\n      late AnimationStatusListener animationStatusCallback;\n      animationStatusCallback = (status) {\n        navigator.didStopUserGesture();\n        controller.removeStatusListener(animationStatusCallback);\n      };\n      controller.addStatusListener(animationStatusCallback);\n    } else {\n      navigator.didStopUserGesture();\n    }\n  }\n\n  void dragUpdate(double delta) {\n    controller.value -= delta;\n  }\n}\n\nclass IOSBackGestureDetector extends StatefulWidget {\n  const IOSBackGestureDetector(\n      {required this.enabledCallback,\n      required this.child,\n      required this.gestureWidth,\n      required this.onStartPopGesture,\n      super.key});\n\n  final double gestureWidth;\n\n  final bool Function() enabledCallback;\n\n  final IOSBackGestureController Function() onStartPopGesture;\n\n  final Widget child;\n\n  @override\n  State<IOSBackGestureDetector> createState() => _IOSBackGestureDetectorState();\n}\n\nclass _IOSBackGestureDetectorState extends State<IOSBackGestureDetector> {\n  IOSBackGestureController? _backGestureController;\n\n  late HorizontalDragGestureRecognizer _recognizer;\n\n  @override\n  void dispose() {\n    _recognizer.dispose();\n    super.dispose();\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _recognizer = HorizontalDragGestureRecognizer(debugOwner: this)\n      ..onStart = _handleDragStart\n      ..onUpdate = _handleDragUpdate\n      ..onEnd = _handleDragEnd\n      ..onCancel = _handleDragCancel;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var dragAreaWidth = Directionality.of(context) == TextDirection.ltr\n        ? MediaQuery.of(context).padding.left\n        : MediaQuery.of(context).padding.right;\n    dragAreaWidth = max(dragAreaWidth, widget.gestureWidth);\n    return Stack(\n      fit: StackFit.passthrough,\n      children: <Widget>[\n        widget.child,\n        Positioned(\n          width: dragAreaWidth,\n          top: 0.0,\n          bottom: 0.0,\n          left: 0,\n          child: Listener(\n            onPointerDown: _handlePointerDown,\n            behavior: HitTestBehavior.translucent,\n          ),\n        ),\n      ],\n    );\n  }\n\n  void _handlePointerDown(PointerDownEvent event) {\n    if (widget.enabledCallback()) _recognizer.addPointer(event);\n  }\n\n  void _handleDragCancel() {\n    assert(mounted);\n    _backGestureController?.dragEnd(0.0);\n    _backGestureController = null;\n  }\n\n  double _convertToLogical(double value) {\n    switch (Directionality.of(context)) {\n      case TextDirection.rtl:\n        return -value;\n      case TextDirection.ltr:\n        return value;\n    }\n  }\n\n  void _handleDragEnd(DragEndDetails details) {\n    assert(mounted);\n    assert(_backGestureController != null);\n    _backGestureController!.dragEnd(_convertToLogical(\n        details.velocity.pixelsPerSecond.dx / context.size!.width));\n    _backGestureController = null;\n  }\n\n  void _handleDragStart(DragStartDetails details) {\n    assert(mounted);\n    assert(_backGestureController == null);\n    _backGestureController = widget.onStartPopGesture();\n  }\n\n  void _handleDragUpdate(DragUpdateDetails details) {\n    assert(mounted);\n    assert(_backGestureController != null);\n    _backGestureController!.dragUpdate(\n        _convertToLogical(details.primaryDelta! / context.size!.width));\n  }\n}\n\nclass SlidePageTransitionBuilder extends PageTransitionsBuilder {\n  @override\n  Widget buildTransitions<T>(\n      PageRoute<T> route,\n      BuildContext context,\n      Animation<double> animation,\n      Animation<double> secondaryAnimation,\n      Widget child) {\n    return SlideTransition(\n        position: Tween<Offset>(\n          begin: const Offset(1, 0),\n          end: Offset.zero,\n        ).animate(CurvedAnimation(\n          parent: animation,\n          curve: Curves.ease,\n        )),\n        child: SlideTransition(\n          position: Tween<Offset>(\n            begin: Offset.zero,\n            end: const Offset(-0.4, 0),\n          ).animate(CurvedAnimation(\n            parent: secondaryAnimation,\n            curve: Curves.ease,\n          )),\n          child: PhysicalModel(\n            color: Colors.transparent,\n            borderRadius: BorderRadius.zero,\n            clipBehavior: Clip.hardEdge,\n            elevation: 6,\n            child: Material(child: child,),\n          ),\n        )\n    );\n  }\n}\n"
  },
  {
    "path": "lib/foundation/cache_manager.dart",
    "content": "import 'dart:io';\n\nimport 'package:crypto/crypto.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/tools/io_extensions.dart';\nimport 'package:sqlite3/sqlite3.dart';\n\nclass CacheManager {\n  static String get cachePath => '${App.cachePath}/cache';\n\n  static CacheManager? instance;\n\n  late Database _db;\n\n  int? _currentSize;\n\n  /// size in bytes\n  int get currentSize => _currentSize ?? 0;\n\n  int dir = 0;\n\n  int _limitSize = 2 * 1024 * 1024 * 1024;\n\n  CacheManager._create(){\n    Directory(cachePath).createSync(recursive: true);\n    _db = sqlite3.open('${App.dataPath}/cache.db');\n    _db.execute('''\n      CREATE TABLE IF NOT EXISTS cache (\n        key TEXT PRIMARY KEY NOT NULL,\n        dir TEXT NOT NULL,\n        name TEXT NOT NULL,\n        expires INTEGER NOT NULL,\n        type TEXT\n      )\n    ''');\n    // 旧版本的表中没有type字段，需要添加\n    try {\n      _db.execute('''\n        ALTER TABLE cache ADD COLUMN type TEXT\n      ''');\n    } catch (e) {\n      // ignore\n    }\n    compute((path) => Directory(path).size, cachePath)\n        .then((value) => _currentSize = value);\n  }\n\n  factory CacheManager() => instance ??= CacheManager._create();\n\n  /// set cache size limit in MB\n  void setLimitSize(int size){\n    _limitSize = size * 1024 * 1024;\n  }\n\n  void setType(String key, String? type){\n    _db.execute('''\n      UPDATE cache\n      SET type = ?\n      WHERE key = ?\n    ''', [type, key]);\n  }\n\n  String? getType(String key){\n    var res = _db.select('''\n      SELECT type FROM cache\n      WHERE key = ?\n    ''', [key]);\n    if(res.isEmpty){\n      return null;\n    }\n    return res.first[0];\n  }\n\n  Future<void> writeCache(String key, Uint8List data, [int duration = 7 * 24 * 60 * 60 * 1000]) async{\n    this.dir++;\n    this.dir %= 100;\n    var dir = this.dir;\n    var name = md5.convert(Uint8List.fromList(key.codeUnits)).toString();\n    var file = File('$cachePath/$dir/$name');\n    while(await file.exists()){\n      name = md5.convert(Uint8List.fromList(name.codeUnits)).toString();\n      file = File('$cachePath/$dir/$name');\n    }\n    await file.create(recursive: true);\n    await file.writeAsBytes(data);\n    var expires = DateTime.now().millisecondsSinceEpoch + duration;\n    _db.execute('''\n      INSERT OR REPLACE INTO cache (key, dir, name, expires) VALUES (?, ?, ?, ?)\n    ''', [key, dir.toString(), name, expires]);\n    if(_currentSize != null) {\n      _currentSize = _currentSize! + data.length;\n    }\n    if(_currentSize != null && _currentSize! > _limitSize){\n      await checkCache();\n    }\n  }\n\n  Future<CachingFile> openWrite(String key) async{\n    this.dir++;\n    this.dir %= 100;\n    var dir = this.dir;\n    var name = md5.convert(Uint8List.fromList(key.codeUnits)).toString();\n    var file = File('$cachePath/$dir/$name');\n    while(await file.exists()){\n      name = md5.convert(Uint8List.fromList(name.codeUnits)).toString();\n      file = File('$cachePath/$dir/$name');\n    }\n    await file.create(recursive: true);\n    return CachingFile._(key, dir.toString(), name, file);\n  }\n\n  Future<String?> findCache(String key) async{\n    var res = _db.select('''\n      SELECT * FROM cache\n      WHERE key = ?\n    ''', [key]);\n    if(res.isEmpty){\n      return null;\n    }\n    var row = res.first;\n    var dir = row[1] as String;\n    var name = row[2] as String;\n    var file = File('$cachePath/$dir/$name');\n    if(await file.exists()){\n      return file.path;\n    }\n    return null;\n  }\n\n  bool _isChecking = false;\n\n  Future<void> checkCache() async{\n    if(_isChecking){\n      return;\n    }\n    _isChecking = true;\n    var res = _db.select('''\n      SELECT * FROM cache\n      WHERE expires < ?\n    ''', [DateTime.now().millisecondsSinceEpoch]);\n    for(var row in res){\n      var dir = row[1] as int;\n      var name = row[2] as String;\n      var file = File('$cachePath/$dir/$name');\n      if(await file.exists()){\n        await file.delete();\n      }\n    }\n    _db.execute('''\n      DELETE FROM cache\n      WHERE expires < ?\n    ''', [DateTime.now().millisecondsSinceEpoch]);\n\n    int count = 0;\n    var res2 = _db.select('''\n      SELECT COUNT(*) FROM cache\n    ''');\n    if(res2.isNotEmpty){\n      count = res2.first[0] as int;\n    }\n\n    while((_currentSize != null && _currentSize! > _limitSize) ||  count > 2000){\n      var res = _db.select('''\n        SELECT * FROM cache\n        ORDER BY time ASC\n        limit 10\n      ''');\n      for(var row in res){\n        var key = row[0] as String;\n        var dir = row[1] as int;\n        var name = row[2] as String;\n        var file = File('$cachePath/$dir/$name');\n        if(await file.exists()){\n          var size = await file.length();\n          await file.delete();\n          _db.execute('''\n            DELETE FROM cache\n            WHERE key = ?\n          ''', [key]);\n          _currentSize = _currentSize! - size;\n          if(_currentSize! <= _limitSize){\n            break;\n          }\n        } else {\n          _db.execute('''\n            DELETE FROM cache\n            WHERE key = ?\n          ''', [key]);\n        }\n        count--;\n      }\n    }\n    _isChecking = false;\n  }\n\n  Future<void> delete(String key) async{\n    var res = _db.select('''\n      SELECT * FROM cache\n      WHERE key = ?\n    ''', [key]);\n    if(res.isEmpty){\n      return;\n    }\n    var row = res.first;\n    var dir = row[1] as String;\n    var name = row[2] as String;\n    var file = File('$cachePath/$dir/$name');\n    var fileSize = 0;\n    if(await file.exists()){\n      fileSize = await file.length();\n      await file.delete();\n    }\n    _db.execute('''\n      DELETE FROM cache\n      WHERE key = ?\n    ''', [key]);\n    if(_currentSize != null) {\n      _currentSize = _currentSize! - fileSize;\n    }\n  }\n\n  Future<void> clear() async {\n    await Directory(cachePath).delete(recursive: true);\n    Directory(cachePath).createSync(recursive: true);\n    _db.execute('''\n      DELETE FROM cache\n    ''');\n    _currentSize = 0;\n  }\n\n  Future<void> deleteKeyword(String keyword) async{\n    var res = _db.select('''\n      SELECT * FROM cache\n      WHERE key LIKE ?\n    ''', ['%$keyword%']);\n    for(var row in res){\n      var key = row[0] as String;\n      var dir = row[1] as String;\n      var name = row[2] as String;\n      var file = File('$cachePath/$dir/$name');\n      var fileSize = 0;\n      if(await file.exists()){\n        fileSize = await file.length();\n        try {\n          await file.delete();\n        }\n        finally {}\n      }\n      _db.execute('''\n        DELETE FROM cache\n        WHERE key = ?\n      ''', [key]);\n      if(_currentSize != null) {\n        _currentSize = _currentSize! - fileSize;\n      }\n    }\n  }\n}\n\nclass CachingFile{\n  CachingFile._(this.key, this.dir, this.name, this.file);\n\n  final String key;\n\n  final String dir;\n\n  final String name;\n\n  final File file;\n\n  final List<int> _buffer = [];\n\n  Future<void> writeBytes(List<int> data) async{\n    _buffer.addAll(data);\n    if(_buffer.length > 1024 * 1024){\n      await file.writeAsBytes(_buffer, mode: FileMode.append);\n      _buffer.clear();\n    }\n  }\n\n  Future<void> close() async{\n    if(_buffer.isNotEmpty){\n      await file.writeAsBytes(_buffer, mode: FileMode.append);\n    }\n    CacheManager()._db.execute('''\n      INSERT OR REPLACE INTO cache (key, dir, name, expires) VALUES (?, ?, ?, ?)\n    ''', [key, dir, name, DateTime.now().millisecondsSinceEpoch + 7 * 24 * 60 * 60 * 1000]);\n  }\n\n  Future<void> cancel() async{\n    await file.deleteIgnoreError();\n  }\n\n  void reset() {\n    _buffer.clear();\n    if(file.existsSync()) {\n      file.deleteSync();\n    }\n  }\n}"
  },
  {
    "path": "lib/foundation/def.dart",
    "content": "import 'package:flutter/material.dart';\n\ntypedef ActionFunc = void Function();\n\nenum ComicType {\n  picacg,\n  ehentai,\n  jm,\n  hitomi,\n  htManga,\n  htFavorite,\n  nhentai,\n  other;\n\n  @override\n  toString() => name;\n}\n\nconst String webUA =\n    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36\";\n\n//App版本\nconst appVersion = \"4.0.4\";\n\n//定义宽屏设备的临界值\nconst changePoint = 600;\nconst changePoint2 = 1300;\n\nList<MaterialAccentColor> get colors => [\n  Colors.redAccent,\n  Colors.pinkAccent,\n  Colors.purpleAccent,\n  Colors.indigoAccent,\n  Colors.blueAccent,\n  Colors.cyanAccent,\n  Colors.tealAccent,\n  Colors.greenAccent,\n  Colors.limeAccent,\n  Colors.yellowAccent,\n  Colors.amberAccent,\n  Colors.orangeAccent,\n];\n\nconst builtInSources = [\n  \"picacg\",\n  \"ehentai\",\n  \"jm\",\n  \"hitomi\",\n  \"htmanga\",\n  \"nhentai\"\n];"
  },
  {
    "path": "lib/foundation/history.dart",
    "content": "import 'dart:async';\nimport 'dart:collection';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/webdav.dart';\nimport 'package:sqlite3/sqlite3.dart';\n\npart \"image_favorites.dart\";\n\nabstract mixin class HistoryMixin {\n  String get title;\n\n  String? get subTitle;\n\n  String get cover;\n\n  String get target;\n\n  Object? get maxPage => null;\n\n  HistoryType get historyType;\n}\n\nfinal class HistoryType {\n  static HistoryType get picacg => const HistoryType(0);\n\n  static HistoryType get ehentai => const HistoryType(1);\n\n  static HistoryType get jmComic => const HistoryType(2);\n\n  static HistoryType get hitomi => const HistoryType(3);\n\n  static HistoryType get htmanga => const HistoryType(4);\n\n  static HistoryType get nhentai => const HistoryType(5);\n\n  final int value;\n\n  String get name {\n    if (value >= 0 && value <= 5) {\n      return [\"picacg\", \"ehentai\", \"jm\", \"hitomi\", \"htmanga\", \"nhentai\"][value];\n    } else {\n      return ComicSource.fromIntKey(value)?.name ?? \"Unknown\";\n    }\n  }\n\n  const HistoryType(this.value);\n\n  @override\n  bool operator ==(Object other) =>\n      other is HistoryType && other.value == value;\n\n  @override\n  int get hashCode => value.hashCode;\n\n  ComicSource? get comicSource {\n    if (value >= 0 && value <= 5) {\n      return ComicSource.find(name);\n    } else {\n      return ComicSource.fromIntKey(value);\n    }\n  }\n}\n\nbase class History extends LinkedListEntry<History> {\n  HistoryType type;\n\n  DateTime time;\n\n  String title;\n\n  String subtitle;\n\n  String cover;\n\n  /// 标记为0表示没有阅读位置记录\n  int ep;\n\n  int page;\n\n  String target;\n\n  Set<int> readEpisode;\n\n  int? maxPage;\n\n  History(this.type, this.time, this.title, this.subtitle, this.cover, this.ep,\n      this.page, this.target,\n      [this.readEpisode = const <int>{}, this.maxPage]);\n\n  History.fromModel(\n      {required HistoryMixin model,\n      required this.ep,\n      required this.page,\n      this.readEpisode = const <int>{},\n      DateTime? time})\n      : type = model.historyType,\n        title = model.title,\n        subtitle = model.subTitle ?? '',\n        cover = model.cover,\n        target = model.target,\n        time = time ?? DateTime.now();\n\n  Map<String, dynamic> toMap() => {\n        \"type\": type.value,\n        \"time\": time.millisecondsSinceEpoch,\n        \"title\": title,\n        \"subtitle\": subtitle,\n        \"cover\": cover,\n        \"ep\": ep,\n        \"page\": page,\n        \"target\": target,\n        \"readEpisode\": readEpisode.toList(),\n        \"max_page\": maxPage\n      };\n\n  History.fromMap(Map<String, dynamic> map)\n      : type = HistoryType(map[\"type\"]),\n        time = DateTime.fromMillisecondsSinceEpoch(map[\"time\"]),\n        title = map[\"title\"],\n        subtitle = map[\"subtitle\"],\n        cover = map[\"cover\"],\n        ep = map[\"ep\"],\n        page = map[\"page\"],\n        target = map[\"target\"],\n        readEpisode = Set<int>.from(\n            (map[\"readEpisode\"] as List<dynamic>?)?.toSet() ?? const <int>{}),\n        maxPage = map[\"max_page\"];\n\n  @override\n  String toString() {\n    return 'NewHistory{type: $type, time: $time, title: $title, subtitle: $subtitle, cover: $cover, ep: $ep, page: $page, target: $target}';\n  }\n\n  History.fromRow(Row row)\n      : type = HistoryType(row[\"type\"]),\n        time = DateTime.fromMillisecondsSinceEpoch(row[\"time\"]),\n        title = row[\"title\"],\n        subtitle = row[\"subtitle\"],\n        cover = row[\"cover\"],\n        ep = row[\"ep\"],\n        page = row[\"page\"],\n        target = row[\"target\"],\n        readEpisode = Set<int>.from((row[\"readEpisode\"] as String)\n            .split(',')\n            .where((element) => element != \"\")\n            .map((e) => int.parse(e))),\n        maxPage = row[\"max_page\"];\n\n  static Future<History> findOrCreate(\n    HistoryMixin model, {\n    int ep = 0,\n    int page = 0,\n  }) async {\n    var history = await HistoryManager().find(model.target);\n    if (history != null) {\n      return history;\n    }\n    history = History.fromModel(model: model, ep: ep, page: page);\n    HistoryManager().addHistory(history);\n    return history;\n  }\n\n  static Future<History> createIfNull(\n      History? history, HistoryMixin model) async {\n    if (history != null) {\n      return history;\n    }\n    history = History.fromModel(model: model, ep: 0, page: 0);\n    HistoryManager().addHistory(history);\n    return history;\n  }\n}\n\nclass HistoryManager {\n  static HistoryManager? cache;\n\n  HistoryManager.create();\n\n  factory HistoryManager() =>\n      cache == null ? (cache = HistoryManager.create()) : cache!;\n\n  late Database _db;\n\n  int get length => _db.select(\"select count(*) from history;\").first[0] as int;\n\n  Map<String, bool>? _cachedHistory;\n\n  Future<void> tryUpdateDb() async {\n    var file = File(\"${App.dataPath}/history_temp.db\");\n    if (!file.existsSync()) {\n      LogManager.addLog(\n          LogLevel.info, \"HistoryManager.tryUpdateDb\", \"db file not exist\");\n      return;\n    }\n    var db = sqlite3.open(file.path);\n    var newHistory0 = db.select(\"\"\"\n      select * from history\n      order by time DESC;\n    \"\"\");\n    var newHistory =\n        newHistory0.map((element) => History.fromRow(element)).toList();\n    if (file.existsSync()) {\n      var skips = 0;\n      for (var history in newHistory) {\n        if (findSync(history.target) == null) {\n          addHistory(history);\n          LogManager.addLog(LogLevel.info, \"HistoryManager\",\n              \"merge history ${history.target}\");\n        } else {\n          skips++;\n        }\n      }\n      LogManager.addLog(LogLevel.info, \"HistoryManager\",\n          \"merge history, skipped $skips, added ${newHistory.length - skips}\");\n    }\n    db.dispose();\n    file.deleteSync();\n  }\n\n  Future<void> init() async {\n    _db = sqlite3.open(\"${App.dataPath}/history.db\");\n\n    _db.execute(\"\"\"\n        create table if not exists history  (\n          target text primary key,\n          title text,\n          subtitle text,\n          cover text,\n          time int,\n          type int,\n          ep int,\n          page int,\n          readEpisode text,\n          max_page int\n        );\n      \"\"\");\n\n    // 检查是否有max_page字段, 如果没有则添加\n    var res = _db.select(\"\"\"\n      PRAGMA table_info(history);\n    \"\"\");\n    if (res.every((row) => row[\"name\"] != \"max_page\")) {\n      _db.execute(\"\"\"\n        alter table history\n        add column max_page int;\n      \"\"\");\n    }\n\n    // 迁移早期版本的数据\n    var file = File(\"${App.dataPath}/history.json\");\n    if (file.existsSync()) {\n      readDataFromJson(jsonDecode(file.readAsStringSync()));\n      file.deleteSync();\n    }\n\n    ImageFavoriteManager.init();\n  }\n\n  void readDataFromJson(List<dynamic> json) {\n    var history = LinkedList<History>();\n    for (var h in json) {\n      history.add(History.fromMap((h as Map<String, dynamic>)));\n    }\n    // do not clear previous history\n    for (var element in history) {\n      if (findSync(element.target) == null) addHistory(element);\n    }\n    vacuum();\n  }\n\n  void saveData() async {\n    Webdav.uploadData();\n  }\n\n  /// add history. if exists, update time.\n  ///\n  /// This function would be called when user start reading.\n  Future<void> addHistory(History newItem) async {\n    var res = _db.select(\"\"\"\n      select * from history\n      where target == ?;\n    \"\"\", [newItem.target]);\n    if (res.isEmpty) {\n      _db.execute(\"\"\"\n        insert into history (target, title, subtitle, cover, time, type, ep, page, readEpisode, max_page)\n        values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);\n      \"\"\", [\n        newItem.target,\n        newItem.title,\n        newItem.subtitle,\n        newItem.cover,\n        newItem.time.millisecondsSinceEpoch,\n        newItem.type.value,\n        newItem.ep,\n        newItem.page,\n        newItem.readEpisode.join(','),\n        newItem.maxPage\n      ]);\n    } else {\n      _db.execute(\"\"\"\n        update history\n        set time = ${DateTime.now().millisecondsSinceEpoch}\n        where target == ?;\n      \"\"\", [newItem.target]);\n    }\n    saveData();\n    updateCache();\n  }\n\n  ///退出阅读器时调用此函数, 修改阅读位置\n  Future<void> saveReadHistory(History history,\n      [bool updateMePage = true]) async {\n    _db.execute(\"\"\"\n        update history\n        set time = ${DateTime.now().millisecondsSinceEpoch}, ep = ?, page = ?, readEpisode = ?, max_page = ?\n        where target == ?;\n    \"\"\", [\n      history.ep,\n      history.page,\n      history.readEpisode.join(','),\n      history.maxPage,\n      history.target\n    ]);\n    if (updateMePage) {\n      scheduleMicrotask(() {\n        StateController.findOrNull(tag: \"me_page\")?.update();\n      });\n    }\n  }\n\n  void clearHistory() {\n    _db.execute(\"delete from history;\");\n    updateCache();\n  }\n\n  void remove(String id) async {\n    _db.execute(\"\"\"\n      delete from history\n      where target == '$id';\n    \"\"\");\n    updateCache();\n  }\n\n  Future<History?> find(String target) async {\n    return findSync(target);\n  }\n\n  void updateCache() {\n    _cachedHistory = {};\n    var res = _db.select(\"\"\"\n        select * from history;\n      \"\"\");\n    for (var element in res) {\n      _cachedHistory![element[\"target\"] as String] = true;\n    }\n  }\n\n  History? findSync(String target) {\n    if(_cachedHistory == null) {\n      updateCache();\n    }\n    if (!_cachedHistory!.containsKey(target)) {\n      return null;\n    }\n\n    var res = _db.select(\"\"\"\n      select * from history\n      where target == ?;\n    \"\"\", [target]);\n    if (res.isEmpty) {\n      return null;\n    }\n    return History.fromRow(res.first);\n  }\n\n  List<History> getAll() {\n    var res = _db.select(\"\"\"\n      select * from history\n      order by time DESC;\n    \"\"\");\n    return res.map((element) => History.fromRow(element)).toList();\n  }\n\n  void vacuum() {\n    _db.execute(\"\"\"\n      vacuum;\n    \"\"\");\n  }\n\n  /// 获取最近一周的阅读数据, 用于生成图表, List中的元素是当天阅读的漫画数量\n  List<int> getWeekData(int days) {\n    var res = _db.select(\"\"\"\n      select * from history\n      where time > ${DateTime.now().add(Duration(days: 1 - days)).millisecondsSinceEpoch}\n      order by time ASC;\n    \"\"\");\n    var data = List<int>.filled(days, 0);\n    for (var element in res) {\n      var time = DateTime.fromMillisecondsSinceEpoch(element[\"time\"] as int);\n      data[DateTime.now().difference(time).inDays]++;\n    }\n    return data.reversed.toList();\n  }\n\n  /// 获取最近阅读的漫画\n  List<History> getRecent() {\n    var res = _db.select(\"\"\"\n      select * from history\n      order by time DESC\n      limit 20;\n    \"\"\");\n    return res.map((element) => History.fromRow(element)).toList();\n  }\n\n  /// 获取历史记录的数量\n  int count() {\n    var res = _db.select(\"\"\"\n      select count(*) from history;\n    \"\"\");\n    return res.first[0] as int;\n  }\n}\n"
  },
  {
    "path": "lib/foundation/image_favorites.dart",
    "content": "part of \"history.dart\";\n\n// 直接用history.db了, 没必要再加一个favorites.db\n\nclass ImageFavorite{\n  /// unique id for the comic\n  final String id;\n\n  final String imagePath;\n\n  final String title;\n\n  final int ep;\n\n  final int page;\n\n  final Map<String, dynamic> otherInfo;\n\n  const ImageFavorite(this.id, this.imagePath, this.title, this.ep, this.page, this.otherInfo);\n}\n\nclass ImageFavoriteManager{\n  static Database get _db => HistoryManager()._db;\n\n  /// 检查表image_favorites是否存在, 不存在则创建\n  static void init(){\n    _db.execute(\"CREATE TABLE IF NOT EXISTS image_favorites (\"\n        \"id TEXT,\"\n        \"title TEXT NOT NULL,\"\n        \"cover TEXT NOT NULL,\"\n        \"ep INTEGER NOT NULL,\"\n        \"page INTEGER NOT NULL,\"\n        \"other TEXT NOT NULL,\"\n        \"PRIMARY KEY (id, ep, page)\"\n        \");\");\n  }\n\n  static void add(ImageFavorite favorite){\n    _db.execute(\"\"\"\n      insert into image_favorites(id, title, cover, ep, page, other)\n      values(?, ?, ?, ?, ?, ?);\n    \"\"\", [favorite.id, favorite.title, favorite.imagePath, favorite.ep, favorite.page, jsonEncode(favorite.otherInfo)]);\n    Webdav.uploadData();\n    Future.microtask(() => StateController.findOrNull(tag: \"me_page\")?.update());\n  }\n\n  static List<ImageFavorite> getAll(){\n    var res = _db.select(\"select * from image_favorites;\");\n    return res.map((e) =>\n        ImageFavorite(e[\"id\"], e[\"cover\"], e[\"title\"], e[\"ep\"], e[\"page\"], jsonDecode(e[\"other\"]))).toList();\n  }\n\n  static void delete(ImageFavorite favorite){\n    _db.execute(\"\"\"\n      delete from image_favorites\n      where id = ? and ep = ? and page = ?;\n    \"\"\", [favorite.id, favorite.ep, favorite.page]);\n    Webdav.uploadData();\n  }\n\n  static int get length {\n    var res = _db.select(\"select count(*) from image_favorites;\");\n    return res.first.values.first! as int;\n  }\n}"
  },
  {
    "path": "lib/foundation/image_loader/base_image_provider.dart",
    "content": "import 'dart:async' show Future, StreamController, scheduleMicrotask;\nimport 'dart:collection';\nimport 'dart:convert';\nimport 'dart:ui' as ui show Codec;\nimport 'dart:ui';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/foundation/cache_manager.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\n\nabstract class BaseImageProvider<T extends BaseImageProvider<T>>\n    extends ImageProvider<T> {\n  const BaseImageProvider();\n\n  @override\n  ImageStreamCompleter loadImage(T key, ImageDecoderCallback decode) {\n    final chunkEvents = StreamController<ImageChunkEvent>();\n    return MultiFrameImageStreamCompleter(\n      codec: _loadBufferAsync(key, chunkEvents, decode),\n      chunkEvents: chunkEvents.stream,\n      scale: 1.0,\n      informationCollector: () sync* {\n        yield DiagnosticsProperty<ImageProvider>(\n          'Image provider: $this \\n Image key: $key',\n          this,\n          style: DiagnosticsTreeStyle.errorProperty,\n        );\n      },\n    );\n  }\n\n  Future<ui.Codec> _loadBufferAsync(\n    T key,\n    StreamController<ImageChunkEvent> chunkEvents,\n    ImageDecoderCallback decode,\n  ) async {\n    try {\n      int retryTime = 1;\n\n      bool stop = false;\n\n      chunkEvents.onCancel = () {\n        stop = true;\n      };\n\n      Uint8List? data;\n\n      while (data == null && !stop) {\n        try {\n          if(_cache.containsKey(key.key)){\n            data = _cache[key.key];\n          } else {\n            data = await load(chunkEvents);\n            _checkCacheSize();\n            _cache[key.key] = data;\n            _cacheSize += data.length;\n          }\n        } catch (e) {\n          if(e.toString().contains(\"Maximum image loading limit reached\")) {\n            rethrow;\n          }\n          if (e.toString().contains(\"Your IP address\")) {\n            rethrow;\n          }\n          if (e is BadRequestException) {\n            rethrow;\n          }\n          if (e.toString().contains(\"handshake\")) {\n            if (retryTime < 5) {\n              retryTime = 5;\n            }\n          }\n          retryTime <<= 1;\n          if (retryTime > (1 << 3) || stop) {\n            rethrow;\n          }\n          await Future.delayed(Duration(seconds: retryTime));\n        }\n      }\n\n      if(stop) {\n        throw Exception(\"Image loading is stopped\");\n      }\n\n      if(data!.isEmpty) {\n        throw Exception(\"Empty image data\");\n      }\n\n      try {\n        final buffer = await ImmutableBuffer.fromUint8List(data);\n        return await decode(buffer);\n      } catch (e) {\n        await CacheManager().delete(this.key);\n        Object error = e;\n        if (data.length < 2 * 1024) {\n          // data is too short, it's likely that the data is text, not image\n          try {\n            var text = const Utf8Codec(allowMalformed: false).decoder.convert(data);\n            error = Exception(\"Expected image data, but got text: $text\");\n          } catch (e) {\n            // ignore\n          }\n        }\n        throw error;\n      }\n    } catch (e) {\n      scheduleMicrotask(() {\n        PaintingBinding.instance.imageCache.evict(key);\n      });\n      rethrow;\n    } finally {\n      chunkEvents.close();\n    }\n  }\n\n  static final _cache = LinkedHashMap<String, Uint8List>();\n\n  static var _cacheSize = 0;\n\n  static var _cacheSizeLimit = 50 * 1024 * 1024;\n\n  static void _checkCacheSize(){\n    while (_cacheSize > _cacheSizeLimit){\n      var firstKey = _cache.keys.first;\n      _cacheSize -= _cache[firstKey]!.length;\n      _cache.remove(firstKey);\n    }\n  }\n\n  static void clearCache(){\n    _cache.clear();\n    _cacheSize = 0;\n  }\n\n  static void setCacheSizeLimit(int size){\n    _cacheSizeLimit = size;\n    _checkCacheSize();\n  }\n\n  Future<Uint8List> load(StreamController<ImageChunkEvent> chunkEvents);\n\n  String get key;\n\n  @override\n  bool operator ==(Object other) {\n    return other is BaseImageProvider<T> && key == other.key;\n  }\n\n  @override\n  int get hashCode => key.hashCode;\n\n  @override\n  String toString() {\n    return \"$runtimeType($key)\";\n  }\n}\n\ntypedef FileDecoderCallback = Future<ui.Codec> Function(Uint8List);\n"
  },
  {
    "path": "lib/foundation/image_loader/cached_image.dart",
    "content": "import 'dart:async' show Future, StreamController;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport '../image_manager.dart';\nimport 'base_image_provider.dart';\nimport 'cached_image.dart' as image_provider;\n\n/// Function which is called after loading the image failed.\ntypedef ErrorListener = void Function();\n\nclass CachedImageProvider\n    extends BaseImageProvider<image_provider.CachedImageProvider> {\n\n  /// Image provider for normal image.\n  const CachedImageProvider(this.url, {this.headers, this.sourceKey});\n\n  final String url;\n\n  final Map<String, String>? headers;\n\n  final String? sourceKey;\n\n  @override\n  Future<Uint8List> load(StreamController<ImageChunkEvent> chunkEvents) async{\n    chunkEvents.add(const ImageChunkEvent(\n        cumulativeBytesLoaded: 0,\n        expectedTotalBytes: 100)\n    );\n    var manager = ImageManager();\n    DownloadProgress? finishProgress;\n\n    var stream = sourceKey == null \n      ? manager.getImage(url, headers)\n      : manager.getCustomThumbnail(url, sourceKey!);\n    await for (var progress in stream) {\n      if (progress.currentBytes == progress.expectedBytes) {\n        finishProgress = progress;\n      }\n      chunkEvents.add(ImageChunkEvent(\n          cumulativeBytesLoaded: progress.currentBytes,\n          expectedTotalBytes: progress.expectedBytes)\n      );\n    }\n\n    if(finishProgress!.data != null){\n      return finishProgress.data!;\n    }\n\n    var file = finishProgress.getFile();\n    return await file.readAsBytes();\n  }\n\n  @override\n  Future<CachedImageProvider> obtainKey(ImageConfiguration configuration) {\n    return SynchronousFuture(this);\n  }\n\n  @override\n  String get key => url;\n}\n"
  },
  {
    "path": "lib/foundation/image_loader/file_image_loader.dart",
    "content": "import 'dart:async' show Future;\nimport 'dart:ui';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/network/download.dart';\n\nclass FileImageProvider extends ImageProvider<FileImageProvider> {\n\n  /// Image provider for downloaded comic\n  const FileImageProvider(this.id, this.ep, this.index);\n\n  final String id;\n\n  final int ep;\n\n  final int index;\n\n  @override\n  Future<FileImageProvider> obtainKey(ImageConfiguration configuration) {\n    return SynchronousFuture<FileImageProvider>(this);\n  }\n\n  @override\n  ImageStreamCompleter loadImage(FileImageProvider key, ImageDecoderCallback decode) {\n    return MultiFrameImageStreamCompleter(\n      codec: _loadAsync(key, decode: decode),\n      scale: 1.0,\n      debugLabel: key.toString(),\n    );\n  }\n\n  Future<Codec> _loadAsync(\n      FileImageProvider key, {\n        required ImageDecoderCallback decode,\n      }) async {\n    var file = await DownloadManager().getImageAsync(id, ep, index);\n    final int lengthInBytes = await file.length();\n    if (lengthInBytes == 0) {\n      // The file may become available later.\n      PaintingBinding.instance.imageCache.evict(key);\n      throw StateError('$file is empty and cannot be loaded as an image.');\n    }\n    return decode(await ImmutableBuffer.fromFilePath(file.path));\n  }\n\n  @override\n  bool operator ==(Object other) {\n    if (other.runtimeType != runtimeType) {\n      return false;\n    }\n    return other is FileImageProvider\n        && other.id == id\n        && other.ep == ep\n        && other.index == index;\n  }\n\n  @override\n  int get hashCode => Object.hash(\"FileImageProvider\", id, ep, index);\n\n  @override\n  String toString() => 'FileImageProvider $id $ep $index';\n}\n"
  },
  {
    "path": "lib/foundation/image_loader/image_recombine.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'dart:isolate';\nimport 'package:flutter/foundation.dart';\nimport 'package:image/image.dart' as image;\nimport 'package:crypto/crypto.dart';\nimport 'package:pica_comic/foundation/log.dart';\n\n/// 转换自 https://github.com/tonquer/JMComic-qt/blob/main/src/tools/tool.py\nint _getSegmentationNum(String epsId, String scrambleID, String pictureName) {\n  int scrambleId = int.parse(scrambleID);\n  int epsID = int.parse(epsId);\n  int num = 0;\n\n  if (epsID < scrambleId) {\n    num = 0;\n  } else if (epsID < 268850) {\n    num = 10;\n  } else if (epsID > 421926) {\n    String string = epsID.toString() + pictureName;\n    List<int> bytes = utf8.encode(string);\n    String hash = md5.convert(bytes).toString();\n    int charCode = hash.codeUnitAt(hash.length - 1);\n    int remainder = charCode % 8;\n    num = remainder * 2 + 2;\n  } else {\n    String string = epsID.toString() + pictureName;\n    List<int> bytes = utf8.encode(string);\n    String hash = md5.convert(bytes).toString();\n    int charCode = hash.codeUnitAt(hash.length - 1);\n    int remainder = charCode % 10;\n    num = remainder * 2 + 2;\n  }\n\n  return num;\n}\n\n/// 转换自 https://github.com/tonquer/JMComic-qt/blob/main/src/tools/tool.py\nFuture<Uint8List> _segmentationPicture(_RecombinationTask data) async {\n  int num = _getSegmentationNum(data.epsId, data.scrambleId, data.bookId);\n\n  if (num <= 1) {\n    return data.imgData;\n  }\n  image.Image srcImg;\n  try {\n    srcImg = image.decodeImage(data.imgData)!;\n  }\n  catch(e){\n    throw Exception(\"Failed to decode image: Data length is ${data.imgData.length} bytes\");\n  }\n\n  int blockSize = (srcImg.height / num).floor();\n  int remainder = srcImg.height % num;\n\n  List<Map<String, int>> blocks = [];\n\n  for (int i = 0; i < num; i++) {\n    int start = i * blockSize;\n    int end = start + blockSize + ((i != num - 1) ? 0 : remainder);\n    blocks.add({'start': start, 'end': end});\n  }\n\n  image.Image desImg = image.Image(width: srcImg.width, height: srcImg.height);\n\n  int y = 0;\n  for (int i = blocks.length - 1; i >= 0; i--) {\n    var block = blocks[i];\n    int currBlockHeight = block['end']! - block['start']!;\n    var range = srcImg.getRange(0, block['start']!, srcImg.width, currBlockHeight);\n    var desRange = desImg.getRange(0, y, srcImg.width, currBlockHeight);\n    while(range.moveNext() && desRange.moveNext()){\n      desRange.current.r = range.current.r;\n      desRange.current.g = range.current.g;\n      desRange.current.b = range.current.b;\n      desRange.current.a = range.current.a;\n    }\n    y += currBlockHeight;\n  }\n\n  return image.encodeJpg(desImg);\n}\n\nFuture<Uint8List> _recombineImageAndWriteFile(_RecombinationTask data) async {\n  var bytes = await _segmentationPicture(data);\n  var file = File(data.savePath!);\n  if (file.existsSync()) {\n    file.deleteSync();\n  }\n  file.writeAsBytesSync(bytes);\n  return bytes;\n}\n\n\nclass _RecombinationTask {\n  Uint8List imgData;\n  String epsId;\n  String scrambleId;\n  String bookId;\n  String? savePath;\n  Completer<Uint8List>? completer;\n\n  _RecombinationTask removeCompleter(){\n    return _RecombinationTask(imgData, epsId, scrambleId, bookId, null, savePath);\n  }\n\n  _RecombinationTask(this.imgData, this.epsId, this.scrambleId, this.bookId, this.completer,\n      [this.savePath]);\n}\n\nclass JmRecombine{\n  static Isolate? _isolate;\n\n  static ReceivePort? _receivePort;\n\n  static ReceivePort? _errorPort;\n\n  static SendPort? _sendPort;\n\n  static final List<_RecombinationTask> _tasks = [];\n\n  static _RecombinationTask? _current;\n\n  static Future<Uint8List> recombineImage(Uint8List imgData, String epsId,\n      String scrambleId, String bookId, String savePath) async{\n    Completer<Uint8List> completer = Completer();\n    _RecombinationTask task =\n      _RecombinationTask(imgData, epsId, scrambleId, bookId, completer, savePath);\n    _tasks.add(task);\n    if(_isolate == null && _receivePort == null){\n      _receivePort = ReceivePort();\n      await _start();\n    }\n    _pushTask();\n    return completer.future;\n  }\n\n  static void _pushTask(){\n    if(_sendPort != null && _current == null && _tasks.isNotEmpty){\n      _current = _tasks.removeAt(0);\n      _sendPort!.send(_current!.removeCompleter());\n    }\n  }\n\n  static Future<void> _start() async{\n    _errorPort = ReceivePort();\n    _isolate = await Isolate.spawn(_run, _receivePort!.sendPort,\n        onError: _errorPort!.sendPort, debugName: \"JmRecombine\");\n    _listen();\n  }\n\n  static void _listen(){\n    _receivePort!.listen((message) {\n      if (message is SendPort){\n        _sendPort = message;\n        _pushTask();\n      } else if(message is Uint8List) {\n        _current!.completer!.complete(message);\n        _current = null;\n        _pushTask();\n      } else if(message is Exception) {\n        _current!.completer!.completeError(message);\n        _current = null;\n        _pushTask();\n      }\n    });\n\n    _errorPort!.listen((message) {\n      log(\"Receive error from Isolate#JmRecombine:\\n$message\", \"Image\",\n          LogLevel.error);\n      _handleError();\n    });\n  }\n\n  static _handleError() async{\n    _receivePort?.close();\n    _errorPort?.close();\n    _isolate = null;\n    _sendPort = null;\n    if(_current != null) {\n      _tasks.add(_current!);\n      _current = null;\n    }\n    await Future.delayed(const Duration(milliseconds: 50));\n    if(_isolate == null && _receivePort == null){\n      _receivePort = ReceivePort();\n      await _start();\n    } else {\n      _pushTask();\n    }\n  }\n\n  static void _run(SendPort port) {\n    _receivePort = ReceivePort();\n    _receivePort!.listen((message) async{\n      if (message is _RecombinationTask){\n        _RecombinationTask task = message;\n        try {\n          Uint8List bytes = await _recombineImageAndWriteFile(task);\n          port.send(bytes);\n        }\n        catch(e){\n          port.send(Exception(e.toString()));\n        }\n      }\n    });\n    port.send(_receivePort!.sendPort);\n  }\n}\n\n///启动一个新的线程转换图片并且写入文件\nFuture<Uint8List> startRecombineAndWriteImage(Uint8List imgData, String epsId,\n    String scrambleId, String bookId, String savePath) {\n  return JmRecombine.recombineImage(imgData, epsId, scrambleId, bookId, savePath);\n}\n"
  },
  {
    "path": "lib/foundation/image_loader/stream_image_provider.dart",
    "content": "import 'dart:async' show Future, StreamController;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport '../image_manager.dart';\nimport 'base_image_provider.dart';\n\n/// Function which is called after loading the image failed.\ntypedef ErrorListener = void Function();\n\nclass StreamImageProvider\n    extends BaseImageProvider<StreamImageProvider> {\n\n  /// Image provider with [Stream<DownloadProgress>].\n  const StreamImageProvider(this.streamBuilder, this.key);\n\n  final Stream<DownloadProgress> Function() streamBuilder;\n\n  @override\n  final String key;\n\n  @override\n  Future<Uint8List> load(StreamController<ImageChunkEvent> chunkEvents) async{\n    chunkEvents.add(const ImageChunkEvent(\n        cumulativeBytesLoaded: 0,\n        expectedTotalBytes: 100)\n    );\n    DownloadProgress? finishProgress;\n\n    await for (var progress in streamBuilder()) {\n      if (progress.currentBytes == progress.expectedBytes) {\n        finishProgress = progress;\n      }\n      chunkEvents.add(ImageChunkEvent(\n          cumulativeBytesLoaded: progress.currentBytes,\n          expectedTotalBytes: progress.expectedBytes)\n      );\n    }\n\n    if(finishProgress!.data != null){\n      return finishProgress.data!;\n    }\n\n    var file = finishProgress.getFile();\n    return await file.readAsBytes();\n  }\n\n  @override\n  Future<StreamImageProvider> obtainKey(ImageConfiguration configuration) {\n    return SynchronousFuture(this);\n  }\n}\n"
  },
  {
    "path": "lib/foundation/image_manager.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:math';\n\nimport 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter_qjs/flutter_qjs.dart';\nimport 'package:html/parser.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/foundation/cache_manager.dart';\nimport 'package:pica_comic/foundation/image_loader/image_recombine.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/app_dio.dart';\nimport 'package:pica_comic/network/cookie_jar.dart';\nimport 'package:pica_comic/network/eh_network/eh_models.dart';\nimport 'package:pica_comic/network/eh_network/get_gallery_id.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_models.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/file_type.dart';\n\nimport '../base.dart';\nimport '../network/eh_network/eh_main_network.dart';\nimport '../network/hitomi_network/image.dart';\nimport '../network/res.dart';\n\nclass BadRequestException {\n  final String message;\n\n  const BadRequestException(this.message);\n\n  @override\n  String toString() => message;\n}\n\nclass ImageManager {\n  static ImageManager? cache;\n\n  ///用于标记正在加载的项目, 避免出现多个异步函数加载同一张图片\n  static Map<String, DownloadProgress> loadingItems = {};\n\n  /// Image cache manager for reader and download manager\n  factory ImageManager() => cache ??= ImageManager._create();\n\n  static bool get haveTask => loadingItems.isNotEmpty;\n\n  static void clearTasks() {\n    loadingItems.clear();\n  }\n\n  ImageManager._create();\n\n  final dio = logDio(BaseOptions())\n    ..interceptors.add(CookieManagerSql(SingleInstanceCookieJar.instance!));\n\n  int ehgtLoading = 0;\n\n  /// 获取图片, 适用于没有任何限制的图片链接\n  Stream<DownloadProgress> getImage(final String url,\n      [Map<String, String>? headers]) async* {\n    await wait(url);\n    loadingItems[url] = DownloadProgress(0, 1, url, \"\");\n    CachingFile? caching;\n\n    try {\n      final key = url;\n      var cache = await CacheManager().findCache(key);\n      if (cache != null) {\n        yield DownloadProgress(\n            1, 1, url, cache, null, CacheManager().getType(key));\n        loadingItems.remove(url);\n        return;\n      }\n\n      final cachingFile = await CacheManager().openWrite(key);\n      caching = cachingFile;\n      final savePath = cachingFile.file.path;\n      yield DownloadProgress(0, 100, url, savePath);\n      headers = headers ?? {};\n      headers[\"User-Agent\"] ??= webUA;\n      headers[\"Connection\"] = \"keep-alive\";\n      var realUrl = url;\n      if (url.contains(\"s.exhentai.org\")) {\n        // s.exhentai.org 有严格的加载限制\n        realUrl = url.replaceFirst(\"s.exhentai.org\", \"ehgt.org\");\n      }\n      if (realUrl.contains(\"ehgt.org\")) {\n        if (ehgtLoading < 3) {\n          ehgtLoading++;\n          await Future.delayed(const Duration(milliseconds: 10));\n        } else {\n          while (ehgtLoading > 2) {\n            await Future.delayed(const Duration(milliseconds: 200));\n          }\n          ehgtLoading++;\n        }\n      }\n      var dioRes = await dio.get<ResponseBody>(realUrl,\n          options:\n              Options(responseType: ResponseType.stream, headers: headers));\n      if (dioRes.data == null) {\n        throw Exception(\"Empty Data\");\n      }\n      List<int> imageData = [];\n      int? expectedBytes;\n      try {\n        expectedBytes =\n            int.parse(dioRes.data!.headers[\"Content-Length\"]![0]) + 1;\n      } catch (e) {\n        //忽略\n      }\n      await for (var res in dioRes.data!.stream) {\n        imageData.addAll(res);\n        await cachingFile.writeBytes(res);\n        var progress = DownloadProgress(imageData.length,\n            (expectedBytes ?? imageData.length + 1), url, savePath);\n        yield progress;\n        loadingItems[url] = progress;\n      }\n      await cachingFile.close();\n      var ext = getExt(dioRes);\n      CacheManager().setType(key, ext);\n      yield DownloadProgress(\n        imageData.length,\n        imageData.length,\n        url,\n        savePath,\n        Uint8List.fromList(imageData),\n        ext,\n      );\n    } catch (e, s) {\n      caching?.cancel();\n      log(\"$e\\n$s\", \"Network\", LogLevel.error);\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        var statusCode = e.response?.statusCode;\n        if (statusCode != null && statusCode >= 400 && statusCode < 500) {\n          throw BadRequestException(e.message.toString());\n        }\n      }\n      rethrow;\n    } finally {\n      if (url.contains(\"ehgt.org\") || url.contains(\"s.exhentai.org\")) {\n        ehgtLoading--;\n      }\n      loadingItems.remove(url);\n    }\n  }\n\n  Stream<DownloadProgress> getEhImageNew(\n      final Gallery gallery, final int page) async* {\n    final galleryLink = gallery.link;\n    final cacheKey = \"$galleryLink$page\";\n    final gid = getGalleryId(galleryLink);\n\n    // check whether this image is loading\n    await wait(cacheKey);\n    loadingItems[cacheKey] = DownloadProgress(0, 1, cacheKey, \"\");\n\n    CachingFile? caching;\n\n    try {\n      final key = cacheKey;\n      var cache = await CacheManager().findCache(key);\n      if (cache != null) {\n        yield DownloadProgress(\n            1, 1, key, cache, null, CacheManager().getType(key));\n        loadingItems.remove(key);\n        return;\n      }\n\n      final cachingFile = await CacheManager().openWrite(key);\n      caching = cachingFile;\n      final savePath = cachingFile.file.path;\n      yield DownloadProgress(0, 100, key, savePath);\n\n      final options = BaseOptions(\n          followRedirects: true,\n          connectTimeout: const Duration(seconds: 8),\n          receiveTimeout: const Duration(seconds: 20),\n          headers: {\"user-agent\": webUA, \"cookie\": EhNetwork().cookiesStr});\n\n      var dio = logDio(options);\n\n      // Get imgKey\n      final readerLink =\n          (await EhNetwork().getReaderLink(galleryLink, page)).data;\n\n      Future<void> getShowKey() async {\n        while (gallery.auth![\"showKey\"] == \"loading\") {\n          await Future.delayed(const Duration(milliseconds: 100));\n        }\n        if (gallery.auth![\"showKey\"] != null ||\n            gallery.auth![\"mpvKey\"] != null) {\n          return;\n        }\n        gallery.auth![\"showKey\"] = \"loading\";\n        try {\n          var res = await EhNetwork().request(readerLink);\n\n          var html = parse(res.data);\n          var script = html\n              .querySelectorAll(\"script\")\n              .firstWhereOrNull((element) => element.text.contains(\"showkey\"));\n          if (script != null) {\n            var match = RegExp(r'showkey=\"(.*?)\"').firstMatch(script.text);\n            final showKey = match!.group(1)!;\n            gallery.auth![\"showKey\"] = showKey;\n          } else {\n            final script = html\n                .querySelectorAll(\"script\")\n                .firstWhereOrNull((element) => element.text.contains(\"mpvkey\"))\n                ?.text;\n            if (script == null) {\n              throw Exception(\"Failed to get showKey or mpvkey\");\n            }\n            var mpvKey = script\n                .split(\";\")\n                .firstWhere((element) => element.contains(\"mpvkey\"));\n            gallery.auth![\"mpvKey\"] = mpvKey.removeAllBlank\n                .replaceFirst(\"varmpvkey=\", \"\")\n                .replaceAll('\"', \"\");\n            var imageListScript = script\n                .split(\";\")\n                .firstWhere((element) => element.contains(\"imagelist\"))\n                .removeAllBlank\n                .replaceFirst(\"varimagelist=\", \"\");\n            gallery.auth![\"imgKey\"] =\n                jsonDecode(imageListScript).map((e) => e[\"k\"]).join(\",\");\n            gallery.auth!.remove(\"showKey\");\n          }\n        } catch (e) {\n          gallery.auth!.remove(\"showKey\");\n          rethrow;\n        }\n      }\n\n      await getShowKey();\n      assert(\n          gallery.auth?[\"showKey\"] != null || gallery.auth?[\"mpvKey\"] != null);\n\n      yield DownloadProgress(0, 100, cacheKey, savePath);\n\n      Response<ResponseBody>? res;\n\n      var imgKey = readerLink.split('/')[4];\n\n      int totalBytes = 0;\n      List<int> data = [];\n\n      if (gallery.auth?[\"mpvKey\"] != null) {\n        Future<(String image, String nl)> getImageFromApi([String? nl]) async {\n          Res<String>? apiRes = await EhNetwork().apiRequest({\n            \"gid\": int.parse(gid),\n            \"imgkey\": gallery.auth![\"imgKey\"]!.split(',')[page - 1],\n            \"method\": \"imagedispatch\",\n            \"page\": page,\n            \"mpvkey\": gallery.auth![\"mpvKey\"],\n            if (nl != null) \"nl\": nl\n          });\n          var apiJson = const JsonDecoder().convert(apiRes.data);\n          return (apiJson[\"i\"].toString(), apiJson[\"s\"].toString());\n        }\n\n        var (image, nl) = await getImageFromApi();\n        int retryTimes = 0;\n        while (res == null) {\n          try {\n            if (image == \"\") {\n              throw \"empty url\";\n            }\n            res = await dio.get<ResponseBody>(image,\n                options: Options(responseType: ResponseType.stream));\n            if (res.data!.headers[\"Content-Type\"]?[0] ==\n                    \"text/html; charset=UTF-8\" ||\n                res.data!.headers[\"content-type\"]?[0] ==\n                    \"text/html; charset=UTF-8\") {\n              throw ImageExceedError();\n            }\n          } catch (e) {\n            retryTimes++;\n            if (retryTimes == 4) {\n              throw \"Failed to load image.\\nMaximum number of retries reached.\";\n            }\n            (image, nl) = await getImageFromApi(nl);\n          }\n        }\n      } else {\n        Future<(String, String, String?)> getImageFromApi() async {\n          // get image url through api\n          Res<String>? apiRes = await EhNetwork().apiRequest({\n            \"gid\": int.parse(gid),\n            \"imgkey\": imgKey,\n            \"method\": \"showpage\",\n            \"page\": page,\n            \"showkey\": gallery.auth![\"showKey\"]\n          });\n\n          if (apiRes.error && apiRes.errorMessage!.contains(\"handshake\")) {\n            throw \"Failed to make api request.\\n\"\n                \"This may be due to too frequent requests.\\n\"\n                \"Try to wait for some time and retry.\";\n          }\n\n          var apiJson = const JsonDecoder().convert(apiRes.data);\n\n          var i6 = apiJson[\"i6\"] as String;\n\n          RegExp regex = RegExp(r\"nl\\('(.+?)'\\)\");\n          var nl = regex.firstMatch(i6)?.group(1);\n\n          var originImage = i6.split(\"<a href=\\\"\").last.split(\"\\\">\").first;\n\n          var image = apiJson[\"i3\"] as String;\n\n          image = image.substring(\n              image.indexOf(\"src=\\\"\") + 5, image.indexOf(\"\\\" style\"));\n\n          return (image, originImage, nl);\n        }\n\n        Future<(String, String, String?)> getImageFromHtml() async {\n          var res = await EhNetwork().request(readerLink);\n          if (res.error) {\n            throw res.errorMessage ?? \"error\";\n          } else {\n            var document = parse(res.data);\n            var image =\n                document.querySelector(\"div#i3 > a > img\")?.attributes[\"src\"];\n            var nl = document\n                .querySelector(\"div#i6 > div > a#loadfail\")\n                ?.attributes[\"onclick\"]\n                ?.split('\\'')\n                .firstWhereOrNull((element) => element.contains('-'));\n            var originImage = document\n                    .querySelectorAll(\"div#i6 > div > a\")\n                    .firstWhereOrNull(\n                        (element) => element.text.contains(\"original\"))\n                    ?.attributes[\"href\"] ??\n                \"\";\n            return (image ?? \"\", originImage, nl);\n          }\n        }\n\n        String image, originImage;\n        String? nl;\n\n        try {\n          (image, originImage, nl) = await getImageFromApi();\n        } catch (e) {\n          (image, originImage, nl) = await getImageFromHtml();\n        }\n\n        if (image.contains(\"509.gif\")) {\n          throw ImageExceedError();\n        }\n\n        if (appdata.settings[29] == \"1\" && originImage.isURL) {\n          image = originImage;\n        }\n\n        int retryTimes = 0;\n        var currentBytes = 0;\n\n        while (true) {\n          try {\n            data.clear();\n            cachingFile.reset();\n            if (image == \"\") {\n              throw \"empty url\";\n            }\n            res = await dio.get<ResponseBody>(image,\n                options: Options(responseType: ResponseType.stream));\n            if (res.data!.headers[\"Content-Type\"]?[0] ==\n                    \"text/html; charset=UTF-8\" ||\n                res.data!.headers[\"content-type\"]?[0] ==\n                    \"text/html; charset=UTF-8\") {\n              throw ImageExceedError();\n            }\n            var stream = res.data!.stream;\n            int? expectedBytes;\n            try {\n              expectedBytes =\n                  int.parse(res.data!.headers[\"Content-Length\"]![0]);\n            } catch (e) {\n              try {\n                expectedBytes =\n                    int.parse(res.data!.headers[\"content-length\"]![0]);\n              } finally {}\n            }\n\n            await for (var b in stream) {\n              await cachingFile.writeBytes(b);\n              currentBytes += b.length;\n              data.addAll(b);\n              var progress = DownloadProgress(\n                currentBytes,\n                expectedBytes + 1,\n                cacheKey,\n                savePath,\n              );\n              yield progress;\n              loadingItems[cacheKey] = progress;\n            }\n            totalBytes = currentBytes;\n            break;\n          } catch (e) {\n            retryTimes++;\n            if (retryTimes == 4) {\n              throw \"Failed to load image.\\nMaximum number of retries reached.\";\n            }\n            if (nl == null) {\n              rethrow;\n            }\n            var (newImage, newNl) = await EhNetwork().getImageLinkWithNL(\n                getGalleryId(galleryLink), imgKey, page, nl);\n            image = newImage;\n            if (kDebugMode) {\n              print(\"Get new image: $image, new nl $newNl\");\n            }\n            if (newNl != null) {\n              nl = newNl;\n            }\n          }\n        }\n      }\n\n      await cachingFile.close();\n      var ext = detectFileType(data).ext.replaceFirst(('.'), '');\n      CacheManager().setType(key, ext);\n      yield DownloadProgress(\n        totalBytes,\n        totalBytes,\n        cacheKey,\n        savePath,\n        Uint8List.fromList(data),\n        ext,\n      );\n    } catch (e, s) {\n      caching?.cancel();\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\");\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        var statusCode = e.response?.statusCode;\n        if (statusCode != null && statusCode >= 400 && statusCode < 500) {\n          throw BadRequestException(e.message.toString());\n        }\n      }\n      rethrow;\n    } finally {\n      loadingItems.remove(cacheKey);\n    }\n  }\n\n  ///为Hitomi设计的图片加载函数\n  ///\n  /// 使用hash标识图片\n  Stream<DownloadProgress> getHitomiImage(\n      HitomiFile image, String galleryId) async* {\n    await wait(image.hash);\n    loadingItems[image.hash] = DownloadProgress(0, 1, image.hash, \"\");\n    CachingFile? caching;\n\n    try {\n      final key = image.hash;\n      var cache = await CacheManager().findCache(key);\n      if (cache != null) {\n        yield DownloadProgress(\n            1, 1, key, cache, null, CacheManager().getType(key));\n        loadingItems.remove(key);\n        return;\n      }\n\n      final cachingFile = await CacheManager().openWrite(key);\n      caching = cachingFile;\n      final savePath = cachingFile.file.path;\n      yield DownloadProgress(0, 100, key, savePath);\n\n      final gg = GG();\n      var url = await gg.urlFromUrlFromHash(galleryId, image, 'webp', null);\n      int l;\n      for (l = url.length - 1; l >= 0; l--) {\n        if (url[l] == '.') {\n          break;\n        }\n      }\n      var dio = logDio();\n      dio.options.headers = {\n        \"User-Agent\": webUA,\n        \"Referer\": \"https://hitomi.la/reader/$galleryId.html\"\n      };\n\n      var res = await dio.get<ResponseBody>(url,\n          options: Options(responseType: ResponseType.stream));\n      var stream = res.data!.stream;\n      int? expectedBytes;\n      try {\n        expectedBytes = int.parse(res.data!.headers[\"Content-Length\"]![0]);\n      } catch (e) {\n        try {\n          expectedBytes = int.parse(res.data!.headers[\"content-length\"]![0]);\n        } catch (e) {\n          //忽视\n        }\n      }\n      var currentBytes = 0;\n      var data = <int>[];\n      await for (var b in stream) {\n        data.addAll(b);\n        await cachingFile.writeBytes(b);\n        currentBytes += b.length;\n        var progress = DownloadProgress(\n            currentBytes, (expectedBytes ?? currentBytes + 1), url, savePath);\n        yield progress;\n        loadingItems[image.hash] = progress;\n      }\n      await cachingFile.close();\n      var ext = getExt(res);\n      CacheManager().setType(key, ext);\n      yield DownloadProgress(currentBytes, currentBytes, url, savePath,\n          Uint8List.fromList(data), ext);\n    } catch (e) {\n      caching?.cancel();\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        var statusCode = e.response?.statusCode;\n        if (statusCode != null && statusCode >= 400 && statusCode < 500) {\n          throw BadRequestException(e.message.toString());\n        }\n      }\n      rethrow;\n    } finally {\n      loadingItems.remove(image.hash);\n    }\n  }\n\n  ///获取禁漫图片, 如果缓存中没有, 则尝试下载\n  Stream<DownloadProgress> getJmImage(String url, Map<String, String>? headers,\n      {required String epsId,\n      required String scrambleId,\n      required String bookId}) async* {\n    bookId = bookId.replaceAll(RegExp(r\"\\..+\"), \"\");\n    final urlWithoutParam = url.replaceAll(RegExp(r\"\\?.+\"), \"\");\n    await wait(urlWithoutParam);\n    loadingItems[urlWithoutParam] = DownloadProgress(0, 1, url, \"\");\n    CachingFile? caching;\n\n    try {\n      final key = urlWithoutParam;\n      var cache = await CacheManager().findCache(key);\n      if (cache != null) {\n        yield DownloadProgress(1, 1, url, cache);\n        loadingItems.remove(url);\n        return;\n      }\n\n      final cachingFile = await CacheManager().openWrite(key);\n      caching = cachingFile;\n      final savePath = cachingFile.file.path;\n      yield DownloadProgress(0, 1, url, savePath);\n\n      var dio = logDio();\n\n      var bytes = <int>[];\n      String? ext;\n      try {\n        var res = await dio.get<ResponseBody>(url,\n            options: Options(responseType: ResponseType.stream, headers: {\n              \"User-Agent\":\n                  \"Mozilla/5.0 (Linux; Android 13; WD5DDE5 Build/TQ1A.230205.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.196 Safari/537.36\",\n              \"x-requested-with\": \"com.jiaohua_browser\",\n              \"referer\": \"https://www.jmapibranch2.cc/\"\n            }));\n        ext = getExt(res);\n        var stream = res.data!.stream;\n        await for (var b in stream) {\n          //不直接写入文件, 因为需要对图片进行重组, 处理完成后再写入\n          bytes.addAll(b);\n          //构建虚假的进度条, 因为无法获取jm文件大小\n          var total = max(1 << 20, bytes.length + 1);\n          var progress = DownloadProgress(bytes.length, total, url, savePath);\n          yield progress;\n          loadingItems[urlWithoutParam] = progress;\n        }\n      } catch (e) {\n        rethrow;\n      }\n      var progress = DownloadProgress(\n        bytes.length,\n        (bytes.length / 0.75).toInt(),\n        url,\n        savePath,\n      );\n      yield progress;\n      loadingItems[urlWithoutParam] = progress;\n      if (url.split('.').last != \"gif\") {\n        bytes = await startRecombineAndWriteImage(\n            Uint8List.fromList(bytes), epsId, scrambleId, bookId, savePath);\n      }\n      await cachingFile.writeBytes(bytes);\n      await cachingFile.close();\n      CacheManager().setType(key, ext);\n      progress = DownloadProgress(\n        bytes.length,\n        bytes.length,\n        url,\n        savePath,\n        Uint8List.fromList(bytes),\n        ext,\n      );\n      yield progress;\n    } catch (e) {\n      caching?.cancel();\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        var statusCode = e.response?.statusCode;\n        if (statusCode != null && statusCode >= 400 && statusCode < 500) {\n          throw BadRequestException(e.message.toString());\n        }\n      }\n      rethrow;\n    } finally {\n      loadingItems.remove(urlWithoutParam);\n    }\n  }\n\n  Stream<DownloadProgress> getCustomImage(\n      String url, String comicId, String epId, String sourceKey) async* {\n    var cacheKey = \"$sourceKey$comicId$epId$url\";\n    await wait(cacheKey);\n    loadingItems[cacheKey] = DownloadProgress(0, 1, cacheKey, \"\");\n\n    var cache = await CacheManager().findCache(cacheKey);\n    if (cache != null) {\n      yield DownloadProgress(1, 1, cacheKey, cache);\n      loadingItems.remove(cacheKey);\n      return;\n    }\n\n    CachingFile? caching;\n\n    var source = ComicSource.find(sourceKey) ??\n        (throw \"Unknown Comic Source $sourceKey\");\n\n    try {\n      Map<String, dynamic> config;\n\n      if (source.getImageLoadingConfig == null) {\n        config = {};\n      } else {\n        config = source.getImageLoadingConfig!(url, comicId, epId);\n      }\n\n      caching = await CacheManager().openWrite(cacheKey);\n      final savePath = caching.file.path;\n\n      var res = await dio.request<ResponseBody>(config['url'] ?? url,\n          data: config['data'],\n          options: Options(\n              method: config['method'] ?? 'GET',\n              headers: config['headers'] ?? {'user-agent': webUA},\n              responseType: ResponseType.stream));\n\n      List<int> imageData = [];\n\n      int? expectedBytes = res.data!.contentLength;\n      if (expectedBytes == -1) {\n        expectedBytes = null;\n      }\n\n      bool shouldModifyData = config['onResponse'] != null;\n\n      await for (var data in res.data!.stream) {\n        if (!shouldModifyData) {\n          await caching.writeBytes(data);\n        }\n        imageData.addAll(data);\n        var progress = DownloadProgress(\n          imageData.length,\n          (expectedBytes ?? imageData.length + 1),\n          url,\n          savePath,\n        );\n        yield progress;\n        loadingItems[cacheKey] = progress;\n      }\n\n      Uint8List? result;\n\n      if (shouldModifyData) {\n        var data = (config['onResponse']\n            as JSInvokable)(Uint8List.fromList(imageData));\n        imageData.clear();\n        if (data is! Uint8List) {\n          throw \"Invalid Config: onImageLoad.onResponse return invalid type\\n\"\n              \"Expected: Uint8List(ArrayBuffer)\\n\"\n              \"Got: ${data.runtimeType}\";\n        }\n        result = data;\n        await caching.writeBytes(data);\n      }\n\n      var ext = getExt(res);\n      CacheManager().setType(cacheKey, ext);\n      await caching.close();\n      var length = result?.length ?? imageData.length;\n      yield DownloadProgress(\n        length,\n        length,\n        url,\n        savePath,\n        result ?? Uint8List.fromList(imageData),\n        ext,\n      );\n    } catch (e) {\n      caching?.cancel();\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        var statusCode = e.response?.statusCode;\n        if (statusCode != null && statusCode >= 400 && statusCode < 500) {\n          throw BadRequestException(e.message.toString());\n        }\n      }\n      rethrow;\n    } finally {\n      loadingItems.remove(cacheKey);\n    }\n  }\n\n  Future<void> wait(String cacheKey) {\n    int timeout = 50;\n    return Future.doWhile(() async {\n      await Future.delayed(const Duration(milliseconds: 300));\n      timeout--;\n      if (timeout == 0) {\n        loadingItems.remove(cacheKey);\n        return false;\n      }\n      return loadingItems[cacheKey] != null;\n    });\n  }\n\n  Stream<DownloadProgress> getCustomThumbnail(\n      String url, String sourceKey, [Map<String, String>? headers]) async* {\n    var cacheKey = \"$sourceKey$url\";\n    await wait(cacheKey);\n    loadingItems[cacheKey] = DownloadProgress(0, 1, cacheKey, \"\");\n\n    var cache = await CacheManager().findCache(cacheKey);\n    if (cache != null) {\n      yield DownloadProgress(1, 1, cacheKey, cache);\n      loadingItems.remove(cacheKey);\n      return;\n    }\n\n    CachingFile? caching;\n\n    var source = ComicSource.find(sourceKey) ??\n        (throw \"Unknown Comic Source $sourceKey\");\n\n    try {\n      Map<String, dynamic> config;\n\n      if (source.getThumbnailLoadingConfig == null) {\n        config = {};\n      } else {\n        config = source.getThumbnailLoadingConfig!(url);\n      }\n\n      config['headers'] ??= headers;\n\n      caching = await CacheManager().openWrite(cacheKey);\n      final savePath = caching.file.path;\n\n      var res = await dio.request<ResponseBody>(config['url'] ?? url,\n          data: config['data'],\n          options: Options(\n              method: config['method'] ?? 'GET',\n              headers: config['headers'] ?? {'user-agent': webUA},\n              responseType: ResponseType.stream));\n\n      List<int> imageData = [];\n\n      int? expectedBytes = res.data!.contentLength;\n      if (expectedBytes == -1) {\n        expectedBytes = null;\n      }\n\n      bool shouldModifyData = config['onResponse'] != null;\n\n      await for (var data in res.data!.stream) {\n        if (!shouldModifyData) {\n          await caching.writeBytes(data);\n        }\n        imageData.addAll(data);\n        var progress = DownloadProgress(imageData.length,\n            expectedBytes ?? (imageData.length + 1), url, savePath);\n        yield progress;\n        loadingItems[cacheKey] = progress;\n      }\n\n      Uint8List? result;\n\n      if (shouldModifyData) {\n        var data = (config['onResponse']\n            as JSInvokable)(Uint8List.fromList(imageData));\n        imageData.clear();\n        if (data is! Uint8List) {\n          throw \"Invalid Config: onImageLoad.onResponse return invalid type\\n\"\n              \"Expected: Uint8List(ArrayBuffer)\\n\"\n              \"Got: ${data.runtimeType}\";\n        }\n        result = data;\n        await caching.writeBytes(data);\n      }\n\n      await caching.close();\n      yield DownloadProgress(\n          1, 1, url, savePath, result ?? Uint8List.fromList(imageData));\n    } catch (e) {\n      Log.error(\"Network\", \"Failed to load a image:\\nUrl:$url\\nError:$e\");\n      caching?.cancel();\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        var statusCode = e.response?.statusCode;\n        if (statusCode != null && statusCode >= 400 && statusCode < 500) {\n          throw BadRequestException(e.message.toString());\n        }\n      }\n      rethrow;\n    } finally {\n      loadingItems.remove(cacheKey);\n    }\n  }\n\n  Future<File?> getFile(String key) async {\n    var cache = await CacheManager().findCache(key);\n    if (cache != null) {\n      return File(cache);\n    }\n    return null;\n  }\n\n  Future<void> clear() async {\n    await CacheManager().clear();\n  }\n\n  Future<bool> find(String key) async {\n    return await CacheManager().findCache(key) != null;\n  }\n\n  Future<void> delete(String key) async {\n    await CacheManager().delete(key);\n  }\n\n  String? getExt(Response res) {\n    String? ext;\n    var url = res.realUri.toString();\n    var contentType =\n        (res.headers[\"Content-Type\"] ?? res.headers[\"content-type\"])?[0];\n    if (contentType != null) {\n      ext = switch (contentType) {\n        \"image/jpeg\" => \"jpg\",\n        \"image/png\" => \"png\",\n        \"image/gif\" => \"gif\",\n        \"image/webp\" => \"webp\",\n        _ => null\n      };\n    }\n    ext ??= url.split('.').last;\n    if (![\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].contains(ext)) {\n      ext = \"jpg\";\n      LogManager.addLog(\n          LogLevel.warning,\n          \"ImageManager\",\n          \"Unknown image extension: \\n\"\n              \"Content-Type: $contentType\\n\"\n              \"URL: $url\");\n    }\n    return ext;\n  }\n}\n\nclass DownloadProgress {\n  final int _currentBytes;\n  final int _expectedBytes;\n  final String url;\n  final String savePath;\n  final Uint8List? data;\n  final String? ext;\n\n  int get currentBytes => _currentBytes;\n\n  int get expectedBytes => _expectedBytes;\n\n  bool get finished => _currentBytes == _expectedBytes;\n\n  const DownloadProgress(\n      this._currentBytes, this._expectedBytes, this.url, this.savePath,\n      [this.data, this.ext]);\n\n  File getFile() => File(savePath);\n}\n\nclass ImageExceedError extends Error {\n  @override\n  String toString() => \"Maximum image loading limit reached.\";\n}\n"
  },
  {
    "path": "lib/foundation/js_engine.dart",
    "content": "import 'dart:convert';\nimport 'dart:math' as math;\n\nimport 'package:cookie_jar/cookie_jar.dart';\nimport 'package:crypto/crypto.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/app_dio.dart';\nimport 'package:html/parser.dart' as html;\nimport 'package:html/dom.dart' as dom;\nimport 'package:pica_comic/network/cloudflare.dart';\nimport 'package:pica_comic/network/cookie_jar.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:flutter_qjs/flutter_qjs.dart';\nimport 'package:pointycastle/api.dart';\nimport 'package:pointycastle/asn1/asn1_parser.dart';\nimport 'package:pointycastle/asn1/primitives/asn1_integer.dart';\nimport 'package:pointycastle/asn1/primitives/asn1_sequence.dart';\nimport 'package:pointycastle/asymmetric/api.dart';\nimport 'package:pointycastle/asymmetric/pkcs1.dart';\nimport 'package:pointycastle/asymmetric/rsa.dart';\nimport 'package:pointycastle/block/aes.dart';\nimport 'package:pointycastle/block/modes/cbc.dart';\nimport 'package:pointycastle/block/modes/cfb.dart';\nimport 'package:pointycastle/block/modes/ecb.dart';\nimport 'package:pointycastle/block/modes/ofb.dart';\n\n\nclass JavaScriptRuntimeException implements Exception {\n  final String message;\n\n  JavaScriptRuntimeException(this.message);\n\n  @override\n  String toString() {\n    return \"JSException: $message\";\n  }\n}\n\nclass JsEngine with _JSEngineApi{\n  factory JsEngine() => _cache ?? (_cache = JsEngine._create());\n\n  static JsEngine? _cache;\n\n  JsEngine._create();\n\n  FlutterQjs? _engine;\n\n  bool _closed = true;\n\n  Dio? _dio;\n\n  static void reset(){\n    _cache = null;\n    _cache?.dispose();\n    JsEngine().init();\n  }\n\n  Future<void> init() async{\n    if (!_closed) {\n      return;\n    }\n    try {\n      _dio ??= logDio(BaseOptions(\n          responseType: ResponseType.plain, validateStatus: (status) => true));\n      _cookieJar ??= SingleInstanceCookieJar.instance!;\n      _dio!.interceptors.add(CookieManagerSql(_cookieJar!));\n      _dio!.interceptors.add(CloudflareInterceptor());\n      _closed = false;\n      _engine = FlutterQjs();\n      _engine!.dispatch();\n      var setGlobalFunc = _engine!.evaluate(\n          \"(key, value) => { this[key] = value; }\");\n      (setGlobalFunc as JSInvokable)([\"sendMessage\", _messageReceiver]);\n      setGlobalFunc.free();\n      var jsInit = await rootBundle.load(\"assets/init.js\");\n      _engine!.evaluate(utf8.decode(jsInit.buffer.asUint8List()), name: \"<init>\");\n    }\n    catch(e, s){\n      log('JS Engine Init Error:\\n$e\\n$s', 'JS Engine', LogLevel.error);\n    }\n  }\n\n  dynamic _messageReceiver(dynamic message) {\n    try {\n      if (message is Map<dynamic, dynamic>) {\n        String method = message[\"method\"] as String;\n        switch (method) {\n          case \"log\":\n            {\n              String level = message[\"level\"];\n              LogManager.addLog(\n                  switch (level) {\n                    \"error\" => LogLevel.error,\n                    \"warning\" => LogLevel.warning,\n                    \"info\" => LogLevel.info,\n                    _ => LogLevel.warning\n                  },\n                  message[\"title\"],\n                  message[\"content\"].toString());\n            }\n          case 'load_data':\n            {\n              String key = message[\"key\"];\n              String dataKey = message[\"data_key\"];\n              return ComicSource.sources\n                  .firstWhereOrNull((element) => element.key == key)\n                  ?.data[dataKey];\n            }\n          case 'save_data':\n            {\n              String key = message[\"key\"];\n              String dataKey = message[\"data_key\"];\n              var data = message[\"data\"];\n              var source = ComicSource.sources\n                  .firstWhere((element) => element.key == key);\n              source.data[dataKey] = data;\n              source.saveData();\n            }\n          case 'delete_data':\n            {\n              String key = message[\"key\"];\n              String dataKey = message[\"data_key\"];\n              var source = ComicSource.sources\n                  .firstWhereOrNull((element) => element.key == key);\n              source?.data.remove(dataKey);\n              source?.saveData();\n            }\n          case 'http':\n            {\n              return _http(Map.from(message));\n            }\n          case 'html':\n            {\n              return handleHtmlCallback(Map.from(message));\n            }\n          case 'convert':\n            {\n              return _convert(Map.from(message));\n            }\n          case \"random\":\n            {\n              return _randomInt(message[\"min\"], message[\"max\"]);\n            }\n          case \"cookie\":\n            {\n              return handleCookieCallback(Map.from(message));\n            }\n        }\n      }\n    }\n    catch(e, s){\n      log(\"Failed to handle message: $message\\n$e\\n$s\", \"JsEngine\", LogLevel.error);\n      rethrow;\n    }\n  }\n\n  Future<Map<String, dynamic>> _http(Map<String, dynamic> req) async{\n    Response? response;\n    String? error;\n\n    try {\n      var headers = Map<String, dynamic>.from(req[\"headers\"] ?? {});\n      if(headers[\"user-agent\"] == null && headers[\"User-Agent\"] == null){\n        headers[\"User-Agent\"] = webUA;\n      }\n      response = await _dio!.request(req[\"url\"], data: req[\"data\"], options: Options(\n        method: req['http_method'],\n        responseType: req[\"bytes\"] == true ? ResponseType.bytes : ResponseType.plain,\n        headers: headers\n      ));\n    } catch (e) {\n      error = e.toString();\n    }\n\n    Map<String, String> headers = {};\n\n    response?.headers.forEach((name, values) => headers[name] = values.join(','));\n\n    dynamic body = response?.data;\n    if(body is! Uint8List && body is List<int>) {\n      body = Uint8List.fromList(body);\n    }\n\n    return {\n      \"status\": response?.statusCode,\n      \"headers\": headers,\n      \"body\": body,\n      \"error\": error,\n    };\n  }\n\n  dynamic runCode(String js, [String? name]) {\n    return _engine!.evaluate(js, name: name);\n  }\n\n  void dispose() {\n    _cache = null;\n    _closed = true;\n    _engine?.close();\n    _engine?.port.close();\n  }\n}\n\nmixin class _JSEngineApi{\n  final Map<int, dom.Document> _documents = {};\n  final Map<int, dom.Element> _elements = {};\n  CookieJarSql? _cookieJar;\n\n  dynamic handleHtmlCallback(Map<String, dynamic> data) {\n    switch (data[\"function\"]) {\n      case \"parse\":\n        _documents[data[\"key\"]] = html.parse(data[\"data\"]);\n        return null;\n      case \"querySelector\":\n        var res = _documents[data[\"key\"]]!.querySelector(data[\"query\"]);\n        if(res == null) return null;\n        _elements[_elements.length] = res;\n        return _elements.length - 1;\n      case \"querySelectorAll\":\n        var res = _documents[data[\"key\"]]!.querySelectorAll(data[\"query\"]);\n        var keys = <int>[];\n        for(var element in res){\n          _elements[_elements.length] = element;\n          keys.add(_elements.length - 1);\n        }\n        return keys;\n      case \"getText\":\n        return _elements[data[\"key\"]]!.text;\n      case \"getAttributes\":\n        return _elements[data[\"key\"]]!.attributes;\n      case \"dom_querySelector\":\n        var res = _elements[data[\"key\"]]!.querySelector(data[\"query\"]);\n        if(res == null) return null;\n        _elements[_elements.length] = res;\n        return _elements.length - 1;\n      case \"dom_querySelectorAll\":\n        var res = _elements[data[\"key\"]]!.querySelectorAll(data[\"query\"]);\n        var keys = <int>[];\n        for(var element in res){\n          _elements[_elements.length] = element;\n          keys.add(_elements.length - 1);\n        }\n        return keys;\n      case \"getChildren\":\n        var res = _elements[data[\"key\"]]!.children;\n        var keys = <int>[];\n        for (var element in res) {\n          _elements[_elements.length] = element;\n          keys.add(_elements.length - 1);\n        }\n        return keys;\n    }\n  }\n\n  dynamic handleCookieCallback(Map<String, dynamic> data) {\n    switch (data[\"function\"]) {\n      case \"set\":\n        _cookieJar!.saveFromResponse(\n            Uri.parse(data[\"url\"]),\n            (data[\"cookies\"] as List).map((e) {\n              var c = Cookie(e[\"name\"], e[\"value\"]);\n              if(e['domain'] != null){\n                c.domain = e['domain'];\n              }\n              return c;\n            }).toList());\n        return null;\n      case \"get\":\n        var cookies = _cookieJar!.loadForRequest(Uri.parse(data[\"url\"]));\n        return cookies.map((e) => {\n          \"name\": e.name,\n          \"value\": e.value,\n          \"domain\": e.domain,\n          \"path\": e.path,\n          \"expires\": e.expires,\n          \"max-age\": e.maxAge,\n          \"secure\": e.secure,\n          \"httpOnly\": e.httpOnly,\n          \"session\": e.expires == null,\n        }).toList();\n      case \"delete\":\n        clearCookies([data[\"url\"]]);\n        return null;\n    }\n  }\n\n  void clear(){\n    _documents.clear();\n    _elements.clear();\n  }\n\n  void clearCookies(List<String> domains) async{\n    for(var domain in domains){\n      var uri = Uri.tryParse(domain);\n      if(uri == null) continue;\n      _cookieJar!.deleteUri(uri);\n    }\n  }\n\n  dynamic _convert(Map<String, dynamic> data) {\n    String type = data[\"type\"];\n    var value = data[\"value\"];\n    bool isEncode = data[\"isEncode\"];\n    try {\n      switch (type) {\n        case \"base64\":\n          if(value is String){\n            value = utf8.encode(value);\n          }\n          return isEncode\n              ? base64Encode(value)\n              : base64Decode(value);\n        case \"md5\":\n          return Uint8List.fromList(md5.convert(value).bytes);\n        case \"sha1\":\n          return Uint8List.fromList(sha1.convert(value).bytes);\n        case \"sha256\":\n          return Uint8List.fromList(sha256.convert(value).bytes);\n        case \"sha512\":\n          return Uint8List.fromList(sha512.convert(value).bytes);\n        case \"aes-ecb\":\n          if(!isEncode){\n            var key = data[\"key\"];\n            var cipher = ECBBlockCipher(AESEngine());\n            cipher.init(false, KeyParameter(key));\n            return cipher.process(value);\n          }\n          return null;\n        case \"aes-cbc\":\n          if(!isEncode){\n            var key = data[\"key\"];\n            var iv = data[\"iv\"];\n            var cipher = CBCBlockCipher(AESEngine());\n            cipher.init(false, ParametersWithIV(KeyParameter(key), iv));\n            return cipher.process(value);\n          }\n          return null;\n        case \"aes-cfb\":\n          if(!isEncode){\n            var key = data[\"key\"];\n            var blockSize = data[\"blockSize\"];\n            var cipher = CFBBlockCipher(AESEngine(), blockSize);\n            cipher.init(false, KeyParameter(key));\n            return cipher.process(value);\n          }\n          return null;\n        case \"aes-ofb\":\n          if(!isEncode){\n            var key = data[\"key\"];\n            var blockSize = data[\"blockSize\"];\n            var cipher = OFBBlockCipher(AESEngine(), blockSize);\n            cipher.init(false, KeyParameter(key));\n            return cipher.process(value);\n          }\n          return null;\n        case \"rsa\":\n          if(!isEncode){\n            var key = data[\"key\"];\n            final cipher = PKCS1Encoding(RSAEngine());\n            cipher.init(\n                false, PrivateKeyParameter<RSAPrivateKey>(_parsePrivateKey(key)));\n            return _processInBlocks(cipher, value);\n          }\n          return null;\n        default:\n          return value;\n      }\n    }\n    catch(e) {\n      Log.error(\"JS Engine\", \"Failed to convert $type: $e\");\n      return null;\n    }\n  }\n\n  RSAPrivateKey _parsePrivateKey(String privateKeyString) {\n    List<int> privateKeyDER = base64Decode(privateKeyString);\n    var asn1Parser = ASN1Parser(privateKeyDER as Uint8List);\n    final topLevelSeq = asn1Parser.nextObject() as ASN1Sequence;\n    final privateKey = topLevelSeq.elements![2];\n\n    asn1Parser = ASN1Parser(privateKey.valueBytes!);\n    final pkSeq = asn1Parser.nextObject() as ASN1Sequence;\n\n    final modulus = pkSeq.elements![1] as ASN1Integer;\n    final privateExponent = pkSeq.elements![3] as ASN1Integer;\n    final p = pkSeq.elements![4] as ASN1Integer;\n    final q = pkSeq.elements![5] as ASN1Integer;\n\n    return RSAPrivateKey(modulus.integer!, privateExponent.integer!, p.integer!, q.integer!);\n  }\n\n  Uint8List _processInBlocks(\n      AsymmetricBlockCipher engine, Uint8List input) {\n    final numBlocks = input.length ~/ engine.inputBlockSize +\n        ((input.length % engine.inputBlockSize != 0) ? 1 : 0);\n\n    final output = Uint8List(numBlocks * engine.outputBlockSize);\n\n    var inputOffset = 0;\n    var outputOffset = 0;\n    while (inputOffset < input.length) {\n      final chunkSize = (inputOffset + engine.inputBlockSize <= input.length)\n          ? engine.inputBlockSize\n          : input.length - inputOffset;\n\n      outputOffset += engine.processBlock(\n          input, inputOffset, chunkSize, output, outputOffset);\n\n      inputOffset += chunkSize;\n    }\n\n    return (output.length == outputOffset)\n        ? output\n        : output.sublist(0, outputOffset);\n  }\n\n  int _randomInt(int min, int max) {\n    return (min + (max - min) * math.Random().nextDouble()).toInt();\n  }\n}\n"
  },
  {
    "path": "lib/foundation/local_favorites.dart",
    "content": "import 'dart:convert';\nimport 'package:collection/collection.dart';\nimport 'package:crypto/crypto.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/network/eh_network/eh_main_network.dart';\nimport 'package:pica_comic/network/eh_network/eh_models.dart';\nimport 'package:pica_comic/network/eh_network/get_gallery_id.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_models.dart';\nimport 'package:pica_comic/network/htmanga_network/models.dart';\nimport 'package:pica_comic/network/jm_network/jm_image.dart';\nimport 'package:pica_comic/network/jm_network/jm_models.dart';\nimport 'package:pica_comic/network/nhentai_network/models.dart';\nimport 'package:pica_comic/network/picacg_network/models.dart';\nimport 'package:pica_comic/pages/favorites/main_favorites_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:sqlite3/sqlite3.dart';\nimport 'dart:io';\nimport '../network/base_comic.dart';\nimport '../network/webdav.dart';\n\nString getCurTime() {\n  return DateTime.now()\n      .toIso8601String()\n      .replaceFirst(\"T\", \" \")\n      .substring(0, 19);\n}\n\nfinal class FavoriteType {\n  final int key;\n\n  const FavoriteType(this.key);\n\n  static FavoriteType get picacg => const FavoriteType(0);\n\n  static FavoriteType get ehentai => const FavoriteType(1);\n\n  static FavoriteType get jm => const FavoriteType(2);\n\n  static FavoriteType get hitomi => const FavoriteType(3);\n\n  static FavoriteType get htManga => const FavoriteType(4);\n\n  static FavoriteType get nhentai => const FavoriteType(6);\n\n  ComicType get comicType {\n    if (key >= 0 && key <= 6) {\n      return ComicType.values[key];\n    }\n    return ComicType.other;\n  }\n\n  ComicSource get comicSource {\n    if (key <= 6) {\n      var key = comicType.name.toLowerCase();\n      return ComicSource.find(key)!;\n    }\n    return ComicSource.sources\n            .firstWhereOrNull((element) => element.intKey == key) ??\n        (throw \"Comic Source Not Found\");\n  }\n\n  String get name {\n    if (comicType != ComicType.other) {\n      return comicType.name;\n    } else {\n      try {\n        return comicSource.name;\n      } catch (e) {\n        return \"**Unknown**\";\n      }\n    }\n  }\n\n  @override\n  bool operator ==(Object other) {\n    return other is FavoriteType && other.key == key;\n  }\n\n  @override\n  int get hashCode => key.hashCode;\n}\n\nclass FavoriteItem {\n  String name;\n  String author;\n  FavoriteType type;\n  List<String> tags;\n  String target;\n  String coverPath;\n  String time = getCurTime();\n\n  bool get available {\n    if (type.key <= 6 && type.key >= 0) {\n      return true;\n    }\n    return ComicSource.sources\n            .firstWhereOrNull((element) => element.intKey == type.key) !=\n        null;\n  }\n\n  String toDownloadId() {\n    try {\n      return switch (type.comicType) {\n        ComicType.picacg => target,\n        ComicType.ehentai => getGalleryId(target),\n        ComicType.jm => \"jm$target\",\n        ComicType.hitomi => RegExp(r\"\\d+(?=\\.html)\").hasMatch(target)\n            ? \"hitomi${RegExp(r\"\\d+(?=\\.html)\").firstMatch(target)?[0]}\"\n            : target,\n        ComicType.htManga => \"ht$target\",\n        ComicType.nhentai => \"nhentai$target\",\n        _ => DownloadManager().generateId(type.comicSource.key, target)\n      };\n    } catch (e) {\n      return \"**Invalid ID**\";\n    }\n  }\n\n  FavoriteItem({\n    required this.target,\n    required this.name,\n    required this.coverPath,\n    required this.author,\n    required this.type,\n    required this.tags,\n  });\n\n  FavoriteItem.fromPicacg(ComicItemBrief comic)\n      : name = comic.title,\n        author = comic.author,\n        type = FavoriteType.picacg,\n        tags = comic.tags,\n        target = comic.id,\n        coverPath = comic.path;\n\n  FavoriteItem.fromEhentai(EhGalleryBrief comic)\n      : name = comic.title,\n        author = comic.uploader,\n        type = FavoriteType.ehentai,\n        tags = comic.tags,\n        target = comic.link,\n        coverPath = comic.coverPath;\n\n  FavoriteItem.fromJmComic(JmComicBrief comic)\n      : name = comic.name,\n        author = comic.author,\n        type = FavoriteType.jm,\n        tags = [],\n        target = comic.id,\n        coverPath = getJmCoverUrl(comic.id);\n\n  FavoriteItem.fromHitomi(HitomiComicBrief comic)\n      : name = comic.name,\n        author = comic.artist,\n        type = FavoriteType.hitomi,\n        tags = List.generate(\n            comic.tagList.length, (index) => comic.tagList[index].name),\n        target = comic.link,\n        coverPath = comic.cover;\n\n  FavoriteItem.fromHtcomic(HtComicBrief comic)\n      : name = comic.name,\n        author = \"${comic.pages}Pages\",\n        type = FavoriteType.htManga,\n        tags = [],\n        target = comic.id,\n        coverPath = comic.image;\n\n  FavoriteItem.fromNhentai(NhentaiComicBrief comic)\n      : name = comic.title,\n        author = \"\",\n        type = FavoriteType.nhentai,\n        tags = comic.tags,\n        target = comic.id,\n        coverPath = comic.cover;\n\n  FavoriteItem.custom(CustomComic comic)\n      : name = comic.title,\n        author = comic.subTitle,\n        type = FavoriteType(comic.sourceKey.hashCode),\n        tags = comic.tags,\n        target = comic.id,\n        coverPath = comic.cover;\n\n  Map<String, dynamic> toJson() => {\n        \"name\": name,\n        \"author\": author,\n        \"type\": type.key,\n        \"tags\": tags,\n        \"target\": target,\n        \"coverPath\": coverPath,\n        \"time\": time\n      };\n\n  FavoriteItem.fromJson(Map<String, dynamic> json)\n      : name = json[\"name\"],\n        author = json[\"author\"],\n        type = FavoriteType(json[\"type\"]),\n        tags = List<String>.from(json[\"tags\"]),\n        target = json[\"target\"],\n        coverPath = json[\"coverPath\"],\n        time = json[\"time\"];\n\n  FavoriteItem.fromRow(Row row)\n      : name = row[\"name\"],\n        author = row[\"author\"],\n        type = FavoriteType(row[\"type\"]),\n        tags = (row[\"tags\"] as String).split(\",\"),\n        target = row[\"target\"],\n        coverPath = row[\"cover_path\"],\n        time = row[\"time\"] {\n    tags.remove(\"\");\n  }\n\n  factory FavoriteItem.fromBaseComic(BaseComic comic) {\n    if (comic is ComicItemBrief) {\n      return FavoriteItem.fromPicacg(comic);\n    } else if (comic is EhGalleryBrief) {\n      return FavoriteItem.fromEhentai(comic);\n    } else if (comic is JmComicBrief) {\n      return FavoriteItem.fromJmComic(comic);\n    } else if (comic is HtComicBrief) {\n      return FavoriteItem.fromHtcomic(comic);\n    } else if (comic is NhentaiComicBrief) {\n      return FavoriteItem.fromNhentai(comic);\n    } else if (comic is CustomComic) {\n      return FavoriteItem.custom(comic);\n    }\n    throw UnimplementedError();\n  }\n\n  @override\n  bool operator ==(Object other) {\n    return other is FavoriteItem && other.target == target && other.type == type;\n  }\n\n  @override\n  int get hashCode => target.hashCode ^ type.hashCode;\n\n  @override\n  String toString() {\n    var s = \"FavoriteItem: $name $author $coverPath $hashCode $tags\";\n    if(s.length > 100) {\n      return s.substring(0, 100);\n    }\n    return s;\n  }\n}\n\nclass FavoriteItemWithFolderInfo {\n  FavoriteItem comic;\n  String folder;\n\n  FavoriteItemWithFolderInfo(this.comic, this.folder);\n\n  @override\n  bool operator ==(Object other) {\n    return other is FavoriteItemWithFolderInfo &&\n        other.comic == comic &&\n        other.folder == folder;\n  }\n\n  @override\n  int get hashCode => comic.hashCode ^ folder.hashCode;\n}\n\nclass FolderSync {\n  String folderName;\n  String time = getCurTime();\n  String key;\n  String syncData; // 内容是 json, 存一下选中的文件夹 folderId\n  FolderSync(this.folderName, this.key, this.syncData);\n\n  Map<String, dynamic> get syncDataObj => jsonDecode(syncData);\n}\n\nextension SQL on String {\n  String get toParam => replaceAll('\\'', \"''\").replaceAll('\"', \"\\\"\\\"\");\n}\n\nclass LocalFavoritesManager {\n  factory LocalFavoritesManager() =>\n      cache ?? (cache = LocalFavoritesManager._create());\n\n  LocalFavoritesManager._create();\n\n  static LocalFavoritesManager? cache;\n\n  late Database _db;\n\n  Future<void> init() async {\n    _db = sqlite3.open(\"${App.dataPath}/local_favorite.db\");\n    _checkAndCreate();\n    await readData();\n  }\n\n  void _checkAndCreate() async {\n    final tables = _getTablesWithDB();\n    if (!tables.contains('folder_sync')) {\n      _db.execute(\"\"\"\n      create table folder_sync (\n        folder_name text primary key,\n        time TEXT,\n        key TEXT,\n        sync_data TEXT\n      );\n    \"\"\");\n    }\n    if (!tables.contains('folder_order')) {\n      _db.execute(\"\"\"\n      create table folder_order (\n        folder_name text primary key,\n        order_value int\n      );\n    \"\"\");\n    }\n    tables.remove('folder_sync');\n    tables.remove('folder_order');\n    if(tables.isEmpty)  return;\n    var testTable = tables.first;\n    // 检查type是否是主键\n    var res = _db.select(\"\"\"\n      PRAGMA table_info(\"$testTable\");\n    \"\"\");\n    bool shouldUpdate = false;\n    for (var row in res) {\n      if (row[\"name\"] == \"type\" && row[\"pk\"] == 0) {\n        shouldUpdate = true;\n        break;\n      }\n    }\n    if (shouldUpdate) {\n      for (var table in tables) {\n        var tempName = \"${table}_dw5d8g2_temp\";\n        _db.execute(\"\"\"\n          CREATE TABLE \"$tempName\" AS SELECT * FROM \"$table\";\n          DROP TABLE \"$table\";\n          CREATE TABLE \"$table\" (\n            target text,\n            name TEXT,\n            author TEXT,\n            type int,\n            tags TEXT,\n            cover_path TEXT,\n            time TEXT,\n            display_order int,\n            primary key (target, type)\n          );\n          INSERT INTO \"$table\" SELECT * FROM \"$tempName\";\n          DROP TABLE \"$tempName\";\n        \"\"\");\n      }\n    }\n  }\n\n  void updateUI() {\n    Future.microtask(\n        () => StateController.findOrNull(tag: \"me page\")?.update());\n    Future.microtask(\n        () => StateController.findOrNull<FavoritesPageController>()?.update());\n  }\n\n  Future<List<String>> find(String target, FavoriteType type) async {\n    var res = <String>[];\n    for (var folder in folderNames) {\n      var rows = _db.select(\"\"\"\n        select * from \"$folder\"\n        where target == ? and type == ?;\n      \"\"\", [target, type.key]);\n      if (rows.isNotEmpty) {\n        res.add(folder);\n      }\n    }\n    return res;\n  }\n\n  Future<List<String>> findWithModel(FavoriteItem item) async {\n    var res = <String>[];\n    for (var folder in folderNames) {\n      var rows = _db.select(\"\"\"\n        select * from \"$folder\"\n        where target == ? and type == ?;\n      \"\"\", [item.target, item.type.key]);\n      if (rows.isNotEmpty) {\n        res.add(folder);\n      }\n    }\n    return res;\n  }\n\n  Future<void> saveData() async {\n    Webdav.uploadData();\n  }\n\n  /// read data from json file or temp db.\n  ///\n  /// This function will delete current database, then create a new one, finally\n  /// import data.\n  Future<void> readData() async {\n    var file = File(\"${App.dataPath}/localFavorite\");\n    if (file.existsSync()) {\n      Map<String, List<FavoriteItem>> allComics = {};\n      try {\n        var data = (const JsonDecoder().convert(file.readAsStringSync()))\n            as Map<String, dynamic>;\n\n        for (var key in data.keys.toList()) {\n          Set<FavoriteItem> comics = {};\n          for (var comic in data[key]!) {\n            comics.add(FavoriteItem.fromJson(comic));\n          }\n          if (allComics.containsKey(key)) {\n            comics.addAll(allComics[key]!);\n          }\n          allComics[key] = comics.toList();\n        }\n\n        await clearAll();\n\n        for (var folder in allComics.keys) {\n          createFolder(folder, true);\n          var comics = allComics[folder]!;\n          for (int i = 0; i < comics.length; i++) {\n            addComic(folder, comics[i]);\n          }\n        }\n      } catch (e, s) {\n        LogManager.addLog(LogLevel.error, \"IO\", \"$e\\n$s\");\n      } finally {\n        file.deleteSync();\n      }\n    } else if ((file = File(\"${App.dataPath}/local_favorite_temp.db\"))\n        .existsSync()) {\n      var tmp_db = sqlite3.open(file.path);\n\n      final folders = tmp_db\n          .select(\"SELECT name FROM sqlite_master WHERE type='table';\")\n          .map((element) => element[\"name\"] as String)\n          .toList();\n      folders.remove('folder_sync');\n      folders.remove('folder_order');\n      LogManager.addLog(LogLevel.info, \"LocalFavoritesManager.readData\",\n          \"read folders from local database $folders\");\n      var folderToOrder = <String, int>{};\n      for (var folder in folders) {\n        var res = tmp_db.select(\"\"\"\n        select * from folder_order\n        where folder_name == ?;\n      \"\"\", [folder]);\n        if (res.isNotEmpty) {\n          folderToOrder[folder] = res.first[\"order_value\"];\n        } else {\n          folderToOrder[folder] = 0;\n        }\n      }\n      folders.sort((a, b) {\n        return folderToOrder[a]! - folderToOrder[b]!;\n      });\n      var res = <FavoriteItemWithFolderInfo>[];\n      for (final folder in folders) {\n        var comics = tmp_db.select(\"\"\"\n        select * from \"$folder\";\n      \"\"\");\n        LogManager.addLog(LogLevel.info, \"LocalFavoritesManager.readData\",\n            \"read $folder gets ${comics.length} comics\");\n        res.addAll(comics.map((element) =>\n            FavoriteItemWithFolderInfo(FavoriteItem.fromRow(element), folder)));\n      }\n      var skips = 0;\n      for (var comic in res) {\n        if (!folderNames.contains(comic.folder)) {\n          createFolder(comic.folder);\n        }\n        if (!comicExists(comic.folder, comic.comic.target, comic.comic.type.key)) {\n          addComic(comic.folder, comic.comic);\n          LogManager.addLog(LogLevel.info, \"LocalFavoritesManager\",\n              \"add comic ${comic.comic.target} to ${comic.folder}\");\n        } else {\n          skips++;\n        }\n      }\n      LogManager.addLog(LogLevel.info, \"LocalFavoritesManager\",\n          \"skipped $skips comics, total ${res.length}\");\n      tmp_db.dispose();\n      file.deleteSync();\n    } else {\n      LogManager.addLog(LogLevel.info, \"LocalFavoritesManager\",\n          \"no local favorites db file found\");\n    }\n  }\n\n  List<String> _getTablesWithDB() {\n    final tables = _db\n        .select(\"SELECT name FROM sqlite_master WHERE type='table';\")\n        .map((element) => element[\"name\"] as String)\n        .toList();\n    return tables;\n  }\n\n  List<String> _getFolderNamesWithDB() {\n    final folders = _getTablesWithDB();\n    folders.remove('folder_sync');\n    folders.remove('folder_order');\n    var folderToOrder = <String, int>{};\n    for (var folder in folders) {\n      var res = _db.select(\"\"\"\n        select * from folder_order\n        where folder_name == ?;\n      \"\"\", [folder]);\n      if (res.isNotEmpty) {\n        folderToOrder[folder] = res.first[\"order_value\"];\n      } else {\n        folderToOrder[folder] = 0;\n      }\n    }\n    folders.sort((a, b) {\n      return folderToOrder[a]! - folderToOrder[b]!;\n    });\n    return folders;\n  }\n\n  void updateOrder(Map<String, int> order) {\n    for (var folder in order.keys) {\n      _db.execute(\"\"\"\n        insert or replace into folder_order (folder_name, order_value)\n        values (?, ?);\n      \"\"\", [folder, order[folder]]);\n    }\n  }\n\n  List<FolderSync> _getFolderSyncWithDB() {\n    return _db\n        .select(\"SELECT * FROM folder_sync\")\n        .map((element) => FolderSync(\n            element['folder_name'], element['key'], element['sync_data']))\n        .toList();\n  }\n\n  void updateFolderSyncTime(FolderSync folderSync) {\n    _db.execute(\"\"\"\n      update folder_sync\n      set time = ?\n      where folder_name == ?\n    \"\"\", [folderSync.time, folderSync.folderName]);\n  }\n\n  void insertFolderSync(FolderSync folderSync) {\n    // 注意 syncData 不能用 toParam, 否则会没法 jsonDecode\n    _db.execute(\"\"\"\n        insert into folder_sync (folder_name, time, key, sync_data)\n        values ('${folderSync.folderName.toParam}', '${folderSync.time.toParam}', '${folderSync.key.toParam}', \n          '${folderSync.syncData}');\n      \"\"\");\n  }\n\n  int count(String folderName) {\n    return _db.select(\"\"\"\n      select count(*) as c\n      from \"$folderName\"\n    \"\"\").first[\"c\"];\n  }\n\n  List<String> get folderNames => _getFolderNamesWithDB();\n\n  List<FolderSync> get folderSync => _getFolderSyncWithDB();\n\n  int maxValue(String folder) {\n    return _db.select(\"\"\"\n        SELECT MAX(display_order) AS max_value\n        FROM \"$folder\";\n      \"\"\").firstOrNull?[\"max_value\"] ?? 0;\n  }\n\n  int minValue(String folder) {\n    return _db.select(\"\"\"\n        SELECT MIN(display_order) AS min_value\n        FROM \"$folder\";\n      \"\"\").firstOrNull?[\"min_value\"] ?? 0;\n  }\n\n  List<FavoriteItem> getAllComics(String folder) {\n    var rows = _db.select(\"\"\"\n        select * from \"$folder\"\n        ORDER BY display_order;\n      \"\"\");\n    return rows.map((element) => FavoriteItem.fromRow(element)).toList();\n  }\n\n  void addTagTo(String folder, String target, String tag) {\n    _db.execute(\"\"\"\n      update \"$folder\"\n      set tags = '$tag,' || tags\n      where target == '${target.toParam}'\n    \"\"\");\n    saveData();\n  }\n\n  List<FavoriteItemWithFolderInfo> allComics() {\n    var res = <FavoriteItemWithFolderInfo>[];\n    for (final folder in folderNames) {\n      var comics = _db.select(\"\"\"\n        select * from \"$folder\";\n      \"\"\");\n      res.addAll(comics.map((element) =>\n          FavoriteItemWithFolderInfo(FavoriteItem.fromRow(element), folder)));\n    }\n    return res;\n  }\n\n  /// create a folder\n  String createFolder(String name, [bool renameWhenInvalidName = false]) {\n    if (name.isEmpty) {\n      if (renameWhenInvalidName) {\n        int i = 0;\n        while (folderNames.contains(i.toString())) {\n          i++;\n        }\n        name = i.toString();\n      } else {\n        throw \"name is empty!\";\n      }\n    }\n    if (folderNames.contains(name)) {\n      if (renameWhenInvalidName) {\n        var prevName = name;\n        int i = 0;\n        while (folderNames.contains(i.toString())) {\n          i++;\n        }\n        name = prevName + i.toString();\n      } else {\n        throw Exception(\"Folder is existing\");\n      }\n    }\n    _db.execute(\"\"\"\n      create table \"$name\"(\n        target text,\n        name TEXT,\n        author TEXT,\n        type int,\n        tags TEXT,\n        cover_path TEXT,\n        time TEXT,\n        display_order int,\n        primary key (target, type)\n      );\n    \"\"\");\n    saveData();\n    return name;\n  }\n\n  bool comicExists(String folder, String target, int type) {\n    var res = _db.select(\"\"\"\n      select * from \"$folder\"\n      where target == ? and type == ?;\n    \"\"\", [target, type]);\n    return res.isNotEmpty;\n  }\n\n  FavoriteItem getComic(String folder, String target, FavoriteType type) {\n    var res = _db.select(\"\"\"\n      select * from \"$folder\"\n      where target == ? and type == ?;\n    \"\"\", [target, type.key]);\n    if (res.isEmpty) {\n      throw Exception(\"Comic not found\");\n    }\n    return FavoriteItem.fromRow(res.first);\n  }\n\n  /// add comic to a folder\n  ///\n  /// This method will download cover to local, to avoid problems like changing url\n  void addComic(String folder, FavoriteItem comic, [int? order]) async {\n    _modifiedAfterLastCache = true;\n    if (!folderNames.contains(folder)) {\n      throw Exception(\"Folder does not exists\");\n    }\n    var res = _db.select(\"\"\"\n      select * from \"$folder\"\n      where target == '${comic.target}';\n    \"\"\");\n    if (res.isNotEmpty) {\n      return;\n    }\n    if (order != null) {\n      _db.execute(\"\"\"\n        insert into \"$folder\" (target, name, author, type, tags, cover_path, time, display_order)\n        values ('${comic.target.toParam}', '${comic.name.toParam}', '${comic.author.toParam}', ${comic.type.key}, \n          '${comic.tags.join(',').toParam}', '${comic.coverPath.toParam}', '${comic.time.toParam}', $order);\n      \"\"\");\n    } else if (appdata.settings[53] == \"0\") {\n      _db.execute(\"\"\"\n        insert into \"$folder\" (target, name, author, type, tags, cover_path, time, display_order)\n        values ('${comic.target.toParam}', '${comic.name.toParam}', '${comic.author.toParam}', ${comic.type.key}, \n          '${comic.tags.join(',').toParam}', '${comic.coverPath.toParam}', '${comic.time.toParam}', ${maxValue(folder) + 1});\n      \"\"\");\n    } else {\n      _db.execute(\"\"\"\n        insert into \"$folder\" (target, name, author, type, tags, cover_path, time, display_order)\n        values ('${comic.target.toParam}', '${comic.name.toParam}', '${comic.author.toParam}', ${comic.type.key}, \n          '${comic.tags.join(',').toParam}', '${comic.coverPath.toParam}', '${comic.time.toParam}', ${minValue(folder) - 1});\n      \"\"\");\n    }\n    updateUI();\n    saveData();\n    try {\n      var file =\n          (await (ImageManager().getImage(comic.coverPath)).last).getFile();\n      var path =\n          \"${(await getApplicationSupportDirectory()).path}${pathSep}favoritesCover\";\n      var directory = Directory(path);\n      if (!directory.existsSync()) {\n        directory.createSync();\n      }\n      var hash =\n          md5.convert(const Utf8Encoder().convert(comic.coverPath)).toString();\n      file.copySync(\"$path$pathSep$hash.jpg\");\n    } catch (e) {\n      //忽略\n    }\n  }\n\n  /// get comic cover\n  Future<File> getCover(FavoriteItem item) async {\n    var path = \"${App.dataPath}/favoritesCover\";\n    var hash =\n        md5.convert(const Utf8Encoder().convert(item.coverPath)).toString();\n    var file = File(\"$path/$hash.jpg\");\n    if (file.existsSync()) {\n      return file;\n    }\n    if (item.coverPath.startsWith(\"file://\")) {\n      var data = DownloadManager()\n          .getCover(item.coverPath.replaceFirst(\"file://\", \"\"));\n      file.createSync(recursive: true);\n      file.writeAsBytesSync(data.readAsBytesSync());\n      return file;\n    }\n    try {\n      if (EhNetwork().cookiesStr == \"\") {\n        await EhNetwork().getCookies(false);\n      }\n      var res = await (ImageManager().getImage(item.coverPath, {\n        if (item.type == FavoriteType.ehentai) \"cookie\": EhNetwork().cookiesStr,\n        if (item.type == FavoriteType.hitomi) \"Referer\": \"https://hitomi.la/\"\n      }).last);\n      file.createSync(recursive: true);\n      file.writeAsBytesSync(res.getFile().readAsBytesSync());\n      return file;\n    } catch (e) {\n      await Future.delayed(const Duration(seconds: 5));\n      rethrow;\n    }\n  }\n\n  /// delete a folder\n  void deleteFolder(String name) {\n    _modifiedAfterLastCache = true;\n    _db.execute(\"\"\"\n      delete from folder_sync where folder_name == ?;\n    \"\"\", [name]);\n    _db.execute(\"\"\"\n      drop table \"$name\";\n    \"\"\");\n  }\n\n  void checkAndDeleteCover(FavoriteItem item) async {\n    if ((await find(item.target, item.type)).isEmpty) {\n      (await getCover(item)).deleteSync();\n    }\n  }\n\n  void deleteComic(String folder, FavoriteItem comic) {\n    _modifiedAfterLastCache = true;\n    deleteComicWithTarget(folder, comic.target, comic.type);\n    checkAndDeleteCover(comic);\n  }\n\n  void deleteComicWithTarget(String folder, String target, FavoriteType type) {\n    _modifiedAfterLastCache = true;\n    _db.execute(\"\"\"\n      delete from \"$folder\"\n      where target == ? and type == ?;\n    \"\"\", [target, type.key]);\n    saveData();\n  }\n\n  Future<void> clearAll() async {\n    _db.dispose();\n    File(\"${App.dataPath}/local_favorite.db\").deleteSync();\n    await init();\n    saveData();\n  }\n\n  void reorder(List<FavoriteItem> newFolder, String folder) async {\n    if (!folderNames.contains(folder)) {\n      throw Exception(\"Failed to reorder: folder not found\");\n    }\n    deleteFolder(folder);\n    createFolder(folder);\n    for (int i = 0; i < newFolder.length; i++) {\n      addComic(folder, newFolder[i], i);\n    }\n    updateUI();\n  }\n\n  void rename(String before, String after) {\n    if (folderNames.contains(after)) {\n      throw \"Name already exists!\";\n    }\n    if (after.contains('\"')) {\n      throw \"Invalid name\";\n    }\n    _db.execute(\"\"\"\n      ALTER TABLE \"$before\"\n      RENAME TO \"$after\";\n    \"\"\");\n    if (folderSync.isNotEmpty) {\n      _db.execute(\"\"\"\n      UPDATE folder_sync\n      set folder_name = ?\n      where folder_name == ?\n    \"\"\", [after, before]);\n    }\n    saveData();\n  }\n\n  void onReadEnd(String target, FavoriteType type) async {\n    _modifiedAfterLastCache = true;\n    bool isModified = false;\n    for (final folder in folderNames) {\n      var rows = _db.select(\"\"\"\n        select * from \"$folder\"\n        where target == ? and type == ?;\n      \"\"\", [target, type.key]);\n      if (rows.isNotEmpty) {\n        isModified = true;\n        var newTime = DateTime.now()\n            .toIso8601String()\n            .replaceFirst(\"T\", \" \")\n            .substring(0, 19);\n        String updateLocationSql = \"\";\n        if (appdata.settings[54] == \"1\") {\n          int maxValue = _db.select(\"\"\"\n            SELECT MAX(display_order) AS max_value\n            FROM \"$folder\";\n          \"\"\").firstOrNull?[\"max_value\"] ?? 0;\n          updateLocationSql = \"display_order = ${maxValue + 1},\";\n        } else if (appdata.settings[54] == \"2\") {\n          int minValue = _db.select(\"\"\"\n            SELECT MIN(display_order) AS min_value\n            FROM \"$folder\";\n          \"\"\").firstOrNull?[\"min_value\"] ?? 0;\n          updateLocationSql = \"display_order = ${minValue - 1},\";\n        }\n        _db.execute(\"\"\"\n            UPDATE \"$folder\"\n            SET \n              $updateLocationSql\n              time = '$newTime'\n            WHERE target == '${target.toParam}';\n          \"\"\");\n      }\n    }\n    if (isModified) {\n      updateUI();\n    }\n    saveData();\n  }\n\n  String folderToJsonString(String folderName) {\n    var data = <String, dynamic>{};\n    data[\"info\"] = \"Generated by PicaComic.\";\n    data[\"website\"] = \"https://github.com/wgh136/PicaComic\";\n    data[\"name\"] = folderName;\n    var comics = _db\n        .select(\"select * from \\\"$folderName\\\";\")\n        .map((element) => FavoriteItem.fromRow(element).toJson())\n        .toList();\n    data[\"comics\"] = comics;\n    return const JsonEncoder().convert(data);\n  }\n\n  (bool, String) loadFolderData(String dataString) {\n    try {\n      var data =\n          const JsonDecoder().convert(dataString) as Map<String, dynamic>;\n      final name_ = data[\"name\"] as String;\n      var name = name_;\n      int i = 0;\n      while (folderNames.contains(name)) {\n        name = name_ + i.toString();\n        i++;\n      }\n      createFolder(name);\n      for (var json in data[\"comics\"]) {\n        addComic(name, FavoriteItem.fromJson(json));\n      }\n      return (false, \"\");\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"IO\", \"Failed to load data.\\n$e\\n$s\");\n      return (true, e.toString());\n    }\n  }\n\n  List<FavoriteItemWithFolderInfo> search(String keyword) {\n    var keywordList = keyword.split(\" \");\n    keyword = keywordList.first;\n    var comics = <FavoriteItemWithFolderInfo>[];\n    for (var table in folderNames) {\n      keyword = \"%$keyword%\";\n      var res = _db.select(\"\"\"\n        SELECT * FROM \"$table\" \n        WHERE name LIKE ? OR author LIKE ? OR tags LIKE ?;\n      \"\"\", [keyword, keyword, keyword]);\n      for (var comic in res) {\n        comics.add(\n            FavoriteItemWithFolderInfo(FavoriteItem.fromRow(comic), table));\n      }\n      if (comics.length > 200) {\n        break;\n      }\n    }\n\n    bool test(FavoriteItemWithFolderInfo comic, String keyword) {\n      if (comic.comic.name.contains(keyword)) {\n        return true;\n      } else if (comic.comic.author.contains(keyword)) {\n        return true;\n      } else if (comic.comic.tags.any((element) => element.contains(keyword))) {\n        return true;\n      }\n      return false;\n    }\n\n    for (var i = 1; i < keywordList.length; i++) {\n      comics =\n          comics.where((element) => test(element, keywordList[i])).toList();\n    }\n\n    return comics;\n  }\n\n  void editTags(String target, String folder, List<String> tags) {\n    _db.execute(\"\"\"\n        update \"$folder\"\n        set tags = '${tags.join(\",\")}'\n        where target == '${target.toParam}';\n      \"\"\");\n  }\n\n  final _cachedFavoritedTargets = <String, bool>{};\n\n  bool isExist(String target) {\n    if (_modifiedAfterLastCache) {\n      _cacheFavoritedTargets();\n    }\n    return _cachedFavoritedTargets.containsKey(target);\n  }\n\n  bool _modifiedAfterLastCache = true;\n\n  void _cacheFavoritedTargets() {\n    _modifiedAfterLastCache = false;\n    _cachedFavoritedTargets.clear();\n    for (var folder in folderNames) {\n      var res = _db.select(\"\"\"\n        select target from \"$folder\";\n      \"\"\");\n      for (var row in res) {\n        _cachedFavoritedTargets[row[\"target\"]] = true;\n      }\n    }\n  }\n\n  void updateInfo(String folder, FavoriteItem comic) {\n    _db.execute(\"\"\"\n      update \"$folder\"\n      set name = ?, author = ?, cover_path = ?, tags = ?\n      where target == ? and type == ?;\n    \"\"\", [comic.name, comic.author, comic.coverPath, comic.tags.join(\",\"), comic.target, comic.type.key]);\n  }\n}\n"
  },
  {
    "path": "lib/foundation/log.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:pica_comic/tools/extensions.dart';\n\nvoid log(String content,\n    [String title = \"debug\", LogLevel level = LogLevel.info]) {\n  LogManager.addLog(level, title, content);\n}\n\nclass LogManager {\n  static final List<Log> _logs = <Log>[];\n\n  static List<Log> get logs => _logs;\n\n  static const maxLogLength = 3000;\n\n  static const maxLogNumber = 500;\n\n  static bool ignoreLimitation = false;\n\n  static void printWarning(String text) {\n    print('\\x1B[33m$text\\x1B[0m');\n  }\n\n  static void printError(String text) {\n    print('\\x1B[31m$text\\x1B[0m');\n  }\n\n  static void addLog(LogLevel level, String title, String content) {\n    if (!ignoreLimitation && content.length > maxLogLength) {\n      content = \"${content.substring(0, maxLogLength)}...\";\n    }\n\n    if (kDebugMode) {\n      switch (level) {\n        case LogLevel.error:\n          printError(\"$title: $content\");\n        case LogLevel.warning:\n          printWarning(\"$title: $content\");\n        case LogLevel.info:\n          print(\"$title: $content\");\n      }\n    }\n\n    var newLog = Log(level, title, content);\n\n    if (newLog == _logs.lastOrNull) {\n      return;\n    }\n\n    _logs.add(newLog);\n    writeLog(level, title, content);\n    if (_logs.length > maxLogNumber) {\n      var res = _logs.remove(\n          _logs.firstWhereOrNull((element) => element.level == LogLevel.info));\n      if (!res) {\n        _logs.removeAt(0);\n      }\n    }\n  }\n\n  static void clear() => _logs.clear();\n\n  @override\n  String toString() {\n    var res = \"Logs\\n\\n\";\n    for (var log in _logs) {\n      res += log.toString();\n    }\n    return res;\n  }\n\n  static File? logFile;\n\n  static void writeLog(LogLevel level, String title, String content) {\n    if(logFile != null) {\n      logFile!.writeAsString(\n        \"${DateTime.now().toIso8601String()} ${level.name}\\n$title: $content\\n\\n\",\n        mode: FileMode.append,\n      );\n    }\n  }\n}\n\nclass Log {\n  final LogLevel level;\n  final String title;\n  final String content;\n  final DateTime time = DateTime.now();\n\n  @override\n  toString() => \"${level.name} $title $time \\n$content\\n\\n\";\n\n  Log(this.level, this.title, this.content);\n\n  static void info(String title, String message) {\n    LogManager.addLog(LogLevel.info, title, message);\n  }\n\n  static void warning(String title, String message) {\n    LogManager.addLog(LogLevel.warning, title, message);\n  }\n\n  static void error(String title, String message) {\n    LogManager.addLog(LogLevel.error, title, message);\n  }\n\n  @override\n  bool operator ==(Object other) {\n    if (other is! Log)  return false;\n    return other.level == level && other.title == title && other.content == content;\n  }\n\n  @override\n  int get hashCode => level.hashCode ^ title.hashCode ^ content.hashCode;\n}\n\nenum LogLevel { error, warning, info }\n"
  },
  {
    "path": "lib/foundation/pair.dart",
    "content": "class Pair<M, V>{\n  M left;\n  V right;\n\n  Pair(this.left, this.right);\n\n  Pair.fromMap(Map<M, V> map, M key): left = key, right = map[key]\n      ?? (throw Exception(\"Pair not found\"));\n}"
  },
  {
    "path": "lib/foundation/stack.dart",
    "content": "import 'dart:collection';\n\nclass Stack<T>{\n  final Queue<T> _values;\n\n  Stack():_values = Queue();\n\n  int get length => _values.length;\n  bool get isEmpty => _values.isEmpty;\n  bool get isNotEmpty => _values.isNotEmpty;\n\n  void push(T value){\n    _values.addLast(value);\n  }\n\n  T pop(){\n    return _values.removeLast();\n  }\n\n  T get last => _values.last;\n}"
  },
  {
    "path": "lib/foundation/state_controller.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/foundation/pair.dart';\n\nclass SimpleController extends StateController {\n  final void Function()? refresh_;\n\n  SimpleController({this.refresh_});\n\n  @override\n  void refresh() {\n    (refresh_ ?? super.refresh)();\n  }\n}\n\nabstract class StateController {\n  static final _controllers = <StateControllerWrapped>[];\n\n  static T put<T extends StateController>(T controller,\n      {Object? tag, bool autoRemove = false}) {\n    _controllers.add(StateControllerWrapped(controller, autoRemove, tag));\n    return controller;\n  }\n\n  static T putIfNotExists<T extends StateController>(T controller,\n      {Object? tag, bool autoRemove = false}) {\n    return findOrNull<T>(tag: tag) ??\n        put(controller, tag: tag, autoRemove: autoRemove);\n  }\n\n  static T find<T extends StateController>({Object? tag}) {\n    try {\n      return _controllers\n          .lastWhere((element) =>\n              element.controller is T && (tag == null || tag == element.tag))\n          .controller as T;\n    } catch (e) {\n      throw StateError(\"$T with tag $tag Not Found\");\n    }\n  }\n\n  static List<T> findAll<T extends StateController>({Object? tag}) {\n    return _controllers\n        .where((element) =>\n            element.controller is T && (tag == null || tag == element.tag))\n        .map((e) => e.controller as T)\n        .toList();\n  }\n\n  static T? findOrNull<T extends StateController>({Object? tag}) {\n    try {\n      return _controllers\n          .lastWhere((element) =>\n              element.controller is T && (tag == null || tag == element.tag))\n          .controller as T;\n    } catch (e) {\n      return null;\n    }\n  }\n\n  static void remove<T>([Object? tag, bool check = false]) {\n    for (int i = _controllers.length - 1; i >= 0; i--) {\n      var element = _controllers[i];\n      if (element.controller is T && (tag == null || tag == element.tag)) {\n        if (check && !element.autoRemove) {\n          continue;\n        }\n        _controllers.removeAt(i);\n        return;\n      }\n    }\n  }\n\n  static SimpleController putSimpleController(\n      void Function() onUpdate, Object? tag,\n      {void Function()? refresh}) {\n    var controller = SimpleController(refresh_: refresh);\n    controller.stateUpdaters.add(Pair(null, onUpdate));\n    _controllers.add(StateControllerWrapped(controller, false, tag));\n    return controller;\n  }\n\n  List<Pair<Object?, void Function()>> stateUpdaters = [];\n\n  void update([List<Object>? ids]) {\n    if (ids == null) {\n      for (var element in stateUpdaters) {\n        element.right();\n      }\n    } else {\n      for (var element in stateUpdaters) {\n        if (ids.contains(element.left)) {\n          element.right();\n        }\n      }\n    }\n  }\n\n  void dispose() {\n    _controllers.removeWhere((element) => element.controller == this);\n  }\n\n  void refresh() {\n    update();\n  }\n}\n\nclass StateControllerWrapped {\n  StateController controller;\n  bool autoRemove;\n  Object? tag;\n\n  StateControllerWrapped(this.controller, this.autoRemove, this.tag);\n}\n\nclass StateBuilder<T extends StateController> extends StatefulWidget {\n  const StateBuilder({\n    super.key,\n    this.init,\n    this.dispose,\n    this.initState,\n    this.tag,\n    required this.builder,\n    this.id,\n  });\n\n  final T? init;\n\n  final void Function(T controller)? dispose;\n\n  final void Function(T controller)? initState;\n\n  final Object? tag;\n\n  final Widget Function(T controller) builder;\n\n  Widget builderWrapped(StateController controller) {\n    return builder(controller as T);\n  }\n\n  void initStateWrapped(StateController controller) {\n    return initState?.call(controller as T);\n  }\n\n  void disposeWrapped(StateController controller) {\n    return dispose?.call(controller as T);\n  }\n\n  final Object? id;\n\n  @override\n  State<StateBuilder> createState() => _StateBuilderState<T>();\n}\n\nclass _StateBuilderState<T extends StateController>\n    extends State<StateBuilder> {\n  late T controller;\n\n  @override\n  void initState() {\n    if (widget.init != null) {\n      StateController.put(widget.init!, tag: widget.tag, autoRemove: true);\n    }\n    try {\n      controller = StateController.find<T>(tag: widget.tag);\n    } catch (e) {\n      throw \"Controller Not Found\";\n    }\n    controller.stateUpdaters.add(Pair(widget.id, () {\n      if (mounted) {\n        setState(() {});\n      }\n    }));\n    widget.initStateWrapped(controller);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    widget.disposeWrapped(controller);\n    StateController.remove<T>(widget.tag, true);\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) => widget.builderWrapped(controller);\n}\n\nabstract class StateWithController<T extends StatefulWidget> extends State<T> {\n  late final SimpleController _controller;\n\n  void refresh() {\n    _controller.update();\n  }\n\n  @override\n  @mustCallSuper\n  void initState() {\n    _controller = StateController.putSimpleController(\n      () {\n        if (mounted) {\n          setState(() {});\n        }\n      },\n      tag,\n      refresh: refresh,\n    );\n    super.initState();\n  }\n\n  @override\n  @mustCallSuper\n  void dispose() {\n    _controller.dispose();\n    super.dispose();\n  }\n\n  void update() {\n    _controller.update();\n  }\n\n  Object? get tag;\n}\n"
  },
  {
    "path": "lib/foundation/ui_mode.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'app.dart' as app;\n\nclass UiMode{\n  static bool m1(BuildContext context){\n    return app.App.uiMode(context) == app.UiModes.m1;\n  }\n\n  static bool m2(BuildContext context){\n    return app.App.uiMode(context) == app.UiModes.m2;\n  }\n\n  static bool m3(BuildContext context){\n    return app.App.uiMode(context) == app.UiModes.m3;\n  }\n}"
  },
  {
    "path": "lib/foundation/widget_utils.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/app_page_route.dart';\n\nextension WidgetExtension on Widget {\n  Widget padding(EdgeInsetsGeometry padding) {\n    return Padding(padding: padding, child: this);\n  }\n\n  Widget paddingLeft(double padding) {\n    return Padding(padding: EdgeInsets.only(left: padding), child: this);\n  }\n\n  Widget paddingRight(double padding) {\n    return Padding(padding: EdgeInsets.only(right: padding), child: this);\n  }\n\n  Widget paddingTop(double padding) {\n    return Padding(padding: EdgeInsets.only(top: padding), child: this);\n  }\n\n  Widget paddingBottom(double padding) {\n    return Padding(padding: EdgeInsets.only(bottom: padding), child: this);\n  }\n\n  Widget paddingVertical(double padding) {\n    return Padding(\n        padding: EdgeInsets.symmetric(vertical: padding), child: this);\n  }\n\n  Widget paddingHorizontal(double padding) {\n    return Padding(\n        padding: EdgeInsets.symmetric(horizontal: padding), child: this);\n  }\n\n  Widget paddingAll(double padding) {\n    return Padding(padding: EdgeInsets.all(padding), child: this);\n  }\n\n  Widget toCenter() {\n    return Center(child: this);\n  }\n\n  Widget toAlign(AlignmentGeometry alignment) {\n    return Align(alignment: alignment, child: this);\n  }\n\n  Widget sliverPadding(EdgeInsetsGeometry padding) {\n    return SliverPadding(padding: padding, sliver: this);\n  }\n\n  Widget sliverPaddingAll(double padding) {\n    return SliverPadding(padding: EdgeInsets.all(padding), sliver: this);\n  }\n\n  Widget sliverPaddingVertical(double padding) {\n    return SliverPadding(\n        padding: EdgeInsets.symmetric(vertical: padding), sliver: this);\n  }\n\n  Widget sliverPaddingHorizontal(double padding) {\n    return SliverPadding(\n        padding: EdgeInsets.symmetric(horizontal: padding), sliver: this);\n  }\n\n  Widget toSliver() {\n    return SliverToBoxAdapter(child: this);\n  }\n\n  Widget fixWidth(double width) {\n    return SizedBox(width: width, child: this);\n  }\n\n  Widget fixHeight(double height) {\n    return SizedBox(height: height, child: this);\n  }\n}\n\nextension ContextExt on BuildContext {\n  EdgeInsets get padding => MediaQuery.of(this).padding;\n\n  double get width => MediaQuery.of(this).size.width;\n\n  double get height => MediaQuery.of(this).size.height;\n\n  EdgeInsets get viewInsets => MediaQuery.of(this).viewInsets;\n\n  ColorScheme get colorScheme => Theme.of(this).colorScheme;\n\n  Brightness get brightness => Theme.of(this).brightness;\n\n  Future<T?> to<T>(Widget Function() builder) {\n    return Navigator.of(this)\n        .push<T>(AppPageRoute<T>(builder: (context) => builder()));\n  }\n\n  void off(Widget Function() builder) {\n    Navigator.of(this)\n        .pushReplacement(AppPageRoute(builder: (context) => builder()));\n  }\n\n  void pop() {\n    if(Navigator.of(this).canPop()) {\n      return Navigator.of(this).pop();\n    } else {\n      App.navigatorKey.currentState!.pop();\n    }\n  }\n\n  void showMessage({required String message, Widget? icon, Widget? trailing}) {\n    showToast(message: message, icon: icon, trailing: trailing);\n  }\n\n  void hideMessages() {\n    hideAllMessages();\n  }\n}\n\n/// create default text style\nTextStyle get ts => const TextStyle();\n\nextension StyledText on TextStyle {\n  TextStyle get bold => copyWith(fontWeight: FontWeight.bold);\n\n  TextStyle get light => copyWith(fontWeight: FontWeight.w300);\n\n  TextStyle get italic => copyWith(fontStyle: FontStyle.italic);\n\n  TextStyle get underline => copyWith(decoration: TextDecoration.underline);\n\n  TextStyle get lineThrough => copyWith(decoration: TextDecoration.lineThrough);\n\n  TextStyle get overline => copyWith(decoration: TextDecoration.overline);\n\n  TextStyle get s8 => copyWith(fontSize: 8);\n\n  TextStyle get s10 => copyWith(fontSize: 10);\n\n  TextStyle get s12 => copyWith(fontSize: 12);\n\n  TextStyle get s14 => copyWith(fontSize: 14);\n\n  TextStyle get s16 => copyWith(fontSize: 16);\n\n  TextStyle get s18 => copyWith(fontSize: 18);\n\n  TextStyle get s20 => copyWith(fontSize: 20);\n\n  TextStyle get s24 => copyWith(fontSize: 24);\n\n  TextStyle get s28 => copyWith(fontSize: 28);\n\n  TextStyle get s32 => copyWith(fontSize: 32);\n\n  TextStyle get s36 => copyWith(fontSize: 36);\n\n  TextStyle get s40 => copyWith(fontSize: 40);\n\n  TextStyle withHeight(double value) => copyWith(height: value);\n\n  TextStyle withColor(Color? color) => copyWith(color: color);\n}"
  },
  {
    "path": "lib/init.dart",
    "content": "import 'dart:io' as io;\n\nimport 'package:app_links/app_links.dart';\nimport 'package:cookie_jar/cookie_jar.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/foundation/cache_manager.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/js_engine.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/cookie_jar.dart';\nimport 'package:pica_comic/network/http_proxy.dart';\nimport 'package:pica_comic/network/jm_network/jm_network.dart';\nimport 'package:pica_comic/network/picacg_network/models.dart';\nimport 'package:pica_comic/tools/app_links.dart';\nimport 'package:pica_comic/tools/background_service.dart';\nimport 'package:pica_comic/tools/cache_auto_clear.dart';\nimport 'package:pica_comic/tools/io_extensions.dart';\nimport 'package:pica_comic/tools/io_tools.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:shared_preferences/shared_preferences.dart';\nimport 'package:workmanager/workmanager.dart';\n\nimport 'base.dart';\nimport 'comic_source/built_in/ehentai.dart';\nimport 'comic_source/built_in/ht_manga.dart';\nimport 'comic_source/built_in/jm.dart';\nimport 'comic_source/built_in/nhentai.dart';\nimport 'comic_source/built_in/picacg.dart';\nimport 'foundation/app.dart';\nimport 'network/nhentai_network/nhentai_main_network.dart';\n\nFuture<void> init() async {\n  try {\n    await App.init();\n    io.File? logFile = io.File(\"${App.dataPath}/log.txt\");\n    if(App.isAndroid) {\n      var externalDirectory = await getExternalStorageDirectory();\n      if (externalDirectory != null) {\n        logFile = io.File(\"${externalDirectory.path}/log.txt\");\n      }\n    }\n    if(App.isIOS) {\n      logFile = null;\n    }\n    if(logFile?.existsSync() ?? false) {\n      await logFile?.delete();\n    }\n    LogManager.logFile = logFile;\n    LogManager.addLog(LogLevel.info, \"App Status\", \"Start initialization.\");\n    await appdata.readData();\n    SingleInstanceCookieJar(\"${App.dataPath}/cookies.db\");\n    HttpProxyServer.createConfigFile();\n    if (appdata.settings[58] == \"1\") {\n      HttpProxyServer.startServer();\n    }\n    startClearCache();\n    if (App.isAndroid) {\n      final appLinks = AppLinks();\n      appLinks.allUriLinkStream.listen((uri) async {\n        while(App.mainNavigatorKey == null) {\n          await Future.delayed(const Duration(milliseconds: 100));\n        }\n        handleAppLinks(uri);\n      });\n    }\n    if (App.isMobile) {\n      Workmanager().initialize(\n        onStart,\n      );\n    }\n    await checkDownloadPath();\n    await _checkOldData();\n\n    await JsEngine().init();\n\n    await ComicSource.init();\n\n    await Future.wait([\n      downloadManager.init(),\n      NhentaiNetwork().init(),\n      JmNetwork().init(),\n      LocalFavoritesManager().init(),\n      HistoryManager().init(),\n      AppTranslation.init(),\n    ]);\n    CacheManager().setLimitSize(appdata.appSettings.cacheLimit);\n  } catch (e, s) {\n    LogManager.addLog(\n        LogLevel.error, \"Init\", \"App initialization failed!\\n$e$s\");\n  }\n}\n\nFuture<void> _checkOldData() async {\n  try {\n    if (int.parse(appdata.settings[17]) >= 4) {\n      appdata.settings[17] = '0';\n    }\n    if (int.parse(appdata.settings[40]) > 40) {\n      appdata.settings[40] = '40';\n    }\n    appdata.blockingKeyword.removeWhere((value) => value.isEmpty);\n\n    if (io.Directory(\"${App.dataPath}/comic_source/cookies/\").existsSync() ||\n        io.Directory(\"${App.dataPath}/eh_cookies\").existsSync() ||\n        io.Directory(\"${App.dataPath}/comic_source/cookies\").existsSync()) {\n      // cookies, old version use package cookie_jar\n      final cookieJars = [\n        PersistCookieJar(storage: FileStorage(\"${App.dataPath}/cookies\")),\n        PersistCookieJar(storage: FileStorage(\"${App.dataPath}/eh_cookies\")),\n        PersistCookieJar(\n            storage: FileStorage(\"${App.dataPath}/comic_source/cookies/\"))\n      ];\n      var cookies = <io.Cookie>[];\n      for (var cookie in (await cookieJars[0]\n          .loadForRequest(Uri.parse(\"https://nhentai.net\")))) {\n        cookie.domain ??= \".nhentai.net\";\n        cookies.add(cookie);\n      }\n      for (var cookie in (await cookieJars[1]\n          .loadForRequest(Uri.parse(\"https://e-hentai.org\")))) {\n        cookie.domain ??= \".e-hentai.org\";\n        cookies.add(cookie);\n      }\n      for (var cookie in (await cookieJars[1]\n          .loadForRequest(Uri.parse(\"https://exhentai.org\")))) {\n        cookie.domain ??= \".exhentai.org\";\n        cookies.add(cookie);\n      }\n      try {\n        for (var file in io.Directory(\"${App.dataPath}/comic_source/cookies/\")\n            .listSync()) {\n          var domain = file.path.split(\"/\").last;\n          if (domain == '.domains' || domain == '.index') {\n            continue;\n          }\n          if (domain.startsWith('.')) {\n            domain = domain.substring(1);\n          }\n          for (var cookie in (await cookieJars[2]\n              .loadForRequest(Uri.parse(\"https://$domain\")))) {\n            cookie.domain ??= \".$domain\";\n            cookies.add(cookie);\n          }\n        }\n      } finally {}\n      if (io.Directory(\"${App.dataPath}/cookies\").existsSync()) {\n        io.Directory(\"${App.dataPath}/cookies\").deleteSync(recursive: true);\n      }\n      if (io.Directory(\"${App.dataPath}/eh_cookies\").existsSync()) {\n        io.Directory(\"${App.dataPath}/eh_cookies\").deleteSync(recursive: true);\n      }\n      if (io.Directory(\"${App.dataPath}/comic_source/cookies\").existsSync()) {\n        io.Directory(\"${App.dataPath}/comic_source/cookies\")\n            .deleteSync(recursive: true);\n      }\n    }\n\n    if (io.File(\"${App.dataPath}/cache.json\").existsSync()) {\n      io.File(\"${App.dataPath}/cache.json\").deleteIgnoreError();\n    }\n    if (io.Directory(\"${App.cachePath}/imageCache\").existsSync()) {\n      io.Directory(\"${App.cachePath}/imageCache\")\n          .deleteIgnoreError(recursive: true);\n    }\n    if (io.Directory(\"${App.cachePath}/cachedNetwork\").existsSync()) {\n      io.Directory(\"${App.cachePath}/cachedNetwork\")\n          .deleteIgnoreError(recursive: true);\n    }\n    await _checkAccountData();\n  } catch (e, s) {\n    LogManager.addLog(LogLevel.error, \"Init\", \"Check old data failed!\\n$e$s\");\n  }\n}\n\nFuture<void> _checkAccountData() async {\n  var s = await SharedPreferences.getInstance();\n  if (s.getString('picacgAccount') != null) {\n    var account = s.getString('picacgAccount');\n    var pwd = s.getString('picacgPassword');\n    var token = s.getString('token');\n    picacg.data['account'] = [account, pwd];\n    picacg.data['token'] = token;\n    picacg.data['user'] = Profile(\n      s.getString(\"userId\") ?? \"\",\n      s.getString(\"userAvatar\") ?? '',\n      s.getString(\"userEmail\") ?? \"\",\n      s.getInt(\"userExp\") ?? 0,\n      s.getInt(\"userLevel\") ?? 0,\n      s.getString(\"userName\") ?? \"\",\n      s.getString(\"userTitle\") ?? \"\",\n      false,\n      '',\n      '',\n    ).toJson();\n    picacg.data['appChannel'] = s.getString(\"appChannel\") ?? \"3\";\n    picacg.data['imageQuality'] = s.getString('image') ?? \"original\";\n    await picacg.saveData();\n    await s.remove('picacgAccount');\n  }\n  if(s.getString(\"jmName\") != null) {\n    var account = s.getString('jmName');\n    var pwd = s.getString('jmPwd');\n    jm.data['account'] = [account, pwd];\n    jm.data['name'] = account;\n    await s.remove(\"jmName\");\n    await jm.saveData();\n  }\n  if(s.getString(\"ehAccount\") != null) {\n    ehentai.data['account'] = 'ok';\n    ehentai.data['name'] = s.getString(\"ehAccount\")!;\n    await s.remove(\"ehAccount\");\n    await ehentai.saveData();\n  }\n  if(s.getString('htName') != null) {\n    var account = s.getString('htName');\n    var pwd = s.getString('htPwd');\n    htManga.data['account'] = [account, pwd];\n    htManga.data['name'] = account;\n    await s.remove('htName');\n    await htManga.saveData();\n  }\n  NhentaiNetwork().init();\n  if(NhentaiNetwork().logged) {\n    nhentai.data['account'] = 'ok';\n    await nhentai.saveData();\n  }\n}\n"
  },
  {
    "path": "lib/main.dart",
    "content": "import 'dart:async';\n\nimport 'package:desktop_webview_window/desktop_webview_window.dart';\nimport 'package:dynamic_color/dynamic_color.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_displaymode/flutter_displaymode.dart';\nimport 'package:flutter_localizations/flutter_localizations.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/components/window_frame.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/app_page_route.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/init.dart';\nimport 'package:pica_comic/network/http_client.dart';\nimport 'package:pica_comic/pages/auth_page.dart';\nimport 'package:pica_comic/pages/main_page.dart';\nimport 'package:pica_comic/pages/welcome_page.dart';\nimport 'package:pica_comic/tools/block_screenshot.dart';\nimport 'package:pica_comic/tools/mouse_listener.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\nimport 'package:window_manager/window_manager.dart';\n\nimport 'components/components.dart';\nimport 'network/webdav.dart';\n\nbool notFirstUse = false;\n\nvoid main(List<String> args) {\n  if (runWebViewTitleBarWidget(args)) {\n    return;\n  }\n  runZonedGuarded(() async {\n    WidgetsFlutterBinding.ensureInitialized();\n    await init();\n    FlutterError.onError = (details) {\n      LogManager.addLog(LogLevel.error, \"Unhandled Exception\",\n          \"${details.exception}\\n${details.stack}\");\n    };\n    notFirstUse = appdata.firstUse[3] == \"1\";\n    setNetworkProxy();\n    runApp(const MyApp());\n    if (App.isDesktop) {\n      await windowManager.ensureInitialized();\n      windowManager.waitUntilReadyToShow().then((_) async {\n        await windowManager.setTitleBarStyle(\n          TitleBarStyle.hidden,\n          windowButtonVisibility: App.isMacOS,\n        );\n        if (App.isLinux) {\n          await windowManager.setBackgroundColor(Colors.transparent);\n        }\n        await windowManager.setMinimumSize(const Size(500, 600));\n        if (!App.isLinux) {\n          // https://github.com/leanflutter/window_manager/issues/460\n          var placement = await WindowPlacement.loadFromFile();\n          await placement.applyToWindow();\n          await windowManager.show();\n          WindowPlacement.loop();\n        }\n      });\n    }\n  }, (error, stack) {\n    LogManager.addLog(LogLevel.error, \"Unhandled Exception\", \"$error\\n$stack\");\n  });\n}\n\nclass MyApp extends StatefulWidget {\n  const MyApp({super.key});\n\n  static void Function()? updater;\n\n  @override\n  State<MyApp> createState() => _MyAppState();\n}\n\nclass _MyAppState extends State<MyApp> with WidgetsBindingObserver {\n  DateTime time = DateTime.fromMillisecondsSinceEpoch(0);\n\n  bool forceRebuild = false;\n\n  OverlayEntry? hideContentOverlay;\n\n  void hideContent() {\n    if (hideContentOverlay != null) return;\n    hideContentOverlay = OverlayEntry(\n        builder: (context) => Container(\n              width: MediaQuery.of(context).size.width,\n              height: MediaQuery.of(context).size.width,\n              color: Theme.of(context).colorScheme.surface,\n            ));\n    OverlayWidget.addOverlay(hideContentOverlay!);\n  }\n\n  void showContent() {\n    hideContentOverlay = null;\n    OverlayWidget.removeAll();\n  }\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    bool enableAuth = appdata.settings[13] == \"1\";\n    if (App.isAndroid && appdata.settings[38] == \"1\") {\n      try {\n        FlutterDisplayMode.setHighRefreshRate();\n      } catch (e) {\n        // ignore\n      }\n    }\n    setNetworkProxy();\n    scheduleMicrotask(() {\n      if (state == AppLifecycleState.hidden && enableAuth) {\n        if (!AuthPage.lock && appdata.settings[13] == \"1\") {\n          AuthPage.initial = false;\n          AuthPage.lock = true;\n          App.to(App.globalContext!, () => const AuthPage());\n        }\n      }\n\n      if (state == AppLifecycleState.inactive && enableAuth) {\n        hideContent();\n      } else if (state == AppLifecycleState.resumed) {\n        showContent();\n        Future.delayed(const Duration(milliseconds: 200), checkClipboard);\n      }\n\n      if (DateTime.now().millisecondsSinceEpoch - time.millisecondsSinceEpoch >\n          7200000) {\n        Webdav.syncData();\n        time = DateTime.now();\n      }\n    });\n  }\n\n  @override\n  void initState() {\n    MyApp.updater = () => setState(() => forceRebuild = true);\n    time = DateTime.now();\n    TagsTranslation.readData();\n    if (App.isAndroid && appdata.settings[38] == \"1\") {\n      try {\n        FlutterDisplayMode.setHighRefreshRate();\n      } finally {}\n    }\n    listenMouseSideButtonToBack();\n    SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);\n    WidgetsBinding.instance.addObserver(this);\n    notifications.init();\n    if (appdata.settings[12] == \"1\") {\n      blockScreenshot();\n    }\n    PaintingBinding.instance.imageCache.maximumSizeBytes = 200 * 1024 * 1024;\n    super.initState();\n  }\n\n  @override\n  void didChangePlatformBrightness() {\n    setState(() {});\n  }\n\n  (ColorScheme, ColorScheme) _generateColorSchemes(\n      ColorScheme? light, ColorScheme? dark) {\n    Color? color;\n    if (int.parse(appdata.settings[27]) != 0) {\n      color = colors[int.parse(appdata.settings[27]) - 1];\n    } else {\n      color = light?.primary ?? Colors.blueAccent;\n    }\n    light = ColorScheme.fromSeed(seedColor: color);\n    dark = ColorScheme.fromSeed(seedColor: color, brightness: Brightness.dark);\n    return (light, dark);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (forceRebuild) {\n      forceRebuild = false;\n      void rebuild(Element el) {\n        el.markNeedsBuild();\n        el.visitChildren(rebuild);\n      }\n\n      (context as Element).visitChildren(rebuild);\n    }\n    return DynamicColorBuilder(builder: (light, dark) {\n      var (lightColor, darkColor) = _generateColorSchemes(light, dark);\n      return MaterialApp(\n        title: 'Pica Comic',\n        debugShowCheckedModeBanner: false,\n        navigatorKey: App.navigatorKey,\n        theme: ThemeData(\n          colorScheme: lightColor,\n          useMaterial3: true,\n          fontFamily: App.isWindows ? \"font\" : \"\",\n        ),\n        darkTheme: ThemeData(\n          colorScheme: darkColor,\n          useMaterial3: true,\n          fontFamily: App.isWindows ? \"font\" : \"\",\n          brightness: Brightness.dark,\n        ),\n        themeMode: appdata.appSettings.darkMode == 2\n            ? ThemeMode.dark\n            : appdata.appSettings.darkMode == 1\n            ? ThemeMode.light\n            : ThemeMode.system,\n        onGenerateRoute: (settings) => AppPageRoute(\n          builder: (context) => notFirstUse\n              ? (appdata.settings[13] == \"1\"\n              ? const AuthPage()\n              : const MainPage())\n              : const WelcomePage(),\n        ),\n        localizationsDelegates: const [\n          GlobalMaterialLocalizations.delegate,\n          GlobalWidgetsLocalizations.delegate,\n          GlobalCupertinoLocalizations.delegate,\n        ],\n        supportedLocales: const [\n          Locale('zh', 'CN'),\n          Locale('zh', 'TW'),\n          Locale('en', 'US')\n        ],\n        builder: (context, widget) {\n          ErrorWidget.builder = (details) {\n            LogManager.addLog(LogLevel.error, \"Unhandled Exception\",\n                \"${details.exception}\\n${details.stack}\");\n            return Material(\n              child: Center(\n                child: Text(details.exception.toString()),\n              ),\n            );\n          };\n          if (widget != null) {\n            widget = OverlayWidget(widget);\n            if (App.isDesktop) {\n              widget = Shortcuts(\n                shortcuts: {\n                  LogicalKeySet(LogicalKeyboardKey.escape):\n                  VoidCallbackIntent(\n                        () {\n                      if (App.canPop) {\n                        App.globalBack();\n                      } else {\n                        App.mainNavigatorKey?.currentContext?.pop();\n                      }\n                    },\n                  ),\n                },\n                child: WindowFrame(widget),\n              );\n            }\n            return _SystemUiProvider(widget);\n          }\n          throw ('widget is null');\n        },\n      );\n    });\n  }\n}\n\nclass _SystemUiProvider extends StatelessWidget {\n  const _SystemUiProvider(this.child);\n\n  final Widget child;\n\n  @override\n  Widget build(BuildContext context) {\n    var brightness = Theme.of(context).brightness;\n    SystemUiOverlayStyle systemUiStyle;\n    if (brightness == Brightness.light) {\n      systemUiStyle = SystemUiOverlayStyle.dark.copyWith(\n        statusBarColor: Colors.transparent,\n        systemNavigationBarColor: Colors.transparent,\n      );\n    } else {\n      systemUiStyle = SystemUiOverlayStyle.light.copyWith(\n        statusBarColor: Colors.transparent,\n        systemNavigationBarColor: Colors.transparent,\n      );\n    }\n    return AnnotatedRegion<SystemUiOverlayStyle>(\n      value: systemUiStyle,\n      child: child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/network/app_dio.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:dio/dio.dart';\nimport 'package:dio/io.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:dio_http2_adapter/dio_http2_adapter.dart';\nimport 'package:pica_comic/network/http_client.dart';\nimport '../base.dart';\nimport '../foundation/app.dart';\n\nclass MyLogInterceptor implements Interceptor {\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) {\n    LogManager.addLog(LogLevel.error, \"Network\",\n        \"${err.requestOptions.method} ${err.requestOptions.path}\\n$err\\n${err.response?.data.toString()}\");\n    switch(err.type) {\n      case DioExceptionType.badResponse:\n        var statusCode = err.response?.statusCode;\n        if(statusCode != null){\n          err = err.copyWith(message: \"Invalid Status Code: $statusCode. \"\n              \"${_getStatusCodeInfo(statusCode)}\");\n        }\n      case DioExceptionType.connectionTimeout:\n        err = err.copyWith(message: \"Connection Timeout\");\n      case DioExceptionType.receiveTimeout:\n        err = err.copyWith(message: \"Receive Timeout: \"\n            \"This indicates that the server is too busy to respond\");\n      case DioExceptionType.unknown:\n        if(err.toString().contains(\"Connection terminated during handshake\")) {\n          err = err.copyWith(message: \"Connection terminated during handshake: \"\n              \"This may be caused by the firewall blocking the connection \"\n              \"or your requests are too frequent.\");\n        } else if (err.toString().contains(\"Connection reset by peer\")) {\n          err = err.copyWith(message: \"Connection reset by peer: \"\n              \"The error is unrelated to app, please check your network.\");\n        }\n      default: {}\n    }\n    handler.next(err);\n  }\n\n  static const errorMessages = <int, String>{\n    400: \"The Request is invalid.\",\n    401: \"The Request is unauthorized.\",\n    403: \"No permission to access the resource. Check your account or network.\",\n    404: \"Not found.\",\n    429: \"Too many requests. Please try again later.\",\n  };\n\n  String _getStatusCodeInfo(int? statusCode){\n    if(statusCode != null && statusCode >= 500) {\n      return \"This is server-side error, please try again later. \"\n          \"Do not report this issue.\";\n    } else {\n      return errorMessages[statusCode] ?? \"\";\n    }\n  }\n\n  @override\n  void onResponse(\n      Response<dynamic> response, ResponseInterceptorHandler handler) {\n    var headers = response.headers.map.map((key, value) => MapEntry(\n        key.toLowerCase(), value.length == 1 ? value.first : value.toString()));\n    headers.remove(\"cookie\");\n    String content;\n    if(response.data is List<int>) {\n      try {\n        content = utf8.decode(response.data, allowMalformed: false);\n      }\n      catch(e) {\n        content = \"<Bytes>\\nlength:${response.data.length}\";\n      }\n    } else {\n      content = response.data.toString();\n    }\n    LogManager.addLog(\n        (response.statusCode != null && response.statusCode! < 400)\n            ? LogLevel.info : LogLevel.error,\n        \"Network\",\n        \"Response ${response.realUri.toString()} ${response.statusCode}\\n\"\n            \"headers:\\n$headers\\n$content\");\n    handler.next(response);\n  }\n\n  @override\n  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {\n    options.connectTimeout = const Duration(seconds: 15);\n    options.receiveTimeout = const Duration(seconds: 15);\n    options.sendTimeout = const Duration(seconds: 15);\n    handler.next(options);\n  }\n}\n\nclass AppHttpAdapter implements HttpClientAdapter{\n  HttpClientAdapter? adapter;\n\n  final bool http2;\n\n  AppHttpAdapter(this.http2);\n\n  static Future<HttpClientAdapter> createAdapter(bool http2) async{\n    return http2 ? Http2Adapter(ConnectionManager(\n      idleTimeout: const Duration(seconds: 15),\n      onClientCreate: (_, config) {\n        if (proxyHttpOverrides?.proxyStr != null && appdata.settings[58] != \"1\") {\n          config.proxy = Uri.parse('http://${proxyHttpOverrides?.proxyStr}');\n        }\n      },\n    ),) : IOHttpClientAdapter();\n  }\n\n  @override\n  void close({bool force = false}) {\n    adapter?.close(force: force);\n  }\n\n\n  /// 直接使用ip访问绕过sni\n  bool changeHost(RequestOptions options){\n    var config = const JsonDecoder().convert(File(\"${App.dataPath}/rule.json\").readAsStringSync());\n    if((config[\"sni\"] ?? []).contains(options.uri.host) && (config[\"rule\"] ?? {})[options.uri.host] != null) {\n      options.path = options.path.replaceFirst(\n          options.uri.host, config[\"rule\"][options.uri.host]!);\n      return true;\n    }\n    return false;\n  }\n\n  @override\n  Future<ResponseBody> fetch(RequestOptions o, Stream<Uint8List>? requestStream, Future<void>? cancelFuture) async{\n    adapter ??= await createAdapter(http2);\n    int retry = 0;\n    while(true){\n      try{\n        var res = await fetchOnce(o, requestStream, cancelFuture);\n        return res;\n      }\n      catch(e){\n        if(e is DioException) {\n          if(e.response?.statusCode != null) {\n            var code = e.response!.statusCode!;\n            if(code >= 400 && code < 500) {\n              rethrow;\n            }\n          }\n        }\n        LogManager.addLog(LogLevel.error, \"Network\",\n            \"${o.method} ${o.path}\\n$e\\nRetrying...\");\n        retry++;\n        if(retry == 2){\n          rethrow;\n        }\n        await Future.delayed(const Duration(seconds: 1));\n      }\n    }\n  }\n\n  Future<ResponseBody> fetchOnce(RequestOptions o, Stream<Uint8List>? requestStream, Future<void>? cancelFuture) async{\n    var options = o.copyWith();\n    LogManager.addLog(LogLevel.info, \"Network\",\n        \"${options.method} ${options.path}\\nheaders:\\n${options.headers.toString()}\\ndata:${options.data}\");\n    if(appdata.settings[58] == \"0\"){\n      return checkCookie(await adapter!.fetch(options, requestStream, cancelFuture));\n    }\n    if(!changeHost(options)){\n      return checkCookie(await adapter!.fetch(options, requestStream, cancelFuture));\n    }\n    if(options.headers[\"host\"] == null && options.headers[\"Host\"] == null){\n      options.headers[\"host\"] = options.uri.host;\n    }\n    options.followRedirects = false;\n    var res = await adapter!.fetch(options, requestStream, cancelFuture);\n    while(res.statusCode < 400 && res.statusCode > 300){\n      var location = res.headers[\"location\"]!.first;\n      if(location.contains(\"http\") && Uri.tryParse(location) != null){\n        if(Uri.parse(location).host != o.uri.host){\n          options.path = location;\n          changeHost(options);\n          res = await adapter!.fetch(options, requestStream, cancelFuture);\n        } else {\n          location = Uri\n              .parse(location)\n              .path;\n          options.path = options.path.contains(\"https://\")\n              ? \"https://${options.uri.host}$location\"\n              : \"http://${options.uri.host}$location\";\n          res = await adapter!.fetch(options, requestStream, cancelFuture);\n        }\n      } else {\n        options.path = options.path.contains(\"https://\")\n            ? \"https://${options.uri.host}$location\"\n            : \"http://${options.uri.host}$location\";\n        res = await adapter!.fetch(options, requestStream, cancelFuture);\n      }\n    }\n    return checkCookie(res);\n  }\n\n  /// 检查cookie是否合法, 去除无效cookie\n  ResponseBody checkCookie(ResponseBody res){\n    if(res.headers[\"set-cookie\"] == null){\n      return res;\n    }\n\n    var cookies = <String>[];\n\n    var invalid = <String>[];\n\n    for(var cookie in res.headers[\"set-cookie\"]!){\n      try{\n        Cookie.fromSetCookieValue(cookie);\n        cookies.add(cookie);\n      }\n      catch(e){\n       invalid.add(cookie);\n      }\n    }\n\n    if(cookies.isNotEmpty){\n      res.headers[\"set-cookie\"] = cookies;\n    }\n    else{\n      res.headers.remove(\"set-cookie\");\n    }\n\n    if(invalid.isNotEmpty){\n      res.headers[\"invalid-cookie\"] = invalid;\n    }\n\n    return res;\n  }\n}\n\nDio logDio([BaseOptions? options, bool http2 = false]) {\n  var dio = Dio(options)..interceptors.add(MyLogInterceptor());\n  dio.httpClientAdapter = AppHttpAdapter(http2);\n  return dio;\n}\n\n\n"
  },
  {
    "path": "lib/network/base_comic.dart",
    "content": "abstract class BaseComic {\n  String get title;\n\n  String get subTitle;\n\n  String get cover;\n\n  String get id;\n\n  List<String> get tags;\n\n  String get description;\n\n  bool get enableTagsTranslation => false;\n\n  const BaseComic();\n}\n\nclass CustomComic extends BaseComic {\n  @override\n  final String title;\n\n  @override\n  final String subTitle;\n\n  @override\n  final String cover;\n\n  @override\n  final String id;\n\n  @override\n  final List<String> tags;\n\n  @override\n  final String description;\n\n  final String sourceKey;\n\n  const CustomComic(\n    this.title,\n    this.subTitle,\n    this.cover,\n    this.id,\n    this.tags,\n    this.description,\n    this.sourceKey,\n  );\n\n  CustomComic.fromJson(Map json, this.sourceKey)\n      : title = json[\"title\"],\n        subTitle = json[\"subTitle\"] ?? \"\",\n        cover = json[\"cover\"],\n        id = json[\"id\"],\n        tags = List<String>.from(json[\"tags\"] ?? []),\n        description = json[\"description\"] ?? \"\";\n}\n"
  },
  {
    "path": "lib/network/cache_network.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:typed_data';\nimport 'package:crypto/crypto.dart';\nimport 'package:dio/dio.dart';\nimport 'package:pica_comic/foundation/cache_manager.dart';\nimport 'package:pica_comic/network/cookie_jar.dart';\nimport 'package:pica_comic/network/http_client.dart';\nimport 'app_dio.dart';\n\n///缓存网络请求, 仅提供get方法, 其它的没有意义\nclass CachedNetwork {\n  Future<CachedNetworkRes<String>> get(String url, BaseOptions options,\n      {CacheExpiredTime expiredTime = CacheExpiredTime.short,\n      CookieJarSql? cookieJar,\n      bool log = true,\n      bool http2 = false}) async {\n    await setNetworkProxy();\n    var fileName = md5.convert(const Utf8Encoder().convert(url)).toString();\n    if (fileName.length > 20) {\n      fileName = fileName.substring(0, 21);\n    }\n    final key = url;\n    if (expiredTime != CacheExpiredTime.no) {\n      var cache = await CacheManager().findCache(key);\n      if (cache != null) {\n        var file = File(cache);\n        return CachedNetworkRes(await file.readAsString(), 200, url);\n      }\n    }\n    options.responseType = ResponseType.bytes;\n    var dio = log ? logDio(options, http2) : Dio(options);\n    if (cookieJar != null) {\n      dio.interceptors.add(CookieManagerSql(cookieJar));\n    }\n\n    var res = await dio.get<Uint8List>(url);\n    if (res.data == null && !url.contains(\"random\")) {\n      throw Exception(\"Empty data\");\n    }\n    if (expiredTime != CacheExpiredTime.no) {\n      await CacheManager().writeCache(key, res.data!, expiredTime.time);\n    }\n    return CachedNetworkRes(utf8.decode(res.data!, allowMalformed: true),\n        res.statusCode, res.realUri.toString(), res.headers.map);\n  }\n\n  void delete(String url) async {\n    await CacheManager().delete(url);\n  }\n}\n\nenum CacheExpiredTime {\n  no(-1),\n  short(86400000),\n  long(604800000),\n  persistent(0);\n\n  ///过期时间, 单位为微秒\n  final int time;\n\n  const CacheExpiredTime(this.time);\n}\n\nclass CachedNetworkRes<T> {\n  T data;\n  int? statusCode;\n  Map<String, List<String>> headers;\n  String url;\n\n  CachedNetworkRes(this.data, this.statusCode, this.url,\n      [this.headers = const {}]);\n}\n"
  },
  {
    "path": "lib/network/cloudflare.dart",
    "content": "import 'dart:io' as io;\n\nimport 'package:dio/dio.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/network/cookie_jar.dart';\nimport 'package:pica_comic/pages/webview.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nimport '../components/components.dart';\n\nclass CloudflareException implements DioException {\n  final String url;\n\n  const CloudflareException(this.url);\n\n  @override\n  String toString() {\n    return \"CloudflareException: $url\";\n  }\n\n  static CloudflareException? fromString(String message) {\n    var match = RegExp(r\"CloudflareException: (.+)\").firstMatch(message);\n    if (match == null) return null;\n    return CloudflareException(match.group(1)!);\n  }\n\n  @override\n  DioException copyWith(\n      {RequestOptions? requestOptions,\n      Response<dynamic>? response,\n      DioExceptionType? type,\n      Object? error,\n      StackTrace? stackTrace,\n      String? message}) {\n    return this;\n  }\n\n  @override\n  Object? get error => this;\n\n  @override\n  String? get message => toString();\n\n  @override\n  RequestOptions get requestOptions => RequestOptions();\n\n  @override\n  Response? get response => null;\n\n  @override\n  StackTrace get stackTrace => StackTrace.empty;\n\n  @override\n  DioExceptionType get type => DioExceptionType.badResponse;\n}\n\nclass CloudflareInterceptor extends Interceptor {\n  @override\n  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {\n    if(options.headers['cookie'].toString().contains('cf_clearance')) {\n      options.headers['user-agent'] = appdata.implicitData[3];\n    }\n    handler.next(options);\n  }\n\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) async {\n    if (err.response?.statusCode == 403) {\n      handler.next(_check(err.response!) ?? err);\n    } else {\n      handler.next(err);\n    }\n  }\n\n  @override\n  void onResponse(Response response, ResponseInterceptorHandler handler) {\n    if (response.statusCode == 403) {\n      var err = _check(response);\n      if (err != null) {\n        handler.reject(err);\n        return;\n      }\n    }\n    handler.next(response);\n  }\n\n  CloudflareException? _check(Response response) {\n    if (response.headers['cf-mitigated']?.firstOrNull == \"challenge\") {\n      return CloudflareException(response.requestOptions.uri.toString());\n    }\n    return null;\n  }\n}\n\nvoid passCloudflare(CloudflareException e, void Function() onFinished) async {\n  var url = e.url;\n  var uri = Uri.parse(url);\n\n  void saveCookies(Map<String, String> cookies) {\n    var domain = uri.host;\n    var splits = domain.split('.');\n    if (splits.length > 1) {\n      domain = \".${splits[splits.length - 2]}.${splits[splits.length - 1]}\";\n    }\n    SingleInstanceCookieJar.instance!.saveFromResponse(\n      uri,\n      List<io.Cookie>.generate(cookies.length, (index) {\n        var cookie = io.Cookie(\n            cookies.keys.elementAt(index), cookies.values.elementAt(index));\n        cookie.domain = domain;\n        return cookie;\n      }),\n    );\n  }\n\n  if (App.isDesktop && (await DesktopWebview.isAvailable())) {\n    var webview = DesktopWebview(\n      initialUrl: url,\n      onTitleChange: (title, controller) async {\n        var res = await controller.evaluateJavascript(\n            \"document.head.innerHTML.includes('#challenge-success-text')\");\n        if (res == 'false') {\n          var ua = controller.userAgent;\n          if (ua != null) {\n            appdata.implicitData[3] = ua;\n            appdata.writeImplicitData();\n          }\n          var cookiesMap = await controller.getCookies(url);\n          if(cookiesMap['cf_clearance'] == null) {\n            return;\n          }\n          saveCookies(cookiesMap);\n          controller.close();\n          onFinished();\n        }\n      },\n    );\n    webview.open();\n  } else if (App.isMobile) {\n    await App.globalTo(\n      () => AppWebview(\n        initialUrl: url,\n        singlePage: true,\n        onTitleChange: (title, controller) async {\n          var res = await controller.platform.evaluateJavascript(\n              source:\n                  \"document.head.innerHTML.includes('#challenge-success-text')\");\n          if (res == false) {\n            var ua = await controller.getUA();\n            if (ua != null) {\n              appdata.implicitData[3] = ua;\n              appdata.writeImplicitData();\n            }\n            var cookiesMap = await controller.getCookies(url) ?? {};\n            if(cookiesMap['cf_clearance'] == null) {\n              return;\n            }\n            saveCookies(cookiesMap);\n            App.globalBack();\n          }\n        },\n        onStarted: (controller) async {\n          var ua = await controller.getUA();\n          if (ua != null) {\n            appdata.implicitData[3] = ua;\n            appdata.writeImplicitData();\n          }\n          var cookiesMap = await controller.getCookies(url) ?? {};\n          saveCookies(cookiesMap);\n        },\n      ),\n    );\n    onFinished();\n  } else {\n    showToast(message: \"当前设备不支持\".tl);\n  }\n}\n"
  },
  {
    "path": "lib/network/cookie_jar.dart",
    "content": "import 'dart:io';\n\nimport 'package:dio/dio.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:sqlite3/sqlite3.dart';\n\nclass CookieJarSql {\n  late Database _db;\n\n  final String path;\n\n  CookieJarSql(this.path){\n    init();\n  }\n\n  void init() {\n    _db = sqlite3.open(path);\n    _db.execute('''\n      CREATE TABLE IF NOT EXISTS cookies (\n        name TEXT NOT NULL,\n        value TEXT NOT NULL,\n        domain TEXT NOT NULL,\n        path TEXT,\n        expires INTEGER,\n        secure INTEGER,\n        httpOnly INTEGER,\n        PRIMARY KEY (name, domain, path)\n      );\n    ''');\n  }\n\n  void saveFromResponse(Uri uri, List<Cookie> cookies) {\n    var current = loadForRequest(uri);\n    for (var cookie in cookies) {\n      var currentCookie = current.firstWhereOrNull((element) =>\n          element.name == cookie.name &&\n          (cookie.path == null || cookie.path!.startsWith(element.path!)));\n      if (currentCookie != null) {\n        cookie.domain = currentCookie.domain;\n      }\n      _db.execute('''\n        INSERT OR REPLACE INTO cookies (name, value, domain, path, expires, secure, httpOnly)\n        VALUES (?, ?, ?, ?, ?, ?, ?);\n      ''', [\n        cookie.name,\n        cookie.value,\n        cookie.domain ?? uri.host,\n        cookie.path ?? \"/\",\n        cookie.expires?.millisecondsSinceEpoch,\n        cookie.secure ? 1 : 0,\n        cookie.httpOnly ? 1 : 0\n      ]);\n    }\n  }\n\n  List<Cookie> _loadWithDomain(String domain) {\n    var rows = _db.select('''\n      SELECT name, value, domain, path, expires, secure, httpOnly\n      FROM cookies\n      WHERE domain = ?;\n    ''', [domain]);\n\n    return rows\n        .map((row) => Cookie(\n              row[\"name\"] as String,\n              row[\"value\"] as String,\n            )\n              ..domain = row[\"domain\"] as String\n              ..path = row[\"path\"] as String\n              ..expires = row[\"expires\"] == null\n                  ? null\n                  : DateTime.fromMillisecondsSinceEpoch(row[\"expires\"] as int)\n              ..secure = row[\"secure\"] == 1\n              ..httpOnly = row[\"httpOnly\"] == 1)\n        .toList();\n  }\n\n  List<String> _getAcceptedDomains(String host) {\n    var acceptedDomains = <String>[host];\n    var hostParts = host.split(\".\");\n    for (var i = 0; i < hostParts.length - 1; i++) {\n      acceptedDomains.add(\".${hostParts.sublist(i).join(\".\")}\");\n    }\n    return acceptedDomains;\n  }\n\n  List<Cookie> loadForRequest(Uri uri) {\n    // if uri.host is example.example.com, acceptedDomains will be [\".example.example.com\", \".example.com\", \"example.com\"]\n    var acceptedDomains = _getAcceptedDomains(uri.host);\n\n    var cookies = <Cookie>[];\n    for (var domain in acceptedDomains) {\n      cookies.addAll(_loadWithDomain(domain));\n    }\n\n    // check expires\n    var expires = cookies.where((cookie) =>\n        cookie.expires != null && cookie.expires!.isBefore(DateTime.now()));\n    for (var cookie in expires) {\n      _db.execute('''\n        DELETE FROM cookies\n        WHERE name = ? AND domain = ? AND path = ?;\n      ''', [cookie.name, cookie.domain, cookie.path]);\n    }\n\n    return cookies\n        .where((element) =>\n            !expires.contains(element) && _checkPathMatch(uri, element.path))\n        .toList();\n  }\n\n  bool _checkPathMatch(Uri uri, String? cookiePath) {\n    if (cookiePath == null) {\n      return true;\n    }\n\n    if (cookiePath == uri.path) {\n      return true;\n    }\n\n    if (cookiePath == \"/\") {\n      return true;\n    }\n\n    if (cookiePath.endsWith(\"/\")) {\n      return uri.path.startsWith(cookiePath);\n    }\n\n    return uri.path.startsWith(cookiePath);\n  }\n\n  void saveFromResponseCookieHeader(Uri uri, List<String> cookieHeader) {\n    var cookies = cookieHeader\n        .map((header) => Cookie.fromSetCookieValue(header))\n        .toList();\n    saveFromResponse(uri, cookies);\n  }\n\n  String loadForRequestCookieHeader(Uri uri) {\n    var cookies = loadForRequest(uri);\n    var map = <String, Cookie>{};\n    for (var cookie in cookies) {\n      if(map.containsKey(cookie.name)) {\n        if(cookie.domain![0] != '.' && map[cookie.name]!.domain![0] == '.') {\n          map[cookie.name] = cookie;\n        } else if(cookie.domain!.length > map[cookie.name]!.domain!.length) {\n          map[cookie.name] = cookie;\n        }\n      } else {\n        map[cookie.name] = cookie;\n      }\n    }\n    return map.entries.map((cookie) => \"${cookie.value.name}=${cookie.value.value}\").join(\"; \");\n  }\n\n  void delete(Uri uri, String name) {\n    var acceptedDomains = _getAcceptedDomains(uri.host);\n    for (var domain in acceptedDomains) {\n      _db.execute('''\n        DELETE FROM cookies\n        WHERE name = ? AND domain = ? AND path = ?;\n      ''', [name, domain, uri.path]);\n    }\n  }\n\n  void deleteUri(Uri uri) {\n    var acceptedDomains = _getAcceptedDomains(uri.host);\n    for (var domain in acceptedDomains) {\n      _db.execute('''\n        DELETE FROM cookies\n        WHERE domain = ?;\n      ''', [domain]);\n    }\n  }\n\n  void deleteAll() {\n    _db.execute('''\n      DELETE FROM cookies;\n    ''');\n  }\n\n  void dispose() {\n    _db.dispose();\n  }\n}\n\nclass SingleInstanceCookieJar extends CookieJarSql {\n  factory SingleInstanceCookieJar(String path) =>\n      instance ??= SingleInstanceCookieJar._create(path);\n\n  SingleInstanceCookieJar._create(super.path);\n\n  static SingleInstanceCookieJar? instance;\n}\n\nclass CookieManagerSql extends Interceptor {\n  final CookieJarSql cookieJar;\n\n  CookieManagerSql(this.cookieJar);\n\n  @override\n  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {\n    var cookies = cookieJar.loadForRequestCookieHeader(options.uri);\n    if (cookies.isNotEmpty) {\n      options.headers[\"cookie\"] = cookies;\n    }\n    handler.next(options);\n  }\n\n  @override\n  void onResponse(Response response, ResponseInterceptorHandler handler) {\n    cookieJar.saveFromResponseCookieHeader(\n        response.requestOptions.uri, response.headers[\"set-cookie\"] ?? []);\n    handler.next(response);\n  }\n\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) {\n    handler.next(err);\n  }\n}\n"
  },
  {
    "path": "lib/network/custom_download_model.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:typed_data';\n\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport 'package:pica_comic/network/download_model.dart';\n\nimport '../tools/io_tools.dart';\nimport 'download.dart';\n\nclass CustomDownloadedItem extends DownloadedItem {\n  @override\n  double? comicSize;\n\n  @override\n  final List<int> downloadedEps;\n\n  final Map<String, String>? chapters;\n\n  @override\n  List<String> get eps => chapters?.values.toList() ?? [\"EP 1\"];\n\n  final String comicId;\n\n  @override\n  final String id;\n\n  @override\n  final String name;\n\n  @override\n  final String subTitle;\n\n  @override\n  final List<String> tags;\n\n  @override\n  DownloadType get type => DownloadType.other;\n\n  final String sourceKey;\n\n  final String sourceName;\n\n  final String cover;\n\n  CustomDownloadedItem(\n      this.comicSize,\n      this.downloadedEps,\n      this.chapters,\n      this.id,\n      this.name,\n      this.subTitle,\n      this.tags,\n      this.sourceKey,\n      this.sourceName,\n      this.cover,\n      this.comicId);\n\n  @override\n  Map<String, dynamic> toJson() => {\n        \"comicSize\": comicSize,\n        \"downloadedEps\": downloadedEps,\n        \"chapters\": chapters,\n        \"id\": id,\n        \"name\": name,\n        \"subTitle\": subTitle,\n        \"tags\": tags,\n        \"sourceKey\": sourceKey,\n        \"sourceName\": sourceName,\n        \"cover\": cover,\n        \"comicId\": comicId\n      };\n\n  CustomDownloadedItem.fromJson(Map<String, dynamic> json)\n      : comicSize = json[\"comicSize\"],\n        downloadedEps = List<int>.from(json[\"downloadedEps\"]),\n        chapters = Map<String, String>.from(json[\"chapters\"]),\n        id = json[\"id\"],\n        name = json[\"name\"],\n        subTitle = json[\"subTitle\"],\n        tags = List<String>.from(json[\"tags\"]),\n        sourceKey = json[\"sourceKey\"],\n        sourceName = json[\"sourceName\"],\n        cover = json[\"cover\"],\n        comicId = json[\"comicId\"];\n}\n\nclass CustomDownloadingItem extends DownloadingItem {\n  CustomDownloadingItem(this.comic, this._downloadEps, super.whenFinish,\n      super.whenError, super.updateInfo, super.id,\n      {super.type = DownloadType.other})\n      : source = ComicSource.find(comic.sourceKey)!;\n\n  final ComicInfoData comic;\n\n  final List<int> _downloadEps;\n\n  late final ComicSource source;\n\n  @override\n  String get cover => comic.cover;\n\n  @override\n  bool get haveEps => comic.chapters != null;\n\n  Stream<DownloadProgress> _getImage(String url) {\n    if (source.getImageLoadingConfig != null) {\n      int ep = links!.keys.elementAt(downloadingEp);\n      var config = source.getImageLoadingConfig!(url, comic.comicId,\n          comic.chapters?.keys.elementAtOrNull(ep - 1) ?? comic.comicId);\n      return ImageManager()\n          .getImage(config[\"url\"] ?? url, Map.from(config['headers'] ?? {}));\n    }\n    return ImageManager().getImage(url);\n  }\n\n  @override\n  Map<String, String> get headers => {\n        \"User-Agent\": webUA,\n      };\n\n  Future<void> getOneEp(int i, Map<int, List<String>> links) async {\n    if (links[i + 1] != null) return;\n\n    int retry = 0;\n\n    while (retry < 3) {\n      try {\n        links[i + 1] = (await source.loadComicPages!(\n                comic.comicId, comic.chapters!.keys.elementAt(i)))\n            .data;\n        return;\n      } catch (e) {\n        await Future.delayed(const Duration(seconds: 3));\n        retry++;\n      }\n    }\n\n    throw Exception(\"Failed to get chapters\");\n  }\n\n  @override\n  Future<Map<int, List<String>>> getLinks() async {\n    var links = <int, List<String>>{};\n    if (comic.chapters != null) {\n      var futures = <Future>[];\n      for (var i in _downloadEps) {\n        futures.add(getOneEp(i, links));\n        await Future.delayed(const Duration(milliseconds: 200));\n        if (futures.length % 5 == 0) {\n          await Future.wait(futures);\n          futures.clear();\n        }\n      }\n      await Future.wait(futures);\n    } else {\n      var res = await source.loadComicPages!(comic.comicId, null);\n      links[0] = res.data;\n    }\n    return links;\n  }\n\n  @override\n  String get title => comic.title;\n\n  @override\n  Map<String, dynamic> toMap() => {\n        \"comic\": comic.toJson(),\n        \"_downloadEps\": _downloadEps,\n        ...super.toBaseMap()\n      };\n\n  CustomDownloadingItem.fromMap(\n      Map<String, dynamic> map,\n      DownloadProgressCallback whenFinish,\n      DownloadProgressCallback whenError,\n      DownloadProgressCallbackAsync updateInfo,\n      String id)\n      : comic = ComicInfoData.fromJson(map[\"comic\"]),\n        _downloadEps = List<int>.from(map[\"_downloadEps\"]),\n        super.fromMap(map, whenFinish, whenError, updateInfo) {\n    source = ComicSource.find(comic.sourceKey)!;\n  }\n\n  @override\n  Future<DownloadedItem> toDownloadedItem() async {\n    var previous = <int>[];\n    if (DownloadManager().isExists(id)) {\n      var comic = await DownloadManager().getComicOrNull(id);\n      previous = comic!.downloadedEps;\n    }\n    var downloaded = (_downloadEps + previous).toSet().toList();\n    downloaded.sort();\n    var tags = <String>[];\n    comic.tags.forEach((key, value) => tags.addAll(value));\n    return CustomDownloadedItem(\n      await getFolderSize(Directory(path)),\n      downloaded,\n      comic.chapters,\n      id,\n      comic.title,\n      comic.subTitle ?? \"\",\n      tags,\n      comic.sourceKey,\n      source.name,\n      comic.cover,\n      comic.comicId,\n    );\n  }\n\n  @override\n  Stream<DownloadProgress> downloadImage(String link) {\n    return _getImage(link);\n  }\n}\n"
  },
  {
    "path": "lib/network/download.dart",
    "content": "import 'dart:collection';\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/custom_download_model.dart';\nimport 'package:pica_comic/network/download_model.dart';\nimport 'package:pica_comic/network/eh_network/eh_download_model.dart';\nimport 'package:pica_comic/network/eh_network/eh_models.dart';\nimport 'package:pica_comic/network/eh_network/get_gallery_id.dart';\nimport 'package:pica_comic/network/favorite_download.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_download_model.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_models.dart';\nimport 'package:pica_comic/network/htmanga_network/ht_download_model.dart';\nimport 'package:pica_comic/network/htmanga_network/models.dart';\nimport 'package:pica_comic/network/jm_network/jm_download.dart';\nimport 'package:pica_comic/network/jm_network/jm_models.dart';\nimport 'package:pica_comic/network/nhentai_network/download.dart';\nimport 'package:pica_comic/network/picacg_network/picacg_download_model.dart';\nimport 'package:pica_comic/pages/download_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/io_extensions.dart';\nimport 'package:pica_comic/tools/io_tools.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:sqlite3/sqlite3.dart';\n\nimport 'nhentai_network/models.dart';\nimport 'picacg_network/models.dart';\n\ntypedef DownloadingCallback = void Function();\n\nclass DownloadManager with _DownloadDb implements Listenable {\n  static DownloadManager? cache;\n\n  factory DownloadManager() => cache ?? (cache = DownloadManager._create());\n\n  DownloadManager._create();\n\n  ///下载目录\n  String? path;\n\n  ///下载队列\n  var downloading = Queue<DownloadingItem>();\n\n  ///是否正在下载\n  bool isDownloading = false;\n\n  ///是否出现了错误\n  bool _error = false;\n\n  ///是否出现了错误\n  bool get error => _error;\n\n  ///是否初始化\n  bool _runInit = false;\n\n  @override\n  Database? _db;\n\n  final List<VoidCallback> _listeners = [];\n\n  @override\n  void addListener(VoidCallback listener) {\n    _listeners.add(listener);\n  }\n\n  @override\n  void removeListener(VoidCallback listener) {\n    _listeners.remove(listener);\n  }\n\n  void notifyListeners() {\n    for (var listener in _listeners) {\n      listener();\n    }\n  }\n\n  ///获取下载目录\n  Future<void> _getPath() async {\n    if (appdata.settings[22] == \"\") {\n      final appPath = await getApplicationSupportDirectory();\n      path = \"${appPath.path}/download\";\n    } else {\n      path = appdata.settings[22];\n    }\n    if (App.isIOS) {\n      if (path!.startsWith('/var/mobile/Containers/Data/Application/')) {\n        if (!Directory(path!).existsSync()) {\n          final appPath = await getApplicationSupportDirectory();\n          path = \"${appPath.path}/download\";\n        }\n      }\n    }\n    var dir = Directory(path!);\n    if (!await dir.exists()) {\n      await dir.create(recursive: true);\n    }\n    if (App.isAndroid) {\n      var file = File(\"$path/.nomedia\");\n      if (!file.existsSync()) {\n        await file.create();\n      }\n    }\n  }\n\n  ///更换下载目录\n  Future<String> updatePath(String newPath, {bool transform = true}) async {\n    if (transform) {\n      var source = Directory(path!);\n      final appPath = await getApplicationSupportDirectory();\n      var destination = Directory(\n        newPath == \"\" ? \"${appPath.path}${pathSep}download\" : newPath,\n      );\n      try {\n        await copyDirectory(source, destination);\n        for (var i in source.listSync()) {\n          await i.delete(recursive: true);\n        }\n      } catch (e) {\n        return e.toString();\n      }\n    }\n\n    _runInit = false;\n    _db!.dispose();\n    downloading.clear();\n    await init();\n    return \"ok\";\n  }\n\n  ///读取数据, 获取未完成的下载和已下载的漫画ID\n  Future<void> _getInfo() async {\n    //读取数据\n    var file = File(\"$path${pathSep}newDownload.json\");\n    if (!file.existsSync()) {\n      await _saveInfo();\n    } else {\n      try {\n        var json = const JsonDecoder().convert(file.readAsStringSync());\n        for (var item in json[\"downloading\"]) {\n          downloading.add(\n              downloadingItemFromMap(item, _onFinish, _onError, _saveInfo));\n        }\n      } catch (e, s) {\n        LogManager.addLog(LogLevel.error, \"IO\",\n            \"Failed to read downloaded information\\n$e\\n$s\");\n        file.deleteSync();\n        await _saveInfo();\n      }\n    }\n  }\n\n  Future<void> _initDb() async {\n    var oldData = <String, DownloadedItem>{};\n    if (!File(\"$path/download.db\").existsSync()) {\n      for (var entry in Directory(path!).listSync()) {\n        if (entry is Directory) {\n          var infoFile = File(\"${entry.path}/info.json\");\n          if (infoFile.existsSync()) {\n            var id = entry.name;\n            var json = infoFile.readAsStringSync();\n            var time = infoFile.lastModifiedSync();\n            var comic = _getComicFromJson(id, json, time);\n            if (comic != null) {\n              infoFile.delete();\n              var directory = comic.name;\n              int i = -1;\n              while (entry is Directory) {\n                try {\n                  entry = entry.renameX(directory);\n                  break;\n                } catch (e) {\n                  i++;\n                  if(i > 20) {\n                    // it seems that the error is unrelated to the directory name\n                    Log.error(\"IO\", \"Failed to rename directory: Trying rename ${entry.name} to ${comic.name}\\n$e\");\n                    break;\n                  }\n                  directory = comic.name + i.toString();\n                }\n              }\n              oldData[entry.name] = comic;\n            }\n          }\n        }\n      }\n    }\n    _db = sqlite3.open(\"$path/download.db\");\n    _createTable();\n    for (var entry in oldData.entries) {\n      _addToDb(entry.value, entry.key);\n    }\n  }\n\n  void dispose() {\n    _runInit = false;\n    downloading.forEach((e) => e.stop());\n    downloading.clear();\n    _db?.dispose();\n    _db = null;\n  }\n\n  ///初始化下载管理器\n  Future<void> init() async {\n    if (_runInit) return;\n    _runInit = true;\n    await _getPath();\n    await _getInfo();\n    await _initDb();\n  }\n\n  ///储存当前的下载队列信息, 每完成一张图片的下载调用一次\n  Future<void> _saveInfo() async {\n    notifyListeners();\n    var data = <String, dynamic>{};\n    data[\"downloading\"] = <Map<String, dynamic>>[];\n    for (var item in downloading) {\n      data[\"downloading\"].add(item.toMap());\n    }\n    var file = File(\"$path${pathSep}newDownload.json\");\n    await file.writeAsString(const JsonEncoder().convert(data));\n  }\n\n  /// move comic to first\n  void moveToFirst(DownloadingItem item) {\n    if (downloading.first == item) {\n      return;\n    }\n    pause();\n    downloading.remove(item);\n    downloading.addFirst(item);\n    start();\n  }\n\n  String generateId(String source, String id) {\n    var comicSource = ComicSource.find(source)!;\n    if (comicSource.matchBriefIdReg != null) {\n      id = RegExp(comicSource.matchBriefIdReg!).firstMatch(id)!.group(1)!;\n    }\n    id = \"$source-$id\";\n    return id;\n  }\n\n  ///当一个下载任务完成时, 调用此函数\n  void _onFinish() async {\n    var task = downloading.removeFirst();\n    _addToDb(await task.toDownloadedItem(), task.directory!);\n    await _saveInfo();\n    StateController.findOrNull<DownloadPageLogic>()?.refresh();\n    if (downloading.isNotEmpty) {\n      //清除已完成的任务, 开始下一个任务\n      downloading.first.start();\n    } else {\n      //标记状态为未在下载\n      isDownloading = false;\n      notifications.endProgress();\n    }\n  }\n\n  ///暂停下载\n  void pause() {\n    isDownloading = false;\n    downloading.first.pause();\n  }\n\n  ///出现错误时调用此函数\n  void _onError() {\n    pause();\n    _error = true;\n    notifications.sendNotification(\"下载出错\".tl, \"点击查看详情\".tl);\n    notifyListeners();\n  }\n\n  ///开始或继续下载\n  void start() {\n    _error = false;\n    if (isDownloading) return;\n    downloading.first.start();\n    isDownloading = true;\n  }\n\n  ///取消指定的下载\n  void cancel(String id) {\n    var index = 0;\n    for (var i in downloading) {\n      if (i.id == id) break;\n      index++;\n    }\n\n    if (index == 0) {\n      _error = false;\n      downloading.first.stop();\n      downloading.removeFirst();\n    } else {\n      downloading.removeWhere((element) => element.id == id);\n    }\n\n    notifyListeners();\n\n    if (downloading.isEmpty) {\n      isDownloading = false;\n      notifications.endProgress();\n    } else {\n      downloading.first.start();\n    }\n    _saveInfo();\n  }\n\n  Future<DownloadedItem?> getComicOrNull(String id) async {\n    return _getComicWithDb(id);\n  }\n\n  ///删除已下载的漫画\n  Future<void> delete(List<String> ids) async {\n    for (var id in ids) {\n      _deleteFromDb(id);\n      var comic = Directory(\"$path/${getDirectory(id)}\");\n      try {\n        comic.delete(recursive: true);\n      } catch (e) {\n        if (e is PathNotFoundException) {\n          //忽略\n        } else {\n          rethrow;\n        }\n      }\n    }\n  }\n\n  /// return error message when error, or null if success.\n  Future<String?> deleteEpisode(DownloadedItem comic, int ep) async {\n    try {\n      if (comic.downloadedEps.length == 1) {\n        return \"Delete Error: only one downloaded episode\";\n      }\n      if (Directory(\"$path/${getDirectory(comic.id)}/${ep + 1}\").existsSync()) {\n        Directory(\"$path/${getDirectory(comic.id)}/${ep + 1}\")\n            .deleteSync(recursive: true);\n      }\n      var size = Directory(\"$path/${getDirectory(comic.id)}\").getMBSizeSync();\n      comic.downloadedEps.remove(ep);\n      comic.comicSize = size;\n      _addToDb(comic, comic.directory ?? getDirectory(comic.id));\n      return null;\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"IO\", \"$e/n$s\");\n      return e.toString();\n    }\n  }\n\n  /// 获取漫画章节的长度, 适用于有章节的漫画\n  Future<int> getEpLength(String id, int ep) async {\n    var directory = Directory(\"$path/${getDirectory(id)}/$ep\");\n    var files = directory.list();\n    return files.length;\n  }\n\n  /// 获取漫画的长度, 适用于无章节的漫画\n  Future<int> getComicLength(String id) async {\n    var directory = Directory(\"$path/${getDirectory(id)}\");\n    var files = directory.list();\n    return await files.length - 1;\n  }\n\n  ///获取图片, 对于无章节的漫画, ep参数为0\n  File getImage(String id, int ep, int index) {\n    String downloadPath;\n    if (ep == 0) {\n      downloadPath = \"$path/${getDirectory(id)}/\";\n    } else {\n      downloadPath = \"$path/${getDirectory(id)}/$ep/\";\n    }\n    for (var file in Directory(downloadPath).listSync()) {\n      if (file.uri.pathSegments.last.replaceFirst(RegExp(r\"\\..+\"), \"\") ==\n          index.toString()) {\n        return file as File;\n      }\n    }\n    throw Exception(\"File not found\");\n  }\n\n  Future<File> getImageAsync(String id, int ep, int index) async {\n    String downloadPath;\n    if (ep == 0) {\n      downloadPath = \"$path/${getDirectory(id)}/\";\n    } else {\n      downloadPath = \"$path/${getDirectory(id)}/$ep/\";\n    }\n    var fileName  = _downloadedFileName[\"$id$ep$index\"];\n    if(fileName != null) {\n      return File(downloadPath + fileName);\n    }\n    await for (var file in Directory(downloadPath).list()) {\n      var i = file.uri.pathSegments.last.replaceFirst(RegExp(r\"\\..+\"), \"\");\n      if(i.isNum) {\n        if(_downloadedFileName.length > 2000) {\n          _downloadedFileName.remove(_downloadedFileName.keys.first);\n        }\n        _downloadedFileName[\"$id$ep$i\"] = file.name;\n      }\n    }\n    if(_downloadedFileName[\"$id$ep$index\"] == null) {\n      throw Exception(\"File not found\");\n    }\n    return File(downloadPath + _downloadedFileName[\"$id$ep$index\"]!);\n  }\n\n  static final _downloadedFileName = <String, String>{};\n\n  ///获取封面, 所有漫画源通用\n  File getCover(String id) {\n    return File(\"$path/${getDirectory(id)}/cover.jpg\");\n  }\n}\n\nDownloadingItem downloadingItemFromMap(\n    Map<String, dynamic> map,\n    void Function() whenFinish,\n    void Function() whenError,\n    Future<void> Function() updateInfo) {\n  switch (map[\"type\"]) {\n    case 0:\n      return PicDownloadingItem.fromMap(\n          map, whenFinish, whenError, updateInfo, map[\"id\"]);\n    case 1:\n      return EhDownloadingItem.fromMap(\n          map, whenFinish, whenError, updateInfo, map[\"id\"]);\n    case 2:\n      return JmDownloadingItem.fromMap(\n          map, whenFinish, whenError, updateInfo, map[\"id\"]);\n    case 3:\n      return HitomiDownloadingItem.fromMap(\n          map, whenFinish, whenError, updateInfo, map[\"id\"]);\n    case 4:\n      return DownloadingHtComic.fromMap(\n          map, whenFinish, whenError, updateInfo, map[\"id\"]);\n    case 5:\n      return NhentaiDownloadingItem.fromMap(\n          map, whenFinish, whenError, updateInfo, map[\"id\"]);\n    case 6:\n      return CustomDownloadingItem.fromMap(\n          map, whenFinish, whenError, updateInfo, map[\"id\"]);\n    case 7:\n      return FavoriteDownloading.fromMap(\n          map, whenFinish, whenError, updateInfo, map[\"id\"]);\n    default:\n      throw UnimplementedError();\n  }\n}\n\nextension AddDownloadExt on DownloadManager {\n  ///添加哔咔漫画下载\n  void addPicDownload(ComicItem comic, List<int> downloadEps) {\n    downloading.addLast(PicDownloadingItem(\n        comic, downloadEps, _onFinish, _onError, _saveInfo, comic.id));\n    _saveInfo();\n    if (!isDownloading) {\n      downloading.first.start();\n      isDownloading = true;\n    }\n  }\n\n  ///添加E-Hentai下载\n  void addEhDownload(Gallery gallery, [int type = 0]) {\n    final id = getGalleryId(gallery.link);\n    downloading.addLast(\n        EhDownloadingItem(gallery, _onFinish, _onError, _saveInfo, id, type));\n    _saveInfo();\n    if (!isDownloading) {\n      downloading.first.start();\n      isDownloading = true;\n    }\n  }\n\n  ///添加禁漫下载\n  void addJmDownload(JmComicInfo comic, List<int> downloadEps) {\n    downloading.addLast(JmDownloadingItem(\n        comic, downloadEps, _onFinish, _onError, _saveInfo, \"jm${comic.id}\"));\n    _saveInfo();\n    if (!isDownloading) {\n      downloading.first.start();\n      isDownloading = true;\n    }\n  }\n\n  ///添加Hitomi下载\n  void addHitomiDownload(HitomiComic comic, String cover, String link) {\n    final id = \"hitomi${comic.id}\";\n    downloading.addLast(HitomiDownloadingItem(\n        comic, cover, link, _onFinish, _onError, _saveInfo, id));\n    _saveInfo();\n    if (!isDownloading) {\n      downloading.first.start();\n      isDownloading = true;\n    }\n  }\n\n  ///添加绅士漫画下载\n  void addHtDownload(HtComicInfo comic) {\n    final id = \"Ht${comic.id}\";\n    downloading\n        .addLast(DownloadingHtComic(comic, _onFinish, _onError, _saveInfo, id));\n    _saveInfo();\n    if (!isDownloading) {\n      downloading.first.start();\n      isDownloading = true;\n    }\n  }\n\n  void addNhentaiDownload(NhentaiComic comic) {\n    final id = \"nhentai${comic.id}\";\n    downloading.addLast(\n        NhentaiDownloadingItem(comic, _onFinish, _onError, _saveInfo, id));\n    _saveInfo();\n    if (!isDownloading) {\n      downloading.first.start();\n      isDownloading = true;\n    }\n  }\n\n  void addCustomDownload(ComicInfoData comic, List<int> downloadEps) {\n    var id = generateId(comic.sourceKey, comic.comicId);\n    downloading.addLast(CustomDownloadingItem(\n        comic, downloadEps, _onFinish, _onError, _saveInfo, id));\n    _saveInfo();\n    if (!isDownloading) {\n      downloading.first.start();\n      isDownloading = true;\n    }\n  }\n\n  void addFavoriteDownload(FavoriteItem comic) {\n    var id = switch (comic.type.key) {\n      0 => comic.target,\n      1 => getGalleryId(comic.target),\n      2 => \"jm${comic.target}\",\n      3 => \"hitomi${RegExp(r\"\\d+(?=\\.html)\").firstMatch(comic.target)![0]!}\",\n      4 => \"Ht${comic.target}\",\n      6 => \"nhentai${comic.target}\",\n      _ => generateId(comic.type.comicSource.key, comic.target)\n    };\n    downloading.addLast(\n        FavoriteDownloading(comic, _onFinish, _onError, _saveInfo, id));\n    _saveInfo();\n    if (!isDownloading) {\n      downloading.first.start();\n      isDownloading = true;\n    }\n  }\n}\n\nDownloadedItem? _getComicFromJson(String id, String json, DateTime time, [String? directory]) {\n  DownloadedItem comic;\n  try {\n    if (id.contains('-')) {\n      comic = CustomDownloadedItem.fromJson(jsonDecode(json));\n    } else if (id.startsWith(\"jm\")) {\n      comic = DownloadedJmComic.fromMap(jsonDecode(json));\n    } else if (id.startsWith(\"hitomi\")) {\n      comic = DownloadedHitomiComic.fromMap(jsonDecode(json));\n    } else if (id.startsWith(\"nhentai\")) {\n      comic = NhentaiDownloadedComic.fromJson(jsonDecode(json));\n    } else if (id.startsWith(\"Ht\")) {\n      comic = DownloadedHtComic.fromJson(jsonDecode(json));\n    } else if (id.isNum) {\n      comic = DownloadedGallery.fromJson(jsonDecode(json));\n    } else {\n      comic = DownloadedComic.fromJson(jsonDecode(json));\n    }\n    comic.time = time;\n    comic.directory = directory;\n    return comic;\n  } catch (e, s) {\n    LogManager.addLog(\n        LogLevel.error, \"IO\", \"Failed to get a downloaded comic info:\\n$e\\n$s\");\n    return null;\n  }\n}\n\nabstract mixin class _DownloadDb {\n  Database? get _db;\n\n  void _createTable() {\n    _db!.execute('''\n      create table if not exists download (\n        id text primary key,\n        title text,\n        subtitle text,\n        time int,\n        directory text,\n        size int,\n        json text\n      )\n    ''');\n  }\n\n  void _addToDb(DownloadedItem item, String directory, [DateTime? time]) {\n    _db!.execute('''\n      insert or replace into download\n      values (?,?,?,?,?,?,?)\n    ''', [\n      item.id,\n      item.name,\n      item.subTitle,\n      (time ?? DateTime.now()).millisecondsSinceEpoch,\n      directory,\n      item.comicSize,\n      jsonEncode(item.toJson()),\n    ]);\n  }\n\n  bool isExists(String id) {\n    var result = _db!.select('''\n      select id from download\n      where id = ?\n    ''', [id]);\n    return result.isNotEmpty;\n  }\n\n  void _deleteFromDb(String id) {\n    _db!.execute('''\n      delete from download\n      where id = ?\n    ''', [id]);\n  }\n\n  DownloadedItem? _getComicWithDb(String id) {\n    var result = _db!.select('''\n      select * from download\n      where id = ?\n    ''', [id]);\n    if (result.isEmpty) return null;\n    var data = result.first;\n    return _getComicFromJson(\n      data['id'],\n      data['json'],\n      DateTime.fromMillisecondsSinceEpoch(data['time']),\n      data['directory'],\n    );\n  }\n\n  int get total {\n    var result = _db!.select('''\n      select count(*) from download\n    ''');\n    return result.first['count(*)'];\n  }\n\n  /// order: time, title, subtitle, size\n  List<DownloadedItem> getAll(\n      [String order = 'time', String direction = 'desc']) {\n    var result = _db!.select('''\n      select * from download\n      order by $order $direction\n    ''');\n    return result\n        .map(\n          (e) => _getComicFromJson(\n            e['id'],\n            e['json'],\n            DateTime.fromMillisecondsSinceEpoch(e['time']),\n            e['directory']\n          )!,\n        )\n        .toList();\n  }\n\n  static final _cache = <String, String>{};\n\n  String getDirectory(String id) {\n    var directory = _cache[id];\n    if(directory == null) {\n      var result = _db!.select('''\n      select directory from download\n      where id = ?\n    ''', [id]);\n      directory = result.first['directory'];\n      directory = _findAccurateDirectory(directory!);\n      if(_cache.length > 50) {\n        _cache.remove(_cache.keys.first);\n      }\n      _cache[id] = directory;\n    }\n    return directory;\n  }\n\n  String _findAccurateDirectory(String directory) {\n    return sanitizeFileName(directory);\n  }\n}\n"
  },
  {
    "path": "lib/network/download_model.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/file_type.dart';\nimport 'package:pica_comic/tools/io_extensions.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nimport '../base.dart';\nimport 'app_dio.dart';\nimport 'download.dart';\n\nabstract class DownloadedItem {\n  ///漫画源\n  DownloadType get type;\n\n  ///漫画名\n  String get name;\n\n  ///章节\n  List<String> get eps;\n\n  ///已下载的章节\n  List<int> get downloadedEps;\n\n  ///标识符\n  String get id;\n\n  ///副标题, 通常为作者\n  String get subTitle;\n\n  ///大小\n  double? get comicSize;\n\n  ///下载的时间\n  DateTime? time;\n\n  /// tags\n  List<String> get tags;\n\n  Map<String, dynamic> toJson();\n\n  set comicSize(double? value);\n\n  String? directory;\n}\n\nenum DownloadType {\n  picacg,\n  ehentai,\n  jm,\n  hitomi,\n  htmanga,\n  nhentai,\n  other,\n  favorite;\n\n  ComicType toComicType() => switch (this) {\n        picacg => ComicType.picacg,\n        ehentai => ComicType.ehentai,\n        jm => ComicType.jm,\n        hitomi => ComicType.hitomi,\n        htmanga => ComicType.htManga,\n        nhentai => ComicType.nhentai,\n        other => ComicType.other,\n        favorite => ComicType.other,\n      };\n}\n\ntypedef DownloadProgressCallback = void Function();\n\ntypedef DownloadProgressCallbackAsync = Future<void> Function();\n\nabstract class DownloadingItem with _TransferSpeedMixin {\n  ///完成时调用\n  final DownloadProgressCallback? onFinish;\n\n  ///出现错误时调用\n  final DownloadProgressCallback? onError;\n\n  ///更新下载信息\n  final DownloadProgressCallbackAsync? updateInfo;\n\n  ///标识符, 对于哔咔和eh, 直接使用其提供的漫画id, 禁漫开头加jm, hitomi开头加hitomi\n  final String id;\n\n  ///类型\n  DownloadType type;\n\n  /// run function start will cause this increasing by 1\n  ///\n  /// this is used for preventing running multiple downloading function at the same time\n  int _runtimeKey = 0;\n\n  int _retryTimes = 0;\n\n  String? directory;\n\n  String get path {\n    var downloadPath = DownloadManager().path!;\n    return \"$downloadPath/$directory\";\n  }\n\n  /// headers for downloading cover\n  Map<String, String> get headers => {};\n\n  int _downloadedNum = 0;\n\n  int _downloadingEp = 0;\n\n  /// index of downloading episode\n  ///\n  /// Attention, this is used for array indexing, so it starts with 0\n  int get downloadingEp => _downloadingEp;\n\n  int index = 0;\n\n  /// all image urls\n  Map<int, List<String>>? links;\n\n  int get allowedLoadingNumber => int.tryParse(appdata.settings[79]) ?? 6;\n\n  DownloadingItem(this.onFinish, this.onError, this.updateInfo, this.id,\n      {required this.type});\n\n  Future<void> downloadCover() async {\n    var file = File(\"$path/cover.jpg\");\n    if (file.existsSync()) {\n      return;\n    }\n    var dio = logDio();\n    var res = await dio.get<Uint8List>(cover,\n        options: Options(responseType: ResponseType.bytes, headers: headers));\n    if (file.existsSync()) {\n      file.deleteSync();\n    }\n    file.createSync(recursive: true);\n    file.writeAsBytesSync(res.data!);\n  }\n\n  /// retry when error\n  Future<void> retry() async {\n    _retryTimes++;\n    if (_retryTimes > 4) {\n      onError?.call();\n      _retryTimes = 0;\n    } else {\n      await Future.delayed(Duration(seconds: 2 << _retryTimes));\n      start();\n    }\n  }\n\n  @mustCallSuper\n  FutureOr<void> onStart() {\n    if (directory == null) {\n      if(DownloadManager().isExists(id)) {\n        directory = DownloadManager().getDirectory(id);\n      } else {\n      directory = findValidDirectoryName(DownloadManager().path!, title);\n      Directory(path).createSync(recursive: true);\n      }\n    }\n  }\n\n  final _downloading = <String, _ImageDownloadWrapper>{};\n\n  void _addDownloading(String link, int ep, int index) {\n    var downloadTo = '';\n    var basename = '';\n    if (haveEps) {\n      downloadTo = \"$path/$ep\";\n      basename = index.toString();\n    } else {\n      downloadTo = path;\n      basename = index.toString();\n    }\n    if (_downloading[\"$ep$index\"] == null ||\n        _downloading[\"$ep$index\"]!.error != null) {\n      _downloading[\"$ep$index\"] = _ImageDownloadWrapper(\n        downloadImage(link),\n        downloadTo,\n        basename,\n        onData,\n        () {\n          updateInfo?.call();\n          _scheduleTasks(ep, this.index);\n        },\n      );\n    }\n  }\n\n  void _scheduleTasks(int ep, int index) {\n    var urls = links![ep]!;\n    int downloading = 0;\n    for (int i = index; i < urls.length; i++) {\n      var task = _downloading[\"$ep$i\"];\n      if (task == null || task.error != null) {\n        _addDownloading(urls[i], ep, i);\n        downloading++;\n      } else if (!task.isFinished) {\n        downloading++;\n      }\n      if (downloading >= allowedLoadingNumber) {\n        break;\n      }\n    }\n  }\n\n  /// begin or continue downloading\n  void start() async {\n    _runtimeKey++;\n    var currentKey = _runtimeKey;\n    try {\n      await onStart();\n      if (_runtimeKey != currentKey) return;\n      notifications.sendProgressNotification(downloadedPages, totalPages,\n          \"下载中\".tl, \"${downloadManager.downloading.length} Tasks\");\n\n      // get image links and cover\n      links ??= await getLinks();\n      await downloadCover();\n      runRecorder();\n\n      // download images\n      while (_downloadingEp < links!.length && currentKey == _runtimeKey) {\n        int ep = links!.keys.elementAt(_downloadingEp);\n        var urls = links![ep]!;\n        while (index < urls.length && currentKey == _runtimeKey) {\n          notifications.sendProgressNotification(downloadedPages, totalPages,\n              \"下载中\".tl, \"${downloadManager.downloading.length} Tasks\");\n          _scheduleTasks(ep, index);\n          if (currentKey != _runtimeKey) return;\n          var task = _downloading[\"$ep$index\"];\n          if (task == null) {\n            throw Exception(\"Task not started\");\n          }\n          await task.wait();\n          if (task.error != null) {\n            throw task.error!;\n          }\n          if (!task.isFinished) {\n            throw Exception(\"Task not finished\");\n          }\n          _downloading.remove(\"$ep$index\");\n          index++;\n          _downloadedNum++;\n          await updateInfo?.call();\n        }\n        if (currentKey != _runtimeKey) return;\n        index = 0;\n        _downloadingEp++;\n        await updateInfo?.call();\n      }\n\n      // finish downloading\n      if (DownloadManager().downloading.firstOrNull != this) return;\n      onFinish?.call();\n      _stopAllTasks();\n    } catch (e, s) {\n      if (currentKey != _runtimeKey) return;\n      LogManager.addLog(LogLevel.error, \"Download\", \"$e\\n$s\");\n      retry();\n    }\n  }\n\n  void _stopAllTasks() {\n    var shouldRemove = <String>[];\n    for(var entry in _downloading.entries) {\n      if(!entry.value.isFinished) {\n        entry.value.cancel();\n        shouldRemove.add(entry.key);\n      }\n    }\n    for(var key in shouldRemove) {\n      _downloading.remove(key);\n    }\n  }\n\n  /// pause downloading\n  void pause() {\n    _runtimeKey++;\n    stopRecorder();\n    notifications.endProgress();\n    _stopAllTasks();\n    ImageManager.clearTasks();\n  }\n\n  /// stop downloading\n  void stop() {\n    _runtimeKey++;\n    stopRecorder();\n    _stopAllTasks();\n    notifications.endProgress();\n    if (downloadManager.isExists(id)) {\n      if (links == null) return;\n      var comicPath = \"$path/\";\n      for (var ep in links!.keys.toList()) {\n        var directory = Directory(comicPath + ep.toString());\n        if (directory.existsSync()) {\n          directory.deleteSync(recursive: true);\n        }\n      }\n    } else {\n      var file = Directory(path);\n      if (file.existsSync()) {\n        file.delete(recursive: true);\n      }\n    }\n  }\n\n  Map<String, dynamic> toBaseMap() {\n    Map<String, List<String>>? convertedData;\n    if (links != null) {\n      convertedData = {};\n      links!.forEach((key, value) {\n        convertedData![key.toString()] = value;\n      });\n    }\n\n    return {\n      \"id\": id,\n      \"type\": type.index,\n      \"_downloadedNum\": _downloadedNum,\n      \"_downloadingEp\": _downloadingEp,\n      \"index\": index,\n      \"links\": convertedData,\n      \"directory\": directory,\n      \"finishedTasks\": _downloading.entries\n          .where((element) => element.value.isFinished)\n          .map((e) => e.key)\n          .toList(),\n    };\n  }\n\n  Map<String, dynamic> toMap();\n\n  DownloadingItem.fromMap(\n      Map<String, dynamic> map, this.onFinish, this.onError, this.updateInfo)\n      : id = map[\"id\"],\n        type = DownloadType.values[map[\"type\"]],\n        _downloadedNum = map[\"_downloadedNum\"],\n        _downloadingEp = map[\"_downloadingEp\"],\n        index = map[\"index\"],\n        links = null {\n    var data = map[\"links\"] as Map<String, dynamic>?;\n    if (data != null) {\n      links = {};\n      data.forEach((key, value) {\n        links![int.parse(key)] = List<String>.from(value);\n      });\n    }\n    directory = map[\"directory\"];\n    if(map[\"finishedTasks\"] != null) {\n      var finishedTasks = List<String>.from(map[\"finishedTasks\"]);\n      for (var task in finishedTasks) {\n        _downloading[task] = _ImageDownloadWrapper.finished();\n      }\n    }\n  }\n\n  /// get all image links\n  ///\n  /// key - episode number(starts with 1), value - image links in this episode\n  ///\n  /// if platform don't have episode, this only have one key: 0.\n  Future<Map<int, List<String>>> getLinks();\n\n  /// whether this platform have episode\n  bool get haveEps =>\n      type != DownloadType.ehentai &&\n      type != DownloadType.hitomi &&\n      type != DownloadType.htmanga &&\n      type != DownloadType.nhentai;\n\n  Stream<DownloadProgress> downloadImage(String link);\n\n  ///获取封面链接\n  String get cover;\n\n  ///总共的图片数量\n  int get totalPages => links?.totalLength ?? 0;\n\n  ///已下载的图片数量\n  int get downloadedPages => _downloadedNum;\n\n  ///标题\n  String get title;\n\n  @override\n  bool operator ==(Object other) {\n    if (other is DownloadingItem) {\n      return id == other.id;\n    } else {\n      return false;\n    }\n  }\n\n  @override\n  int get hashCode => id.hashCode;\n\n  FutureOr<DownloadedItem> toDownloadedItem();\n\n  @override\n  String toString() {\n    return \"$id: $downloadedPages/$totalPages\";\n  }\n}\n\nclass _ImageDownloadWrapper {\n  final Stream<DownloadProgress> stream;\n\n  final String path;\n\n  final String fileBaseName;\n\n  final void Function(int length)? onReceiveData;\n\n  final void Function()? onFinished;\n\n  Object? error;\n\n  bool isFinished = false;\n\n  bool _canceled = false;\n\n  void cancel() {\n    _canceled = true;\n  }\n\n  _ImageDownloadWrapper(\n    this.stream,\n    this.path,\n    this.fileBaseName,\n    this.onReceiveData,\n    this.onFinished,\n  ) {\n    listen();\n  }\n\n  _ImageDownloadWrapper.finished():\n    stream = const Stream.empty(),\n    path = \"\",\n    fileBaseName = \"\",\n    onReceiveData = null,\n    onFinished = null,\n    isFinished = true;\n\n  void listen() async {\n    try {\n      var last = 0;\n      await for (var progress in stream) {\n        if(_canceled) {\n          for (var c in completers) {\n            c.complete(this);\n          }\n          return;\n        }\n        onReceiveData?.call(progress.currentBytes - last);\n        last = progress.currentBytes;\n        if (progress.finished) {\n          var data = progress.data ?? await progress.getFile().readAsBytes();\n          var type = detectFileType(data);\n          var file = File(\"$path/$fileBaseName${type.ext}\");\n          if (!await file.exists()) {\n            await file.create(recursive: true);\n          }\n          await file.writeAsBytes(data);\n          isFinished = true;\n        }\n      }\n    } catch (e) {\n      error = e;\n    }\n    if (!isFinished && error == null) {\n      error = Exception(\"Failed to download image\");\n    }\n    onFinished?.call();\n    for (var c in completers) {\n      c.complete(this);\n    }\n  }\n\n  var completers = <Completer<_ImageDownloadWrapper>>[];\n\n  Future<_ImageDownloadWrapper> wait() {\n    if (isFinished) {\n      return Future.value(this);\n    }\n    var completer = Completer<_ImageDownloadWrapper>();\n    completers.add(completer);\n    return completer.future;\n  }\n}\n\nabstract mixin class _TransferSpeedMixin {\n  int _bytesSinceLastSecond = 0;\n\n  int _currentSpeed = 0;\n\n  int get currentSpeed => _currentSpeed;\n\n  Timer? timer;\n\n  void onData(int length) {\n    if (timer == null) return;\n    _bytesSinceLastSecond += length;\n  }\n\n  void onNextSecond(Timer t) {\n    _currentSpeed = _bytesSinceLastSecond;\n    _bytesSinceLastSecond = 0;\n    DownloadManager().notifyListeners();\n  }\n\n  void runRecorder() {\n    if (timer != null) {\n      timer!.cancel();\n    }\n    timer = Timer.periodic(const Duration(seconds: 1), onNextSecond);\n  }\n\n  void stopRecorder() {\n    timer?.cancel();\n    timer = null;\n  }\n}\n"
  },
  {
    "path": "lib/network/eh_network/eh_download_model.dart",
    "content": "import 'dart:async';\nimport 'dart:isolate';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/foundation/cache_manager.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/eh_network/eh_models.dart';\nimport 'package:pica_comic/network/download_model.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport 'package:pica_comic/network/file_downloader.dart';\nimport 'package:pica_comic/network/http_client.dart';\nimport 'package:zip_flutter/zip_flutter.dart';\nimport 'dart:io';\nimport '../../tools/io_tools.dart';\nimport '../download.dart';\nimport 'eh_main_network.dart';\nimport 'get_gallery_id.dart';\n\nclass DownloadedGallery extends DownloadedItem{\n  Gallery gallery;\n  double? size;\n  DownloadedGallery(this.gallery,this.size);\n\n  @override\n  Map<String, dynamic> toJson()=>{\n    \"gallery\": gallery.toJson(),\n    \"size\": size\n  };\n  DownloadedGallery.fromJson(Map<String, dynamic> map):\n        gallery = Gallery.fromJson(map[\"gallery\"]),\n        size = map[\"size\"];\n\n  @override\n  DownloadType get type => DownloadType.ehentai;\n\n  @override\n  List<int> get downloadedEps => [0];\n\n  @override\n  List<String> get eps => [\"EP 1\"];\n\n  @override\n  String get name {\n    if(appdata.settings[78] == \"1\"){\n      return gallery.subTitle ?? gallery.title;\n    } else {\n      return gallery.title;\n    }\n  }\n\n  @override\n  String get id => getGalleryId(gallery.link);\n\n  @override\n  String get subTitle => gallery.uploader;\n\n  @override\n  double? get comicSize => size;\n\n  @override\n  set comicSize(double? value) {\n    size = value;\n  }\n\n  List<String> _getTags(){\n    var res = <String>[];\n    gallery.tags.forEach((key, value) => value.forEach((element) => res.add(element)));\n    return res;\n  }\n\n  @override\n  List<String> get tags => _getTags();\n}\n\n///e-hentai的下载进程模型\nclass EhDownloadingItem extends DownloadingItem{\n  EhDownloadingItem(\n      this.gallery,\n      super.whenFinish,\n      super.onError,\n      super.updateInfo,\n      super.id,\n      this.downloadType,\n      {super.type = DownloadType.ehentai}\n  );\n\n  ///画廊模型\n  final Gallery gallery;\n\n  final int downloadType;\n\n  @override\n  Map<String, String> get headers => {\n    \"Cookie\": EhNetwork().cookiesStr,\n    \"User-Agent\": webUA,\n    \"Referer\": EhNetwork().ehBaseUrl,\n  };\n\n  @override\n  String get cover => gallery.coverPath.replaceFirst('s.exhentai.org', 'ehgt.org');\n\n  @override\n  String get title => gallery.title;\n\n  @override\n  Future<Map<int, List<String>>> getLinks() async{\n    return {\n      0: List.generate((int.parse(gallery.maxPage)), (index) => (index+1).toString())\n    };\n  }\n\n  @override\n  Stream<DownloadProgress> downloadImage(String link) {\n    return ImageManager().getEhImageNew(gallery, int.parse(link));\n  }\n\n  @override\n  Map<String, dynamic> toMap() => {\n    \"gallery\": gallery.toJson(),\n    \"downloadType\": downloadType,\n    \"_downloadLink\": _downloadLink,\n    \"_currentBytes\": _currentBytes,\n    \"_totalBytes\": _totalBytes,\n    ...super.toBaseMap()\n  };\n\n  @override\n  Future<void> onStart() async{\n    await super.onStart();\n    // clear showKey and imageKey\n    // imageKey is saved through the network cache mechanism\n    gallery.auth?.remove(\"showKey\");\n    await CacheManager().deleteKeyword(\"exhentai.org\");\n    await CacheManager().deleteKeyword(\"e-hentai.org\");\n  }\n\n  int? _currentBytes;\n\n  int? _totalBytes;\n\n  @override\n  int get totalPages {\n    if(downloadType == 0){\n      return super.totalPages;\n    } else {\n      return _totalBytes ?? 1;\n    }\n  }\n\n  @override\n  int get downloadedPages {\n    if(downloadType == 0){\n      return super.downloadedPages;\n    } else {\n      return _currentBytes ?? 0;\n    }\n  }\n\n  _IsolateDownloader? _downloader;\n\n  bool _stop = false;\n\n  String? _downloadLink;\n\n  int _currentSpeed = 0;\n\n  @override\n  int get currentSpeed => downloadType == 0\n      ? super.currentSpeed\n      : _currentSpeed;\n\n  @override\n  start() async{\n    if(downloadType == 0){\n      return super.start();\n    } else {\n      await onStart();\n      _stop = false;\n      try{\n        await downloadCover();\n        if(gallery.auth?[\"archiveDownload\"] == null){\n          throw \"No archive download link\";\n        }\n        if(_downloadLink == null) {\n          var res = await EhNetwork().getArchiveDownloadLink(\n              gallery.auth![\"archiveDownload\"]!, downloadType);\n          if (_stop) {\n            return;\n          }\n          if (res.error) {\n            throw res.errorMessage!;\n          }\n          _downloadLink = res.data;\n        }\n        _downloader = _IsolateDownloader(\n            _downloadLink!,\n            path,\n            (current, total, speed){\n              _currentBytes = current;\n              _totalBytes = total;\n              _currentSpeed = speed;\n              updateInfo?.call();\n              if(current == total){\n                if (DownloadManager().downloading.firstOrNull != this) return;\n                finish();\n              }\n            },\n            onError!\n        );\n        _downloader!.start();\n      }\n      catch(e, s){\n        log(\"$e\\n$s\", \"Download\", LogLevel.error);\n        onError?.call();\n        return;\n      }\n    }\n  }\n\n  void finish() async{\n    onFinish?.call();\n  }\n\n  @override\n  pause() async{\n    if(downloadType == 0){\n      return super.pause();\n    } else {\n      _stop = true;\n      _downloader?.pause();\n    }\n  }\n\n  @override\n  stop() async{\n    if(downloadType == 0){\n      return super.stop();\n    } else {\n      _stop = true;\n      _downloader?.stop();\n      var directory = Directory(path);\n      if(await directory.exists()) {\n        await directory.delete(recursive: true);\n      }\n    }\n  }\n\n  EhDownloadingItem.fromMap(\n      Map<String, dynamic> map,\n      DownloadProgressCallback whenFinish,\n      DownloadProgressCallback whenError,\n      DownloadProgressCallbackAsync updateInfo,\n      String id\n      ):gallery=Gallery.fromJson(map[\"gallery\"]),\n        downloadType = map[\"downloadType\"],\n        _currentBytes = map[\"_currentBytes\"],\n        _totalBytes = map[\"_totalBytes\"],\n        _downloadLink = map[\"_downloadLink\"],\n        super.fromMap(map, whenFinish, whenError, updateInfo);\n\n  @override\n  FutureOr<DownloadedItem> toDownloadedItem() async {\n    return DownloadedGallery(gallery, await getFolderSize(Directory(path)));\n  }\n}\n\nclass _IsolateDownloader{\n  final String url;\n\n  final String savePath;\n\n  late ReceivePort port;\n\n  late SendPort sendPort;\n\n  final void Function(int current, int total, int speed) updateInfo;\n\n  final void Function() onError;\n\n  _IsolateDownloader(this.url, this.savePath, this.updateInfo,\n      this.onError);\n\n  Isolate? isolate;\n\n  void stop(){\n    sendPort.send(\"stop\");\n    isolate = null;\n    port.close();\n  }\n\n  void pause(){\n    stop();\n  }\n\n  void start() async{\n    port = ReceivePort();\n    isolate = await Isolate.spawn<_DownloadData>(run, _DownloadData(\n        port.sendPort, url, savePath, await getProxy()));\n    var total = 0;\n    port.listen((message) {\n      if(message is SendPort){\n        sendPort = message;\n      } else if(message is DownloadingStatus){\n        updateInfo(message.downloadedBytes, message.totalBytes+1, message.bytesPerSecond);\n        total = message.totalBytes;\n      } else if(message == \"finish\"){\n        isolate?.kill(priority: Isolate.immediate);\n        isolate = null;\n        updateInfo(total+1, total+1, 0);\n      } else if(message is _DownloadException){\n        isolate?.kill(priority: Isolate.immediate);\n        isolate = null;\n        LogManager.addLog(LogLevel.error, \"Download\", message.message);\n        onError();\n      }\n    });\n  }\n\n  static void run(_DownloadData data) async{\n    var receivePort = ReceivePort();\n\n    final sendPort = data.port;\n\n    sendPort.send(receivePort.sendPort);\n\n    final url = data.url;\n\n    final savePath = data.savePath;\n\n    FileDownloader? task;\n\n    receivePort.listen((message) {\n      if(message == \"stop\"){\n        task?.stop().then((value) => Isolate.current.kill());\n      }\n    });\n\n    Future.sync(() async{\n      task = FileDownloader(url, \"$savePath/temp.zip\", data.proxy);\n\n      try {\n        await for (var status in task!.start()) {\n          sendPort.send(status);\n        }\n        ZipFile.openAndExtract(\"$savePath/temp.zip\", savePath);\n        var files = Directory(savePath).listSync();\n        files.sort((a, b) => a.path.compareTo(b.path));\n        int index = 0;\n        for(var entry in Directory(savePath).listSync()){\n          if(entry is File){\n            var name = entry.path.split(pathSep).last;\n            if(name.endsWith(\".zip\")){\n              entry.deleteSync();\n            } else if(!name.contains(\"cover\")){\n              var baseName = index.toString();\n              index++;\n              var ext = name.split(\".\").last;\n              entry.renameSync(\"$savePath/$baseName.$ext\");\n            }\n          }\n        }\n        sendPort.send(\"finish\");\n      }\n      catch(e, s){\n        sendPort.send(_DownloadException(\"$e\\n$s\"));\n      }\n    });\n  }\n}\n\nclass _DownloadData{\n  final SendPort port;\n  final String url;\n  final String savePath;\n  final String? proxy;\n\n  const _DownloadData(this.port, this.url, this.savePath,\n      this.proxy);\n}\n\nclass _DownloadException{\n  final String message;\n\n  const _DownloadException(this.message);\n}"
  },
  {
    "path": "lib/network/eh_network/eh_main_network.dart",
    "content": "import 'dart:collection';\nimport 'dart:convert';\n\nimport 'package:cookie_jar/cookie_jar.dart';\nimport 'package:dio/dio.dart';\nimport 'package:html/dom.dart' as dom;\nimport 'package:html/parser.dart';\nimport 'package:pica_comic/comic_source/built_in/ehentai.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/app_dio.dart';\nimport 'package:pica_comic/network/cache_network.dart';\nimport 'package:pica_comic/network/cookie_jar.dart';\nimport 'package:pica_comic/network/eh_network/eh_models.dart';\nimport 'package:pica_comic/network/eh_network/get_gallery_id.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/pre_search_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/js.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:shared_preferences/shared_preferences.dart';\n\nimport '../../base.dart';\nimport '../http_client.dart';\n\nclass EhNetwork {\n  factory EhNetwork() => cache == null ? (cache = EhNetwork.create()) : cache!;\n\n  static EhNetwork? cache;\n\n  static EhNetwork createEhNetwork() => EhNetwork();\n\n  late List<String> folderNames;\n\n  EhNetwork.create() {\n    getCookies(true);\n    folderNames = List.from(ehentai.data[\"favoriteNames\"] ?? []);\n    if(folderNames.length != 10){\n      folderNames = List.generate(10, (index) => \"Favorite $index\");\n    }\n  }\n\n  ///e-hentai的url\n  String get ehBaseUrl => appdata.settings[20] == \"0\"\n      ? \"https://e-hentai.org\"\n      : \"https://exhentai.org\";\n\n  ///api url\n  get ehApiUrl => appdata.settings[20] == \"0\"\n      ? \"https://api.e-hentai.org/api.php\"\n      : \"https://exhentai.org/api.php\";\n\n  final cookieJar = SingleInstanceCookieJar.instance!;\n\n  ///给图片加载使用的cookie\n  String cookiesStr = \"\";\n\n  // 用于账号详情页面显示\n  String id = \"\";\n  String hash = \"\";\n  String igneous = \"\";\n\n  ///设置请求cookie\n  Future<String> getCookies(bool setNW, [String? url]) async {\n    url ??= ehBaseUrl;\n\n    var shouldAdd = [\n      if (setNW) Cookie(\"nw\", \"1\")\n      else Cookie(\"nw\", \"0\"),\n      if (appdata.settings[75] != \"\")\n        Cookie(\"sp\", appdata.settings[75]),\n    ];\n\n    var cookies = cookieJar.loadForRequest(Uri.parse(url));\n    \n    if(ehentai.isLogin\n        && cookies.every((element) => element.name != \"ipb_member_id\")){\n      // 迁移旧版本数据\n      SharedPreferences prefs = await SharedPreferences.getInstance();\n      id = prefs.getString(\"ehId\") ?? \"\";\n      hash = prefs.getString(\"ehPassHash\") ?? \"\";\n      igneous = prefs.getString(\"ehIgneous\") ?? \"\";\n\n      shouldAdd.add(Cookie(\"ipb_member_id\", id));\n      shouldAdd.add(Cookie(\"ipb_pass_hash\", hash));\n      if(igneous.isNotEmpty) {\n        shouldAdd.add(Cookie(\"igneous\", igneous));\n      }\n    }\n\n    cookieJar.saveFromResponse(Uri.parse(url), shouldAdd);\n\n    var res = \"\";\n    for (var cookie in cookies) {\n      res += \"${cookie.name}=${cookie.value}; \";\n      if(cookie.name == \"ipb_member_id\"){\n        id = cookie.value;\n      } else if(cookie.name == \"ipb_pass_hash\"){\n        hash = cookie.value;\n      } else if(cookie.name == \"igneous\"){\n        igneous = cookie.value;\n      }\n    }\n    if (res.length < 2) {\n      return \"\";\n    }\n    cookiesStr = res.substring(0, res.length - 2);\n    return cookiesStr;\n  }\n\n  ///从url获取数据, 在请求时设置了cookie\n  Future<Res<String>> request(String url,\n      {Map<String, String>? headers,\n      CacheExpiredTime expiredTime = CacheExpiredTime.short,\n      bool setNW = true}) async {\n    await getCookies(setNW, url);\n    var options = BaseOptions(\n        connectTimeout: const Duration(seconds: 8),\n        sendTimeout: const Duration(seconds: 8),\n        receiveTimeout: const Duration(seconds: 8),\n        followRedirects: true,\n        headers: {\n          \"user-agent\": webUA,\n          ...?headers,\n          \"host\": Uri.parse(url).host\n        });\n    var dio = CachedNetwork();\n    try {\n      var data = await dio.get(url, options,\n          cookieJar: cookieJar, expiredTime: expiredTime);\n      if (data.data.isEmpty) {\n        throw Exception(\"Empty Data. \"\n            \"No permission to access this page.\\n\"\n            \"Please check your account and cookie.\");\n      }\n      \n      if(data.url.contains(\"bounce_login.php\")){\n        throw Exception(\"需要登录或者登录过期\".tl);\n      }\n      \n      await getCookies(true);\n      if ((data.data).substring(0, 4) == \"Your\") {\n        dio.delete(url);\n        return const Res(null,\n            errorMessage: \"Your IP address has been temporarily banned\");\n      }\n      return Res(data.data);\n    } on DioException catch (e) {\n      String? message;\n      if (e.type != DioExceptionType.unknown) {\n        message = e.message ?? \"未知\".tl;\n      } else {\n        message = e.toString().split(\"\\n\").elementAtOrNull(1);\n      }\n      return Res(null, errorMessage: message ?? \"Network Error\");\n    } catch (e) {\n      String? message;\n      if (e.toString() != \"null\") {\n        message = e.toString();\n      }\n      if(message?.contains(\"Redirect loop\") ?? false){\n        message = \"Redirect loop: No permission to view this page. \\nCheck your account and cookie.\";\n      }\n      return Res(null, errorMessage: message ?? \"Network Error\");\n    }\n  }\n\n  final apiDio = logDio(BaseOptions());\n\n  ///eh APi请求\n  Future<Res<String>> apiRequest(\n    Map<String, dynamic> data, {\n    Map<String, String>? headers,\n  }) async {\n    await getCookies(false, ehApiUrl);\n    await setNetworkProxy();\n\n    try {\n      var res = await apiDio.post<String>(ehApiUrl,\n          data: data,\n          options: Options(headers: {\n            \"user-agent\": webUA,\n            ...?headers,\n            \"host\": Uri.parse(ehBaseUrl).host,\n            \"Cookie\": cookiesStr\n          }));\n      return Res(res.data);\n    } on DioException catch (e) {\n      String? message;\n      if (e.type != DioExceptionType.unknown) {\n        message = e.message ?? \"未知\".tl;\n      } else {\n        message = e.toString().split(\"\\n\").elementAtOrNull(1);\n      }\n      return Res(null, errorMessage: message ?? \"Network Error\");\n    } catch (e) {\n      String? message;\n      if (e.toString() != \"null\") {\n        message = e.toString();\n      }\n      return Res(null, errorMessage: message ?? \"Network Error\");\n    }\n  }\n\n  Future<Res<String>> post(\n    String url,\n    dynamic data, {\n    Map<String, String>? headers,\n  }) async {\n    await getCookies(true, url);\n    await setNetworkProxy(); //更新代理\n    var options = BaseOptions(\n        connectTimeout: const Duration(seconds: 8),\n        sendTimeout: const Duration(seconds: 8),\n        receiveTimeout: const Duration(seconds: 8),\n        receiveDataWhenStatusError: true,\n        validateStatus: (status) => status == 200 || status == 302,\n        headers: {\"user-agent\": webUA, ...?headers});\n\n    var dio = logDio(options)..interceptors.add(LogInterceptor());\n    dio.interceptors.add(CookieManagerSql(cookieJar));\n    try {\n      var res = await dio.post<String>(url, data: data);\n      return Res(res.data ?? \"\");\n    } on DioException catch (e) {\n      String? message;\n      if (e.type != DioExceptionType.unknown) {\n        message = e.message ?? \"未知\".tl;\n      } else {\n        message = e.toString().split(\"\\n\").elementAtOrNull(1);\n      }\n      return Res(null, errorMessage: message ?? \"Network Error\");\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\");\n      String? message;\n      if (e.toString() != \"null\") {\n        message = e.toString();\n      }\n      return Res(null, errorMessage: message ?? \"Network Error\");\n    }\n  }\n\n  ///获取用户名, 同时用于检测cookie是否有效\n  Future<bool> getUserName() async {\n    try {\n      var res = await request(\"https://forums.e-hentai.org/\",\n          headers: {\n            \"referer\": \"https://forums.e-hentai.org/index.php?\",\n            \"accept\":\n                \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\",\n            \"accept-encoding\": \"gzip, deflate, br\",\n            \"accept-language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\"\n          },\n          expiredTime: CacheExpiredTime.no);\n      if (res.error) {\n        return false;\n      }\n\n      var html = parse(res.data);\n      var name = html.querySelector(\"div#userlinks > p.home > b > a\");\n      ehentai.data['name'] = name?.text ?? '';\n      return name != null;\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\");\n      return false;\n    }\n  }\n\n  ///解析星星的html元素的位置属性, 返回评分\n  double getStarsFromPosition(String position) {\n    int i = 0;\n    while (position[i] != \";\") {\n      i++;\n      if (i == position.length) {\n        break;\n      }\n    }\n    switch (position.substring(0, i)) {\n      case \"background-position:0px -1px\":\n        return 5;\n      case \"background-position:0px -21px\":\n        return 4.5;\n      case \"background-position:-16px -1px\":\n        return 4;\n      case \"background-position:-16px -21px\":\n        return 3.5;\n      case \"background-position:-32px -1px\":\n        return 3;\n      case \"background-position:-32px -21px\":\n        return 2.5;\n      case \"background-position:-48px -1px\":\n        return 2;\n      case \"background-position:-48px -21px\":\n        return 1.5;\n      case \"background-position:-64px -1px\":\n        return 1;\n      case \"background-position:-64px -21px\":\n        return 0.5;\n    }\n    return 0.5;\n  }\n\n  ///从e-hentai链接中获取当前页面的所有画廊\n  Future<Res<Galleries>> getGalleries(String url,\n      {bool leaderboard = false, bool favoritePage = false}) async {\n    //从一个链接中获取所有画廊, 同时获得下一页的链接\n    //leaderboard比正常的表格多了第一列\n    int t = 0;\n    if (leaderboard) {\n      t++;\n    }\n    var res = await request(url, expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var document = parse(res.data);\n      var galleries = <EhGalleryBrief>[];\n\n      // compact mode\n      for (var item in document.querySelectorAll(\"table.itg.gltc > tbody > tr\")) {\n        try {\n          var type = item.children[0 + t].children[0].text;\n          var time = item.children[1 + t].children[2].children[0].text;\n          var stars = getStarsFromPosition(item\n              .children[1 + t].children[2].children[1].attributes[\"style\"]!);\n          var cover = item.children[1 + t].children[1].children[0].children[0].attributes[\"src\"];\n          if (cover![0] == 'd') {\n            cover = item.children[1 + t].children[1].children[0].children[0].attributes[\"data-src\"];\n          }\n          var title = item.children[2 + t].children[0].children[0].text;\n          var link = item.children[2 + t].children[0].attributes[\"href\"];\n          String uploader = \"\";\n          int? pages;\n          try {\n            uploader = item.children[3 + t].children[0].children[0].text;\n            pages = int.parse(item.children[3 + t].children[1].text.nums);\n          } catch (e) {\n            //收藏夹页没有uploader\n          }\n          var tags = <String>[];\n          for (var node\n              in item.children[2 + t].children[0].children[1].children) {\n            tags.add(node.attributes[\"title\"]!);\n          }\n\n          galleries.add(EhGalleryBrief(\n              title, type, time, uploader, cover!, stars, link!, tags, pages: pages));\n        } catch (e) {\n          //表格中存在空行或者被屏蔽\n          continue;\n        }\n      }\n\n      // Thumbnail mode\n      for (var item in document.querySelectorAll(\"div.gl1t\")) {\n        try {\n          final title = item.querySelector(\"a\")?.text ?? \"Unknown\";\n          final type =\n              item.querySelector(\"div.gl5t > div > div.cs\")?.text ?? \"Unknown\";\n          final time = item\n                  .querySelectorAll(\"div.gl5t > div > div\")\n                  .firstWhereOrNull(\n                      (element) => DateTime.tryParse(element.text) != null)\n                  ?.text ??\n              \"Unknown\";\n          final coverPath = item.querySelector(\"img\")?.attributes[\"src\"] ?? \"\";\n          final stars = getStarsFromPosition(item\n                  .querySelector(\"div.gl5t > div > div.ir\")\n                  ?.attributes[\"style\"] ??\n              \"\");\n          final link = item.querySelector(\"a\")?.attributes[\"href\"] ?? \"\";\n          final pages = int.tryParse(item\n                  .querySelectorAll(\"div.gl5t > div > div\")\n                  .firstWhereOrNull((element) => element.text.contains(\"pages\"))\n                  ?.text\n                  .nums ??\n              \"\");\n          galleries.add(EhGalleryBrief(\n              title, type, time, \"\", coverPath, stars, link, [],\n              pages: pages));\n        } catch (e) {\n          //忽视\n        }\n      }\n\n      // Extended mode\n      for(var item in document.querySelectorAll(\"table.itg.glte > tbody > tr\")){\n        try{\n          final title = item.querySelector(\"td.gl2e > div > a > div > div.glink\")?.text ?? \"Unknown\";\n          final type = item.querySelector(\"td.gl2e > div > div.gl3e > div.cn\")?.text ?? \"Unknown\";\n          final time = item.querySelectorAll(\"td.gl2e > div > div.gl3e > div\")\n              .firstWhereOrNull((element) => DateTime.tryParse(element.text) != null)?.text ?? \"Unknown\";\n          final uploader = item.querySelector(\"td.gl2e > div > div.gl3e > div > a\")?.text ?? \"Unknown\";\n          final coverPath = item.querySelector(\"td.gl1e > div > a > img\")?.attributes[\"src\"] ?? \"\";\n          final stars = getStarsFromPosition(item.querySelector(\"td.gl2e > div > div.gl3e > div.ir\")?.attributes[\"style\"] ?? \"\");\n          final link = item.querySelector(\"td.gl1e > div > a\")?.attributes[\"href\"] ?? \"\";\n          final tags = item.querySelectorAll(\"div.gtl\").map((e) => e.attributes[\"title\"] ?? \"\").toList();\n          final pages = int.tryParse(item.querySelectorAll(\"td.gl2e > div > div.gl3e > div\")\n              .firstWhereOrNull((element) => element.text.contains(\"pages\"))?.text.nums ?? \"\");\n          galleries.add(EhGalleryBrief(title, type, time, uploader, coverPath, stars, link, tags, pages: pages));\n        }\n        catch(e){\n          //忽视\n        }\n      }\n\n      // minimal mode\n      for(var item in document.querySelectorAll(\"table.itg.gltm > tbody > tr\")){\n        try{\n          final title = item.querySelector(\"td.gl3m > a > div.glink\")?.text ?? \"Unknown\";\n          final type = item.querySelector(\"td.gl1m > div.cs\")?.text ?? \"Unknown\";\n          final time = item.querySelectorAll(\"td.gl2m > div\")\n              .firstWhereOrNull((element) => DateTime.tryParse(element.text) != null)?.text ?? \"Unknown\";\n          final uploader = item.querySelector(\"td.gl5m > div > a\")?.text ?? \"Unknown\";\n          final coverPath = item.querySelector(\"td.gl2m > div > div > img\")?.attributes[\"src\"] ?? \"\";\n          final stars = getStarsFromPosition(item.querySelector(\"td.gl4m > div.ir\")?.attributes[\"style\"] ?? \"\");\n          final link = item.querySelector(\"td.gl3m > a\")?.attributes[\"href\"] ?? \"\";\n          galleries.add(EhGalleryBrief(title, type, time, uploader, coverPath, stars, link, []));\n        }\n        catch(e){\n          //忽视\n        }\n      }\n\n      var g = Galleries();\n      var nextButton = document.getElementById(\"dnext\");\n      if (nextButton == null) {\n        g.next = null;\n      } else {\n        g.next = nextButton.attributes[\"href\"];\n      }\n      g.galleries = galleries;\n\n      //获取收藏夹名称\n      if (favoritePage && ehentai.isLogin) {\n        var names = <String>[];\n        try {\n          var folderDivs = document.querySelectorAll(\"div.fp\");\n          for (var folderDiv in folderDivs) {\n            var name = folderDiv.children.elementAtOrNull(2)?.text ??\n                \"Favorite ${names.length}\";\n            var length = folderDiv.children.elementAtOrNull(0)?.text;\n            if (length != null) {\n              length = \" ($length)\";\n            }\n            length ??= \"\";\n            names.add(\"$name$length\");\n          }\n          if (names.length != 10) {\n            names = names.sublist(0, 10);\n          }\n          bool isSame = true;\n          if (folderNames.length == names.length) {\n            for (int i = 0; i < folderNames.length; i++) {\n              if (folderNames[i] != names[i]) {\n                isSame = false;\n                break;\n              }\n            }\n          } else {\n            isSame = false;\n          }\n          if (!isSame) {\n            folderNames = names;\n            ehentai.data[\"favoriteNames\"] = names;\n            ehentai.saveData();\n          }\n        } catch (e) {\n          //忽视\n        }\n        return Res(g, subData: folderNames);\n      }\n      return Res(g);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///获取画廊的下一页\n  Future<bool> getNextPageGalleries(Galleries galleries) async {\n    if (galleries.next == null) return true;\n    var next = await getGalleries(galleries.next!);\n    if (next.error) return false;\n    galleries.galleries.addAll(next.data.galleries);\n    galleries.next = next.data.next;\n    return true;\n  }\n\n  Comment _parseComment(dom.Element e) {\n    var name = e\n        .getElementsByClassName(\"c3\")[0]\n        .getElementsByTagName(\"a\")\n        .elementAtOrNull(0)\n        ?.text ??\n        \"未知\";\n    var time = e.getElementsByClassName(\"c3\").elementAtOrNull(0)\n        ?.text\n        .split('Posted on')\n        .elementAtOrNull(1)\n        ?.split('by')\n        .elementAtOrNull(0)\n        ?.trim()\n        ?? 'unknown';\n    var content = e.getElementsByClassName(\"c6\")[0].text;\n    var score = int.parse(e.querySelector(\"div.c5 > span\")?.text ?? '0');\n    var id = e.previousElementSibling?.attributes['name']?.nums ?? \"0\";\n    bool voteUp = e.querySelector(\"a#comment_vote_up_$id\")?.attributes['style']?.isNotEmpty == true;\n    bool voteDown = e.querySelector(\"a#comment_vote_down_$id\")?.attributes['style']?.isNotEmpty == true;\n    bool? vote;\n    if(voteUp){\n      vote = true;\n    } else if(voteDown){\n      vote = false;\n    }\n    return Comment(id, name, content, time, score, vote);\n  }\n\n  ///从漫画详情页链接中获取漫画详细信息\n  Future<Res<Gallery>> getGalleryInfo(String link, [bool setNW = true]) async {\n    try {\n      var res =\n          await request(link, expiredTime: CacheExpiredTime.no, setNW: setNW);\n      if (res.error) {\n        return Res(null, errorMessage: res.errorMessage);\n      }\n      if (res.data.contains(\"Content Warning\") &&\n          res.data.contains(\"Never Warn Me Again\")) {\n        return const Res(null, errorMessage: \"Content Warning\");\n      }\n      var document = parse(res.data);\n      //tags\n      var tags = <String, List<String>>{};\n      var tagLists =\n          document.querySelectorAll(\"div#taglist > table > tbody > tr\");\n      for (var tr in tagLists) {\n        var list = <String>[];\n        for (var div in tr.children[1].children) {\n          list.add(div.children[0].text);\n        }\n        tags[tr.children[0].text.substring(0, tr.children[0].text.length - 1)] =\n            list;\n      }\n      String maxPage = \"1\";\n\n      for (var element in document.querySelectorAll(\"td.gdt2\")) {\n        if (element.text.contains(\"pages\")) {\n          maxPage = element.text.nums;\n        }\n      }\n\n      bool favorite = true;\n      if (document.getElementById(\"favoritelink\")?.text ==\n          \" Add to Favorites\") {\n        favorite = false;\n      }\n      var coverPath = document\n          .querySelector(\"div#gleft > div#gd1 > div\")!\n          .attributes[\"style\"]!;\n      coverPath =\n          RegExp(r\"https?://([-a-zA-Z0-9.]+(/\\S*)?\\.(?:jpg|jpeg|gif|png))\")\n              .firstMatch(coverPath)![0]!;\n      //评论\n      var comments = <Comment>[];\n      for (var c in document.getElementsByClassName(\"c1\")) {\n        comments.add(_parseComment(c));\n      }\n      //上传者\n      var uploader =\n          document.getElementById(\"gdn\")!.children.elementAtOrNull(0)?.text ??\n              \"未知\";\n\n      //星星\n      var stars = getStarsFromPosition(\n          document.getElementById(\"rating_image\")!.attributes[\"style\"]!);\n\n      //平均分数\n      var rating = document.getElementById(\"rating_label\")?.text;\n      //类型\n      var type = document.getElementsByClassName(\"cs\")[0].text;\n      //时间\n      var time = document\n          .querySelector(\"div#gdd > table > tbody > tr > td.gdt2\")!\n          .text;\n      //身份认证数据\n      var auth = getVariablesFromJsCode(res.data);\n      var thumbnailUrls = <String>[];\n      var title = document.querySelector(\"h1#gn\")!.text;\n      var subTitle = document.querySelector(\"h1#gj\")?.text;\n      if (subTitle != null && subTitle.removeAllBlank == \"\") {\n        subTitle = null;\n      }\n      var thumbnailDiv =\n          document.querySelectorAll(\"div.gdtm > div\").elementAtOrNull(0);\n      if (thumbnailDiv != null) {\n        var pattern = RegExp(r\"/m/(\\d+)/\");\n        var match = pattern.firstMatch(thumbnailDiv.attributes[\"style\"] ?? \"\");\n\n        if (match != null) {\n          var extractedValue = match.group(1);\n          if (extractedValue != null) {\n            auth[\"thumbnailKey\"] = extractedValue;\n          }\n        }\n      } else {\n        var imgDom = document.querySelectorAll(\"div.gdtl > a > img\");\n        for (var i in imgDom) {\n          if (i.attributes[\"src\"] != null) {\n            thumbnailUrls.add(i.attributes[\"src\"]!);\n          }\n        }\n        var totalPages = document.querySelectorAll(\"table.ptt > tbody > tr > td > a\")\n            .where((element) => element.text.isNum).last.text;\n        auth[\"thumbnailKey\"] = \"large thumbnail: $totalPages\";\n      }\n      var archiveDownload = document.querySelectorAll('a')\n          .firstWhereOrNull((element) => element.text == \"Archive Download\")\n          ?.attributes[\"onclick\"];\n      if(archiveDownload != null){\n        archiveDownload = archiveDownload.split(\"'\")[1];\n        if(archiveDownload.isURL){\n          auth[\"archiveDownload\"] = archiveDownload;\n        }\n      }\n      return Res(Gallery(\n          title,\n          type,\n          time,\n          uploader,\n          stars,\n          rating,\n          coverPath,\n          tags,\n          comments,\n          auth,\n          favorite,\n          link,\n          maxPage,\n          thumbnailUrls,\n          subTitle));\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<List<Comment>>> getComments(String url) async {\n    var res = await request(\"$url?hc=1\", expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var document = parse(res.data);\n      var resComments = <Comment>[];\n      var comments = document.getElementsByClassName(\"c1\");\n      for (var c in comments) {\n        resComments.add(_parseComment(c));\n      }\n      return Res(resComments);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Set<String> loadingReaderLinks = {};\n\n  Future<Res<String>> getReaderLink(String gLink, int page) async {\n    var res = await _getReaderLinks(gLink, 1);\n    if (page <= res.data.length) {\n      return Res(res.data[page - 1]);\n    }\n    var urlsOnePage = res.data.length;\n\n    final shouldLoadPage = (page - 1) ~/ urlsOnePage + 1;\n    final urlsRes = (await _getReaderLinks(gLink, shouldLoadPage));\n    if (urlsRes.error) {\n      return Res.fromErrorRes(urlsRes);\n    }\n    return Res(urlsRes.data[(page - 1) % urlsOnePage]);\n  }\n\n  /// page starts from 1\n  Future<Res<List<String>>> _getReaderLinks(String link, int page) async {\n    String url = link;\n    if (page != 1) {\n      url = url.contains(\"?\") ? \"$url&p=${page - 1}\" : \"$url?p=${page - 1}\";\n    }\n    while (loadingReaderLinks.contains(url)) {\n      await Future.delayed(const Duration(milliseconds: 200));\n    }\n    loadingReaderLinks.add(url);\n    var res = await request(url);\n    loadingReaderLinks.remove(url);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var urls_ = <String>[];\n      var temp = parse(res.data);\n      var links = temp.querySelectorAll(\"div#gdt > div.gdtm > div > a\");\n      for (var link in links) {\n        urls_.add(link.attributes[\"href\"]!);\n      }\n      links = temp.querySelectorAll(\"div#gdt > div.gdtl > a\");\n      for (var link in links) {\n        urls_.add(link.attributes[\"href\"]!);\n      }\n      return Res(urls_);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<(String image, String? nl)> getImageLinkWithNL(\n      String gid, String imgKey, int p, String nl) async {\n    var res = await request(\"$ehBaseUrl/s/$imgKey/$gid-$p?nl=$nl\");\n    if (res.error) {\n      throw res.errorMessage ?? \"error\";\n    } else {\n      var document = parse(res.data);\n      var image = document.querySelector(\"div#i3 > a > img\")?.attributes[\"src\"];\n      var nl = document\n          .querySelector(\"div#i6 > div > a#loadfail\")\n          ?.attributes[\"onclick\"]\n          ?.split('\\'')\n          .firstWhereOrNull((element) => element.contains('-'));\n      return (image ?? (throw \"Failed to get image.\"), nl);\n    }\n  }\n\n  Future<Res<List<String>>> getThumbnailUrls(Gallery gallery) async {\n    if (gallery.auth![\"thumbnailKey\"] == null) {\n      var res = await request(gallery.link);\n      if (res.error) {\n        return Res.fromErrorRes(res);\n      }\n      var document = parse(res.data);\n      var thumbnailDiv = document.querySelectorAll(\"div.gdtm > div\")[0];\n      var pattern = RegExp(r'url\\((.*?)\\)');\n      var match = pattern.firstMatch(thumbnailDiv.attributes[\"style\"] ?? \"\");\n\n      if (match != null) {\n        var extractedValue = match.group(1);\n        if (extractedValue != null) {\n          gallery.auth![\"thumbnailKey\"] = extractedValue.replaceRange(\n            extractedValue.lastIndexOf('/'),\n            null,\n            '',\n          );\n        }\n      } else {\n        return const Res(null, errorMessage: \"Failed to get Thumbnail\");\n      }\n    }\n    return Res(List.generate(int.parse(gallery.maxPage), (index) {\n      var page = (index ~/ 20).toString();\n      if (page.length == 1) {\n        page = \"0$page\";\n      }\n      return \"${gallery.auth![\"thumbnailKey\"]!}/${getGalleryId(gallery.link)}-$page.jpg\";\n    }));\n  }\n\n  Future<Res<List<String>>> getLargeThumbnails(Gallery gallery, int page) async{\n    var res = await request(\"${gallery.link}?p=$page\");\n    if(res.error){\n      return Res.fromErrorRes(res);\n    }\n    var document = parse(res.data);\n    return Res(document.querySelectorAll(\"div.gdtl > a > img\").map((e) => e.attributes[\"src\"] ?? \"\").toList());\n  }\n\n  List<String> _splitKeyword(String keyword) {\n    var res = <String>[];\n    var buffer = StringBuffer();\n    var qs = Queue<String>();\n    for(int i = 0; i<keyword.length; i++) {\n      var char = keyword[i];\n      if(char == '\"' || char == \"'\") {\n        if(qs.isEmpty) {\n          qs.add(char);\n        } else {\n          if(qs.first == char) {\n            qs.removeFirst();\n          } else {\n            qs.add(char);\n          }\n        }\n      }\n      if(char == ' ') {\n        if(qs.isEmpty) {\n          res.add(buffer.toString());\n          buffer.clear();\n        } else {\n          buffer.write(char);\n        }\n      } else {\n        buffer.write(char);\n      }\n    }\n    if(buffer.isNotEmpty) {\n      res.add(buffer.toString());\n    }\n    return res;\n  }\n\n  ///搜索e-hentai\n  Future<Res<Galleries>> search(String keyword,\n      {int? fCats, int? startPages, int? endPages, int? minStars}) async {\n    if (keyword != \"\") {\n      appdata.searchHistory.remove(keyword);\n      appdata.searchHistory.add(keyword);\n      appdata.writeHistory();\n    }\n    keyword = keyword.replaceAll(RegExp(r\"\\s+\"), \" \").trim();\n    if(keyword.contains(\" | \")) {\n      var keywords = _splitKeyword(keyword);\n      var newKeywords = <String>[];\n      for(var k in keywords) {\n        if(!k.contains(' | '))  {\n          newKeywords.add(k);\n        } else {\n          var lr = k.split(':');\n          if(lr.length != 2\n              && !((lr[1].startsWith('\"') && lr[1].endsWith('\"'))\n              || (lr[1].startsWith(\"'\") && lr[1].endsWith(\"'\")))\n          ) {\n            newKeywords.add(k);\n          } else {\n            var key = lr[0];\n            var value = lr[1].substring(1, lr[1].length-1);\n            value = '${value.split(' | ').first}\\$';\n            newKeywords.add('$key:\"$value\"');\n          }\n        }\n      }\n      keyword = newKeywords.join(' ');\n    }\n    var requestUrl = \"$ehBaseUrl/?f_search=$keyword\";\n    if (fCats != null) {\n      requestUrl += \"&f_cats=$fCats\";\n    }\n    if (startPages != null) {\n      requestUrl += \"&f_spf=$startPages\";\n    }\n    if (endPages != null) {\n      requestUrl += \"&f_spt=$endPages\";\n    }\n    if (minStars != null) {\n      requestUrl += \"&f_srdd=$minStars\";\n    }\n    var res = await getGalleries(requestUrl);\n    Future.delayed(const Duration(microseconds: 500), () {\n      try {\n        StateController.find<PreSearchController>().update();\n      } catch (e) {\n        //忽视\n      }\n    });\n    return res;\n  }\n\n  Future<Res<List<EhGalleryBrief>>> getLeaderBoardByPage(\n      int type, int page) async {\n    var res = await getGalleries(\n      \"https://e-hentai.org/toplist.php?tl=$type&p=$page\",\n      leaderboard: true,\n    );\n    if(res.error){\n      return Res.fromErrorRes(res);\n    }\n    return Res(res.data.galleries, subData: 200);\n  }\n\n  ///获取排行榜\n  Future<Res<EhLeaderboard>> getLeaderboard(EhLeaderboardType type) async {\n    var res = await getGalleries(\n        \"https://e-hentai.org/toplist.php?tl=${type.value}\",\n        leaderboard: true);\n    if (res.error) return Res(null, errorMessage: res.errorMessage);\n    return Res(EhLeaderboard(type, res.data.galleries, 0));\n  }\n\n  ///获取排行榜的下一页\n  Future<void> getLeaderboardNextPage(EhLeaderboard leaderboard) async {\n    if (leaderboard.loaded == EhLeaderboard.max) {\n      return;\n    } else {\n      var res = await getGalleries(\n          \"https://e-hentai.org/toplist.php?tl=${leaderboard.type.value}&p=${leaderboard.loaded + 1}\",\n          leaderboard: true);\n      if (!res.error) {\n        leaderboard.galleries.addAll(res.data.galleries);\n      }\n      leaderboard.loaded++;\n    }\n  }\n\n  ///评分\n  Future<bool> rateGallery(Map<String, String> auth, int rating) async {\n    var res = await apiRequest({\n      \"method\": \"rategallery\",\n      \"apiuid\": auth[\"apiuid\"],\n      \"apikey\": auth[\"apikey\"],\n      \"gid\": auth[\"gid\"],\n      \"token\": auth[\"token\"],\n      \"rating\": rating\n    });\n    return !res.error;\n  }\n\n  ///收藏\n  Future<bool> favorite(String gid, String token, {String id = \"0\"}) async {\n    var res = await post(\n        \"https://e-hentai.org/gallerypopups.php?gid=$gid&t=$token&act=addfav\",\n        \"favcat=$id&favnote=&apply=Add+to+Favorites&update=1\",\n        headers: {\"Content-Type\": \"application/x-www-form-urlencoded\"});\n    if (res.error) {\n      return false;\n    }\n    if (res.error || res.data.isEmpty || res.data[0] != \"<\") {\n      return false;\n    } else {\n      return true;\n    }\n  }\n\n  ///取消收藏\n  Future<bool> unfavorite(String gid, String token) async {\n    var res = await post(\n        \"https://e-hentai.org/gallerypopups.php?gid=$gid&t=$token&act=addfav\",\n        \"favcat=favdel&favnote=&apply=Apply+Changes&update=1\",\n        headers: {\"Content-Type\": \"application/x-www-form-urlencoded\"});\n    if (res.error || res.data[0] != \"<\") {\n      return false;\n    } else {\n      return true;\n    }\n  }\n\n  Future<bool> unfavorite2(String gid) async {\n    var res = await post(\"https://e-hentai.org/favorites.php\",\n        \"ddact=delete&modifygids%5B%5D=$gid\",\n        headers: {\"Content-Type\": \"application/x-www-form-urlencoded\"});\n    if (res.error) {\n      return false;\n    } else {\n      return true;\n    }\n  }\n\n  ///发送评论\n  Future<Res<bool>> comment(String content, String link) async {\n    var res = await post(\n        link, \"commenttext_new=${Uri.encodeComponent(content)}\",\n        headers: {\"Content-Type\": \"application/x-www-form-urlencoded\"});\n\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    var document = parse(res.data);\n    if (document.querySelector(\"p.br\") != null) {\n      return Res(null, errorMessage: document.querySelector(\"p.br\")!.text);\n    }\n    return const Res(true);\n  }\n\n  Future<Res<EhImageLimit>> getImageLimit() async{\n    if(!ehentai.isLogin){\n      return const Res(null, errorMessage: \"Not logged in\");\n    }\n    var [res, res1] = await Future.wait([\n      request(\"https://e-hentai.org/home.php\", expiredTime: CacheExpiredTime.no),\n      request(\"https://e-hentai.org/exchange.php?t=gp\", expiredTime: CacheExpiredTime.no)\n    ]);\n    if(res.error){\n      return Res.fromErrorRes(res);\n    }\n    if(res1.error){\n      return Res.fromErrorRes(res1);\n    }\n    var document = parse(res.data);\n    var infoBox = document.querySelectorAll(\"div.homebox > p\")\n        .firstWhere((element) => element.text.contains(\"You are currently at\"));\n    var [current, limit] = infoBox.querySelectorAll(\"strong\").map((e) => e.text).toList();\n    var resetBox = document.querySelectorAll(\"div.homebox > p\")\n        .firstWhere((element) => element.text.contains(\"Reset Cost\"));\n    var cost = resetBox.querySelector(\"strong\")!.text;\n    document = parse(res1.data);\n    var credits = document.querySelectorAll(\"div.outer > div > div\")\n        .where((element) => element.children.isEmpty && element.text.contains(\"Credits\")).map((e) => e.text.nums).first;\n    var gp = document.querySelectorAll(\"div.outer > div > div\")\n        .where((element) => element.children.isEmpty && element.text.contains(\"kGP\")).map((e) => e.text.nums).first;\n    return Res(EhImageLimit(int.parse(current.nums), int.parse(limit.nums),\n        int.parse(cost.nums), int.parse(gp.nums), int.parse(credits.nums)));\n  }\n\n  Future<bool> resetImageLimit() async{\n    if(!ehentai.isLogin){\n      return false;\n    }\n    var res = await post(\"https://e-hentai.org/home.php\", \"reset_imagelimit=Reset+Limit\",\n        headers: {\"Content-Type\": \"application/x-www-form-urlencoded\"});\n    if(res.error){\n      return false;\n    }\n    return true;\n  }\n  \n  /// key - value: id - name\n  Future<Res<Map<String, String>>> getProfiles() async{\n    var res = await request(\"$ehBaseUrl/uconfig.php\", expiredTime: CacheExpiredTime.no);\n    if(res.error){\n      return Res.fromErrorRes(res);\n    }\n    var document = parse(res.data);\n    var options = document.querySelectorAll(\"select[name=profile_set] > option\");\n    if(options.isEmpty){\n      return const Res.error(\"No profiles found\");\n    } else {\n      return Res({ for (var e in options) e.attributes[\"value\"] ?? \"\" : e.text });\n    }\n  }\n\n  Future<Res<ArchiveDownloadInfo>> getArchiveDownloadInfo(String url) async{\n    var res = await request(url, expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    try {\n      var document = parse(res.data);\n      var body = document.querySelector(\"div#db\")!;\n      int index = url.contains(\"exhentai\") ? 1 : 3;\n      var origin = body.children[index].children[0];\n      var originCost = origin.querySelector(\"div > strong\")!.text;\n      var originSize = origin.querySelector(\"p > strong\")!.text;\n      var resample = body.children[index].children[1];\n      var resampleCost = resample.querySelector(\"div > strong\")!.text;\n      var resampleSize = resample.querySelector(\"p > strong\")!.text;\n      return Res(ArchiveDownloadInfo(originSize, resampleSize,\n          originCost, resampleCost,\n          document.querySelector(\"form#invalidate_form\")?.attributes[\"action\"],\n      ));\n    }\n    catch(e, s){\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\\n${res.data}\");\n      return Res.error(e.toString());\n    }\n  }\n\n  Future<Res<ArchiveDownloadInfo>> cancelAndReloadArchiveInfo(ArchiveDownloadInfo info) async{\n    var url = info.cancelUnlockUrl!;\n    var res = await post(url, \"invalidate_sessions=1\", headers: {\n      \"content-type\": \"application/x-www-form-urlencoded\",\n    });\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    try {\n      var document = parse(res.data);\n      var body = document.querySelector(\"div#db\")!;\n      int index = url.contains(\"exhentai\") ? 1 : 3;\n      var origin = body.children[index].children[0];\n      var originCost = origin.querySelector(\"div > strong\")!.text;\n      var originSize = origin.querySelector(\"p > strong\")!.text;\n      var resample = body.children[index].children[1];\n      var resampleCost = resample.querySelector(\"div > strong\")!.text;\n      var resampleSize = resample.querySelector(\"p > strong\")!.text;\n      return Res(ArchiveDownloadInfo(originSize, resampleSize,\n          originCost, resampleCost,\n          document.querySelector(\"form#invalidate_form\")?.attributes[\"action\"],\n      ));\n    }\n    catch(e, s){\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\\n${res.data}\");\n      return Res.error(e.toString());\n    }\n  }\n\n  Future<Res<String>> getArchiveDownloadLink(String apiUrl, int type) async{\n    try {\n      var data = type == 1\n          ? \"dltype=org&dlcheck=Download+Original+Archive\"\n          : \"dltype=res&dlcheck=Download+Resample+Archive\";\n      var res = await post(apiUrl, data, headers: {\n        \"content-type\": \"application/x-www-form-urlencoded\",\n      });\n      if (res.error) {\n        return Res.fromErrorRes(res);\n      }\n      var document = parse(res.data);\n      var link = document\n          .querySelector(\"a\")\n          ?.attributes[\"href\"];\n      if (link == null) {\n        return const Res.error(\"Failed to get download link\");\n      }\n      var res2 = await logDio().get<String>(link);\n      document = parse(res2.data);\n      var link2 = document\n          .querySelector(\"a\")\n          ?.attributes[\"href\"];\n      var host = Uri.parse(link).host;\n      return Res(\"https://$host$link2\");\n    }\n    catch(e){\n      return Res.error(e.toString());\n    }\n  }\n\n  Future<Res<int>> voteComment(Map<String, String> auth, String cid, bool isUp) async {\n    var res = await apiRequest({\n      \"method\": \"votecomment\",\n      \"apikey\": auth[\"apikey\"],\n      \"apiuid\": auth[\"apiuid\"],\n      \"comment_id\": cid,\n      \"gid\": auth[\"gid\"],\n      \"token\": auth[\"token\"],\n      \"comment_vote\": isUp ? \"1\" : \"-1\"\n    });\n    if(res.error){\n      return Res.fromErrorRes(res);\n    }\n    try {\n      var json = jsonDecode(res.data);\n      var newScore = json[\"comment_score\"];\n      if(newScore is! int) {\n        return const Res.error(\"Failed to get new score\");\n      }\n      return Res(newScore);\n    }\n    catch(e){\n      return Res.error(e.toString());\n    }\n  }\n}\n"
  },
  {
    "path": "lib/network/eh_network/eh_models.dart",
    "content": "import 'package:pica_comic/base.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/network/base_comic.dart';\n\nclass EhGalleryBrief extends BaseComic{\n  @override\n  String title;\n  String type;\n  String time;\n  String uploader;\n  double stars; //0-5\n  String coverPath;\n  String link;\n  @override\n  List<String> tags;\n  int? pages;\n\n  EhGalleryBrief(this.title,this.type,this.time,this.uploader,this.coverPath,this.stars,this.link,this.tags, {this.pages});\n\n  @override\n  String get cover => coverPath;\n\n  @override\n  String get description => time;\n\n  @override\n  String get id => link;\n\n  @override\n  String get subTitle => uploader;\n\n  @override\n  bool get enableTagsTranslation => true;\n}\n\nclass Galleries{\n  List<EhGalleryBrief> galleries = [];\n  String? next;//下一页的链接\n  EhGalleryBrief operator[](int index)=>galleries[index];\n  int get length => galleries.length;\n}\n\nclass Comment{\n  String id;\n  String name;\n  String content;\n  String time;\n  int score;\n  // true: up, false: down, null: not voted\n  bool? voteUP;\n\n  Comment(this.id, this.name, this.content, this.time, this.score, this.voteUP);\n}\n\nclass Gallery with HistoryMixin{\n  @override\n  String title;\n  @override\n  String? subTitle;\n  String type;\n  String time;\n  String uploader;\n  double stars;\n  String? rating;\n  String coverPath;\n  Map<String,List<String>> tags;\n  List<Comment> comments = [];\n  /// api身份验证信息\n  Map<String,String>? auth;\n  bool favorite;\n  String link;\n  @override\n  String maxPage;\n  List<String> thumbnails;\n\n  List<String> _generateTags(){\n    var res = <String>[];\n    tags.forEach((key, value) {\n      for(var element in value) {\n        res.add(\"$key:$element\");\n      }\n    });\n    return res;\n  }\n\n  EhGalleryBrief toBrief() => EhGalleryBrief(\n      title,\n      type,\n      time,\n      uploader,\n      coverPath,\n      stars,\n      link,\n      _generateTags(),\n  );\n\n  Map<String, dynamic> toJson() {\n    return {\n      \"title\": title,\n      \"subTitle\": subTitle,\n      \"type\": type,\n      \"time\": time,\n      \"uploader\": uploader,\n      \"stars\": stars,\n      \"rating\": rating,\n      \"coverPath\": coverPath,\n      \"tags\": tags,\n      \"favorite\": favorite,\n      \"link\": link,\n      \"maxPage\": maxPage,\n      \"auth\": auth\n    };\n  }\n\n  Gallery.fromJson(Map<String, dynamic> json):\n    title = json[\"title\"],\n    type = json[\"type\"],\n    time = json[\"time\"],\n    uploader = json[\"uploader\"],\n    subTitle = json[\"subTitle\"],\n    stars = json[\"stars\"],\n    rating = json[\"rating\"],\n    coverPath = json[\"coverPath\"],\n    tags = {},\n    favorite = json[\"favorite\"],\n    link = json[\"link\"],\n    maxPage = json[\"maxPage\"],\n    thumbnails = [],\n    auth = json[\"auth\"] == null ? null : Map<String,String>.from(json[\"auth\"]),\n    comments = []{\n    for(var key in (json[\"tags\"] as Map<String, dynamic>).keys){\n      tags[\"key\"] = List<String>.from(json[\"tags\"][key]);\n    }\n  }\n\n  Gallery(\n      this.title,\n      this.type,\n      this.time,\n      this.uploader,\n      this.stars,\n      this.rating,\n      this.coverPath,\n      this.tags,\n      this.comments,\n      this.auth,\n      this.favorite,\n      this.link,\n      this.maxPage,\n      this.thumbnails, // unused field\n      this.subTitle);\n\n  @override\n  String get cover => coverPath;\n\n  @override\n  HistoryType get historyType => HistoryType.ehentai;\n\n  @override\n  String get target => link;\n}\n\nenum EhLeaderboardType{\n  yesterday(15),\n  month(13),\n  year(12),\n  all(11);\n\n  final int value;\n\n  const EhLeaderboardType(this.value);\n\n  static EhLeaderboardType fromValue(int value){\n    switch(value){\n      case 15:\n        return EhLeaderboardType.yesterday;\n      case 13:\n        return EhLeaderboardType.month;\n      case 12:\n        return EhLeaderboardType.year;\n      case 11:\n        return EhLeaderboardType.all;\n      default:\n        throw Exception(\"Invalid value\");\n    }\n  }\n}\n\nclass EhLeaderboard{\n  EhLeaderboardType type;\n  List<EhGalleryBrief> galleries;\n  int loaded;\n  static const int max = 199;\n\n  EhLeaderboard(this.type,this.galleries,this.loaded);\n}\n\nclass EhImageLimit{\n  final int current;\n  final int max;\n  final int resetCost;\n  final int kGP;\n  final int credits;\n\n  const EhImageLimit(this.current, this.max, this.resetCost, this.kGP, this.credits);\n}\n\nclass ArchiveDownloadInfo{\n  final String originSize;\n  final String resampleSize;\n  final String originCost;\n  final String resampleCost;\n  final String? cancelUnlockUrl;\n\n  const ArchiveDownloadInfo(this.originSize,\n      this.resampleSize, this.originCost, this.resampleCost,\n      this.cancelUnlockUrl);\n}\n"
  },
  {
    "path": "lib/network/eh_network/get_gallery_id.dart",
    "content": "///从画廊链接中获取画廊id\nString getGalleryId(String url){\n  var i = url.indexOf(\"/g/\");\n  i += 3;\n  String res = \"\";\n  while(i < url.length){\n    res += url[i];\n    i++;\n    if(url[i] == '/'){\n      break;\n    }\n  }\n  return res;\n}"
  },
  {
    "path": "lib/network/favorite_download.dart",
    "content": "import 'dart:async';\nimport 'dart:typed_data';\n\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/custom_download_model.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/network/download_model.dart';\nimport 'package:pica_comic/network/eh_network/eh_download_model.dart';\nimport 'package:pica_comic/network/eh_network/eh_main_network.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_download_model.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_main_network.dart';\nimport 'package:pica_comic/network/htmanga_network/ht_download_model.dart';\nimport 'package:pica_comic/network/htmanga_network/htmanga_main_network.dart';\nimport 'package:pica_comic/network/jm_network/jm_download.dart';\nimport 'package:pica_comic/network/jm_network/jm_network.dart';\nimport 'package:pica_comic/network/nhentai_network/download.dart';\nimport 'package:pica_comic/network/nhentai_network/nhentai_main_network.dart';\nimport 'package:pica_comic/network/picacg_network/methods.dart';\nimport 'package:pica_comic/network/picacg_network/picacg_download_model.dart';\n\nclass FavoriteDownloading extends DownloadingItem{\n  FavoriteDownloading(this.comic, super.whenFinish, super.onError,\n      super.updateInfo, super.id, {super.type = DownloadType.favorite});\n\n  FavoriteItem comic;\n\n  late DownloadingItem downloadLogic;\n\n  @override\n  void start() async{\n    await onStart();\n    downloadLogic.start();\n  }\n\n  @override\n  Future<void> onStart() async{\n    try {\n      switch(comic.type.key){\n        case 0: {\n          var comicItem = await PicacgNetwork().getComicInfo(comic.target);\n          downloadLogic = PicDownloadingItem(\n              comicItem.data, List.generate(comicItem.data.eps.length,\n                  (index) => index), onFinish, onError, updateInfo, id);\n        }\n        case 1: {\n          var gallery = await EhNetwork().getGalleryInfo(comic.target);\n          downloadLogic = EhDownloadingItem(gallery.data,\n              onFinish, onError, updateInfo, id, 0);\n        }\n        case 2: {\n          var jmComic = await JmNetwork().getComicInfo(comic.target);\n          var downloadedEp = List.generate(jmComic.data.epNames.length, (index) => index);\n          if(downloadedEp.isEmpty) {\n            downloadedEp.add(0);\n          }\n          downloadLogic = JmDownloadingItem(jmComic.data, downloadedEp,\n              onFinish, onError, updateInfo, id);\n        }\n        case 3: {\n          var hitomiComic = await HiNetwork().getComicInfo(comic.target);\n          downloadLogic = HitomiDownloadingItem(hitomiComic.data,\n              comic.coverPath, comic.target, onFinish, onError, updateInfo, id);\n        }\n        case 4: {\n          var htComic = await HtmangaNetwork().getComicInfo(comic.target);\n          downloadLogic = DownloadingHtComic(htComic.data, onFinish, onError, updateInfo, id);\n        }\n        case 6: {\n          var nhComic = await NhentaiNetwork().getComicInfo(comic.target);\n          downloadLogic = NhentaiDownloadingItem(nhComic.data, onFinish, onError, updateInfo, id);\n        }\n        default: {\n          var comicSource = comic.type.comicSource;\n          var comicInfoData = await comicSource.loadComicInfo!(comic.target);\n          var downloadedEp = List.generate(comicInfoData.data.chapters?.length ?? 0, (index) => index);\n          downloadLogic = CustomDownloadingItem(comicInfoData.data, downloadedEp,\n              onFinish, onError, updateInfo, id);\n        }\n      }\n    }\n    catch(e, s) {\n      Log.error(\"Download\", \"$e$s\");\n      onError?.call();\n      return;\n    }\n    pause();\n    DownloadManager().downloading.removeFirst();\n    DownloadManager().downloading.addFirst(downloadLogic);\n    downloadLogic.start();\n  }\n\n  @override\n  String get cover => comic.coverPath;\n\n  @override\n  Future<Map<int, List<String>>> getLinks() => downloadLogic.getLinks();\n\n  @override\n  String get title => comic.name;\n\n  @override\n  Map<String, dynamic> toMap() {\n    return {\n      \"comic\": comic.toJson(),\n      ...toBaseMap()\n    };\n  }\n\n  FavoriteDownloading.fromMap(Map<String, dynamic> json,\n      DownloadProgressCallback whenFinish,\n      DownloadProgressCallback whenError,\n      DownloadProgressCallbackAsync updateInfo,\n      String id)\n      : comic = FavoriteItem.fromJson(json[\"comic\"]),\n        super.fromMap(json, whenFinish, whenError, updateInfo);\n\n  @override\n  FutureOr<DownloadedItem> toDownloadedItem() =>\n      downloadLogic.toDownloadedItem();\n\n  @override\n  Stream<DownloadProgress> downloadImage(String link) {\n    return downloadLogic.downloadImage(link);\n  }\n}"
  },
  {
    "path": "lib/network/file_downloader.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:dio/dio.dart';\nimport 'package:pica_comic/network/http_client.dart';\nimport 'package:pica_comic/tools/extensions.dart';\n\nclass FileDownloader{\n  final String url;\n  final String savePath;\n  final String? proxy;\n  final int maxConcurrent;\n\n  FileDownloader(this.url, this.savePath, this.proxy,\n      {this.maxConcurrent = 4});\n\n  int _currentBytes = 0;\n\n  int _lastBytes = 0;\n\n  late int _fileSize;\n\n  final _dio = Dio();\n\n  RandomAccessFile? _file;\n\n  bool _isWriting = false;\n\n  int _kChunkSize = 16 * 1024 * 1024;\n\n  bool _canceled = false;\n\n  late List<_DownloadBlock> _blocks;\n\n  Future<void> _writeStatus() async{\n    var file = File(\"$savePath.download\");\n    await file.writeAsString(_blocks.map((e) => e.toString()).join(\"\\n\"));\n  }\n\n  Future<void> _readStatus() async{\n    var file = File(\"$savePath.download\");\n    if(!await file.exists()){\n      return;\n    }\n\n    var lines = await file.readAsLines();\n    _blocks = lines.map((e) => _DownloadBlock.fromString(e)).toList();\n  }\n\n  /// create file and write empty bytes\n  Future<void> _prepareFile() async{\n    var file = File(savePath);\n    if(await file.exists()){\n      if(file.lengthSync() == _fileSize && File(\"$savePath.download\").existsSync()){\n        _file = await file.open(mode: FileMode.append);\n        return;\n      } else {\n        await file.delete();\n      }\n    }\n\n    await file.create(recursive: true);\n    _file = await file.open(mode: FileMode.append);\n    await _file!.truncate(_fileSize);\n  }\n\n  Future<void> _createTasks() async{\n    var res = await _dio.head(url);\n    var length = res.headers[\"content-length\"]?.first;\n    _fileSize = length == null ? 0 : int.parse(length);\n\n    await _prepareFile();\n\n    if(File(\"$savePath.download\").existsSync()){\n      await _readStatus();\n      _currentBytes = _blocks.fold<int>(0,\n              (previousValue, element) => previousValue + element.downloadedBytes);\n    } else {\n      if (_fileSize > 1024 * 1024 * 1024) {\n        _kChunkSize = 64 * 1024 * 1024;\n      } else if (_fileSize > 512 * 1024 * 1024) {\n        _kChunkSize = 32 * 1024 * 1024;\n      }\n\n      _blocks = [];\n      for(var i = 0; i < _fileSize; i += _kChunkSize) {\n        var end = i + _kChunkSize;\n        if (end > _fileSize) {\n          _blocks.add(_DownloadBlock(i, _fileSize, 0, false));\n        } else {\n          _blocks.add(_DownloadBlock(i, i + _kChunkSize, 0, false));\n        }\n      }\n    }\n  }\n\n  Stream<DownloadingStatus> start(){\n    setProxy(proxy);\n    var stream = StreamController<DownloadingStatus>();\n    _download(stream);\n    return stream.stream;\n  }\n\n  void _reportStatus(StreamController<DownloadingStatus> stream){\n    stream.add(DownloadingStatus(_currentBytes, _fileSize, 0));\n  }\n\n  void _download(StreamController<DownloadingStatus> resultStream) async{\n    try {\n      // get file size\n      await _createTasks();\n\n      if (_canceled) return;\n\n      // check if file is downloaded\n      if (_currentBytes >= _fileSize) {\n        await _file!.close();\n        _file = null;\n        _reportStatus(resultStream);\n        resultStream.close();\n        return;\n      }\n\n      _reportStatus(resultStream);\n\n      Timer.periodic(const Duration(seconds: 1), (timer) {\n        if(_canceled || _currentBytes >= _fileSize){\n          timer.cancel();\n          return;\n        }\n        resultStream.add(DownloadingStatus(\n            _currentBytes,\n            _fileSize,\n            _currentBytes - _lastBytes\n        ));\n        _lastBytes = _currentBytes;\n      });\n\n      // start downloading\n      await _scheduleDownload();\n      await _file!.close();\n      _file = null;\n      await File(\"$savePath.download\").delete();\n\n      // check if download is finished\n      if(_currentBytes < _fileSize){\n        throw Exception(\"Download failed: Expected $_fileSize bytes, \"\n            \"but only $_currentBytes bytes downloaded.\");\n      }\n\n      resultStream.add(DownloadingStatus(_currentBytes, _fileSize, 0, true));\n      resultStream.close();\n    }\n    catch(e, s){\n      await _file?.close();\n      _file = null;\n      resultStream.addError(e, s);\n      resultStream.close();\n    }\n  }\n\n  Future<void> _scheduleDownload() async{\n    var tasks = <Future>[];\n    while(true){\n      if(tasks.length >= maxConcurrent){\n        await Future.any(tasks);\n      }\n      final block = _blocks.firstWhereOrNull((element) =>\n      !element.downloading &&\n          element.end - element.start > element.downloadedBytes\n      );\n      if(block == null){\n        break;\n      }\n      block.downloading = true;\n      var task = _fetchBlock(block);\n      task.then((value) => tasks.remove(task));\n      tasks.add(task);\n    }\n    await Future.wait(tasks);\n  }\n\n  Future<void> _fetchBlock(_DownloadBlock block) async{\n    final start = block.start;\n    final end = block.end;\n\n    if(start > _fileSize){\n      return;\n    }\n\n    var options = Options(\n      responseType: ResponseType.stream,\n      headers: {\n        \"Range\": \"bytes=${start + block.downloadedBytes}-${end-1}\",\n        \"Accept\": \"*/*\",\n        \"Accept-Encoding\": \"deflate, gzip\",\n      },\n      preserveHeaderCase: true,\n    );\n    var res = await _dio.get<ResponseBody>(url, options: options);\n    if(_canceled) return;\n    if(res.data == null){\n      throw Exception(\"Failed to block $start-$end\");\n    }\n\n    var buffer = <int>[];\n    await for (var data in res.data!.stream) {\n      if(_canceled) return;\n      buffer.addAll(data);\n      if(buffer.length > 16 * 1024){\n        if(_isWriting) continue;\n        _currentBytes += buffer.length;\n        _isWriting = true;\n        await _file!.setPosition(start + block.downloadedBytes);\n        await _file!.writeFrom(buffer);\n        block.downloadedBytes += buffer.length;\n        buffer.clear();\n        await _writeStatus();\n        _isWriting = false;\n      }\n    }\n\n    if(buffer.isNotEmpty){\n      while(_isWriting){\n        await Future.delayed(const Duration(milliseconds: 10));\n      }\n      _isWriting = true;\n      _currentBytes += buffer.length;\n      await _file!.setPosition(start + block.downloadedBytes);\n      await _file!.writeFrom(buffer);\n      block.downloadedBytes += buffer.length;\n      await _writeStatus();\n      _isWriting = false;\n    }\n\n    block.downloading = false;\n  }\n\n  Future<void> stop() async{\n    _canceled = true;\n    await _file?.close();\n    _file = null;\n  }\n}\n\nclass DownloadingStatus{\n  /// The current downloaded bytes\n  final int downloadedBytes;\n  /// The total bytes of the file\n  final int totalBytes;\n  /// Whether the download is finished\n  final bool isFinished;\n  /// The download speed in bytes per second\n  final int bytesPerSecond;\n\n  const DownloadingStatus(this.downloadedBytes, this.totalBytes, this.bytesPerSecond,\n      [this.isFinished = false]);\n\n  @override\n  String toString() {\n    return \"Downloaded: $downloadedBytes/$totalBytes ${isFinished ? \"Finished\" : \"\"}\";\n  }\n}\n\nclass _DownloadBlock{\n  final int start;\n  final int end;\n  int downloadedBytes;\n  bool downloading;\n\n  _DownloadBlock(this.start, this.end, this.downloadedBytes, this.downloading);\n\n  @override\n  String toString() {\n    return \"$start-$end-$downloadedBytes\";\n  }\n\n  _DownloadBlock.fromString(String str)\n      : start = int.parse(str.split(\"-\")[0]),\n        end = int.parse(str.split(\"-\")[1]),\n        downloadedBytes = int.parse(str.split(\"-\")[2]),\n        downloading = false;\n}\n"
  },
  {
    "path": "lib/network/hitomi_network/fetch_data.dart",
    "content": "import 'dart:typed_data';\nimport 'package:pica_comic/foundation/def.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:dio/dio.dart';\n\nimport '../http_client.dart';\n\n///改写自 hitomi.la 网站上的js脚本\n///\n/// 接收byte数据, 将每4个byte合成1个int32即为漫画id\n///\n/// 发送请求时需要在请求头设置开始接收位置和最后接收位置,\n///\n/// 获取主页时不需要传入end, 因为需要和js脚本保持一致, 设置获取宽度100, 避免出现问题\n///\n/// 响应头中 Content-Range 指明数据范围, 此函数用subData形式返回此值\nFuture<Res<List<int>>> fetchComicData(String url, int start, {int? maxLength, int? endData, String? ref}) async{\n  await getProxy();\n  try{\n    var end = start + 100 - 1;\n    if(endData != null){\n      end = endData;\n    }\n    if(maxLength != null && maxLength < end){\n      end = maxLength;\n    }\n    assert(start < end);\n    var dio = Dio(BaseOptions(\n      connectTimeout: const Duration(seconds: 5),\n      receiveTimeout: const Duration(seconds: 5),\n      sendTimeout: const Duration(seconds: 5),\n    ));\n    dio.options.responseType = ResponseType.bytes;\n    dio.options.headers = {\n      \"User-Agent\": webUA,\n      \"Range\": \"bytes=$start-$end\",\n      if(ref != null)\n        \"Referer\": ref\n    };\n    var res = await dio.get(url);\n    var bytes = Uint8List.fromList(res.data);\n    var comicIds = <int>[];\n    for (int i = 0; i < bytes.length; i += 4) {\n      Int8List list = Int8List(4);\n      list[0] = bytes[i];\n      list[1] = bytes[i + 1];\n      list[2] = bytes[i + 2];\n      list[3] = bytes[i + 3];\n      int number = list.buffer.asByteData().getInt32(0);\n      comicIds.add(number);\n    }\n    var range = (res.headers[\"content-range\"]?? res.headers[\"Content-Range\"])![0];\n    int i = 0;\n    for(;i<range.length;i++){\n      if(range[i] == '/') break;\n    }\n    return Res(comicIds, subData: range.substring(i+1));\n  }\n  catch(e, s){\n    LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\");\n    return Res(null, errorMessage: e.toString()==\"null\" ? \"Unknown Error\" : e.toString());\n  }\n}"
  },
  {
    "path": "lib/network/hitomi_network/hitomi_download_model.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:typed_data';\nimport 'package:pica_comic/network/download_model.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport '../../base.dart';\nimport '../../tools/io_tools.dart';\nimport 'hitomi_models.dart';\nimport 'dart:io';\n\nclass DownloadedHitomiComic extends DownloadedItem {\n  HitomiComic comic;\n  double? size;\n  String cover;\n  String link;\n\n  DownloadedHitomiComic(this.comic, this.size, this.link, this.cover);\n\n  Map<String, dynamic> toMap() =>\n      {\"comic\": comic.toMap(), \"size\": size, \"link\": link, \"cover\": cover};\n\n  DownloadedHitomiComic.fromMap(Map<String, dynamic> map)\n      : comic = HitomiComic.fromMap(map[\"comic\"]),\n        size = map[\"size\"],\n        link = map[\"link\"],\n        cover = map[\"cover\"];\n\n  @override\n  double? get comicSize => size;\n\n  @override\n  List<int> get downloadedEps => [0];\n\n  @override\n  List<String> get eps => [\"第一章\"];\n\n  @override\n  String get id => \"hitomi${comic.id}\";\n\n  @override\n  String get name => comic.name;\n\n  @override\n  String get subTitle =>\n      (comic.artists ?? [\"未知\"]).isEmpty ? \"未知\" : (comic.artists ?? [\"未知\"])[0];\n\n  @override\n  DownloadType get type => DownloadType.hitomi;\n\n  HitomiComicBrief toBrief() => comic.toBrief(link, cover);\n\n  @override\n  Map<String, dynamic> toJson() => toMap();\n\n  @override\n  set comicSize(double? value) => size = value;\n\n  @override\n  List<String> get tags => comic.tags.map((e) => e.name).toList();\n}\n\nclass HitomiDownloadingItem extends DownloadingItem {\n  HitomiDownloadingItem(this.comic, this._coverPath, this.link,\n      super.whenFinish, super.whenError, super.updateInfo, super.id,\n      {super.type = DownloadType.hitomi});\n\n  final String _coverPath;\n\n  ///漫画模型\n  final HitomiComic comic;\n\n  ///画廊链接\n  final String link;\n\n  late final _headers = {\n    \"User-Agent\": webUA,\n    \"Referer\": \"https://hitomi.la/reader/${id.substring(6)}.html\"\n  };\n\n  @override\n  Map<String, String> get headers => _headers;\n\n  @override\n  String get cover => _coverPath;\n\n  @override\n  String get title => comic.name;\n\n  @override\n  Future<Map<int, List<String>>> getLinks() async {\n    return {\n      0: List<String>.generate(comic.files.length,\n          (index) => const JsonEncoder().convert(comic.files[index].toMap()))\n    };\n  }\n\n  @override\n  Stream<DownloadProgress> downloadImage(String link) {\n    return ImageManager().getHitomiImage(\n      HitomiFile.fromMap(const JsonDecoder().convert(link)),\n      id.replaceFirst(\"hitomi\", \"\"),\n    );\n  }\n\n  @override\n  Map<String, dynamic> toMap() => {\n        \"comic\": comic.toMap(),\n        \"_coverPath\": _coverPath,\n        \"link\": link,\n        ...super.toBaseMap()\n      };\n\n  HitomiDownloadingItem.fromMap(\n      Map<String, dynamic> map,\n      DownloadProgressCallback whenFinish,\n      DownloadProgressCallback whenError,\n      DownloadProgressCallbackAsync updateInfo,\n      String id)\n      : comic = HitomiComic.fromMap(map[\"comic\"]),\n        _coverPath = map[\"_coverPath\"],\n        link = map[\"link\"],\n        super.fromMap(map, whenFinish, whenError, updateInfo);\n\n  @override\n  FutureOr<DownloadedItem> toDownloadedItem() async {\n    return DownloadedHitomiComic(\n        comic, await getFolderSize(Directory(path)), link, _coverPath);\n  }\n}\n"
  },
  {
    "path": "lib/network/hitomi_network/hitomi_main_network.dart",
    "content": "import 'dart:convert';\nimport 'package:dio/dio.dart';\nimport 'package:html/parser.dart';\nimport 'package:pica_comic/network/cache_network.dart';\nimport 'package:pica_comic/network/hitomi_network/search.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport '../../base.dart';\nimport '../../foundation/log.dart';\nimport '../http_client.dart';\nimport '../res.dart';\nimport 'fetch_data.dart';\nimport 'hitomi_models.dart';\n\n/// 用于 hitomi.la 的网络请求类\nclass HiNetwork{\n  factory HiNetwork() => cache==null ? (cache=HiNetwork._create()) : cache!;\n\n  HiNetwork._create();\n\n  static HiNetwork? cache;\n\n  final baseUrl = \"https://hitomi.la\";\n\n  ///基本的get请求\n  Future<Res<String>> get(String url, {CacheExpiredTime expiredTime=CacheExpiredTime.short}) async{\n    try{\n      var options = BaseOptions(\n          connectTimeout: const Duration(seconds: 5),\n          receiveTimeout: const Duration(seconds: 5),\n          sendTimeout: const Duration(seconds: 5),\n          headers: {\n            \"User-Agent\": webUA,\n            \"Referer\": \"https://hitomi.la/\"\n          }\n      );\n      var dio = CachedNetwork();\n      var res = await dio.get(url, options, expiredTime: expiredTime);\n      return Res(res.data);\n    }\n    catch(e){\n      return Res(null, errorMessage: e.toString()==\"null\"?\"未知错误\":e.toString());\n    }\n  }\n\n  ///从一个漫画列表中获取所有的漫画\n  Future<Res<ComicList>> getComics(String url) async{\n    var comicList = ComicList(url);\n    var res = await loadNextPage(comicList);\n    if(res.error){\n      return Res(null, errorMessage: res.errorMessage!);\n    }else{\n      return Res(comicList);\n    }\n  }\n\n  Future<Res<bool>> loadNextPage(ComicList comicList) async{\n    if(comicList.toLoad >= comicList.total) return const Res(false);\n    var comicIds = await fetchComicData(comicList.url, comicList.toLoad, maxLength: comicList.total);\n    if(comicIds.error){\n      return Res(false, errorMessage: comicIds.errorMessage!);\n    }\n    comicList.total = int.parse(comicIds.subData);\n    comicList.toLoad += 100;\n    comicList.comicIds.addAll(comicIds.data);\n    return const Res(true);\n  }\n\n  ///获取一个漫画的简略信息\n  Future<Res<HitomiComicBrief>> getComicInfoBrief(String id) async{\n    var res = await get(\"https://ltn.hitomi.la/galleryblock/$id.html\");\n    if(res.error){\n      return Res(null, errorMessage: res.errorMessage!);\n    }\n    try{\n      var comicDiv = parse(res.data);\n      var name = comicDiv.querySelector(\"h1.lillie > a\")!.text;\n      var link = comicDiv.querySelector(\"h1.lillie > a\")!.attributes[\"href\"]!;\n      link = baseUrl + link;\n      var artist = comicDiv.querySelector(\"div.artist-list a\")?.text??\"N/A\";\n      String cover;\n      try {\n        cover = comicDiv.querySelector(\"div.dj-img1 > picture > source\")\n            ?.attributes[\"data-srcset\"] ??\n            comicDiv.querySelector(\"div.cg-img1 > picture > source\")!\n            .attributes[\"data-srcset\"]!;\n        cover = cover.substring(2);\n        cover = \"https://a$cover\";\n        cover = cover.replaceAll(RegExp(r\"2x.*\"), \"\");\n        cover = cover.removeAllBlank;\n        cover = cover.replaceFirst(\"avifbigtn\", \"webpbigtn\");\n        cover = cover.replaceFirst(\".avif\", \".webp\");\n      }\n      catch(e){\n        cover = \"\";\n      }\n      var table = comicDiv.querySelectorAll(\"div.dj-content > table.dj-desc > tbody\");\n      String type = \"\", lang = \"\";\n      var tags = <Tag>[];\n      for (var tr in table[0].children) {\n        if (tr.firstChild!.text == \"Type\") {\n          type = tr.children[1].text;\n        } else if (tr.firstChild!.text == \"Language\") {\n          lang = tr.children[1].text;\n        } else if (tr.firstChild!.text == \"Tags\") {\n          for (var liA in tr.querySelectorAll(\"td.relatedtags > ul > li > a\")) {\n            tags.add(Tag(liA.text, liA.attributes[\"href\"]!));\n          }\n        }\n      }\n      var time = comicDiv.querySelector(\"div.dj-content > p\")!.text;\n      return Res(HitomiComicBrief(name, type, lang, tags, time, artist, link, cover));\n    }\n    catch(e, s){\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///搜索Hitomi\n  Future<Res<List<int>>> search(String keyword) async{\n    await getProxy();\n    appdata.searchHistory.remove(keyword);\n    appdata.searchHistory.add(keyword);\n    appdata.writeHistory();\n    try{\n      var searchEngine = HitomiSearch(keyword);\n      var res = await searchEngine.search();\n      return Res(res.data);\n    }\n    catch(e, s){\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\");\n      return Res(null, errorMessage: \"$e\");\n    }\n  }\n\n  ///获取漫画信息\n  Future<Res<HitomiComic>> getComicInfo(String target) async{\n    String id;\n    if(target.isNum){\n      id = target;\n    }else {\n      id = RegExp(r\"\\d+(?=\\.html)\").firstMatch(target)![0]!;\n    }\n    var brief = await getComicInfoBrief(id);\n    if(brief.error){\n      return Res(null, errorMessage: brief.errorMessage!);\n    }\n    var res = await get(\"https://ltn.hitomi.la/galleries/$id.js\");\n    if(res.error){\n      return Res(null, errorMessage: res.errorMessage!);\n    }\n    //返回一个js脚本, 图片url也在这里面\n    //直接将前面的\"var galleryinfo = \"删掉, 然后作为json解析即可\n    var data = res.data.substring(res.data.indexOf('{'));\n    var json = const JsonDecoder().convert(data);\n    var tags = <Tag>[];\n    var files = <HitomiFile>[];\n\n    for(var tag in json[\"tags\"]??[]){\n      tags.add(Tag(tag[\"tag\"], \"$baseUrl${tag[\"url\"]}\"));\n    }\n\n    for(var file in json[\"files\"]??[]){\n      files.add(HitomiFile(file[\"name\"], file[\"hash\"],\n          file[\"haswebp\"]==1, file[\"hasavif\"]==1, file[\"height\"], file[\"width\"], id));\n    }\n\n    return Res(HitomiComic(\n      id,\n      json[\"title\"],\n      List<int>.from(json[\"related\"]),\n      json[\"type\"],\n      List<String>.from((json[\"artists\"]??[]).map((e) => e[\"artist\"]).toList()),\n      json[\"language_localname\"] ?? \"\",\n      tags,\n      json[\"date\"],\n      files,\n      List<String>.from((json[\"groups\"]??[]).map((e) => e[\"group\"]).toList()),\n      brief.data.cover,\n    ));\n  }\n}\n\nenum HitomiUrls{\n  homePageAll('https://ltn.hitomi.la/index-all.nozomi'),\n  homePageCn(\"https://ltn.hitomi.la/index-chinese.nozomi\"),\n  homePageJp(\"https://ltn.hitomi.la/index-japanese.nozomi\"),\n  homePageEn(\"https://ltn.hitomi.la/index-english.nozomi\");\n\n  final String url;\n\n  const HitomiUrls(this.url);\n}\n\nclass HitomiDataUrls{\n  static String homePageAll = 'https://ltn.hitomi.la/index-all.nozomi';\n  static String homePageCn = \"https://ltn.hitomi.la/index-chinese.nozomi\";\n  static String homePageJp = \"https://ltn.hitomi.la/index-japanese.nozomi\";\n  static String homePageEn = \"https://ltn.hitomi.la/index-english.nozomi\";\n  static String todayPopular = \"https://ltn.hitomi.la/popular/today-all.nozomi\";\n  static String weekPopular = \"https://ltn.hitomi.la/popular/week-all.nozomi\";\n  static String monthPopular = \"https://ltn.hitomi.la/popular/month-all.nozomi\";\n  static String yearPopular = \"https://ltn.hitomi.la/popular/year-all.nozomi\";\n}"
  },
  {
    "path": "lib/network/hitomi_network/hitomi_models.dart",
    "content": "import 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/network/base_comic.dart';\n\nclass Tag {\n  String name;\n  String link;\n\n  Tag(this.name, this.link);\n}\n\nclass HitomiComicBrief extends BaseComic {\n  String name;\n  String type;\n  String lang;\n  List<Tag> tagList;\n  String time;\n  String artist;\n  String link;\n  @override\n  String cover;\n\n  HitomiComicBrief(\n    this.name,\n    this.type,\n    this.lang,\n    this.tagList,\n    this.time,\n    this.artist,\n    this.link,\n    this.cover,\n  );\n\n  @override\n  String get description => lang;\n\n  @override\n  String get id => link;\n\n  @override\n  String get subTitle => artist;\n\n  @override\n  List<String> get tags => tagList.map((e) => e.name).toList();\n\n  @override\n  String get title => name;\n\n  @override\n  bool get enableTagsTranslation => true;\n}\n\nclass ComicList {\n  ///数据源\n  String url;\n\n  ///要获取的开始位置\n  int toLoad = 0;\n\n  ///总共的byte数量\n  int total = 100;\n\n  List<int> comicIds = [];\n\n  ComicList(this.url);\n}\n\nclass HitomiFile {\n  String name;\n  String hash;\n  bool hasWebp;\n  bool hasAvif;\n  int height;\n  int width;\n  String galleryId;\n\n  HitomiFile(this.name, this.hash, this.hasWebp, this.hasAvif, this.height,\n      this.width, this.galleryId);\n\n  Map<String, dynamic> toMap() => {\n        \"name\": name,\n        \"hash\": hash,\n        \"hasWebp\": hasWebp,\n        \"hasAvif\": hasAvif,\n        \"height\": height,\n        \"width\": width,\n        \"galleryId\": galleryId\n      };\n\n  HitomiFile.fromMap(Map<String, dynamic> map)\n      : name = map[\"name\"],\n        hash = map[\"hash\"],\n        hasWebp = map[\"hasWebp\"],\n        hasAvif = map[\"hasAvif\"],\n        height = map[\"height\"],\n        width = map[\"width\"],\n        galleryId = map[\"galleryId\"];\n}\n\nclass HitomiComic with HistoryMixin {\n  String id;\n  String name;\n  List<int> related;\n  String type;\n  List<String>? artists;\n  String lang;\n  List<Tag> tags;\n  String time;\n  List<HitomiFile> files;\n  List<String> group;\n\n  HitomiComic(\n    this.id,\n    this.name,\n    this.related,\n    this.type,\n    this.artists,\n    this.lang,\n    this.tags,\n    this.time,\n    this.files,\n    this.group,\n    this.cover,\n  ) {\n    if (group.isEmpty) {\n      group.add(\"N/A\");\n    }\n    if (artists == null || artists!.isEmpty) {\n      artists = [\"N/A\"];\n    }\n  }\n\n  Map<String, dynamic> toMap() => {\n        \"id\": id,\n        \"name\": name,\n        \"type\": type,\n        \"artists\": artists,\n        \"lang\": lang,\n        \"time\": time,\n        \"files\": List<Map<String, dynamic>>.generate(\n            files.length, (index) => files[index].toMap())\n      };\n\n  HitomiComic.fromMap(Map<String, dynamic> map)\n      : id = map[\"id\"],\n        name = map[\"name\"],\n        type = map[\"type\"],\n        artists = List<String>.from(map[\"artists\"]),\n        lang = map[\"lang\"],\n        time = map[\"time\"],\n        tags = [],\n        related = [],\n        group = [],\n        cover = '',\n        files = List.generate(map[\"files\"].length,\n            (index) => HitomiFile.fromMap(map[\"files\"][index]));\n\n  HitomiComicBrief toBrief(String link, String cover) => HitomiComicBrief(\n      name,\n      type,\n      lang,\n      tags,\n      time,\n      (artists ?? [\"未知\"]).isEmpty ? \"未知\" : (artists ?? [\"未知\"])[0],\n      link,\n      cover);\n\n  @override\n  final String cover;\n\n  @override\n  HistoryType get historyType => HistoryType.hitomi;\n\n  @override\n  String get subTitle => artists?.firstOrNull ?? '';\n\n  @override\n  String get target => id;\n\n  @override\n  String get title => name;\n}\n"
  },
  {
    "path": "lib/network/hitomi_network/image.dart",
    "content": "import 'package:pica_comic/foundation/def.dart';\n\nimport 'hitomi_models.dart';\nimport 'package:dio/dio.dart';\n\n///获取图像url使用的一个临时的类\n///\n/// 需要发起一个网络请求获取gg.js并对其进行解析\n///\n/// gg.js内容会动态变化\nclass GG{\n  List<String> numbers = [];\n  int initialG = 1;\n  int mm(int g){\n    if(numbers.contains(g.toString())){\n      return ~initialG&1;\n    }else{\n      return initialG;\n    }\n  }\n\n  static String s(String h) {\n    RegExp exp = RegExp(r'(..)(.)$');\n    Match? m = exp.firstMatch(h);\n    if (m != null) {\n      int g = int.parse(m.group(2)! + m.group(1)!, radix: 16);\n      return g.toString();\n    } else {\n      return \"\";\n    }\n  }\n\n  String? b;\n\n  ///通过缓存减少请求时间, 短时间内gg.js不会变化\n  static DateTime? cacheTime;\n  static String? cacheB;\n  static List<String>? cacheNumbers;\n\n  Future<void> getGg(String galleryId) async{\n    if(cacheTime!=null && DateTime.now().millisecondsSinceEpoch - cacheTime!.millisecondsSinceEpoch < 100){\n      numbers = cacheNumbers!;\n      b = cacheB!;\n      return;\n    }\n    var dio = Dio(BaseOptions(\n        responseType: ResponseType.plain,\n        headers: {\n          \"User-Agent\": webUA,\n          \"Referer\": \"https://hitomi.la/reader/$galleryId.html\"\n        }\n    ));\n    var res = await dio.get<String>(\"https://ltn.hitomi.la/gg.js?_=1683939645979\");\n    RegExp exp = RegExp(r'(?<=case )\\d+');\n    Iterable<RegExpMatch> matches = exp.allMatches(res.data!);\n    numbers = [];\n    for (RegExpMatch match in matches) {\n      numbers.add(match.group(0)!);\n    }\n    exp = RegExp(r\"(?<=b: ')\\d+\");\n    b = exp.firstMatch(res.data!)![0];\n    exp = RegExp(r\"(?<=var o = )[0-9]+\");\n    initialG = int.parse(exp.firstMatch(res.data!)![0]!);\n    cacheTime = DateTime.now();\n    cacheB = b;\n    cacheNumbers = numbers;\n  }\n\n  String subdomainFromUrl(String url, String? base){\n    var retval = 'b';\n    if (base != null) {\n      retval = base;\n    }\n\n    var b = 16;\n    var m = RegExp(r\"/[0-9a-f]{61}([0-9a-f]{2})([0-9a-f])\").firstMatch(url);\n    if(m == null){\n      return 'a';\n    }\n    int g = int.parse(m[2]! + m[1]!, radix: b);\n    if (!g.isNaN) {\n      retval = String.fromCharCode(97 + mm(g)) + retval;\n    }\n    return retval;\n  }\n\n  String fullPathFromHash(String hash) {\n    return '$b/${GG.s(hash)}/$hash';\n  }\n\n  String realFullPathFromHash(String hash) {\n    RegExp regex = RegExp(r'^.*(..)(.)$');\n    String newPath = regex.stringMatch(hash)!.replaceAllMapped(regex, (match) {\n      return '${match.group(2)}/${match.group(1)}/$hash';\n    });\n    return newPath;\n  }\n\n  String urlFromUrl(String url, String? base) {\n    return url.replaceFirst(RegExp(r\"//..?\\.hitomi\\.la/\"), '//${subdomainFromUrl(url, base)}.hitomi.la/');\n  }\n\n  String urlFromHash(HitomiFile image, String? dir, String? ext) {\n    ext ??= dir ??= image.name.split('.').last;\n    dir ??= 'images';\n    if(dir.contains('small')){\n      return 'https://a.hitomi.la/$dir/${realFullPathFromHash(image.hash)}.$ext';\n    }\n    return 'https://a.hitomi.la/$dir/${fullPathFromHash(image.hash)}.$ext';\n  }\n\n  ///获取图像信息\n  Future<String> urlFromUrlFromHash(String galleryId, HitomiFile image, String? dir, String? ext, [String subDomainBase = 'a']) async{\n    await getGg(galleryId);\n    return urlFromUrl(urlFromHash(image, dir, ext), subDomainBase);\n  }\n}"
  },
  {
    "path": "lib/network/hitomi_network/search.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:math';\nimport 'dart:typed_data';\nimport 'package:crypto/crypto.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:pica_comic/foundation/def.dart';\nimport '../res.dart';\n\nclass HitomiSearch{\n  final domain = 'https://ltn.hitomi.la';\n  var results = <int>[];\n  String? tagIndexVersion;\n  final dio = Dio();\n  final nozomiExtension = '.nozomi';\n  var indexDir = 'galleriesindex';\n  var galleriesIndexDir = 'galleriesindex';\n  var languagesIndexDir = 'languagesindex';\n  var nozomiUrlIndexDir = 'nozomiurlindex';\n  final String keyword;\n\n  HitomiSearch(this.keyword);\n\n  Future<Res<List<int>>> search() async{\n    await getTagIndexVersion();\n    var terms = keyword.toLowerCase().trim().split(RegExp(r\"\\s+\"));\n    var negativeTerms = <String>[];\n    var positiveTerms = <String>[];\n    for(var term in terms){\n      term = term.replaceAll('_', ' ');\n      if (term.startsWith('-')) {\n        negativeTerms.add(term.replaceFirst('-', ''));\n      } else {\n        positiveTerms.add(term);\n      }\n    }\n    //first results\n    if(positiveTerms.isEmpty){\n      results = await getGalleryIdsFromNozomi(null, 'index', 'all');\n    }else{\n      final term = positiveTerms.removeAt(0);\n      results = await getGalleryIdsForQuery(term);\n    }\n    //positive results\n    for(var term in positiveTerms){\n      var res = await getGalleryIdsForQuery(term);\n      var newRes = <int>[];\n\n      int p1 = 0;\n      int p2 = 0;\n      while(p1 < res.length && p2 < results.length){\n        if(res[p1] > results[p2]){\n          p1++;\n        } else if(res[p1] < results[p2]){\n          p2++;\n        } else {\n          newRes.add(res[p1]);\n          p1++;\n          p2++;\n        }\n      }\n\n      results = newRes;\n    }\n    //negative results\n    for(var term in negativeTerms){\n      var res = await getGalleryIdsForQuery(term);\n      var newRes = <int>[];\n\n      int p1 = 0;\n      int p2 = 0;\n      while(p1 < res.length && p2 < results.length){\n        if(res[p1] > results[p2]){\n          p1++;\n          newRes.add(res[p1]);\n        } else if(res[p1] < results[p2]){\n          p2++;\n          newRes.add(res[p2]);\n        } else {\n          p1++;\n          p2++;\n        }\n      }\n      results = newRes;\n    }\n    return Res(results);\n  }\n\n  Future<void> getTagIndexVersion() async{\n    var res = await dio.get(\n        \"$domain/galleriesindex/version?_=${DateTime.now().millisecondsSinceEpoch ~/ 1000}\",\n        options: Options(\n            responseType: ResponseType.plain\n        )\n    );\n    tagIndexVersion = res.data;\n  }\n\n  Future<List<int>> getGalleryIdsFromNozomi(String? area, String tag, String language) async{\n    var url = \"$domain/n/$tag-$language$nozomiExtension\";\n    if(area != null){\n      url = \"$domain/n/$area/$tag-$language$nozomiExtension\";\n    }\n    var bytes = (await dio.get<Uint8List>(url, options: Options(\n      responseType: ResponseType.bytes\n    ))).data;\n    var comicIds = <int>[];\n    for (int i = 0; i < bytes!.length; i += 4) {\n      Int8List list = Int8List(4);\n      list[0] = bytes[i];\n      list[1] = bytes[i + 1];\n      list[2] = bytes[i + 2];\n      list[3] = bytes[i + 3];\n      int number = list.buffer.asByteData().getInt32(0);\n      comicIds.add(number);\n    }\n    return comicIds;\n  }\n\n  Future<List<int>> getGalleryIdsForQuery(String query) async{\n    query = query.replaceAll(\"_\", \" \");\n    if(query.contains(\":\")){\n      final sides = query.split(\":\");\n      final ns = sides[0];\n      var tag = sides[1];\n      String? area = ns;\n      var language = 'all';\n\n      if(ns == 'female' || ns == 'male'){\n        area = 'tag';\n        tag = query;\n      }else if(ns == 'language'){\n        area = null;\n        language = tag;\n        tag = 'index';\n      }\n\n      return getGalleryIdsFromNozomi(area, tag, language);\n    }\n    final key = hashTerm(query);\n    const field = 'galleries';\n    var node = await getNodeAtAddress(field, 0);\n    if(node == null){\n      return [];\n    }else{\n      var data = await bSearch(field, key, node);\n      if(data == null){\n        return [];\n      }else{\n        return getGalleryIdsFromData(data);\n      }\n    }\n  }\n\n  Uint8List hashTerm(String term){\n    List<int> hash = sha256.convert(utf8.encode(term)).bytes;\n    return Uint8List.fromList(hash.sublist(0, 4));\n  }\n\n  Future<Node?> getNodeAtAddress(String field, int address) async{\n    const maxNodeSize = 464;\n    var url = '$domain/$indexDir/$field.${tagIndexVersion!}.index';\n    var res = await getUrlAtRange(url, [address, address + maxNodeSize - 1]);\n    if(res == null){\n      return null;\n    }else{\n      return decodeNodeData(res);\n    }\n  }\n\n  Future<Uint8List?> getUrlAtRange(String url, List<int> range) async{\n    assert(range.length==2);\n    var cachePath = await getApplicationCacheDirectory();\n    var key = md5.convert(const Utf8Encoder().convert(url + range.toString()));\n    var cacheFile = File(\"${cachePath.path}${Platform.pathSeparator}hitomi${Platform.pathSeparator}$key\");\n    if(cacheFile.existsSync()){\n      return cacheFile.readAsBytesSync();\n    }\n    var res = await dio.get<List<int>>(url, options: Options(\n      responseType: ResponseType.bytes,\n      headers: {\n        'Range': \"bytes=${range[0]}-${range[1]}\",\n        'User-Agent': webUA,\n        'Referer': 'https://hitomi.la/search.html',\n        'Origin': \"https://hitomi.la\"\n      }\n    ));\n    cacheFile.createSync(recursive: true);\n    cacheFile.writeAsBytesSync(res.data!);\n    return Uint8List.fromList(res.data!);\n  }\n\n  Future<Node?> decodeNodeData(Uint8List data) async{\n    ByteData view = ByteData.view(data.buffer);\n    int pos = 0;\n    int numberOfKeys = view.getInt32(pos, Endian.big);\n    pos += 4;\n\n    List<Uint8List> keys = [];\n    for (int i = 0; i < numberOfKeys; i++) {\n      int keySize = view.getInt32(pos, Endian.big);\n      if (keySize == 0 || keySize > 32) {\n        return null;\n      }\n      pos += 4;\n      keys.add(data.sublist(pos, pos + keySize));\n      pos += keySize;\n    }\n\n    int numberOfDatas = view.getInt32(pos, Endian.big);\n    pos += 4;\n    List<List<int>> datas = [];\n    for (int i = 0; i < numberOfDatas; i++) {\n      int offset = view.getUint64(pos, Endian.big);\n      pos += 8;\n\n      int length = view.getInt32(pos, Endian.big);\n      pos += 4;\n\n      datas.add([offset, length]);\n    }\n\n    const B = 16;\n    int numberOfSubnodeAddresses = B + 1;\n    List<int> subnodeAddresses = [];\n    for (int i = 0; i < numberOfSubnodeAddresses; i++) {\n      int subnodeAddress = view.getUint64(pos, Endian.big);\n      if(i != 0 && subnodeAddress < subnodeAddresses.last){\n        continue;\n      }\n      pos += 8;\n      subnodeAddresses.add(subnodeAddress);\n    }\n\n    return Node(keys, datas, subnodeAddresses);\n  }\n\n  Future<List<int>?> bSearch(String field, Uint8List key, Node? node) async{\n    if(node == null){\n      return null;\n    }\n\n    if(node.keys.isEmpty){\n      return null;\n    }\n\n    int compareArrayBuffers(Uint8List a, Uint8List b){\n      final top = min(a.length, b.length);\n      for(var i=0;i<top;i++){\n        if(a[i] < b[i]){\n          return -1;\n        }else if(a[i] > b[i]){\n          return 1;\n        }\n      }\n      return 0;\n    }\n\n    List<dynamic> locateKey(Uint8List key, Node node){\n      var cmpResult = -1;\n      int i;\n      for(i=0;i<node.keys.length;i++){\n        cmpResult = compareArrayBuffers(key, node.keys[i]);\n        if(cmpResult <= 0){\n          break;\n        }\n      }\n      return [cmpResult==0, i];\n    }\n\n    bool isLeaf(Node node){\n      for(var i = 0; i< node.subNodeAddresses.length; i++){\n        if(node.subNodeAddresses[i]!=0){\n          return false;\n        }\n      }\n      return true;\n    }\n\n    var [there, where] = locateKey(key, node);\n    assert(there is bool && where is int);\n    if(there){\n      return node.data[where];\n    }else if(isLeaf(node)){\n      return null;\n    }\n\n    if(node.subNodeAddresses[where] == 0){\n      return null;\n    }\n\n    var next = await getNodeAtAddress(field, node.subNodeAddresses[where]);\n    return bSearch(field, key, next);\n  }\n\n  Future<List<int>> getGalleryIdsFromData(List<int>? data) async{\n    if(data==null){\n      return [];\n    }\n    assert(data.length==2);\n    var [offset, length] = data;\n    if(length > 100000000 || length <= 0){\n      if(kDebugMode){\n        print(\"length $length is too long\");\n      }\n    }\n    var url = '$domain/$galleriesIndexDir/galleries.${tagIndexVersion!}.data';\n    var inbuf = await getUrlAtRange(url, [offset, offset+length-1]);\n    if(inbuf == null){\n      return [];\n    }\n    var galleryIds = <int>[];\n    var pos = 0;\n    ByteData view = ByteData.view(inbuf.buffer);\n    var numberOfGalleryIds = view.getInt32(pos);\n    pos += 4;\n    var expectedLength = numberOfGalleryIds * 4 + 4;\n    if (numberOfGalleryIds > 10000000 || numberOfGalleryIds <= 0){\n      return [];\n    } else if (inbuf.length != expectedLength){\n      return [];\n    }\n\n    for(var i = 0; i < numberOfGalleryIds; i++){\n      galleryIds.add(view.getInt32(pos));\n      pos += 4;\n    }\n    return galleryIds;\n  }\n}\n\nclass Node{\n  List<Uint8List> keys;\n  ///数据, 个体为[offset, length]\n  List<List<int>> data;\n  List<int> subNodeAddresses;\n\n  Node(this.keys, this.data, this.subNodeAddresses);\n}"
  },
  {
    "path": "lib/network/htmanga_network/ht_download_model.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'dart:typed_data';\nimport 'package:pica_comic/network/htmanga_network/htmanga_main_network.dart';\nimport 'package:pica_comic/network/htmanga_network/models.dart';\nimport 'package:pica_comic/network/download_model.dart';\nimport '../../base.dart';\nimport '../../foundation/image_manager.dart';\nimport '../../tools/io_tools.dart';\n\nclass DownloadedHtComic extends DownloadedItem {\n  DownloadedHtComic(this.comic, this.size);\n\n  HtComicInfo comic;\n\n  double? size;\n\n  @override\n  double? get comicSize => size;\n\n  @override\n  List<int> get downloadedEps => [0];\n\n  @override\n  List<String> get eps => [\"EP 1\"];\n\n  @override\n  String get id => \"Ht${comic.id}\";\n\n  @override\n  String get name => comic.name;\n\n  @override\n  String get subTitle => comic.uploader;\n\n  @override\n  DownloadType get type => DownloadType.htmanga;\n\n  @override\n  Map<String, dynamic> toJson() => {\"comic\": comic.toJson(), \"size\": size};\n\n  DownloadedHtComic.fromJson(Map<String, dynamic> json)\n      : comic = HtComicInfo.fromJson(json[\"comic\"]),\n        size = json[\"size\"];\n\n  @override\n  set comicSize(double? value) => size = value;\n\n  @override\n  List<String> get tags => comic.tags.keys.toList();\n}\n\nclass DownloadingHtComic extends DownloadingItem {\n  DownloadingHtComic(\n      this.comic, super.whenFinish, super.whenError, super.updateInfo, super.id,\n      {super.type = DownloadType.htmanga});\n\n  final HtComicInfo comic;\n\n  String _getCover() {\n    var uri = comic.coverPath;\n    if (uri.contains(\"https:\") && !uri.contains(\"https://\")) {\n      uri = uri.replaceFirst(\"https:\", \"https://\");\n    }\n    return uri;\n  }\n\n  @override\n  String get cover => _getCover();\n\n  @override\n  String get title => comic.name;\n\n  @override\n  Future<Map<int, List<String>>> getLinks() async {\n    var res = await HtmangaNetwork().getImages(comic.id);\n    return {0: res.data};\n  }\n\n  @override\n  Stream<DownloadProgress> downloadImage(String link) {\n    return ImageManager().getImage(link);\n  }\n\n  @override\n  Map<String, dynamic> toMap() =>\n      {\"comic\": comic.toJson(), ...super.toBaseMap()};\n\n  DownloadingHtComic.fromMap(\n      Map<String, dynamic> map,\n      DownloadProgressCallback whenFinish,\n      DownloadProgressCallback whenError,\n      DownloadProgressCallbackAsync updateInfo,\n      String id)\n      : comic = HtComicInfo.fromJson(map[\"comic\"]),\n        super.fromMap(map, whenFinish, whenError, updateInfo);\n\n  @override\n  FutureOr<DownloadedItem> toDownloadedItem() async {\n    return DownloadedHtComic(\n      comic,\n      await getFolderSize(Directory(path)),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/network/htmanga_network/htmanga_main_network.dart",
    "content": "import 'dart:convert';\nimport 'dart:math';\nimport 'package:dio/dio.dart';\nimport 'package:pica_comic/comic_source/built_in/ht_manga.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/cache_network.dart';\nimport 'package:pica_comic/network/cookie_jar.dart';\nimport 'package:pica_comic/network/htmanga_network/models.dart';\nimport 'package:pica_comic/network/app_dio.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:html/parser.dart';\nimport 'package:pica_comic/pages/pre_search_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport '../../base.dart';\n\nclass HtmangaNetwork {\n  ///用于获取绅士漫画的网络请求类\n  factory HtmangaNetwork() => _cache ?? (_cache = HtmangaNetwork._create());\n\n  static HtmangaNetwork? _cache;\n\n  HtmangaNetwork._create();\n\n  static String get baseUrl => appdata.settings[31];\n\n  void logout() {\n    SingleInstanceCookieJar.instance?.deleteUri(Uri.parse(baseUrl));\n  }\n\n  ///基本的Get请求\n  Future<Res<String>> get(String url,\n      {bool cache = true, Map<String, String>? headers}) async {\n    var dio = CachedNetwork();\n    try {\n      var res = await dio.get(\n          url,\n          BaseOptions(headers: {\n            \"User-Agent\": webUA,\n            if (headers != null) ...headers\n          }),\n          cookieJar: SingleInstanceCookieJar.instance,\n          expiredTime: cache ? CacheExpiredTime.short : CacheExpiredTime.no);\n      if(res.url.contains(\"users-login\")){\n        return Res(null, errorMessage: \"未登录或登录到期\".tl);\n      }\n      return Res(res.data);\n    } on DioException catch (e) {\n      if (e.type == DioExceptionType.connectionTimeout ||\n          e.type == DioExceptionType.sendTimeout ||\n          e.type == DioExceptionType.receiveTimeout) {\n        return const Res(null, errorMessage: \"连接超时\");\n      } else {\n        return Res(null, errorMessage: e.toString());\n      }\n    } catch (e) {\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///基本的Post请求\n  Future<Res<String>> post(String url, String data) async {\n    var dio = logDio(BaseOptions(headers: {\n      \"User-Agent\": webUA,\n      \"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\"\n    }));\n    dio.interceptors.add(CookieManagerSql(SingleInstanceCookieJar.instance!));\n    try {\n      var res = await dio.post(url, data: data);\n      return Res(res.data);\n    } on DioException catch (e) {\n      if (e.type == DioExceptionType.connectionTimeout ||\n          e.type == DioExceptionType.sendTimeout ||\n          e.type == DioExceptionType.receiveTimeout) {\n        return const Res(null, errorMessage: \"连接超时\");\n      } else {\n        return Res(null, errorMessage: e.toString());\n      }\n    } catch (e) {\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///登录\n  Future<Res<bool>> login(String account, String pwd, [bool saveData = true]) async {\n    var res = await post(\"$baseUrl/users-check_login.html\",\n        \"login_name=${Uri.encodeComponent(account)}&login_pass=${Uri.encodeComponent(pwd)}\");\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var json = const JsonDecoder().convert(res.data);\n      if (json[\"html\"].contains(\"登錄成功\")) {\n        return const Res(true);\n      }\n      return Res(null, errorMessage: json[\"html\"]);\n    } catch (e) {\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<bool>> loginFromAppdata() async {\n    var res = await htManga.reLogin();\n    return res ? const Res(true) : const Res.error(\"error\");\n  }\n\n  Future<Res<HtHomePageData>> getHomePage() async {\n    var res = await get(baseUrl, cache: false);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var document = parse(res.data);\n      var titles = document.querySelectorAll(\"div.title_sort\");\n      var comicBlocks = document.querySelectorAll(\"div.bodywrap\");\n      Map<String, String> titleRes = {};\n      for (var title in titles) {\n        var text = title.querySelector(\"div.title_h2\")!.text;\n        text = text.replaceAll(\"\\n\", \"\").removeAllBlank;\n        var link = title.querySelector(\"div.r > a\")!.attributes[\"href\"]!;\n        link = baseUrl + link;\n        titleRes[text] = link;\n      }\n      var comicsRes = <List<HtComicBrief>>[];\n      for (var block in comicBlocks) {\n        var cs = block.querySelectorAll(\"div.gallary_wrap > ul.cc > li\");\n        var comics = <HtComicBrief>[];\n        for (var c in cs) {\n          var link = c.querySelector(\"div.pic_box > a\")!.attributes[\"href\"]!;\n          var id = RegExp(r\"(?<=-aid-)[0-9]+\").firstMatch(link)![0]!;\n          var image =\n              c.querySelector(\"div.pic_box > a > img\")!.attributes[\"src\"]!;\n          image = \"https:$image\";\n          var name = c.querySelector(\"div.info > div.title > a\")!.text;\n          var infoCol = c.querySelector(\"div.info > div.info_col\")!.text;\n          var lr = infoCol.split(\",\");\n          var time = lr[0];\n          var pagesStr = \"\";\n          for (int i = 0; i < lr[1].length; i++) {\n            if (lr[1][i].isNum) {\n              pagesStr += lr[1][i];\n            }\n          }\n          var pages = int.parse(pagesStr);\n          try {\n            comics.add(HtComicBrief(name, time, image, id, pages));\n          } finally {}\n        }\n        comicsRes.add(comics);\n      }\n      if (comicsRes.length != titleRes.length) {\n        throw Exception(\"漫画块数量和标题数量不相等\");\n      }\n      return Res(HtHomePageData(comicsRes, titleRes));\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyze\", \"$e\\n$s\");\n      return Res(null, errorMessage: \"解析失败: $e\");\n    }\n  }\n\n  /// 获取给定漫画列表页面的漫画\n  Future<Res<List<HtComicBrief>>> getComicList(String url, int page, {bool searchPage = false}) async {\n    if (page != 1) {\n      if (url.contains(\"search\")) {\n        url = \"$url&p=$page\";\n      } else {\n        if (!url.contains(\"-\")) {\n          url = url.replaceAll(\".html\", \"-.html\");\n        }\n        url = url.replaceAll(\"index\", \"\");\n        var lr = url.split(\"albums-\");\n        lr[1] = \"index-page-$page${lr[1]}\";\n        url = \"${lr[0]}albums-${lr[1]}\";\n      }\n    }\n    var res = await get(url, cache: false);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var document = parse(res.data);\n      var comics = <HtComicBrief>[];\n      for (var comic in document\n          .querySelectorAll(\"div.grid div.gallary_wrap > ul.cc > li\")) {\n        try {\n          var link =\n              comic.querySelector(\"div.pic_box > a\")!.attributes[\"href\"]!;\n          var id = RegExp(r\"(?<=-aid-)[0-9]+\").firstMatch(link)![0]!;\n          var image =\n              comic.querySelector(\"div.pic_box > a > img\")!.attributes[\"src\"]!;\n          image = \"https:$image\";\n          var name = comic\n              .querySelector(\"div.info > div.title > a\")!\n              .attributes[\"title\"]\n              ?.replaceAll(\"<em>\", \"\")\n              .replaceAll(\"</em>\", \"\");\n          name = name ??\n              comic\n                  .querySelector(\"div.info > div.title > a\")!\n                  .text\n                  .replaceAll(\"<em>\", \"\")\n                  .replaceAll(\"</em>\", \"\");\n          var infoCol = comic.querySelector(\"div.info > div.info_col\")!.text;\n          var lr = infoCol.split(\"，\");\n          var time = lr[1].removeAllBlank;\n          time = time.replaceAll(\"\\n\", \"\");\n          var pagesStr = \"\";\n          for (int i = 0; i < lr[0].length; i++) {\n            if (lr[0][i].isNum) {\n              pagesStr += lr[0][i];\n            }\n          }\n          var pages = pagesStr == \"\" ? 0 : int.parse(pagesStr);\n          comics.add(HtComicBrief(name, time, image, id, pages));\n        } catch (e) {\n          continue;\n        }\n      }\n      int pages;\n      try {\n        if(searchPage){\n          var result = int.parse(document.querySelectorAll(\"p.result > b\")[0].text.nums);\n          var comicsOnePage = document.querySelectorAll(\"div.grid div.gallary_wrap > ul.cc > li\").length;\n          pages = result ~/ comicsOnePage + 1;\n        }else{\n          var pagesLink = document.querySelectorAll(\"div.f_left.paginator > a\");\n          pages = int.parse(pagesLink.last.text);\n        }\n      } catch (e) {\n        pages = 1;\n      }\n      return Res(comics, subData: pages);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<List<HtComicBrief>>> search(String keyword, int page) {\n    if (keyword != \"\") {\n      appdata.searchHistory.remove(keyword);\n      appdata.searchHistory.add(keyword);\n      appdata.writeHistory();\n    }\n    Future.delayed(const Duration(milliseconds: 300),\n            () => StateController.find<PreSearchController>().update())\n        .onError((error, stackTrace) => null);\n    return getComicList(\n        \"$baseUrl/search/?q=${Uri.encodeComponent(keyword)}&f=_all&s=create_time_DESC&syn=yes\",\n        page, searchPage: true);\n  }\n\n  /// 获取漫画详情, subData为第一页的缩略图\n  Future<Res<HtComicInfo>> getComicInfo(String id) async {\n    var res =\n        await get(\"$baseUrl/photos-index-page-1-aid-$id.html\", cache: false);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var document = parse(res.data);\n      var name = document.querySelector(\"div.userwrap > h2\")!.text;\n      var coverPath = document\n          .querySelector(\n              \"div.userwrap > div.asTB > div.asTBcell.uwthumb > img\")!\n          .attributes[\"src\"]!;\n      coverPath = \"https:$coverPath\";\n      coverPath = coverPath.replaceRange(6, 8, \"\");\n      var labels = document.querySelectorAll(\"div.asTBcell.uwconn > label\");\n      var category = labels[0].text.split(\"：\")[1];\n      var pages = int.parse(\n          RegExp(r\"\\d+\").firstMatch(labels[1].text.split(\"：\")[1])![0]!);\n      var tagsDom = document.querySelectorAll(\"a.tagshow\");\n      var tags = <String, String>{};\n      for (var tag in tagsDom) {\n        var link = tag.attributes[\"href\"]!;\n        tags[tag.text] = link;\n      }\n      var description = document.querySelector(\"div.asTBcell.uwconn > p\")!.text;\n      var uploader =\n          document.querySelector(\"div.asTBcell.uwuinfo > a > p\")!.text;\n      var avatar = document\n          .querySelector(\"div.asTBcell.uwuinfo > a > img\")!\n          .attributes[\"src\"]!;\n      avatar = \"$baseUrl/$avatar\";\n      var uploadNum = int.parse(\n          document.querySelector(\"div.asTBcell.uwuinfo > p > font\")!.text);\n      var photosDom = document.querySelectorAll(\"div.pic_box.tb > a > img\");\n      var photos = List<String>.generate(photosDom.length,\n          (index) => \"https:${photosDom[index].attributes[\"src\"]!}\");\n      return Res(\n          HtComicInfo(id, coverPath, name, category, pages, tags, description,\n              uploader, avatar, uploadNum, photos));\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<List<String>>> getThumbnails(String id, int page) async {\n    var res = await get(\"$baseUrl/photos-index-page-$page-aid-$id.html\");\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var document = parse(res.data);\n      var photosDom = document.querySelectorAll(\"div.pic_box.tb > a > img\");\n      var photos = List<String>.generate(photosDom.length,\n          (index) => \"https:${photosDom[index].attributes[\"src\"]!}\");\n      return Res(photos);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<List<String>>> getImages(String id) async {\n    var res = await get(\"$baseUrl/photos-gallery-aid-$id.html\");\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var urls = RegExp(r\"(?<=//)[\\w./\\[\\]()-]+\").allMatches(res.data);\n      var images = <String>[];\n      for (var url in urls) {\n        images.add(\"https://${url[0]!}\");\n      }\n      return Res(images);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  /// 获取收藏夹\n  ///\n  /// 返回Map, 值为收藏夹名，键为ID\n  Future<Res<Map<String, String>>> getFolders() async {\n    var res = await get(\n        \"$baseUrl/users-addfav-id-210814.html\",\n        cache: false);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var document = parse(res.data);\n      var data = <String, String>{};\n      for (var option in document.querySelectorAll(\"option\")) {\n        if (option.attributes[\"value\"] == \"\") continue;\n        data[option.attributes[\"value\"]!] = option.text;\n      }\n      return Res(data);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<bool> createFolder(String name) async => !(await post(\n          \"$baseUrl/users-favc_save-id.html\",\n          \"favc_name=${Uri.encodeComponent(name)}\"))\n      .error;\n\n  Future<bool> deleteFolder(String id) async => !(await get(\n          \"$baseUrl/users-favclass_del-id-$id.html\"\n          \"?ajax=true&_t=${Random.secure().nextDouble()}\",\n          cache: false))\n      .error;\n\n  Future<Res<bool>> addFavorite(String comicId, String folderId) async {\n    var res = await post(\n        \"$baseUrl/users-save_fav-id-$comicId.html\", \"favc_id=$folderId\");\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    return const Res(true);\n  }\n\n  Future<Res<bool>> delFavorite(String favoriteId) async {\n    var res = await get(\n      \"$baseUrl/users-fav_del-id-$favoriteId.html?\"\n      \"ajax=true&_t=${Random.secure().nextDouble()}\",\n      cache: false,\n    );\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    return const Res(true);\n  }\n\n  ///获取收藏夹中的漫画\n  Future<Res<List<HtComicBrief>>> getFavoriteFolderComics(\n      String folderId, int page) async {\n    var res = await get(\n      \"$baseUrl/users-users_fav-page-$page-c-$folderId.html\",\n      cache: false,\n    );\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var document = parse(res.data);\n      var comics = <HtComicBrief>[];\n      for (var comic in document.querySelectorAll(\"div.asTB\")) {\n        var cover = comic\n            .querySelector(\"div.asTBcell.thumb > div > img\")!\n            .attributes[\"src\"]!;\n        cover = \"https:$cover\";\n        var time = comic\n            .querySelector(\"div.box_cel.u_listcon > p.l_catg > span\")!\n            .text\n            .replaceAll(\"創建時間：\", \"\");\n        var name =\n            comic.querySelector(\"div.box_cel.u_listcon > p.l_title > a\")!.text;\n        var link = comic\n            .querySelector(\"div.box_cel.u_listcon > p.l_title > a\")!\n            .attributes[\"href\"]!;\n        var id = RegExp(r\"(?<=-aid-)[0-9]+\").firstMatch(link)![0]!;\n        var info =\n            comic.querySelector(\"div.box_cel.u_listcon > p.l_detla\")!.text;\n        var pages = int.parse(RegExp(r\"(?<=頁數：)[0-9]+\").firstMatch(info)![0]!);\n        var delUrl = comic\n            .querySelector(\"div.box_cel.u_listcon > p.alopt > a\")!\n            .attributes[\"onclick\"]!;\n        var favoriteId = RegExp(r\"(?<=del-id-)[0-9]+\").firstMatch(delUrl)![0];\n        comics.add(\n            HtComicBrief(name, time, cover, id, pages, favoriteId: favoriteId));\n      }\n      int pages;\n      try {\n        var pagesLink = document.querySelectorAll(\"div.f_left.paginator > a\");\n        pages = int.parse(pagesLink.last.text);\n      } catch (e) {\n        pages = page;\n      }\n      return Res(comics, subData: pages);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n}\n"
  },
  {
    "path": "lib/network/htmanga_network/models.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/network/base_comic.dart';\n\n@immutable\nclass HtHomePageData {\n  final List<List<HtComicBrief>> comics;\n  final Map<String, String> links;\n\n  /// 主页\n  const HtHomePageData(this.comics, this.links);\n}\n\n@immutable\nclass HtComicBrief extends BaseComic{\n  final String name;\n  final String time;\n  final String image;\n  final int pages;\n  @override\n  final String id;\n  final String? favoriteId;\n\n  /// 漫画简略信息\n  const HtComicBrief(this.name, this.time, this.image, this.id, this.pages,\n      {this.favoriteId});\n\n  @override\n  String get cover => image;\n\n  @override\n  String get description => time;\n\n  @override\n  String get subTitle => id;\n\n  @override\n  List<String> get tags => const [];\n\n  @override\n  String get title => name;\n}\n\n@immutable\nclass HtComicInfo with HistoryMixin {\n  final String id;\n  final String coverPath;\n  final String name;\n  final String category;\n  final int pages;\n  final Map<String, String> tags;\n  final String description;\n  final String uploader;\n  final String avatar;\n  final int uploadNum;\n  final List<String> thumbnails;\n\n  const HtComicInfo(this.id, this.coverPath, this.name, this.category, this.pages, this.tags,\n      this.description, this.uploader, this.avatar, this.uploadNum, this.thumbnails);\n\n  HtComicBrief toBrief() => HtComicBrief(name, \"\", coverPath, id, pages);\n\n  Map<String, dynamic> toJson() => {\n    \"id\": id,\n    \"coverPath\": coverPath,\n    \"name\": name,\n    \"category\": category,\n    \"pages\": pages,\n    \"tags\": tags,\n    \"description\": description,\n    \"uploader\": uploader,\n    \"avatar\": avatar,\n    \"uploadNum\": uploadNum\n  };\n\n  HtComicInfo.fromJson(Map<String, dynamic> json):\n      id = json[\"id\"],\n      coverPath = json[\"coverPath\"],\n      name = json[\"name\"],\n      category = json[\"category\"],\n      pages = json[\"pages\"],\n      tags = Map<String, String>.from(json[\"tags\"]),\n      description = json[\"description\"],\n      uploader = json[\"uploader\"],\n      avatar = json[\"avatar\"],\n      uploadNum = json[\"uploadNum\"],\n      thumbnails = [];\n\n  @override\n  String get cover => coverPath;\n\n  @override\n  HistoryType get historyType => HistoryType.htmanga;\n\n  @override\n  String get subTitle => uploader;\n\n  @override\n  String get target => id;\n\n  @override\n  String get title => name;\n}\n"
  },
  {
    "path": "lib/network/http_client.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport '../base.dart';\nimport '../foundation/app.dart';\n\n///获取系统设置中的代理, 仅windows,安卓有效\nFuture<String?> getProxy() async{\n  if(appdata.settings[58] == \"1\"){\n    final file = File(\"${App.dataPath}/rule.json\");\n    var json = const JsonDecoder().convert(file.readAsStringSync());\n    return \"${InternetAddress.loopbackIPv4.address}:${json[\"port\"]}\";\n  }\n\n  //手动设置的代理\n  if(appdata.settings[8].removeAllBlank==\"\") return null;\n  if(appdata.settings[8]!=\"0\")  return appdata.settings[8];\n  //对于安卓, 将获取WIFI设置中的代理\n\n  String res;\n  if(!App.isLinux) {\n    const channel = MethodChannel(\"kokoiro.xyz.pica_comic/proxy\");\n    try {\n      res = await channel.invokeMethod(\"getProxy\");\n    }\n    catch(e){\n      return null;\n    }\n  }else{\n    res = \"No Proxy\";\n  }\n  if(res == \"No Proxy\") return null;\n  //windows上部分代理工具会将代理设置为http=127.0.0.1:8888;https=127.0.0.1:8888;ftp=127.0.0.1:7890的形式\n  //下面的代码从中提取正确的代理地址\n  if(res.contains(\"https\")){\n    var proxies = res.split(\";\");\n    for (String proxy in proxies) {\n      proxy = proxy.removeAllBlank;\n      if (proxy.startsWith('https=')) {\n        return proxy.substring(6);\n      }\n    }\n  }\n  // 执行最终检查\n  final RegExp regex = RegExp(\n    r'^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d+$',\n    caseSensitive: false,\n    multiLine: false,\n  );\n  if (!regex.hasMatch(res)) {\n    return null;\n  }\n\n  return res;\n}\n\nProxyHttpOverrides? proxyHttpOverrides;\n\n///获取代理设置并应用\nFuture<void> setNetworkProxy() async{\n  //Image加载使用的是Image.network()和CachedNetworkImage(), 均使用flutter内置http进行网络请求\n  var proxy = await getProxy();\n\n  if(proxy != null) {\n    proxy = \"PROXY $proxy;\";\n  }\n\n  if(proxyHttpOverrides == null){\n    proxyHttpOverrides = ProxyHttpOverrides(proxy);\n    HttpOverrides.global = proxyHttpOverrides;\n    Log.info(\"Network\", \"Set Proxy $proxy\");\n  } else if(proxyHttpOverrides!.proxy != proxy) {\n    proxyHttpOverrides!.proxy = proxy;\n    Log.info(\"Network\", \"Set Proxy $proxy\");\n  }\n}\n\nvoid setProxy(String? proxy){\n  if(proxy != null) {\n    proxy = \"PROXY $proxy;\";\n  }\n  var proxyHttpOverrides = ProxyHttpOverrides(proxy);\n  HttpOverrides.global = proxyHttpOverrides;\n}\n\nclass ProxyHttpOverrides extends HttpOverrides {\n  String? proxy;\n  ProxyHttpOverrides(this.proxy);\n\n  String? get proxyStr => proxy?.replaceAll(\"PROXY\", \"\").replaceAll(\" \", \"\").replaceAll(\";\", \"\");\n\n  @override\n  HttpClient createHttpClient(SecurityContext? context) {\n    final client = super.createHttpClient(context);\n    client.connectionTimeout = const Duration(seconds: 5);\n    client.findProxy = (uri) => proxy??\"DIRECT\";\n    client.idleTimeout = const Duration(seconds: 100);\n    client.badCertificateCallback = (X509Certificate cert, String host, int port){\n      if(host.contains(\"cdn\"))  return true;\n      final ipv4RegExp = RegExp(\n          r'^((25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3})$');\n      if(ipv4RegExp.hasMatch(host)){\n        // 允许ip访问\n        return true;\n      }\n      return false;\n    };\n    return client;\n  }\n}"
  },
  {
    "path": "lib/network/http_proxy.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'dart:isolate';\nimport '../foundation/app.dart';\n\nclass HttpProxyRequest {\n  String host;\n  int port;\n\n  var sni = <String>[];\n\n  final void Function() stop;\n\n  HttpProxyRequest(this.host, this.port, this.stop);\n}\n\nclass _HttpProxyHandler {\n  var content = \"\";\n  late Socket client;\n  Socket? serverSocket;\n\n  void handle(\n      Socket c, void Function(HttpProxyRequest request) onRequest) async {\n    try {\n      client = c;\n      await for (var d in client) {\n        if (serverSocket == null) {\n          content += const Utf8Decoder().convert(d);\n          if (content.contains(\"\\n\")) {\n            if (content.split(\" \").first != \"CONNECT\") {\n              client\n                  .write(\"HTTP/1.1 400 Bad Request\\nContent-Type: text/plain\\n\"\n                  \"Content-Length: 29\\n\\nBad Request: Invalid Request\");\n              client.flush();\n              client.close();\n              return;\n            }\n            var uri = content\n                .split('\\n')\n                .first\n                .split(\" \")\n                .firstWhere((element) => element.contains(\":\"));\n            bool stop = false;\n            var request = HttpProxyRequest(\n                uri.split(\":\").first, int.parse(uri.split(\":\").last), () {\n              stop = true;\n            });\n            onRequest(request);\n            if (stop) {\n              client.close();\n              return;\n            }\n            forward(request.host, request.port);\n          }\n        }\n        if (serverSocket != null) {\n          serverSocket!.add(d);\n        }\n      }\n      close();\n    } catch (e) {\n      close();\n    }\n  }\n\n  void close() {\n    try {\n      client.close();\n      serverSocket?.close();\n    } catch (e) {\n      //\n    }\n  }\n\n  void forward(String host, int port) async {\n    try {\n      serverSocket = await Socket.connect(host, port);\n      serverSocket?.listen((event) {\n        client.add(event);\n      }, onDone: () {\n        client.close();\n        serverSocket = null;\n      }, onError: (e) {\n        client.close();\n        serverSocket = null;\n      }, cancelOnError: true);\n      client.write('HTTP/1.1 200 Connection Established\\r\\n\\r\\n');\n      client.flush();\n    } catch (e) {\n      close();\n    }\n  }\n}\n\ntypedef RequestHandler = void Function(HttpProxyRequest request);\n\nclass HttpProxyServer {\n  HttpProxyServer(this.handler, this.port);\n\n  final RequestHandler handler;\n\n  final int port;\n\n  ServerSocket? socket;\n\n  void run() {\n    runZonedGuarded(() async{\n      socket = await ServerSocket.bind(InternetAddress.loopbackIPv4, port);\n      socket?.listen((event) => _HttpProxyHandler().handle(event, handler));\n    }, (error, stack) async{\n      print(error);\n      print(stack);\n    });\n  }\n\n  void close(){\n    socket?.close();\n  }\n\n  static Isolate? _server;\n\n  static void startServer() async{\n    _server?.kill();\n    _server = await Isolate.spawn<String>((message) {\n      final file = File(\"$message/rule.json\");\n      var json = const JsonDecoder().convert(file.readAsStringSync());\n      var server = HttpProxyServer((request) {\n        final file = File(\"$message/rule.json\");\n        final json = const JsonDecoder().convert(file.readAsStringSync());\n        if (json[\"rule\"][request.host] != null) {\n          request.host = json[\"rule\"][request.host];\n        }\n      }, json[\"port\"]);\n      server.run();\n    }, App.dataPath);\n  }\n\n  static void reload(){\n    startServer();\n  }\n\n  static void createConfigFile(){\n    var file = File(\"${App.dataPath}/rule.json\");\n    if(!file.existsSync()){\n      var rule = {\n        \"port\": 7891,\n        \"rule\": {\n          \"picaapi.picacomic.com\": \"104.21.91.145\",\n          \"img.picacomic.com\": \"104.21.91.145\",\n          \"storage1.picacomic.com\": \"104.21.91.145\",\n          \"storage-b.picacomic.com\": \"104.21.91.145\",\n          \"e-hentai.org\": \"172.67.0.127\",\n          \"exhentai.org\": \"178.175.129.254\",\n          \"s.exhentai.org\": \"178.175.129.254\"\n        },\n        \"sni\": [\n          \"e-hentai.org\",\n          \"exhentai.org\",\n          \"s.exhentai.org\"\n        ]\n      };\n      var spaces = ' ' * 4;\n      var encoder = JsonEncoder.withIndent(spaces);\n      file.writeAsStringSync(encoder.convert(rule));\n    }\n  }\n}"
  },
  {
    "path": "lib/network/jm_network/headers.dart",
    "content": "import 'dart:convert';\nimport 'package:crypto/crypto.dart';\nimport 'package:dio/dio.dart';\nimport 'dart:math' as math;\nimport 'jm_network.dart';\n\nvar _device = '';\n\nString get _jmUA {\n  // 生成随机的设备标识符\n  if(_device.isEmpty) {\n    var chars = \"abcdefghijklmnopqrstuvwxyz0123456789\";\n    var random = math.Random();\n    for (var i = 0; i < 9; i++) {\n      _device += chars[random.nextInt(chars.length)];\n    }\n  }\n  return \"Mozilla/5.0 (Linux; Android 13; $_device Build/TQ1A.230305.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.196 Safari/537.36\";\n}\n\nconst _jmVersion = \"1.7.2\";\n\nconst _jmAuthKey = \"18comicAPPContent\";\n\nBaseOptions getHeader(int time,\n    {bool post = false, Map<String, String>? headers, bool byte = true}) {\n  var token = md5.convert(const Utf8Encoder().convert(\"$time$_jmAuthKey\"));\n\n  return BaseOptions(\n      receiveDataWhenStatusError: true,\n      connectTimeout: const Duration(seconds: 8),\n      responseType: byte ? ResponseType.bytes : null,\n      headers: {\n        \"token\": token.toString(),\n        \"tokenparam\": \"$time,$_jmVersion\",\n        \"user-agent\": _jmUA,\n        \"accept-encoding\": \"gzip\",\n        \"Host\": JmNetwork().baseUrl.replaceFirst(\"https://\", \"\"),\n        ...headers ?? {},\n        if (post) \"Content-Type\": \"application/x-www-form-urlencoded\"\n      });\n}"
  },
  {
    "path": "lib/network/jm_network/jm_download.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'package:flutter/foundation.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport 'jm_image.dart';\nimport 'jm_models.dart';\nimport 'package:pica_comic/network/download_model.dart';\nimport 'dart:io';\nimport 'package:pica_comic/tools/io_tools.dart';\nimport 'jm_network.dart';\n\nclass DownloadedJmComic extends DownloadedItem {\n  JmComicInfo comic;\n  double? size;\n  List<int> downloadedChapters;\n\n  DownloadedJmComic(this.comic, this.size, this.downloadedChapters);\n\n  Map<String, dynamic> toMap() => {\n        \"comic\": comic.toJson(),\n        \"size\": size,\n        \"downloadedChapters\": downloadedChapters\n      };\n\n  DownloadedJmComic.fromMap(Map<String, dynamic> map)\n      : comic = JmComicInfo.fromMap(map[\"comic\"]),\n        size = map[\"size\"],\n        downloadedChapters = [] {\n    if (map[\"downloadedChapters\"] == null) {\n      //旧版本中的数据不包含这一项\n      for (int i = 0; i < comic.series.length; i++) {\n        downloadedChapters.add(i);\n      }\n      if (downloadedChapters.isEmpty) {\n        downloadedChapters.add(0);\n      }\n    } else {\n      downloadedChapters = List<int>.from(map[\"downloadedChapters\"]);\n    }\n  }\n\n  @override\n  DownloadType get type => DownloadType.jm;\n\n  @override\n  List<int> get downloadedEps => downloadedChapters;\n\n  @override\n  List<String> get eps => comic.epNames.isEmpty\n      ? (List<String>.generate(comic.series.isEmpty ? 1 : comic.series.length,\n          (index) => \"第${index + 1}章\"))\n      : comic.epNames;\n\n  @override\n  String get name => comic.name;\n\n  @override\n  String get id => \"jm${comic.id}\";\n\n  @override\n  String get subTitle => comic.author.elementAtOrNull(0) ?? \"\";\n\n  @override\n  double? get comicSize => size;\n\n  @override\n  Map<String, dynamic> toJson() => toMap();\n\n  @override\n  set comicSize(double? value) => size = value;\n\n  @override\n  List<String> get tags => comic.tags;\n}\n\nclass JmDownloadingItem extends DownloadingItem {\n  JmDownloadingItem(this.comic, this._downloadEps, super.whenFinish,\n      super.whenError, super.updateInfo, super.id,\n      {super.type = DownloadType.jm});\n\n  JmComicInfo comic;\n\n  ///要下载的章节\n  final List<int> _downloadEps;\n\n  @override\n  String get cover => getJmCoverUrl(comic.id);\n\n  @override\n  String get title => comic.name;\n\n  Future<void> getOneEp(int key, Map<int, List<String>> res) async {\n    if (res[key] != null) return;\n\n    int retry = 0;\n\n    while (retry < 3) {\n      try {\n        res[key] = (await JmNetwork().getChapter(comic.series[key]!)).data;\n        return;\n      } catch (e) {\n        await Future.delayed(const Duration(seconds: 3));\n        retry++;\n      }\n    }\n\n    throw Exception(\"Failed to get chapter\");\n  }\n\n  @override\n  Future<Map<int, List<String>>> getLinks() async {\n    if (comic.series.isEmpty) {\n      comic.series[1] = id.replaceFirst(\"jm\", \"\");\n    }\n    var res = <int, List<String>>{};\n    var futures = <Future>[];\n    for (var key in comic.series.keys.toList()) {\n      if (!_downloadEps.contains(key - 1)) continue;\n      futures.add(getOneEp(key, res));\n      await Future.delayed(const Duration(milliseconds: 200));\n      if (futures.length % 5 == 0) {\n        await Future.wait(futures);\n        futures.clear();\n      }\n    }\n    await Future.wait(futures);\n    return res;\n  }\n\n  @override\n  Stream<DownloadProgress> downloadImage(String link) {\n    var bookId = \"\";\n    for (int i = link.length - 1; i >= 0; i--) {\n      if (link[i] == '/') {\n        bookId = link.substring(i + 1, link.length - 5);\n        break;\n      }\n    }\n    return ImageManager().getJmImage(\n      link,\n      {},\n      epsId: comic.series[links!.keys.toList()[downloadingEp]]!,\n      scrambleId: \"220980\",\n      bookId: bookId,\n    );\n  }\n\n  @override\n  Map<String, dynamic> toMap() => {\n        \"comic\": comic.toJson(),\n        \"_downloadEps\": _downloadEps,\n        ...super.toBaseMap()\n      };\n\n  JmDownloadingItem.fromMap(\n      Map<String, dynamic> map,\n      DownloadProgressCallback whenFinish,\n      DownloadProgressCallback whenError,\n      DownloadProgressCallbackAsync updateInfo,\n      String id)\n      : comic = JmComicInfo.fromMap(map[\"comic\"]),\n        _downloadEps = List<int>.from(map[\"_downloadEps\"]),\n        super.fromMap(map, whenFinish, whenError, updateInfo);\n\n  @override\n  FutureOr<DownloadedItem> toDownloadedItem() async {\n    var previous = <int>[];\n    if (DownloadManager().isExists(id)) {\n      var comic =\n          (await DownloadManager().getComicOrNull(id))! as DownloadedJmComic;\n      previous = comic.downloadedEps;\n    }\n    var downloadEps = (_downloadEps + previous).toSet().toList();\n    downloadEps.sort();\n    return DownloadedJmComic(\n        comic, await getFolderSize(Directory(path)), downloadEps);\n  }\n}\n"
  },
  {
    "path": "lib/network/jm_network/jm_image.dart",
    "content": "import 'package:pica_comic/base.dart';\n\nconst imageUrls = [\n  \"https://cdn-msp.jmapiproxy3.cc\",\n  \"https://cdn-msp3.jmapiproxy3.cc\",\n  \"https://cdn-msp2.jmapiproxy1.cc\",\n  \"https://cdn-msp3.jmapiproxy3.cc\",\n  \"https://cdn-msp2.jmapiproxy4.cc\",\n  \"https://cdn-msp2.jmapiproxy3.cc\",\n];\n\nString getBaseUrl(){\n  return imageUrls[int.parse(appdata.settings[37])];\n}\n\nString getJmCoverUrl(String id) {\n  return \"${getBaseUrl()}/media/albums/${id}_3x4.jpg\";\n}\n\nString getJmImageUrl(String imageName, String id) {\n  return \"${getBaseUrl()}/media/photos/$id/$imageName\";\n}\n\nString getJmAvatarUrl(String imageName) {\n  return \"${getBaseUrl()}/media/users/$imageName\";\n}\n"
  },
  {
    "path": "lib/network/jm_network/jm_models.dart",
    "content": "import 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/network/base_comic.dart';\nimport 'package:pica_comic/network/jm_network/jm_image.dart';\n\nclass HomePageData {\n  List<HomePageItem> items;\n\n  HomePageData(this.items);\n}\n\nclass HomePageItem {\n  String name;\n  String id;\n  bool category;\n  List<JmComicBrief> comics;\n\n  HomePageItem(this.name, this.id, this.comics, this.category);\n}\n\nclass JmComicBrief extends BaseComic {\n  @override\n  String id;\n  String author;\n  String name;\n  @override\n  String description;\n  List<ComicCategoryInfo> categories;\n  @override\n  List<String> get tags => categories.map((e) => e.name).toList();\n\n  JmComicBrief(\n    this.id,\n    this.author,\n    this.name,\n    this.description,\n    this.categories\n  );\n\n  @override\n  String get cover => getJmCoverUrl(id);\n\n  @override\n  String get subTitle => author;\n\n  @override\n  String get title => name;\n}\n\nclass ComicCategoryInfo {\n  String id;\n  String name;\n\n  ComicCategoryInfo(this.id, this.name);\n}\n\nclass PromoteList {\n  String id;\n  List<JmComicBrief> comics;\n  int loaded = 0;\n  int total = 1;\n  int page = 0;\n\n  PromoteList(this.id, this.comics);\n}\n\nclass SearchRes {\n  String keyword;\n  int loaded;\n  int total;\n  int loadedPage = 1;\n  List<JmComicBrief> comics;\n\n  SearchRes(this.keyword, this.loaded, this.total, this.comics);\n}\n\nclass Category {\n  String name;\n  String slug;\n  List<SubCategory> subCategories;\n\n  Category(this.name, this.slug, this.subCategories) {\n    if (slug == \"\") {\n      slug = \"0\";\n    }\n  }\n}\n\nclass SubCategory {\n  String cid;\n  String name;\n  String slug;\n\n  SubCategory(this.cid, this.name, this.slug);\n}\n\nclass JmComicInfo with HistoryMixin {\n  String name;\n  String id;\n  List<String> author;\n  String description;\n  int likes;\n  int views;\n  int comments;\n\n  ///章节信息, 键为章节序号, 值为漫画ID\n  Map<int, String> series;\n  List<String> tags;\n  List<JmComicBrief> relatedComics;\n  bool liked;\n  bool favorite;\n  List<String> epNames;\n\n  JmComicInfo(\n      this.name,\n      this.id,\n      this.author,\n      this.description,\n      this.likes,\n      this.views,\n      this.series,\n      this.tags,\n      this.relatedComics,\n      this.liked,\n      this.favorite,\n      this.comments,\n      this.epNames);\n\n  static Map<String, String> seriesToJsonMap(Map<int, String> map) {\n    var res = <String, String>{};\n    for (var i in map.entries) {\n      res[i.key.toString()] = i.value;\n    }\n    return res;\n  }\n\n  static Map<int, String> jsonMapToSeries(Map<String, dynamic> map) {\n    var res = <int, String>{};\n    for (var i in map.entries) {\n      res[int.parse(i.key)] = i.value;\n    }\n    return res;\n  }\n\n  Map<String, dynamic> toJson() {\n    return {\n      \"name\": name,\n      \"id\": id,\n      \"author\": author,\n      \"description\": description,\n      \"likes\": \"\",\n      \"views\": \"\",\n      \"series\": seriesToJsonMap(series),\n      \"tags\": tags,\n      \"relatedComics\": [],\n      \"liked\": \"\",\n      \"favorite\": \"\",\n      \"epNames\": epNames\n    };\n  }\n\n  JmComicInfo.fromMap(Map<String, dynamic> map)\n      : name = map[\"name\"],\n        id = map[\"id\"],\n        author = List<String>.from(map[\"author\"]),\n        description = map[\"description\"],\n        likes = 0,\n        views = 0,\n        series = jsonMapToSeries(map[\"series\"]),\n        tags = List<String>.from(map[\"tags\"]),\n        relatedComics = [],\n        liked = false,\n        favorite = false,\n        comments = 0,\n        epNames = List.from(map[\"epNames\"] ?? []);\n\n  JmComicBrief toBrief() =>\n      JmComicBrief(id, author.firstOrNull ?? \"\", name, description, []);\n\n  @override\n  String get cover => getJmCoverUrl(id);\n\n  @override\n  HistoryType get historyType => HistoryType.jmComic;\n\n  @override\n  String get subTitle => author.firstOrNull ?? '';\n\n  @override\n  String get target => id;\n\n  @override\n  String get title => name;\n}\n\nclass Comment {\n  String id;\n  String avatar;\n  String name;\n  String time;\n  String content;\n  List<Comment> reply;\n\n  Comment(this.id, this.avatar, this.name, this.time, this.content, this.reply);\n}\n"
  },
  {
    "path": "lib/network/jm_network/jm_network.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:typed_data';\n\nimport 'package:cookie_jar/cookie_jar.dart';\nimport 'package:crypto/crypto.dart';\nimport 'package:dio/dio.dart';\nimport 'package:dio_cookie_manager/dio_cookie_manager.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:html/parser.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/built_in/jm.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/network/cache_network.dart';\nimport 'package:pica_comic/pages/pre_search_page.dart';\nimport 'package:pointycastle/api.dart';\nimport 'package:pointycastle/block/aes.dart';\nimport 'package:pointycastle/block/modes/ecb.dart';\n\nimport '../../foundation/cache_manager.dart';\nimport '../../foundation/log.dart';\nimport '../app_dio.dart';\nimport '../http_client.dart';\nimport '../res.dart';\nimport 'headers.dart';\nimport 'jm_image.dart';\nimport 'jm_models.dart';\n\nextension _CachedNetwork on CachedNetwork {\n  Future<CachedNetworkRes<String>> getJm(\n      String url, BaseOptions options, int time,\n      {CacheExpiredTime expiredTime = CacheExpiredTime.short,\n      CookieJar? cookieJar}) async {\n    await setNetworkProxy();\n    final key = url;\n    var cache = await CacheManager().findCache(key);\n    if (cache != null) {\n      var file = File(cache);\n      return CachedNetworkRes(await file.readAsString(), 200, url);\n    }\n    options.responseType = ResponseType.bytes;\n    var dio = logDio(options);\n    if (cookieJar != null) {\n      dio.interceptors.add(CookieManager(cookieJar));\n    }\n    var res = await dio.get<Uint8List>(url);\n    if (res.data == null) {\n      throw Exception(\"Empty data\");\n    }\n    var body = utf8.decoder.convert(res.data!);\n    if (res.statusCode != 200) {\n      return CachedNetworkRes(body, res.statusCode, res.realUri.toString());\n    }\n    var json = const JsonDecoder().convert(body);\n    var data = json[\"data\"];\n    if (data is List && data.isEmpty) {\n      throw Exception(\"Empty data\");\n    } else if (data is List) {\n      throw Exception(\"Data parsing error\");\n    }\n    var decodedData = JmNetwork.convertData(data, time);\n    if (expiredTime != CacheExpiredTime.no) {\n      await CacheManager().writeCache(key, res.data!, expiredTime.time);\n    }\n    return CachedNetworkRes(\n        decodedData, res.statusCode, res.realUri.toString());\n  }\n}\n\nclass JmNetwork {\n  static const baseData = \"\";\n\n  // 禁漫的cookie无需持久化储存, 因为有效期非常短\n  final cookieJar = CookieJar(ignoreExpires: true);\n\n  var hotTags = <String>[];\n\n  factory JmNetwork() => cache == null ? (cache = JmNetwork.create()) : cache!;\n\n  JmNetwork.create();\n\n  static JmNetwork? cache;\n\n  static const urls = <String>[\n    \"https://www.jmeadpoolcdn.one\",\n    \"https://www.jmeadpoolcdn.life\",\n    \"https://www.jmapiproxyxxx.one\",\n    \"https://www.jmfreedomproxy.xyz\"\n  ];\n\n  String get baseUrl => urls[int.parse(appdata.settings[17])];\n\n  static const kJmSecret = '185Hcomic3PAPP7R';\n\n  bool _performingLogin = false;\n\n  ///解密数据\n  static String convertData(String input, int time) {\n    //key为时间+18comicAPPContent的md5结果\n    var key = md5.convert(const Utf8Encoder().convert(\"$time$kJmSecret\"));\n    BlockCipher cipher = ECBBlockCipher(AESEngine())\n      ..init(false, KeyParameter(const Utf8Encoder().convert(key.toString())));\n    //先将数据进行base64解码\n    final data = base64Decode(input);\n    //再进行AES-ECB解密\n    var offset = 0;\n    var paddedPlainText = Uint8List(data.length);\n    while (offset < data.length) {\n      offset += cipher.processBlock(data, offset, paddedPlainText, offset);\n    }\n    //将得到的数据进行Utf8解码\n    var res = const Utf8Decoder().convert(paddedPlainText);\n    //得到的数据在末尾有一些乱码\n    int i = res.length - 1;\n    for (; i >= 0; i--) {\n      if (res[i] == '}' || res[i] == ']') {\n        break;\n      }\n    }\n    return res.substring(0, i + 1);\n  }\n\n  Future<void> init() async {\n    loginFromAppdata();\n  }\n\n  ///get请求, 返回Json数据中的data\n  Future<Res<dynamic>> get(String url,\n      {Map<String, String>? header,\n      CacheExpiredTime expiredTime = CacheExpiredTime.long,\n      bool isRetry = false}) async {\n    while (_performingLogin) {\n      await Future.delayed(const Duration(milliseconds: 100));\n    }\n\n    int time = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n    var dio = CachedNetwork();\n    var options = getHeader(time);\n    options.validateStatus = (i) => i == 200 || i == 401;\n    try {\n      var res = await dio.getJm(url, options, time,\n          cookieJar: cookieJar, expiredTime: CacheExpiredTime.no);\n      if (res.statusCode == 401) {\n        var message =\n            const JsonDecoder().convert(res.data)[\"errorMsg\"] ?? \"Error\";\n        if (message == \"請先登入會員\" && jm.isLogin && !isRetry) {\n          var res = await jm.reLogin();\n          if (res) {\n            return get(\n              url,\n              header: header,\n              expiredTime: expiredTime,\n              isRetry: true,\n            );\n          }\n        }\n        return Res(null, errorMessage: message);\n      }\n\n      final data = const JsonDecoder().convert(res.data);\n\n      return Res<dynamic>(data);\n    } on DioException catch (e) {\n      if (kDebugMode) {\n        print(e);\n      }\n      if (e.type != DioExceptionType.unknown) {\n        return Res<String>(null, errorMessage: e.message ?? \"Network Error\");\n      } else {\n        return Res<String>(null, errorMessage: e.toString().split(\"\\n\")[1]);\n      }\n    } catch (e, s) {\n      if (kDebugMode) {\n        print(e);\n      }\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\");\n      return Res<String>(null, errorMessage: e.toString());\n    }\n  }\n\n  /// post请求\n  Future<Res<dynamic>> post(String url, String data) async {\n    try {\n      await setNetworkProxy();\n      int time = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n      var dio = logDio(getHeader(time, post: true));\n      dio.interceptors.add(CookieManager(cookieJar));\n      var res = await dio.post(url,\n          options: Options(validateStatus: (i) => i == 200 || i == 401),\n          data: data);\n      if (res.statusCode == 401) {\n        return Res(null,\n            errorMessage: const JsonDecoder().convert(\n                    const Utf8Decoder().convert(res.data))[\"errorMsg\"] ??\n                \"Unknown Error\".toString());\n      }\n      var resData = convertData(\n          (const JsonDecoder()\n              .convert(const Utf8Decoder().convert(res.data)))[\"data\"],\n          time);\n      return Res<dynamic>(const JsonDecoder().convert(resData));\n    } on DioException catch (e) {\n      if (kDebugMode) {\n        print(e);\n      }\n      if (e.type != DioExceptionType.unknown) {\n        return const Res.error(\"Network Error\");\n      } else {\n        return Res.error(e.toString());\n      }\n    } catch (e, s) {\n      if (kDebugMode) {\n        print(e);\n      }\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\");\n      return const Res.error(\"Network Error\");\n    }\n  }\n\n  ///获取主页\n  Future<Res<HomePageData>> getHomePage() async {\n    var res = await get(\"$baseUrl/promote?$baseData&page=0\",\n        expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var data = HomePageData([]);\n      for (var item in res.data) {\n        var comics = <JmComicBrief>[];\n        for (var comic in item[\"content\"]) {\n          try {\n            var categories = <ComicCategoryInfo>[];\n            if (comic[\"category\"][\"id\"] != null &&\n                comic[\"category\"][\"title\"] != null) {\n              categories.add(ComicCategoryInfo(\n                  comic[\"category\"][\"id\"], comic[\"category\"][\"title\"]));\n            }\n            if (comic[\"category_sub\"][\"id\"] != null &&\n                comic[\"category_sub\"][\"title\"] != null) {\n              categories.add(ComicCategoryInfo(\n                  comic[\"category_sub\"][\"id\"], comic[\"category_sub\"][\"title\"]));\n            }\n            comics.add(JmComicBrief(comic[\"id\"], comic[\"author\"], comic[\"name\"],\n                comic[\"description\"] ?? \"\", categories));\n          } catch (e) {\n            continue;\n          }\n        }\n        String type = item[\"type\"];\n        String id = item[\"id\"].toString();\n        if (type == \"category_id\") {\n          id = item[\"slug\"];\n        }\n        data.items\n            .add(HomePageItem(item[\"title\"], id, comics, type != \"promote\"));\n      }\n      return Res(data);\n    } catch (e, s) {\n      if (kDebugMode) {\n        print(e);\n      }\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<PromoteList>> getPromoteList(String id) async {\n    var res = await get(\"$baseUrl/promote_list?$baseData&id=$id&page=0\",\n        expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var list = PromoteList(id, []);\n      list.total = int.parse(res.data[\"total\"]);\n      for (var comic in (res.data[\"list\"])) {\n        var categories = <ComicCategoryInfo>[];\n        if (comic[\"category\"][\"id\"] != null &&\n            comic[\"category\"][\"title\"] != null) {\n          categories.add(ComicCategoryInfo(\n              comic[\"category\"][\"id\"], comic[\"category\"][\"title\"]));\n        }\n        if (comic[\"category_sub\"][\"id\"] != null &&\n            comic[\"category_sub\"][\"title\"] != null) {\n          categories.add(ComicCategoryInfo(\n              comic[\"category_sub\"][\"id\"], comic[\"category_sub\"][\"title\"]));\n        }\n        try {\n          list.comics.add(JmComicBrief(comic[\"id\"], comic[\"author\"],\n              comic[\"name\"], comic[\"description\"] ?? \"\", categories));\n        } catch (e) {\n          //忽略\n        }\n        list.loaded++;\n      }\n      list.page++;\n      return Res(list);\n    } catch (e, s) {\n      if (kDebugMode) {\n        print(e);\n      }\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<void> loadMorePromoteListComics(PromoteList list) async {\n    if (list.loaded >= list.total) {\n      return;\n    }\n    var res = await get(\n        \"$baseUrl/promote_list?$baseData&id=${list.id}&page=${list.page}\",\n        expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return;\n    }\n    try {\n      for (var comic in (res.data[\"list\"])) {\n        var categories = <ComicCategoryInfo>[];\n        if (comic[\"category\"][\"id\"] != null &&\n            comic[\"category\"][\"title\"] != null) {\n          categories.add(ComicCategoryInfo(\n              comic[\"category\"][\"id\"], comic[\"category\"][\"title\"]));\n        }\n        if (comic[\"category_sub\"][\"id\"] != null &&\n            comic[\"category_sub\"][\"title\"] != null) {\n          categories.add(ComicCategoryInfo(\n              comic[\"category_sub\"][\"id\"], comic[\"category_sub\"][\"title\"]));\n        }\n        try {\n          list.comics.add(JmComicBrief(comic[\"id\"], comic[\"author\"],\n              comic[\"name\"], comic[\"description\"] ?? \"\", categories));\n        } catch (e) {\n          //忽视\n        }\n        list.loaded++;\n      }\n      list.page++;\n      return;\n    } catch (e, s) {\n      if (kDebugMode) {\n        print(e);\n      }\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return;\n    }\n  }\n\n  Future<Res<List<JmComicBrief>>> getLatest(int page) async {\n    var res = await get(\"$baseUrl/latest?$baseData&page=$page\",\n        expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var comics = <JmComicBrief>[];\n      for (var comic in (res.data)) {\n        try {\n          var categories = <ComicCategoryInfo>[];\n          if (comic[\"category\"][\"id\"] != null &&\n              comic[\"category\"][\"title\"] != null) {\n            categories.add(ComicCategoryInfo(\n                comic[\"category\"][\"id\"], comic[\"category\"][\"title\"]));\n          }\n          if (comic[\"category_sub\"][\"id\"] != null &&\n              comic[\"category_sub\"][\"title\"] != null) {\n            categories.add(ComicCategoryInfo(\n                comic[\"category_sub\"][\"id\"], comic[\"category_sub\"][\"title\"]));\n          }\n          comics.add(JmComicBrief(comic[\"id\"], comic[\"author\"], comic[\"name\"],\n              comic[\"description\"] ?? \"\", categories));\n        } catch (e) {\n          continue;\n        }\n      }\n      return Res(comics, subData: 99999);\n    } catch (e, s) {\n      if (kDebugMode) {\n        print(e);\n      }\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///获取热搜词\n  Future<Res<bool>> getHotTags() async {\n    var res = await get(\"$baseUrl/hot_tags?$baseData\",\n        expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    hotTags.clear();\n    for (var s in res.data) {\n      hotTags.add(s);\n    }\n    return const Res(true);\n  }\n\n  Future<Res<List<JmComicBrief>>> searchNew(\n      String keyword, int page, ComicsOrder order) async {\n    appdata.searchHistory.remove(keyword);\n    appdata.searchHistory.add(keyword);\n    keyword = keyword.trim();\n    keyword = keyword.replaceAll('  ', ' ');\n    keyword = Uri.encodeComponent(keyword);\n    keyword = keyword.replaceAll('%20', '+');\n    appdata.writeHistory();\n    Res res;\n    if (page != 1) {\n      res = await get(\n          \"$baseUrl/search?&search_query=$keyword&o=$order&page=$page\",\n          expiredTime: CacheExpiredTime.no);\n    } else {\n      res = await get(\"$baseUrl/search?&search_query=$keyword&o=$order\",\n          expiredTime: CacheExpiredTime.no);\n    }\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var comics = <JmComicBrief>[];\n      for (var comic in (res.data[\"content\"])) {\n        try {\n          var categories = <ComicCategoryInfo>[];\n          if (comic[\"category\"][\"id\"] != null &&\n              comic[\"category\"][\"title\"] != null) {\n            categories.add(ComicCategoryInfo(\n                comic[\"category\"][\"id\"], comic[\"category\"][\"title\"]));\n          }\n          if (comic[\"category_sub\"][\"id\"] != null &&\n              comic[\"category_sub\"][\"title\"] != null) {\n            categories.add(ComicCategoryInfo(\n                comic[\"category_sub\"][\"id\"], comic[\"category_sub\"][\"title\"]));\n          }\n          comics.add(JmComicBrief(comic[\"id\"], comic[\"author\"], comic[\"name\"],\n              comic[\"description\"] ?? \"\", categories));\n        } catch (e) {\n          continue;\n        }\n      }\n      Future.delayed(const Duration(microseconds: 500), () {\n        try {\n          StateController.find<PreSearchController>().update();\n        } catch (e) {\n          //跳过\n        }\n      });\n      return Res(comics,\n          subData: comics.isEmpty\n              ? 0\n              : (int.parse(res.data[\"total\"]) / res.data[\"content\"].length)\n                  .ceil());\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      Future.delayed(const Duration(microseconds: 500),\n          () => StateController.find<PreSearchController>().update());\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///获取分类信息\n  Future<Res<List<Category>>> getCategories() async {\n    var res = await get(\"$baseUrl/categories?$baseData\");\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var categories = <Category>[];\n      for (var c in res.data[\"categories\"]) {\n        var subCategories = <SubCategory>[];\n        for (var sc in c[\"sub_categories\"] ?? []) {\n          subCategories.add(SubCategory(sc[\"CID\"], sc[\"name\"], sc[\"slug\"]));\n        }\n        categories.add(Category(c[\"name\"], c[\"slug\"], subCategories));\n      }\n      return Res(categories);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<List<JmComicBrief>>> getCategoryComics(\n      String category, ComicsOrder order, int page) async {\n    var res = await get(\n        \"$baseUrl/categories/filter?$baseData&o=$order&c=${Uri.encodeComponent(category)}&page=$page\",\n        expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var comics = <JmComicBrief>[];\n      for (var comic in (res.data[\"content\"])) {\n        try {\n          var categories = <ComicCategoryInfo>[];\n          if (comic[\"category\"][\"id\"] != null &&\n              comic[\"category\"][\"title\"] != null) {\n            categories.add(ComicCategoryInfo(\n                comic[\"category\"][\"id\"], comic[\"category\"][\"title\"]));\n          }\n          if (comic[\"category_sub\"][\"id\"] != null &&\n              comic[\"category_sub\"][\"title\"] != null) {\n            categories.add(ComicCategoryInfo(\n                comic[\"category_sub\"][\"id\"], comic[\"category_sub\"][\"title\"]));\n          }\n          comics.add(JmComicBrief(comic[\"id\"], comic[\"author\"], comic[\"name\"],\n              comic[\"description\"] ?? \"\", categories));\n        } catch (e) {\n          continue;\n        }\n      }\n      Object total = res.data[\"total\"];\n      if (total is String) {\n        total = int.parse(total);\n      }\n      var current = res.data[\"content\"].length;\n      var pagesCount = 1;\n      if (current != 0) {\n        pagesCount = ((total as int) / current).ceil();\n      }\n      return Res(comics, subData: pagesCount);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<JmComicInfo>> getComicInfo(String id) async {\n    var res = await get(\"$baseUrl/album?comicName=&id=$id\",\n        expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      if (res.errorMessage!.contains(\"Empty data\")) {\n        throw Exception(\"漫畫不存在: id = $id\");\n      }\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var author = <String>[];\n      for (var s in res.data[\"author\"] ?? \"未知\") {\n        author.add(s);\n      }\n      var series = <int, String>{};\n      var epNames = <String>[];\n      int sort = 1;\n      for (var s in res.data[\"series\"] ?? []) {\n        series[sort] = s[\"id\"];\n        sort++;\n        var name = s[\"name\"] as String;\n        if (name.isEmpty) {\n          name = \"第${s[\"sort\"]}話\";\n        }\n        epNames.add(name);\n      }\n      var tags = <String>[];\n      for (var s in res.data[\"tags\"] ?? []) {\n        tags.add(s);\n      }\n      var related = <JmComicBrief>[];\n      for (var c in res.data[\"related_list\"] ?? []) {\n        related.add(JmComicBrief(c[\"id\"], c[\"author\"] ?? \"Unknown\",\n            c[\"name\"] ?? \"Unknown\", c[\"description\"] ?? \"None\", []));\n      }\n      return Res(JmComicInfo(\n          res.data[\"name\"] ?? \"未知\",\n          id,\n          author,\n          res.data[\"description\"] ?? \"无\",\n          int.parse(res.data[\"likes\"] ?? \"0\"),\n          int.parse(res.data[\"total_views\"] ?? \"0\"),\n          series,\n          tags,\n          related,\n          res.data[\"liked\"] ?? false,\n          res.data[\"is_favorite\"] ?? false,\n          int.parse(res.data[\"comment_total\"] ?? \"0\"),\n          epNames));\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<bool>> login(String account, String pwd) async {\n    _performingLogin = true;\n    try {\n      var res = await post(\"$baseUrl/login\",\n          \"username=${Uri.encodeComponent(account)}&password=${Uri.encodeComponent(pwd)}\");\n      if (res.error) {\n        return Res(null, errorMessage: res.errorMessage);\n      }\n      jm.data['name'] = account;\n      appdata.writeData();\n      return const Res(true);\n    } finally {\n      _performingLogin = false;\n    }\n  }\n\n  /// 使用储存的数据进行登录\n  Future<Res<bool>> loginFromAppdata() async {\n    var res = await jm.reLogin();\n    return res ? const Res(true) : const Res.error(\"error\");\n  }\n\n  Future<void> logout() async {\n    await cookieJar.deleteAll();\n  }\n\n  Future<void> likeComic(String id) async {\n    await post(\"$baseUrl/like\", \"id=$id&$baseData\");\n  }\n\n  ///创建收藏夹\n  Future<Res<bool>> createFolder(String name) async {\n    var res = await post(\n        \"$baseUrl/favorite_folder\", \"type=add&folder_name=$name&$baseData\");\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    } else {\n      return const Res(true);\n    }\n  }\n\n  Future<Res<List<JmComicBrief>>> getFolderComicsPage(\n      String id, int page) async {\n    ComicsOrder order =\n        appdata.settings[42] == \"0\" ? ComicsOrder.latest : ComicsOrder.update;\n    var res = await get(\n        \"$baseUrl/favorite?$baseData&page=$page&folder_id=$id&o=$order\",\n        expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var comics = <JmComicBrief>[];\n      for (var comic in (res.data[\"list\"])) {\n        var categories = <ComicCategoryInfo>[];\n        if (comic[\"category\"][\"id\"] != null &&\n            comic[\"category\"][\"title\"] != null) {\n          categories.add(ComicCategoryInfo(\n              comic[\"category\"][\"id\"], comic[\"category\"][\"title\"]));\n        }\n        if (comic[\"category_sub\"][\"id\"] != null &&\n            comic[\"category_sub\"][\"title\"] != null) {\n          categories.add(ComicCategoryInfo(\n              comic[\"category_sub\"][\"id\"], comic[\"category_sub\"][\"title\"]));\n        }\n        comics.add(JmComicBrief(comic[\"id\"], comic[\"author\"], comic[\"name\"],\n            comic[\"description\"] ?? \"\", categories));\n      }\n      int pages;\n      if (comics.isNotEmpty) {\n        pages = (int.parse(res.data[\"total\"]) / comics.length).ceil();\n      } else {\n        pages = 0;\n      }\n      return Res(comics, subData: pages);\n    } catch (e, s) {\n      if (kDebugMode) {\n        print(e);\n      }\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///获取收藏夹\n  Future<Res<Map<String, String>>> getFolders() async {\n    var res = await get(\"$baseUrl/favorite?$baseData\",\n        expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var folders = <String, String>{};\n      for (var folder in res.data[\"folder_list\"]) {\n        folders[folder[\"FID\"]] = folder[\"name\"];\n      }\n      return Res(folders);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///移动漫画至指定的收藏夹\n  Future<Res<bool>> moveToFolder(String comicId, String folderId) async {\n    var res = await post(\"$baseUrl/favorite_folder\",\n        \"type=move&folder_id=$folderId&aid=$comicId&$baseData\");\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    } else {\n      return const Res(true);\n    }\n  }\n\n  ///收藏漫画, 如果folder为null, 则为取消收藏\n  Future<Res<bool>> favorite(String id, String? folder) async {\n    try {\n      if (folder != null) {\n        var res = await post(\"$baseUrl/favorite\", \"aid=$id&$baseData\");\n        if (res.data[\"type\"] != \"add\") {\n          res = await post(\"$baseUrl/favorite\", \"aid=$id&$baseData\");\n        }\n        Res res2 = const Res(true);\n        if (folder != \"0\") {\n          res2 = await moveToFolder(id, folder);\n        }\n        if (res.error || res2.error) {\n          return Res(null, errorMessage: res.errorMessage);\n        } else {\n          return const Res(true);\n        }\n      } else {\n        var res = await post(\"$baseUrl/favorite\", \"aid=$id&$baseData\");\n        if (res.data[\"type\"] == \"add\") {\n          res = await post(\"$baseUrl/favorite\", \"aid=$id&$baseData\");\n        }\n        return const Res(false);\n      }\n    } catch (e) {\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///获取漫画图片\n  Future<Res<List<String>>> getChapter(String id) async {\n    var res = await get(\"$baseUrl/chapter?&id=$id\");\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      var images = <String>[];\n      for (var s in res.data[\"images\"]) {\n        images.add(getJmImageUrl(s, id));\n      }\n      return Res(images);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///获取scramble\n  ///\n  /// 此函数未使用, 因为似乎所有漫画的scramble都一样\n  Future<String?> getScramble(String id) async {\n    var dio = Dio(\n        getHeader(DateTime.now().millisecondsSinceEpoch ~/ 1000, byte: false))\n      ..interceptors.add(LogInterceptor());\n    dio.interceptors.add(CookieManager(cookieJar));\n    var res = await dio.get(\n        \"$baseUrl/chapter_view_template?id=$id&mode=vertical&page=0&app_ima_shunt=NaN&express=off\");\n    var exp = RegExp(r\"(?<=var scramble_id = )\\w+\");\n    return exp.firstMatch(res.data)!.group(0);\n  }\n\n  /// 获取评论, 获取章节评论需要mode = all\n  Future<Res<List<Comment>>> getComment(String id, int page,\n      [String mode = \"manhua\"]) async {\n    var res = await get(\"$baseUrl/forum?mode=$mode&aid=$id&page=$page\",\n        expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    }\n    try {\n      String parseContent(String input) {\n        var fragment = parseFragment(input);\n        return fragment.querySelector(\"div\")?.text ?? \"\";\n      }\n\n      var comments = <Comment>[];\n      for (var c in res.data[\"list\"]) {\n        var reply = <Comment>[];\n        for (var r in c[\"replys\"] ?? []) {\n          reply.add(Comment(r[\"CID\"], getJmAvatarUrl(r[\"photo\"]), r[\"username\"],\n              r[\"addtime\"], parseContent(r[\"content\"]), []));\n        }\n        comments.add(Comment(c[\"CID\"], getJmAvatarUrl(c[\"photo\"]),\n            c[\"username\"], c[\"addtime\"], parseContent(c[\"content\"]), reply));\n      }\n      return Res(\n        comments,\n        subData: res.data[\"total\"] is int\n            ? res.data[\"total\"]\n            : (int.tryParse(res.data[\"total\"]) ?? 1),\n      );\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<bool>> deleteFolder(String id) async {\n    var res = await post(\n        \"$baseUrl/favorite_folder\", \"type=del&folder_id=$id&$baseData\");\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage);\n    } else {\n      if (res.data[\"code\"] == 400) {\n        return Res(null, errorMessage: res.data[\"msg\"]);\n      }\n      return const Res(true);\n    }\n  }\n\n  ///获取每周必看列表\n  ///\n  /// 返回Map, 键为ID, 值为名称\n  Future<Res<Map<String, String>>> getWeekRecommendation() async {\n    var res =\n        await get(\"$baseUrl/week?$baseData\", expiredTime: CacheExpiredTime.no);\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage!);\n    }\n    try {\n      Map<String, String> categories = {};\n      for (var c in res.data[\"categories\"]) {\n        categories[c[\"id\"]] = c[\"time\"];\n      }\n      return Res(categories);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///获取单个每周必看中的漫画\n  ///\n  /// 不需要传递page变量, 因为只有一页\n  Future<Res<List<JmComicBrief>>> getWeekRecommendationComics(\n      String id, WeekRecommendationType type) async {\n    var res = await get(\"$baseUrl/week/filter?$baseData&id=$id&page=0$type\");\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessage!);\n    }\n    try {\n      var comics = <JmComicBrief>[];\n      for (var comic in (res.data[\"list\"])) {\n        var categories = <ComicCategoryInfo>[];\n        if (comic[\"category\"][\"id\"] != null &&\n            comic[\"category\"][\"title\"] != null) {\n          categories.add(ComicCategoryInfo(\n              comic[\"category\"][\"id\"], comic[\"category\"][\"title\"]));\n        }\n        if (comic[\"category_sub\"][\"id\"] != null &&\n            comic[\"category_sub\"][\"title\"] != null) {\n          categories.add(ComicCategoryInfo(\n              comic[\"category_sub\"][\"id\"], comic[\"category_sub\"][\"title\"]));\n        }\n        comics.add(JmComicBrief(comic[\"id\"], comic[\"author\"], comic[\"name\"],\n            comic[\"description\"] ?? \"\", categories));\n      }\n      return Res(comics);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<dynamic>> comment(String aid, String content) async {\n    var res = await post(\"$baseUrl/comment\",\n        \"comment=${Uri.encodeComponent(content)}&status=undefined&aid=$aid&$baseData\");\n    if (res.error) {\n      return res;\n    } else {\n      return Res(res.data[\"msg\"]);\n    }\n  }\n}\n\n///禁漫漫画排序模式\nenum ComicsOrder {\n  ///最新\n  latest(\"mr\"),\n\n  ///总排行, 或者最多点击\n  totalRanking(\"mv\"),\n\n  ///月排行, 仅分类中\n  monthRanking(\"mv_m\"),\n\n  ///周排行, 仅分类中\n  weekRanking(\"mv_w\"),\n\n  ///日排行, 仅分类中\n  dayRanking(\"mv_t\"),\n\n  ///最多图片\n  maxPictures(\"mp\"),\n\n  ///最多喜欢\n  maxLikes(\"tf\"),\n\n  /// 最新更新(收藏夹)\n  update(\"mp\");\n\n  @override\n  String toString() => value;\n\n  final String value;\n\n  const ComicsOrder(this.value);\n\n  static ComicsOrder fromValue(String value) {\n    for (var v in ComicsOrder.values) {\n      if (v.value == value) return v;\n    }\n    throw UnimplementedError();\n  }\n}\n\n///每周必看的类型\nenum WeekRecommendationType {\n  korean(\"&type=hanman\"),\n  manga(\"&type=manga\"),\n  another(\"&type=another\");\n\n  const WeekRecommendationType(this.value);\n\n  final String value;\n\n  @override\n  String toString() => value;\n}\n\nvar jmNetwork = JmNetwork();\n"
  },
  {
    "path": "lib/network/net_fav_to_local.dart",
    "content": "import 'dart:convert';\nimport 'dart:math';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/network/base_comic.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/pages/favorites/network_to_local.dart';\n\ntypedef GetFavoriteFunc<T extends Object> = Future<Res<List<T>>> Function(\n    int page);\n\ntypedef ComicToLocalFavoriteFunc<T extends Object> = FavoriteItem Function(T);\n\nFuture<List<T>> getFavorites<T extends Object>(BuildContext context,\n    GetFavoriteFunc<T> getFavoriteFunc, Duration? interval, int? total) async {\n  var comics = <T>[];\n\n  Stream<(int, int?)> load() async* {\n    yield (0, null);\n    int current = 0;\n    int? temTotal = total;\n    while (temTotal == null || current < temTotal) {\n      var res = await getFavoriteFunc(current + 1);\n      if (res.error) {\n        throw res.errorMessageWithoutNull;\n      }\n      if (res.data.isEmpty) {\n        yield (current, current);\n        return;\n      }\n      comics.addAll(res.data);\n      temTotal ??= res.subData;\n      if (interval != null) {\n        await Future.delayed(interval);\n      }\n      current++;\n      yield (current, temTotal);\n      if (current > 5) {\n        var random = Random().nextInt(500) + 500;\n        await Future.delayed(Duration(milliseconds: random));\n      }\n    }\n  }\n\n  await showDialog(\n      barrierDismissible: false,\n      context: context,\n      builder: (context) => SimpleDialog(\n            title: const Text(\"Loading...\"),\n            children: [\n              const SizedBox(\n                width: 400,\n              ),\n              const Center(\n                child: CircularProgressIndicator(),\n              ),\n              StreamBuilder<(int, int?)>(\n                  stream: load(),\n                  builder: (context, snapshot) {\n                    if (snapshot.hasError) {\n                      Future.microtask(() {\n                        context.pop();\n                        if (kDebugMode) {\n                          print(snapshot.error);\n                          print(snapshot.stackTrace);\n                        }\n                        showToast(message: snapshot.error.toString());\n                      });\n                    }\n                    if (snapshot.hasData &&\n                        snapshot.data?.$1 == snapshot.data?.$2) {\n                      Future.delayed(\n                        const Duration(milliseconds: 200),\n                        context.pop,\n                      );\n                    }\n                    return Center(\n                      child: Text(\n                          \"${snapshot.data?.$1}/${snapshot.data?.$2 ?? \"?\"}\"),\n                    );\n                  }),\n              Center(\n                child: TextButton(\n                  child: Text(\"取消\".tl),\n                  onPressed: () {\n                    App.back(context);\n                  },\n                ),\n              )\n            ],\n          ));\n  return comics;\n}\n\nvoid startConvert<T extends Object>(\n    GetFavoriteFunc<T> getFavoriteFunc,\n    Duration? interval,\n    BuildContext context,\n    String folderName,\n    ComicToLocalFavoriteFunc<T> toLocalFavoriteFunc,\n    String key,\n    bool agreeSync,\n    Object syncData) async {\n  List<T> comics = await getFavorites(context, getFavoriteFunc, interval, null);\n  var name = folderName;\n  int i = 0;\n  while (LocalFavoritesManager().folderNames.contains(name)) {\n    name = folderName + i.toString();\n    i++;\n  }\n\n  LocalFavoritesManager().createFolder(name);\n  // 是否同步网络收藏\n  if (agreeSync) {\n    LocalFavoritesManager()\n        .insertFolderSync(FolderSync(name, key, jsonEncode(syncData)));\n  }\n  int order = 0;\n  for (var comic in comics) {\n    LocalFavoritesManager().addComic(name, toLocalFavoriteFunc(comic), order);\n    order++;\n  }\n}\n\nvoid startFolderSync<T extends Object>(\n    BuildContext context, FolderSync folderSync) async {\n  final key = folderSync.key;\n  final folderName = folderSync.folderName;\n  final syncDataObj = folderSync.syncDataObj;\n\n  final curAllComics = LocalFavoritesManager().getAllComics(folderName);\n  final minValue = LocalFavoritesManager().minValue(folderName);\n  final maxValue = LocalFavoritesManager().maxValue(folderName);\n  int addValue = 0;\n  final loadComicObj = LoadComicClass();\n  final fData = getFavoriteData(key);\n  final total = int.parse(appdata.settings[71]);\n  List<BaseComic> comics = await getFavorites(\n      context,\n      (page) => loadComicObj.loadComic(fData, page, syncDataObj[\"folderId\"]),\n      null,\n      total);\n  final range = comics.length;\n  String direction =\n      '1'; // 顺序是放到最前还是最后, 为了保证顺序和网络收藏一致, 默认最前从新到旧, 不过有些网络收藏(绅士漫画)是从旧到新\n  final comicsWithRange = comics\n      .getRange(0, range)\n      .toList()\n      .reversed\n      .toList(); // 翻转一下, 保证插入顺序最终和网络收藏一致\n  for (var comic in comicsWithRange) {\n    final temComic = FavoriteItem.fromBaseComic(comic);\n    final index =\n        curAllComics.indexWhere((element) => element.target == temComic.target);\n    if (index == -1) {\n      if (direction == \"0\") {\n        addValue += 1;\n      } else {\n        addValue -= 1;\n      }\n      LocalFavoritesManager().addComic(folderName, temComic,\n          direction == \"0\" ? maxValue + addValue : minValue + addValue);\n    }\n  }\n  showToast(\n      message: \"本次更新数: \".tl +\n          addValue.abs().toString() +\n          \", 上次更新时间: \".tl +\n          folderSync.time);\n  folderSync.time = getCurTime();\n  LocalFavoritesManager().updateFolderSyncTime(folderSync);\n}\n"
  },
  {
    "path": "lib/network/nhentai_network/download.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'dart:typed_data';\nimport 'package:pica_comic/network/nhentai_network/nhentai_main_network.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport '../../base.dart';\nimport '../../foundation/image_manager.dart';\nimport '../../tools/io_tools.dart';\nimport '../download_model.dart';\n\nclass NhentaiDownloadedComic extends DownloadedItem {\n  NhentaiDownloadedComic(\n      this.comicID, this.title, this.size, this.cover, this.tags);\n\n  final String comicID;\n\n  final String title;\n\n  final double? size;\n\n  final String cover;\n\n  @override\n  double? get comicSize => size;\n\n  @override\n  List<int> get downloadedEps => [0];\n\n  @override\n  List<String> get eps => [\"第一章\".tl];\n\n  @override\n  String get id => comicID;\n\n  @override\n  String get name => title;\n\n  @override\n  String get subTitle => \"\";\n\n  @override\n  DownloadType get type => DownloadType.nhentai;\n\n  @override\n  Map<String, dynamic> toJson() =>\n      {'comicID': comicID, 'title': title, 'size': size, 'cover': cover};\n\n  NhentaiDownloadedComic.fromJson(Map<String, dynamic> json)\n      : comicID = json[\"comicID\"],\n        title = json[\"title\"],\n        size = json[\"size\"],\n        tags = List.from(json[\"tags\"] ?? []),\n        cover = json[\"cover\"];\n\n  @override\n  set comicSize(double? value) {}\n\n  @override\n  List<String> tags;\n}\n\nclass NhentaiDownloadingItem extends DownloadingItem {\n  NhentaiDownloadingItem(\n      this.comic, super.whenFinish, super.whenError, super.updateInfo, super.id,\n      {super.type = DownloadType.nhentai});\n\n  final NhentaiComic comic;\n\n  @override\n  String get cover => comic.cover;\n\n  @override\n  Future<Map<int, List<String>>> getLinks() async {\n    var res = await NhentaiNetwork().getImages(comic.id);\n    return {0: res.data};\n  }\n\n  @override\n  Stream<DownloadProgress> downloadImage(String link) {\n    return ImageManager().getImage(link);\n  }\n\n  @override\n  String get title => comic.title;\n\n  @override\n  Map<String, dynamic> toMap() =>\n      {\"comic\": comic.toMap(), ...super.toBaseMap()};\n\n  NhentaiDownloadingItem.fromMap(\n      Map<String, dynamic> map,\n      DownloadProgressCallback whenFinish,\n      DownloadProgressCallback whenError,\n      DownloadProgressCallbackAsync updateInfo,\n      String id)\n      : comic = NhentaiComic.fromMap(map[\"comic\"]),\n        super.fromMap(map, whenFinish, whenError, updateInfo);\n\n  @override\n  FutureOr<DownloadedItem> toDownloadedItem() async {\n    return NhentaiDownloadedComic(\n      id,\n      title,\n      await getFolderSize(Directory(path)),\n      comic.cover,\n      comic.tags[\"tags\"] ?? [],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/network/nhentai_network/login.dart",
    "content": "import 'dart:io' as io;\n\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/network/nhentai_network/nhentai_main_network.dart';\nimport 'package:pica_comic/pages/webview.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\n\nvoid nhLogin(void Function() onFinished) async{\n  if(NhentaiNetwork().baseUrl.contains(\"xxx\")){\n    showToast(message: \"暂不支持\");\n    return;\n  }\n\n  if(App.isDesktop && (await DesktopWebview.isAvailable())){\n    var webview = DesktopWebview(\n      initialUrl: \"${NhentaiNetwork().baseUrl}/login/?next=/\",\n      onTitleChange: (title, controller) async{\n        print(title);\n        if(title == \"nhentai.net\")  return;\n        if (!title.contains(\"Login\") && !title.contains(\"Register\") && title.contains(\"nhentai\")) {\n          var ua = controller.userAgent;\n          if(ua != null){\n            appdata.implicitData[3] = ua;\n            appdata.writeImplicitData();\n          }\n          var cookies = await controller.getCookies(\"${NhentaiNetwork().baseUrl}/\");\n          List<io.Cookie> cookiesList = [];\n          cookies.forEach((key, value) {\n            var cookie = io.Cookie(key, value);\n            if(key == \"sessionid\" || key == \"XSRF-TOKEN\"){\n              NhentaiNetwork().logged = true;\n            }\n            cookie.domain = \".nhentai.net\";\n            cookiesList.add(cookie);\n          });\n          NhentaiNetwork().cookieJar!.saveFromResponse(\n              Uri.parse(NhentaiNetwork().baseUrl), cookiesList);\n          onFinished();\n          controller.close();\n        }\n      },\n    );\n    webview.open();\n  } else if(App.isMobile) {\n    App.globalTo(() => AppWebview(\n      initialUrl: \"${NhentaiNetwork().baseUrl}/login/?next=/\",\n      singlePage: true,\n      onTitleChange: (title, controller) async{\n        if (!title.contains(\"Login\") && !title.contains(\"Register\") && title.contains(\"nhentai\")) {\n          var ua = await controller.getUA();\n          if(ua != null){\n            appdata.implicitData[3] = ua;\n            appdata.writeImplicitData();\n          }\n          var cookies = await controller.getCookies(\"${NhentaiNetwork().baseUrl}/\") ?? {};\n          List<io.Cookie> cookiesList = [];\n          cookies.forEach((key, value) {\n            var cookie = io.Cookie(key, value);\n            if(key == \"sessionid\" || key == \"XSRF-TOKEN\"){\n              NhentaiNetwork().logged = true;\n            }\n            cookie.domain = \".nhentai.net\";\n            cookiesList.add(cookie);\n          });\n          NhentaiNetwork().cookieJar!.saveFromResponse(\n              Uri.parse(NhentaiNetwork().baseUrl), cookiesList);\n          onFinished();\n          App.globalBack();\n        }\n      },\n    ));\n  } else {\n    showToast(message: \"当前设备不支持\".tl);\n  }\n}\n"
  },
  {
    "path": "lib/network/nhentai_network/models.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/network/base_comic.dart';\n\n@immutable\nclass NhentaiComicBrief extends BaseComic{\n  @override\n  final String title;\n  @override\n  final String cover;\n  @override\n  final String id;\n  final String lang;\n  @override\n  final List<String> tags;\n\n  const NhentaiComicBrief(this.title, this.cover, this.id, this.lang, this.tags);\n\n  @override\n  String get description => lang;\n\n  @override\n  String get subTitle => id;\n\n  @override\n  bool get enableTagsTranslation => true;\n}\n\nclass NhentaiHomePageData{\n  final List<NhentaiComicBrief> popular;\n  List<NhentaiComicBrief> latest;\n  int page = 1;\n\n  NhentaiHomePageData(this.popular, this.latest);\n}\n\nclass NhentaiComic with HistoryMixin{\n  String id;\n  @override\n  String title;\n  @override\n  String subTitle;\n  @override\n  String cover;\n  Map<String, List<String>> tags;\n  bool favorite;\n  List<String> thumbnails;\n  List<NhentaiComicBrief> recommendations;\n  String token;\n\n  NhentaiComic(this.id, this.title, this.subTitle, this.cover, this.tags, this.favorite,\n      this.thumbnails, this.recommendations, this.token);\n\n  Map<String, dynamic> toMap() => {\n    \"id\": id,\n    \"title\": title,\n    \"subTitle\": subTitle,\n    \"cover\": cover,\n  };\n\n  NhentaiComic.fromMap(Map<String, dynamic> map):\n      id = map[\"id\"],\n      title = map[\"title\"],\n      subTitle = map[\"subTitle\"],\n      cover = map[\"cover\"],\n      tags = {},\n      favorite = false,\n      thumbnails = [],\n      recommendations = [],\n      token = \"\";\n\n  @override\n  HistoryType get historyType => HistoryType.nhentai;\n\n  @override\n  String get target => id;\n}\n\nclass NhentaiComment{\n  String userName;\n  String avatar;\n  String content;\n  int date;\n\n  NhentaiComment(this.userName, this.avatar, this.content, this.date);\n}"
  },
  {
    "path": "lib/network/nhentai_network/nhentai_main_network.dart",
    "content": "import 'dart:convert';\nimport 'package:dio/dio.dart';\nimport 'package:html/dom.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/cloudflare.dart';\nimport 'package:pica_comic/network/cookie_jar.dart';\nimport 'package:pica_comic/network/nhentai_network/tags.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/time.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/pages/pre_search_page.dart';\nimport '../app_dio.dart';\nimport 'models.dart';\nimport 'package:html/parser.dart';\n\nexport 'models.dart';\n\nclass NhentaiNetwork {\n  factory NhentaiNetwork() => _cache ?? (_cache = NhentaiNetwork._create());\n\n  NhentaiNetwork._create();\n\n  static NhentaiNetwork? _cache;\n\n  SingleInstanceCookieJar? cookieJar;\n\n  bool logged = false;\n\n  String get baseUrl => appdata.settings[48];\n\n  late Dio dio;\n\n  Future<void> init() async {\n    cookieJar = SingleInstanceCookieJar.instance;\n    for (var cookie in cookieJar!.loadForRequest(Uri.parse(baseUrl))) {\n      if (cookie.name == \"sessionid\") {\n        logged = true;\n      }\n    }\n    dio = logDio(BaseOptions(\n      headers: {\n        \"Accept\":\n            \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\",\n        \"Accept-Language\": \"zh-CN,zh-TW;q=0.9,zh;q=0.8,en-US;q=0.7,en;q=0.6\",\n        \"Referer\": \"$baseUrl/\",\n      },\n      validateStatus: (i) => i == 200 || i == 302,\n    ));\n    dio.interceptors.add(CookieManagerSql(cookieJar!));\n    dio.interceptors.add(CloudflareInterceptor());\n  }\n\n  void logout() async {\n    logged = false;\n    cookieJar!.delete(Uri.parse(baseUrl), \"sessionid\");\n  }\n\n  Future<Res<String>> get(String url) async {\n    if (cookieJar == null) {\n      await init();\n    }\n    try {\n      var res = await dio.get<String>(url);\n      if (res.statusCode == 302) {\n        return Res(res.headers[\"Location\"]?.first ??\n            res.headers[\"location\"]?.first ??\n            \"\");\n      }\n      return Res(res.data);\n    } catch (e) {\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<String>> post(String url, dynamic data,\n      [Map<String, String>? headers]) async {\n    if (cookieJar == null) {\n      await init();\n    }\n    try {\n      var res = await dio.post<String>(url, data: data, options: Options(headers: headers));\n      return Res(res.data);\n    } catch (e) {\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  NhentaiComicBrief parseComic(Element comicDom) {\n    var img = comicDom.querySelector(\"a > img\")!.attributes[\"data-src\"]!;\n    var name = comicDom.querySelector(\"div.caption\")!.text;\n    var id = comicDom.querySelector(\"a\")!.attributes[\"href\"]!.nums;\n    var lang = \"Unknown\";\n    var tags = comicDom.attributes[\"data-tags\"] ?? \"\";\n    if (tags.contains(\"12227\")) {\n      lang = \"English\";\n    } else if (tags.contains(\"6346\")) {\n      lang = \"日本語\";\n    } else if (tags.contains(\"29963\")) {\n      lang = \"中文\";\n    }\n    var tagsRes = <String>[];\n    for (var tag in tags.split(\" \")) {\n      if (nhentaiTags[tag] != null) {\n        tagsRes.add(nhentaiTags[tag]!);\n      }\n    }\n    return NhentaiComicBrief(name, img, id, lang, tagsRes);\n  }\n\n  List<T> removeNullValue<T extends Object>(List<T?> list) {\n    while (list.remove(null)) {}\n    return List.from(list);\n  }\n\n  Future<Res<NhentaiHomePageData>> getHomePage([int? page]) async {\n    var url = baseUrl;\n    if (page != null && page != 1) {\n      url = \"$url?page=$page\";\n    }\n    var res = await get(url);\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    try {\n      var document = parse(res.data);\n      List<Element> popularDoms;\n      if (url == baseUrl) {\n        popularDoms = document.querySelectorAll(\n            \"div.container.index-container.index-popular > div.gallery\");\n      } else {\n        popularDoms = const [];\n      }\n      var latest = document\n          .querySelectorAll(\"div.container.index-container > div.gallery\");\n\n      return Res(NhentaiHomePageData(\n        removeNullValue(List.generate(\n            popularDoms.length, (index) => parseComic(popularDoms[index]))),\n        removeNullValue(List.generate(latest.length - popularDoms.length,\n            (index) => parseComic(latest[index + popularDoms.length]))),\n      ));\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: \"Failed to Parse Data: $e\");\n    }\n  }\n\n  Future<Res<bool>> loadMoreHomePageData(NhentaiHomePageData data) async {\n    var res = await get(\"$baseUrl?page=${data.page + 1}\");\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    try {\n      var document = parse(res.data);\n\n      var latest = document.querySelectorAll(\"div.gallery\");\n\n      data.latest.addAll(removeNullValue(\n          List.generate(latest.length, (index) => parseComic(latest[index]))));\n\n      data.page++;\n\n      return const Res(true);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: \"Failed to Parse Data: $e\");\n    }\n  }\n\n  Future<Res<List<NhentaiComicBrief>>> search(String keyword, int page,\n      [NhentaiSort sort = NhentaiSort.recent]) async {\n    if (appdata.searchHistory.contains(keyword)) {\n      appdata.searchHistory.remove(keyword);\n    }\n    appdata.searchHistory.add(keyword);\n    appdata.writeHistory();\n    var res = await get(\n        \"$baseUrl/search/?q=${Uri.encodeComponent(keyword)}&page=$page${sort.value}\");\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    try {\n      var document = parse(res.data);\n\n      var comicDoms = document.querySelectorAll(\"div.gallery\");\n\n      var results = document.querySelector(\"div#content > h1\")!.text;\n\n      Future.microtask(() {\n        try {\n          StateController.find<PreSearchController>().update();\n        } catch (e) {\n          //\n        }\n      });\n\n      if (comicDoms.isEmpty) {\n        return const Res([], subData: 0);\n      }\n\n      return Res(\n          removeNullValue(List.generate(\n              comicDoms.length, (index) => parseComic(comicDoms[index]))),\n          subData: (int.parse(results.nums) / comicDoms.length).ceil());\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: \"Failed to Parse Data: $e\");\n    }\n  }\n\n  Future<Res<NhentaiComic>> getComicInfo(String id) async {\n    Res<String> res;\n    if (id == \"\") {\n      res = await get(\"$baseUrl/random/\");\n      if (res.error) {\n        return Res.fromErrorRes(res);\n      }\n    } else {\n      res = await get(\"$baseUrl/g/$id/\");\n    }\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    try {\n      String combineSpans(Element? title) {\n        var res = \"\";\n        for (var span in title?.children ?? []) {\n          res += span.text;\n        }\n        return res;\n      }\n\n      var document = parse(res.data);\n      \n      id = id == \"\" ? document.querySelector(\"h3#gallery_id\")!.text.nums : id;\n\n      var cover = document\n          .querySelector(\"div#cover > a > img\")!\n          .attributes[\"data-src\"]!;\n\n      var title = combineSpans(document.querySelector(\"h1.title\")!);\n\n      var subTitle = combineSpans(document.querySelector(\"h2.title\"));\n\n      Map<String, List<String>> tags = {};\n      for (var field in document.querySelectorAll(\"div.tag-container\")) {\n        var fieldName =\n            field.firstChild!.text!.removeAllBlank.replaceLast(\":\", \"\");\n        if (fieldName == \"Uploaded\") {\n          var timeStr = document.querySelector(\"time\")?.attributes[\"datetime\"];\n          if (timeStr != null) {\n            tags[\"时间\".tl] = [timeToString(DateTime.parse(timeStr))];\n            continue;\n          }\n        }\n        tags[fieldName] = [];\n        for (var span in field.querySelectorAll(\"span.name\")) {\n          tags[fieldName]!.add(span.text);\n        }\n      }\n\n      bool favorite =\n          document.querySelector(\"button#favorite > span.text\")?.text !=\n                  \"Favorite\" &&\n              logged;\n\n      var thumbnails = <String>[];\n      for (var t in document.querySelectorAll(\"a.gallerythumb > img\")) {\n        thumbnails.add(t.attributes[\"data-src\"]!);\n      }\n\n      var recommendations = <NhentaiComicBrief>[];\n      for (var comic in document.querySelectorAll(\"div.gallery\")) {\n        var c = parseComic(comic);\n        recommendations.add(c);\n      }\n      String token = \"\";\n      try {\n        var script = document\n            .querySelectorAll(\"script\")\n            .firstWhere((element) => element.text.contains(\"csrf_token\"))\n            .text;\n        token = script.split(\"csrf_token: \\\"\")[1].split(\"\\\",\")[0];\n      } catch (e) {\n        // ignore\n      }\n\n      return Res(NhentaiComic(id, title, subTitle, cover, tags, favorite,\n          thumbnails, recommendations, token));\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: \"Failed to Parse Data: $e\");\n    }\n  }\n\n  Future<Res<List<NhentaiComment>>> getComments(String id) async {\n    var res = await get(\"$baseUrl/api/gallery/$id/comments\");\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    try {\n      var json = const JsonDecoder().convert(res.data);\n      var comments = <NhentaiComment>[];\n      for (var c in json) {\n        comments.add(NhentaiComment(\n            c[\"poster\"][\"username\"],\n            \"https://i3.nhentai.net/${c[\"poster\"][\"avatar_url\"]}\",\n            c[\"body\"],\n            c[\"post_date\"]));\n      }\n      return Res(comments);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: \"Failed to Parse Data: $e\");\n    }\n  }\n\n  Future<Res<List<String>>> getImages(String id) async {\n    var res = await get(\"$baseUrl/g/$id/1/\");\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    try {\n      if (baseUrl.contains(\"net\")) {\n        var document = parse(res.data);\n        var script = document\n            .querySelectorAll(\"script\")\n            .firstWhere((element) => element.text.contains(\"window._gallery\"))\n            .text;\n\n        Map<String, dynamic> parseJavaScriptJson(String jsCode) {\n          String jsonText = jsCode.split('JSON.parse(\"')[1].split('\");')[0];\n          String decodedJsonText =\n              jsonText.replaceAll(\"\\\\u0022\", \"\\\"\").replaceAll(\"\\\\u005C\", \"\\\\\");\n\n          return json.decode(decodedJsonText);\n        }\n\n        var galleryData = parseJavaScriptJson(script);\n\n        String mediaId = galleryData[\"media_id\"];\n\n        var images = <String>[];\n\n        for (var image in galleryData[\"images\"][\"pages\"]) {\n          var extension = switch (image[\"t\"]) {\n            \"j\" => \"jpg\",\n            \"p\" => \"png\",\n            \"g\" => \"gif\",\n            _ => \"jpg\"\n          };\n          images.add(\n              \"https://i7.nhentai.net/galleries/$mediaId/${images.length + 1}\"\n              \".$extension\");\n        }\n        return Res(images);\n      } else if (baseUrl.contains(\"xxx\")) {\n        var document = parse(res.data);\n        for (var element in document.querySelectorAll(\"img\")) {\n          if (!(element.attributes[\"data-cfsrc\"] ??\n                  element.attributes[\"src\"] ??\n                  \"logo\")\n              .contains(\"logo\")) {\n            var splits =\n                (element.attributes[\"data-cfsrc\"] ?? element.attributes[\"src\"])!\n                    .split(\"/\");\n            String imageUrl = splits.sublist(0, splits.length - 1).join(\"/\");\n            var images = <String>[];\n            final pages =\n                int.parse(document.querySelector(\"span.num-pages\")!.text);\n            for (int i = 1; i <= pages; i++) {\n              images.add(\"$imageUrl/$i.jpg\");\n            }\n            return Res(images);\n          }\n        }\n        throw StateError(\"Failed to get images\");\n      } else {\n        throw UnimplementedError();\n      }\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: \"Failed to Parse Data: $e\");\n    }\n  }\n\n  // 一页 25 个\n  Future<Res<List<NhentaiComicBrief>>> getFavorites(int page) async {\n    if (!logged) {\n      return const Res(null, errorMessage: \"login required\");\n    }\n    var res = await get(\"$baseUrl/favorites/?page=$page\");\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    try {\n      var document = parse(res.data);\n      var comics = document.querySelectorAll(\"div.gallery\");\n      var lastPagination = document\n          .querySelector(\"section.pagination > a.last\")\n          ?.attributes[\"href\"]\n          ?.nums;\n      return Res(\n          removeNullValue(List.generate(\n              comics.length, (index) => parseComic(comics[index]))),\n          subData: lastPagination == null ? 1 : int.parse(lastPagination));\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: \"Failed to Parse Data: $e\");\n    }\n  }\n\n  Future<Res<bool>> favoriteComic(String id, String token) async {\n    var res = await post(\"$baseUrl/api/gallery/$id/favorite\", null, {\n      \"Referer\": \"$baseUrl/g/$id\",\n      \"X-Csrftoken\": token,\n      \"X-Requested-With\": \"XMLHttpRequest\"\n    });\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    } else {\n      return const Res(true);\n    }\n  }\n\n  Future<Res<bool>> unfavoriteComic(String id, String token) async {\n    var res = await post(\"$baseUrl/api/gallery/$id/unfavorite\", null, {\n      \"Referer\": \"$baseUrl/g/$id\",\n      \"X-Csrftoken\": token,\n      \"X-Requested-With\": \"XMLHttpRequest\"\n    });\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    } else {\n      return const Res(true);\n    }\n  }\n\n  Future<Res<List<NhentaiComicBrief>>> getCategoryComics(\n      String path, int page, NhentaiSort sort) async {\n    var param = switch (sort) {\n      NhentaiSort.recent => '/',\n      NhentaiSort.popularToday => '/popular-today',\n      NhentaiSort.popularWeek => '/popular-week',\n      NhentaiSort.popularMonth => '/popular-month',\n      NhentaiSort.popularAll => '/popular'\n    };\n    var res = await get(\"$baseUrl$path$param?page=$page\");\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    try {\n      var document = parse(res.data);\n\n      var comicDoms = document.querySelectorAll(\"div.gallery\");\n\n      var results = document.querySelector(\"div#content > h1\")!.text;\n\n      Future.microtask(() {\n        try {\n          StateController.find<PreSearchController>().update();\n        } catch (e) {\n          //\n        }\n      });\n\n      if (comicDoms.isEmpty) {\n        return const Res([], subData: 0);\n      }\n\n      return Res(\n          removeNullValue(List.generate(\n              comicDoms.length, (index) => parseComic(comicDoms[index]))),\n          subData: (int.parse(results.nums) / comicDoms.length).ceil());\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: \"Failed to Parse Data: $e\");\n    }\n  }\n}\n\nenum NhentaiSort {\n  recent(\"\"),\n  popularToday(\"&sort=popular-today\"),\n  popularWeek(\"&sort=popular-week\"),\n  popularMonth(\"&sort=popular-month\"),\n  popularAll(\"&sort=popular\");\n\n  final String value;\n\n  const NhentaiSort(this.value);\n\n  static NhentaiSort fromValue(String value) {\n    switch (value) {\n      case \"\":\n        return NhentaiSort.recent;\n      case \"&sort=popular-today\":\n        return NhentaiSort.popularToday;\n      case \"&sort=popular-week\":\n        return NhentaiSort.popularWeek;\n      case \"&sort=popular-month\":\n        return NhentaiSort.popularMonth;\n      case \"&sort=popular\":\n        return NhentaiSort.popularAll;\n      default:\n        return NhentaiSort.recent;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/network/nhentai_network/tags.dart",
    "content": "const Map<String, String> nhentaiTags = {\n  \"2937\":\"big breasts\",\n  \"35762\":\"sole female\",\n  \"35763\":\"sole male\",\n  \"8010\":\"group\",\n  \"14283\":\"anal\",\n  \"19440\":\"lolicon\",\n  \"24201\":\"stockings\",\n  \"10314\":\"schoolgirl uniform\",\n  \"13720\":\"nakadashi\",\n  \"29859\":\"blowjob\",\n  \"8378\":\"glasses\",\n  \"20905\":\"full color\",\n  \"32341\":\"shotacon\",\n  \"27553\":\"rape\",\n  \"15658\":\"bondage\",\n  \"23895\":\"yaoi\",\n  \"27473\":\"mosaic censorship\",\n  \"13989\":\"ahegao\",\n  \"22942\":\"incest\",\n  \"21712\":\"males only\",\n  \"1207\":\"milf\",\n  \"19018\":\"dark skin\",\n  \"22945\":\"double penetration\",\n  \"25614\":\"paizuri\",\n  \"20035\":\"x-ray\",\n  \"779\":\"futanari\",\n  \"23237\":\"tankoubon\",\n  \"21572\":\"multi-work series\",\n  \"20525\":\"defloration\",\n  \"14971\":\"sex toys\",\n  \"8653\":\"netorare\",\n  \"3735\":\"swimsuit\",\n  \"19954\":\"yuri\",\n  \"15348\":\"ffm threesome\",\n  \"8368\":\"full censorship\",\n  \"15408\":\"femdom\",\n  \"29224\":\"impregnation\",\n  \"29013\":\"dilf\",\n  \"85295\":\"twintails\",\n  \"31044\":\"collar\",\n  \"85288\":\"ponytail\",\n  \"24380\":\"pantyhose\",\n  \"9260\":\"cheating\",\n  \"28031\":\"sister\",\n  \"16828\":\"hairy\",\n  \"31880\":\"bbm\",\n  \"30555\":\"big penis\",\n  \"15782\":\"crossdressing\",\n  \"31775\":\"tentacles\",\n  \"27384\":\"mind break\",\n  \"19175\":\"bikini\",\n  \"8739\":\"story arc\",\n  \"30473\":\"muscle\",\n  \"24102\":\"lactation\",\n  \"7752\":\"schoolboy uniform\",\n  \"20617\":\"mind control\",\n  \"9083\":\"big ass\",\n  \"29023\":\"tomgirl\",\n  \"81774\":\"kemonomimi\",\n  \"1590\":\"sweating\",\n  \"9162\":\"masturbation\",\n  \"7256\":\"mmf threesome\",\n  \"28550\":\"teacher\",\n  \"190\":\"maid\",\n  \"8693\":\"uncensored\",\n  \"19899\":\"exhibitionism\",\n  \"6343\":\"pregnant\",\n  \"8050\":\"females only\",\n  \"6817\":\"unusual pupils\",\n  \"25871\":\"lingerie\",\n  \"10988\":\"anthology\",\n  \"20282\":\"footjob\",\n  \"15853\":\"mother\",\n  \"15785\":\"harem\",\n  \"14072\":\"huge breasts\",\n  \"30035\":\"gender bender\",\n  \"1643\":\"kissing\",\n  \"130025\":\"anal intercourse\",\n  \"1033\":\"handjob\",\n  \"12824\":\"condom\",\n  \"31386\":\"catgirl\",\n  \"10476\":\"urination\",\n  \"3666\":\"garter belt\",\n  \"26130\":\"fingering\",\n  \"81707\":\"beauty mark\",\n  \"22079\":\"drugs\",\n  \"105833\":\"gloves\",\n  \"4435\":\"gag\",\n  \"25601\":\"small breasts\",\n  \"5820\":\"piercing\",\n  \"12695\":\"prostitution\",\n  \"16228\":\"demon girl\",\n  \"7155\":\"cunnilingus\",\n  \"22950\":\"tanlines\",\n  \"832\":\"elf\",\n  \"31012\":\"blindfold\",\n  \"17773\":\"kimono\",\n  \"2820\":\"scat\",\n  \"29182\":\"blackmail\",\n  \"23132\":\"bunny girl\",\n  \"32484\":\"stomach deformation\",\n  \"2515\":\"virginity\",\n  \"27063\":\"filming\",\n  \"7142\":\"bbw\",\n  \"21989\":\"inflation\",\n  \"88846\":\"horns\",\n  \"104227\":\"tail\",\n  \"26953\":\"bukkake\",\n  \"28800\":\"bloomers\",\n  \"25050\":\"gyaru\",\n  \"24676\":\"rimjob\",\n  \"23632\":\"big areolae\",\n  \"16533\":\"sleeping\",\n  \"73750\":\"bald\",\n  \"18567\":\"monster\",\n  \"35972\":\"sole dickgirl\",\n  \"18328\":\"thigh high boots\",\n  \"5810\":\"strap-on\",\n  \"29565\":\"school swimsuit\",\n  \"32996\":\"deepthroat\",\n  \"370\":\"business suit\",\n  \"7550\":\"monster girl\",\n  \"1067\":\"inseki\",\n  \"50585\":\"webtoon\",\n  \"12523\":\"bestiality\",\n  \"27697\":\"leotard\",\n  \"30645\":\"dick growth\",\n  \"29631\":\"inverted nipples\",\n  \"29366\":\"tomboy\",\n  \"24412\":\"bodysuit\",\n  \"15492\":\"scanmark\",\n  \"9406\":\"enema\",\n  \"35970\":\"dickgirl on dickgirl\",\n  \"29399\":\"daughter\",\n  \"18613\":\"military\",\n  \"11941\":\"replaced\",\n  \"6525\":\"nurse\",\n  \"9661\":\"cervix penetration\",\n  \"33129\":\"slave\",\n  \"4573\":\"corruption\",\n  \"5529\":\"urethra insertion\",\n  \"10542\":\"snuff\",\n  \"683\":\"squirting\",\n  \"51399\":\"crotch tattoo\",\n  \"122908\":\"very long hair\",\n  \"7838\":\"magical girl\",\n  \"24726\":\"apron\",\n  \"23183\":\"breast expansion\",\n  \"20074\":\"latex\",\n  \"28426\":\"hairy armpits\",\n  \"27217\":\"guro\",\n  \"31285\":\"fox girl\",\n  \"106119\":\"no penetration\",\n  \"24764\":\"drunk\",\n  \"9990\":\"prostate massage\",\n  \"35968\":\"dickgirl on male\",\n  \"2956\":\"old man\",\n  \"32752\":\"shibari\",\n  \"6900\":\"miko\",\n  \"2153\":\"wings\",\n  \"706\":\"birth\",\n  \"10794\":\"breast feeding\",\n  \"14069\":\"ryona\",\n  \"25822\":\"smell\",\n  \"5357\":\"humiliation\",\n  \"5962\":\"spanking\",\n  \"2531\":\"transformation\",\n  \"21538\":\"bike shorts\",\n  \"31101\":\"incomplete\",\n  \"32745\":\"chikan\",\n  \"16236\":\"shemale\",\n  \"36957\":\"bisexual\",\n  \"26952\":\"tall girl\",\n  \"25663\":\"oppai loli\",\n  \"7995\":\"big nipples\",\n  \"32602\":\"fisting\",\n  \"106733\":\"hair buns\",\n  \"1088\":\"bdsm\",\n  \"21283\":\"masked face\",\n  \"15225\":\"blowjob face\",\n  \"2633\":\"leg lock\",\n  \"27378\":\"artbook\",\n  \"35971\":\"male on dickgirl\",\n  \"27112\":\"tiara\",\n  \"107705\":\"facial hair\",\n  \"24933\":\"eyepatch\",\n  \"4549\":\"torture\",\n  \"30206\":\"tribadism\",\n  \"1037\":\"oni\",\n  \"89056\":\"hidden sex\",\n  \"13136\":\"facesitting\",\n  \"3391\":\"nun\",\n  \"25766\":\"gokkun\",\n  \"5200\":\"pegging\",\n  \"17531\":\"cosplaying\",\n  \"28521\":\"voyeurism\",\n  \"19479\":\"nipple fuck\",\n  \"17349\":\"tracksuit\",\n  \"22221\":\"blood\",\n  \"50505\":\"oyakodon\",\n  \"50486\":\"tail plug\",\n  \"560\":\"twins\",\n  \"23965\":\"chloroform\",\n  \"15425\":\"vore\",\n  \"25457\":\"possession\",\n  \"129668\":\"eye-covering bang\",\n  \"24984\":\"orgasm denial\",\n  \"144644\":\"extraneous ads\",\n  \"28589\":\"hotpants\",\n  \"17752\":\"foot licking\",\n  \"32282\":\"piss drinking\",\n  \"19390\":\"cousin\",\n  \"32589\":\"feminization\",\n  \"11376\":\"body modification\",\n  \"20362\":\"gyaru-oh\",\n  \"28778\":\"large insertions\",\n  \"27720\":\"smegma\",\n  \"10811\":\"double vaginal\",\n  \"3614\":\"triple penetration\",\n  \"3455\":\"chastity belt\",\n  \"2452\":\"scar\",\n  \"31319\":\"yandere\",\n  \"7354\":\"amputee\",\n  \"28335\":\"giantess\",\n  \"26848\":\"waitress\",\n  \"28349\":\"cbt\",\n  \"24967\":\"sumata\",\n  \"104893\":\"vtuber\",\n  \"8516\":\"emotionless sex\",\n  \"26380\":\"demon\",\n  \"17591\":\"robot\",\n  \"17801\":\"solo action\",\n  \"13640\":\"frottage\",\n  \"25996\":\"gaping\",\n  \"23035\":\"aunt\",\n  \"23967\":\"huge penis\",\n  \"31846\":\"body writing\",\n  \"25744\":\"cheerleader\",\n  \"24708\":\"cowgirl\",\n  \"25085\":\"swinging\",\n  \"18322\":\"brother\",\n  \"101724\":\"leash\",\n  \"10354\":\"milking\",\n  \"97795\":\"pixie cut\",\n  \"11089\":\"body swap\",\n  \"32224\":\"eggs\",\n  \"10606\":\"pasties\",\n  \"3947\":\"onahole\",\n  \"14573\":\"tall man\",\n  \"10604\":\"dog\",\n  \"14362\":\"low lolicon\",\n  \"15242\":\"lab coat\",\n  \"4935\":\"farting\",\n  \"13468\":\"shimapan\",\n  \"5620\":\"double anal\",\n  \"14138\":\"freckles\",\n  \"50390\":\"josou seme\",\n  \"15119\":\"dog girl\",\n  \"93324\":\"fishnets\",\n  \"22025\":\"prolapse\",\n  \"15471\":\"asphyxiation\",\n  \"21774\":\"human pet\",\n  \"31337\":\"kunoichi\",\n  \"15712\":\"eyemask\",\n  \"30126\":\"big clit\",\n  \"92409\":\"thick eyebrows\",\n  \"109360\":\"cumflation\",\n  \"7208\":\"catboy\",\n  \"31687\":\"randoseru\",\n  \"24529\":\"bride\",\n  \"19561\":\"big balls\",\n  \"24450\":\"chinese dress\",\n  \"121738\":\"focus anal\",\n  \"22967\":\"diaper\",\n  \"29347\":\"miniguy\",\n  \"29001\":\"parasite\",\n  \"25296\":\"armpit licking\",\n  \"6220\":\"orc\",\n  \"7546\":\"witch\",\n  \"30895\":\"sunglasses\",\n  \"7372\":\"corset\",\n  \"28119\":\"nose hook\",\n  \"8429\":\"machine\",\n  \"7684\":\"armpit sex\",\n  \"14516\":\"wolf girl\",\n  \"15045\":\"niece\",\n  \"13882\":\"tutor\",\n  \"8391\":\"public use\",\n  \"30811\":\"christmas\",\n  \"104245\":\"small penis\",\n  \"266\":\"sundress\",\n  \"17501\":\"phimosis\",\n  \"17800\":\"tickling\",\n  \"25794\":\"widow\",\n  \"7288\":\"vomit\",\n  \"1215\":\"unusual teeth\",\n  \"72471\":\"dickgirls only\",\n  \"107503\":\"soushuuhen\",\n  \"138044\":\"exposed clothing\",\n  \"1352\":\"slime\",\n  \"31986\":\"age regression\",\n  \"23917\":\"long tongue\",\n  \"24115\":\"angel\",\n  \"114993\":\"shimaidon\",\n  \"13722\":\"moral degeneration\",\n  \"26898\":\"age progression\",\n  \"27120\":\"selfcest\",\n  \"7577\":\"vampire\",\n  \"17676\":\"ghost\",\n  \"88103\":\"clothed female nude male\",\n  \"13515\":\"coach\",\n  \"141098\":\"nipple stimulation\",\n  \"9116\":\"unbirth\",\n  \"5936\":\"time stop\",\n  \"18420\":\"all the way through\",\n  \"72139\":\"clothed paizuri\",\n  \"27530\":\"ball sucking\",\n  \"16518\":\"coprophagia\",\n  \"28869\":\"stuck in wall\",\n  \"2527\":\"bandages\",\n  \"24621\":\"insect\",\n  \"11399\":\"metal armor\",\n  \"106006\":\"large tattoo\",\n  \"3843\":\"fundoshi\",\n  \"20120\":\"multiple paizuri\",\n  \"8400\":\"goblin\",\n  \"129321\":\"mesuiki\",\n  \"124610\":\"mouth mask\",\n  \"10693\":\"dougi\",\n  \"31371\":\"mecha girl\",\n  \"21450\":\"minigirl\",\n  \"10685\":\"double blowjob\",\n  \"118056\":\"petplay\",\n  \"20789\":\"policewoman\",\n  \"3031\":\"underwater\",\n  \"31173\":\"first person perspective\",\n  \"78262\":\"shaved head\",\n  \"19064\":\"pubic stubble\",\n  \"14280\":\"bunny boy\",\n  \"25949\":\"gothic lolita\",\n  \"23463\":\"wrestling\",\n  \"16947\":\"horse\",\n  \"11247\":\"skinsuit\",\n  \"11073\":\"living clothes\",\n  \"30786\":\"watermarked\",\n  \"23073\":\"assjob\",\n  \"52826\":\"dark sclera\",\n  \"107478\":\"drill hair\",\n  \"23225\":\"non-h\",\n  \"109930\":\"domination loss\",\n  \"20170\":\"poor grammar\",\n  \"138200\":\"gender change\",\n  \"16759\":\"artistcg\",\n  \"80978\":\"nudity only\",\n  \"15749\":\"oil\",\n  \"30176\":\"petrification\",\n  \"25848\":\"human cattle\",\n  \"559\":\"ttf threesome\",\n  \"14010\":\"snake girl\",\n  \"11276\":\"multiple penises\",\n  \"90671\":\"original\",\n  \"18024\":\"touhou project\",\n  \"1841\":\"kantai collection\",\n  \"35605\":\"fate grand order\",\n  \"20925\":\"the idolmaster\",\n  \"972\":\"granblue fantasy\",\n  \"78245\":\"azur lane\",\n  \"17137\":\"neon genesis evangelion\",\n  \"3185\":\"love live\",\n  \"391\":\"girls und panzer\",\n  \"11219\":\"pokemon\",\n  \"15021\":\"sailor moon\",\n  \"4505\":\"mahou shoujo lyrical nanoha\",\n  \"128408\":\"blue archive\",\n  \"10222\":\"fate stay night\",\n  \"27431\":\"to love-ru\",\n  \"13159\":\"naruto\",\n  \"123503\":\"genshin impact\",\n  \"3984\":\"sword art online\",\n  \"3603\":\"street fighter\",\n  \"22174\":\"one piece\",\n  \"16285\":\"puella magi madoka magica\",\n  \"91195\":\"princess connect\",\n  \"12232\":\"my hero academia\",\n  \"3163\":\"king of fighters\",\n  \"26172\":\"k-on\",\n  \"7259\":\"touken ranbu\",\n  \"19080\":\"code geass\",\n  \"37544\":\"love live sunshine\",\n  \"17077\":\"cardcaptor sakura\",\n  \"27547\":\"the melancholy of haruhi suzumiya\",\n  \"13508\":\"final fantasy vii\",\n  \"10954\":\"shingeki no kyojin\",\n  \"25430\":\"vocaloid\",\n  \"32687\":\"free\",\n  \"4577\":\"toheart2\",\n  \"22146\":\"dead or alive\",\n  \"20025\":\"gochuumon wa usagi desu ka\",\n  \"8485\":\"dragon ball z\",\n  \"5037\":\"bleach\",\n  \"3218\":\"bakemonogatari\",\n  \"12624\":\"ore no imouto ga konna ni kawaii wake ga nai\",\n  \"37109\":\"kono subarashii sekai ni syukufuku o\",\n  \"4369\":\"monster hunter\",\n  \"127065\":\"hololive\",\n  \"74788\":\"girls frontline\",\n  \"24886\":\"fate kaleid liner prisma illya\",\n  \"6999\":\"toaru kagaku no railgun\",\n  \"22032\":\"boku wa tomodachi ga sukunai\",\n  \"18350\":\"ragnarok online\",\n  \"21674\":\"dragon quest iii\",\n  \"14345\":\"ojamajo doremi\",\n  \"7832\":\"darkstalkers\",\n  \"24135\":\"ah my goddess\",\n  \"32394\":\"samurai spirits\",\n  \"1283\":\"queens blade\",\n  \"16639\":\"haikyuu\",\n  \"13924\":\"yu-gi-oh\",\n  \"79467\":\"kimetsu no yaiba\",\n  \"18238\":\"danganronpa\",\n  \"26336\":\"yu-gi-oh zexal\",\n  \"16984\":\"persona 4\",\n  \"18569\":\"kuroko no basuke\",\n  \"1910\":\"smile precure\",\n  \"30587\":\"sakura taisen\",\n  \"16166\":\"mahou sensei negima\",\n  \"12285\":\"ranma 12\",\n  \"8470\":\"infinite stratos\",\n  \"32363\":\"toaru majutsu no index\",\n  \"22708\":\"saki\",\n  \"8708\":\"to heart\",\n  \"108082\":\"arknights\",\n  \"16707\":\"detective conan\",\n  \"22210\":\"guilty gear\",\n  \"947\":\"gundam seed destiny\",\n  \"22677\":\"tenchi muyo\",\n  \"23429\":\"pretty cure\",\n  \"18512\":\"strike witches\",\n  \"31027\":\"lucky star\",\n  \"7408\":\"league of legends\",\n  \"394\":\"love hina\",\n  \"23201\":\"kanon\",\n  \"27704\":\"amagami\",\n  \"127052\":\"nijisanji\",\n  \"70802\":\"kemono friends\",\n  \"52098\":\"persona 5\",\n  \"22215\":\"super robot wars\",\n  \"27567\":\"hayate no gotoku\",\n  \"35251\":\"osomatsu-san\",\n  \"7633\":\"pripara\",\n  \"34823\":\"ensemble stars\",\n  \"37914\":\"re zero kara hajimeru isekai seikatsu\",\n  \"74918\":\"bang dream\",\n  \"15041\":\"martian successor nadesico\",\n  \"24783\":\"dragon ball\",\n  \"120519\":\"love live nijigasaki high school idol club\",\n  \"2803\":\"love plus\",\n  \"5085\":\"senki zesshou symphogear\",\n  \"28474\":\"zero no tsukaima\",\n  \"15197\":\"gundam build fighters\",\n  \"15427\":\"dragon quest iv\",\n  \"1163\":\"rozen maiden\",\n  \"23859\":\"yu-gi-oh arc-v\",\n  \"75023\":\"dragon quest xi\",\n  \"2112\":\"dungeon ni deai o motomeru no wa machigatteiru darou ka\",\n  \"36418\":\"voiceroid\",\n  \"28281\":\"mitsudomoe\",\n  \"11624\":\"the legend of zelda\",\n  \"14694\":\"fullmetal alchemist\",\n  \"16847\":\"dragon quest v\",\n  \"2497\":\"urusei yatsura\",\n  \"5671\":\"tengen toppa gurren lagann\",\n  \"22754\":\"amagi brilliant park\",\n  \"20606\":\"tsukihime\",\n  \"5165\":\"gundam build fighters try\",\n  \"4114\":\"macross frontier\",\n  \"20763\":\"inazuma eleven\",\n  \"14550\":\"sister princess\",\n  \"19083\":\"jojos bizarre adventure\",\n  \"21052\":\"fate hollow ataraxia\",\n  \"29922\":\"teitoku\",\n  \"51810\":\"gudao\",\n  \"16643\":\"producer\",\n  \"13848\":\"reimu hakurei\",\n  \"25125\":\"asuka langley soryu\",\n  \"17279\":\"sakuya izayoi\",\n  \"10496\":\"patchouli knowledge\",\n  \"37739\":\"shielder\",\n  \"3206\":\"shinji ikari\",\n  \"38068\":\"gran\",\n  \"4675\":\"sanae kochiya\",\n  \"21779\":\"rei ayanami\",\n  \"14040\":\"fate testarossa\",\n  \"3870\":\"flandre scarlet\",\n  \"23902\":\"remilia scarlet\",\n  \"21688\":\"atago\",\n  \"11373\":\"marisa kirisame\",\n  \"35128\":\"kashima\",\n  \"17154\":\"sakura kinomoto\",\n  \"31462\":\"satori komeiji\",\n  \"30080\":\"kaga\",\n  \"10802\":\"alice margatroid\",\n  \"17017\":\"aya shameimaru\",\n  \"17862\":\"yukari yakumo\",\n  \"5340\":\"shimakaze\",\n  \"18935\":\"nanoha takamachi\",\n  \"18896\":\"shirou emiya\",\n  \"16555\":\"rin tosaka\",\n  \"16130\":\"rito yuuki\",\n  \"15890\":\"reisen udongein inaba\",\n  \"7724\":\"takao\",\n  \"27060\":\"jeanne darc\",\n  \"78989\":\"jeanne alter\",\n  \"7718\":\"naruto uzumaki\",\n  \"5337\":\"nami\",\n  \"22975\":\"chun-li\",\n  \"17502\":\"illyasviel von einzbern\",\n  \"20111\":\"tifa lockhart\",\n  \"21131\":\"youmu konpaku\",\n  \"18026\":\"kazuto kirigaya\",\n  \"92923\":\"shikikan\",\n  \"29856\":\"saber\",\n  \"71442\":\"minamoto no raikou\",\n  \"1843\":\"asuna yuuki\",\n  \"51419\":\"gudako\",\n  \"7488\":\"mai shiranui\",\n  \"9835\":\"koishi komeiji\",\n  \"16916\":\"kasumi\",\n  \"30026\":\"maki nishikino\",\n  \"143975\":\"sensei\",\n  \"26906\":\"izuku midoriya\",\n  \"37275\":\"scathach\",\n  \"7696\":\"momiji inubashiri\",\n  \"38039\":\"astolfo\",\n  \"27794\":\"mikoto misaka\",\n  \"20062\":\"hamakaze\",\n  \"78285\":\"artoria pendragon\",\n  \"34860\":\"katsuki bakugou\",\n  \"3328\":\"homura akemi\",\n  \"37687\":\"djeeta\",\n  \"32200\":\"suzuya\",\n  \"21108\":\"rin shibuya\",\n  \"35964\":\"nico yazawa\",\n  \"27494\":\"levi ackerman\",\n  \"609\":\"eren jaeger\",\n  \"11920\":\"sakura haruno\",\n  \"20427\":\"sailor mercury\",\n  \"24714\":\"chino kafuu\",\n  \"31456\":\"mikan yuuki\",\n  \"866\":\"koyomi araragi\",\n  \"12149\":\"kyousuke kousaka\",\n  \"277\":\"haruka nanase\",\n  \"19926\":\"haruna\",\n  \"3763\":\"haruhi suzumiya\",\n  \"26427\":\"mio akiyama\",\n  \"25439\":\"hinata hyuga\",\n  \"17811\":\"ran yakumo\",\n  \"14857\":\"kongou\",\n  \"18548\":\"kotori minami\",\n  \"32364\":\"rider\",\n  \"15641\":\"madoka kaname\",\n  \"2613\":\"hong meiling\",\n  \"491\":\"makoto tachibana\",\n  \"20702\":\"koakuma\",\n  \"15315\":\"tomoyo daidouji\",\n  \"10730\":\"shigure\",\n  \"14265\":\"touma kamijou\",\n  \"80311\":\"bb\",\n  \"4203\":\"mami tomoe\",\n  \"37706\":\"kazuma satou\",\n  \"33070\":\"umi sonoda\",\n  \"27172\":\"yuyuko saigyouji\",\n  \"3353\":\"yuuka kazami\",\n  \"2078\":\"nagato\",\n  \"6311\":\"arisu tachibana\",\n  \"647\":\"belldandy\",\n  \"9274\":\"maya\",\n  \"24889\":\"sena kashiwazaki\",\n  \"15125\":\"golden darkness\",\n  \"6555\":\"sailor jupiter\",\n  \"25695\":\"mika jougasaki\",\n  \"50929\":\"shuten douji\",\n  \"33077\":\"sailor mars\",\n  \"8293\":\"minami nitta\",\n  \"7451\":\"lelouch vi britannia\",\n  \"389\":\"rika jougasaki\",\n  \"22469\":\"prinz eugen\",\n  \"16108\":\"azusa nakano\",\n  \"12812\":\"tenryuu\",\n  \"7311\":\"ami mizuno\",\n  \"6642\":\"byakuren hijiri\",\n  \"7097\":\"suwako moriya\",\n  \"19172\":\"miki hoshii\",\n  \"9657\":\"ayane\",\n  \"29433\":\"c.c.\",\n  \"25220\":\"sakura matou\",\n  \"14499\":\"tsunade\",\n  \"10665\":\"tenshi hinanai\",\n  \"16564\":\"miku hatsune\",\n  \"29190\":\"kallen stadtfeld\",\n  \"3312\":\"kirino kousaka\",\n  \"1234\":\"yuki nagato\",\n  \"26261\":\"ranma saotome\",\n  \"19002\":\"rin kaenbyou\",\n  \"12748\":\"nico robin\",\n  \"32765\":\"rin matsuoka\",\n  \"4241\":\"fumika sagisawa\",\n  \"1729\":\"tamaki kousaka\",\n  \"23997\":\"ruri gokou\",\n  \"29684\":\"sailor venus\",\n  \"19160\":\"nitori kawashiro\",\n  \"27302\":\"uzuki shimamura\",\n  \"23216\":\"android 18\",\n  \"8489\":\"hibiki\",\n  \"7333\":\"suguha kirigaya\",\n  \"1267\":\"kodaka hasegawa\",\n  \"2345\":\"morrigan aensland\",\n  \"9371\":\"yamato\",\n  \"26087\":\"inazuma\",\n  \"27532\":\"archer\",\n  \"26587\":\"miho nishizumi\",\n  \"12346\":\"utsuho reiuji\",\n  \"37108\":\"megumin\",\n  \"22407\":\"takane shijou\",\n  \"15914\":\"sasuke uchiha\",\n  \"2774\":\"kyouko sakura\",\n  \"80930\":\"abigail williams\",\n  \"81288\":\"gudao | ritsuka fujimaru\",\n  \"73756\":\"nightingale\",\n  \"6109\":\"eri ayase\",\n  \"27492\":\"akagi\",\n  \"17899\":\"sakura kasugano\",\n  \"32137\":\"cirno\",\n  \"11760\":\"yui kotegawa\",\n  \"75029\":\"eli ayase\",\n  \"11740\":\"sailor moon\",\n  \"49158\":\"narmaya\",\n  \"29693\":\"ikazuchi\",\n  \"126586\":\"aether\",\n  \"20918\":\"iori minase\",\n  \"24832\":\"misato katsuragi\",\n  \"2883\":\"kasen ibara\",\n  \"6932\":\"souji okita\",\n  \"28555\":\"tamamo-no-mae\",\n  \"14428\":\"kokoa hoto\",\n  \"26783\":\"taihou\",\n  \"12763\":\"rumia\",\n  \"401\":\"nakoruru\",\n  \"72475\":\"musashi miyamoto\",\n  \"23122\":\"maho nishizumi\",\n  \"29188\":\"eirin yagokoro\",\n  \"466\":\"usagi tsukino\",\n  \"29638\":\"kyon\",\n  \"15995\":\"makoto kino\",\n  \"11744\":\"amatsukaze\",\n  \"6175\":\"cammy white\",\n  \"30331\":\"ichika orimura\",\n  \"23473\":\"mikuru asahina\",\n  \"28807\":\"ruri hoshino\",\n  \"2572\":\"hatate himekaidou\",\n  \"15291\":\"chen\",\n  \"23386\":\"fujiwara no mokou\",\n  \"9237\":\"shoukaku\",\n  \"28763\":\"tewi inaba\",\n  \"23851\":\"gilgamesh\",\n  \"10672\":\"aqua\",\n  \"9702\":\"ro-500\",\n  \"31074\":\"keine kamishirasawa\",\n  \"32443\":\"charlotte dunois\",\n  \"2196\":\"sayaka miki\",\n  \"1645\":\"zuikaku\",\n  \"5925\":\"akatsuki\",\n  \"4196\":\"hestia\",\n  \"33171\":\"shiho nishizumi\",\n  \"19534\":\"hayate yagami\",\n  \"79507\":\"belfast\",\n  \"12433\":\"kaede takagaki\",\n  \"12872\":\"warrior\",\n  \"8170\":\"len kagamine\",\n  \"50415\":\"rem\",\n  \"14409\":\"momoka sakurai\",\n  \"2211\":\"mari illustrious makinami\",\n  \"99075\":\"kokkoro\",\n  \"1907\":\"rei hino\",\n  \"15651\":\"miyu edelfelt\",\n  \"26169\":\"musashi\",\n  \"8053\":\"lum\",\n  \"50596\":\"you watanabe\",\n  \"9883\":\"kagami hiiragi\",\n  \"24509\":\"darjeeling\",\n  \"11992\":\"lala satalin deviluke\",\n  \"32683\":\"hachiman hikigaya\",\n  \"31076\":\"kuroko shirai\",\n  \"20836\":\"red saber\",\n  \"12902\":\"isuzu sento\",\n  \"10379\":\"bianca whitaker\",\n  \"16181\":\"nozomi toujou\",\n  \"27774\":\"bismarck\",\n  \"28219\":\"yui hirasawa\",\n  \"1271\":\"momo velia deviluke\",\n  \"49852\":\"subaru natsuki\",\n  \"5918\":\"shinobu oshino\",\n  \"28056\":\"link\",\n  \"25605\":\"rangiku matsumoto\",\n  \"35313\":\"cagliostro\",\n  \"18453\":\"hero\",\n  \"75102\":\"nozomi tojo\",\n  \"20722\":\"mutsu\",\n  \"29170\":\"yuma tsukumo\",\n  \"9486\":\"nue houjuu\",\n  \"33049\":\"ritsuko akizuki\",\n  \"23626\":\"murakumo\",\n  \"20323\":\"tsumugi kotobuki\",\n  \"16566\":\"ritsu tainaka\",\n  \"14016\":\"yuu narukami\",\n  \"11609\":\"yoko ritona\",\n  \"107011\":\"chloe von einzbern\",\n  \"52132\":\"riko sakurauchi\",\n  \"32114\":\"onpu segawa\",\n  \"11924\":\"kagerou imaizumi\",\n};"
  },
  {
    "path": "lib/network/picacg_network/headers.dart",
    "content": "import 'package:dio/dio.dart';\nimport 'package:crypto/crypto.dart';\nimport 'package:pica_comic/comic_source/built_in/picacg.dart';\nimport 'dart:convert';\nimport 'package:uuid/uuid.dart';\n\nvar apiKey = \"C69BAF41DA5ABD1FFEDC6D2FEA56B\";\n\nString createNonce() {\n  var uuid = const Uuid();\n  String nonce = uuid.v1();\n  return nonce.replaceAll(\"-\", \"\");\n}\n\nString createSignature(String path, String nonce, String time, String method) {\n  String key = path + time + nonce + method + apiKey;\n  String data =\n      '~d}\\$Q7\\$eIni=V)9\\\\RK/P.RM4;9[7|@/CA}b~OW!3?EV`:<>M7pddUBL5n|0/*Cn';\n  var s = utf8.encode(key.toLowerCase());\n  var f = utf8.encode(data);\n  var hmacSha256 = Hmac(sha256, f);\n  var digest = hmacSha256.convert(s);\n  return digest.toString();\n}\n\nBaseOptions getHeaders(String method, String token, String url) {\n  var nonce = createNonce();\n  var time = (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString();\n  var signature = createSignature(url, nonce, time, method.toUpperCase());\n  var headers = {\n    \"api-key\": \"C69BAF41DA5ABD1FFEDC6D2FEA56B\",\n    \"accept\": \"application/vnd.picacomic.com.v1+json\",\n    \"app-channel\": picacg.data['appChannel'] ?? '3',\n    \"authorization\": token,\n    \"time\": time,\n    \"nonce\": nonce,\n    \"app-version\": \"2.2.1.3.3.4\",\n    \"app-uuid\": \"defaultUuid\",\n    \"image-quality\": picacg.data['imageQuality'] ?? \"original\",\n    \"app-platform\": \"android\",\n    \"app-build-version\": \"45\",\n    \"Content-Type\": \"application/json; charset=UTF-8\",\n    \"user-agent\": \"okhttp/3.8.1\",\n    \"version\": \"v1.4.1\",\n    \"Host\": \"picaapi.picacomic.com\",\n    \"signature\": signature,\n  };\n  return BaseOptions(\n    receiveDataWhenStatusError: true,\n    responseType: ResponseType.plain,\n    headers: headers,\n  );\n}\n"
  },
  {
    "path": "lib/network/picacg_network/methods.dart",
    "content": "import 'package:dio/dio.dart';\nimport 'package:pica_comic/comic_source/built_in/picacg.dart';\nimport 'package:pica_comic/network/cache_network.dart';\nimport 'dart:convert' as convert;\nimport 'package:pica_comic/network/picacg_network/headers.dart';\nimport 'package:pica_comic/network/http_client.dart';\nimport 'package:pica_comic/pages/pre_search_page.dart';\nimport '../../base.dart';\nimport '../../foundation/app.dart';\nimport '../../foundation/log.dart';\nimport '../app_dio.dart';\nimport '../res.dart';\nimport 'models.dart';\n\nexport \"models.dart\";\n\nconst defaultAvatarUrl = \"DEFAULT AVATAR URL\";\n\n///哔咔网络请求类\nclass PicacgNetwork {\n  factory PicacgNetwork() => cache ?? (cache = PicacgNetwork._create());\n\n  static PicacgNetwork? cache;\n\n  PicacgNetwork._create() {\n    if (picacg.data['user'] != null) {\n      try {\n        user = Profile.fromJson(picacg.data['user']);\n      } finally {}\n    }\n  }\n\n  final String apiUrl = \"https://picaapi.picacomic.com\";\n\n  String get token => picacg.data['token'] ?? '';\n\n  Profile? user;\n\n  Future<Res<Map<String, dynamic>>> get(String url,\n      {CacheExpiredTime expiredTime = CacheExpiredTime.short,\n      bool log = true}) async {\n    if (token == \"\") {\n      await Future.delayed(const Duration(milliseconds: 500));\n      return const Res(null, errorMessage: \"未登录\");\n    }\n    await setNetworkProxy();\n    var dio = CachedNetwork();\n    var options = getHeaders(\"get\", token, url.replaceAll(\"$apiUrl/\", \"\"));\n    options.validateStatus = (i) => i == 200 || i == 400 || i == 401;\n\n    try {\n      var res = await dio.get(url, options, expiredTime: expiredTime, log: log);\n      if (res.statusCode == 200) {\n        var jsonResponse = convert.jsonDecode(res.data) as Map<String, dynamic>;\n        return Res(jsonResponse);\n      } else if (res.statusCode == 400) {\n        var jsonResponse = convert.jsonDecode(res.data) as Map<String, dynamic>;\n        return Res(null, errorMessage: jsonResponse[\"message\"]);\n      } else if (res.statusCode == 401) {\n        var reLogin = await loginFromAppdata();\n        if (reLogin.error) {\n          return const Res(null, errorMessage: \"登录失效且重新登录失败\");\n        } else {\n          return get(url, expiredTime: expiredTime);\n        }\n      } else {\n        return Res(null, errorMessage: \"Invalid Status Code ${res.statusCode}\");\n      }\n    } on DioException catch (e) {\n      String message;\n      if (e.type == DioExceptionType.connectionTimeout) {\n        message = \"连接超时\";\n      } else if (e.type != DioExceptionType.unknown) {\n        message = e.message!;\n      } else {\n        message = e.toString().split(\"\\n\")[1];\n      }\n      return Res(null, errorMessage: message);\n    } catch (e, stack) {\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$stack\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<Map<String, dynamic>>> post(\n      String url, Map<String, String>? data) async {\n    var api = \"https://picaapi.picacomic.com\";\n    if (token == \"\" &&\n        url != '$api/auth/sign-in' &&\n        url != \"https://picaapi.picacomic.com/auth/register\") {\n      await Future.delayed(const Duration(milliseconds: 500));\n      return const Res(null, errorMessage: \"未登录\");\n    }\n    var dio = logDio();\n    dio.options = getHeaders(\"post\", token, url.replaceAll(\"$apiUrl/\", \"\"));\n    try {\n      await setNetworkProxy();\n      var res = await dio.post<String>(url,\n          data: data,\n          options: Options(\n              responseType: ResponseType.plain,\n              validateStatus: (i) {\n                return i == 200 || i == 400 || i == 401;\n              }));\n\n      if (res.data == null) {\n        throw Exception(\"Empty data\");\n      }\n\n      if (res.statusCode == 200) {\n        var jsonResponse =\n            convert.jsonDecode(res.data!) as Map<String, dynamic>;\n        return Res(jsonResponse);\n      } else if (res.statusCode == 400) {\n        var jsonResponse =\n            convert.jsonDecode(res.data!) as Map<String, dynamic>;\n        return Res(null, errorMessage: jsonResponse[\"message\"]);\n      } else if (res.statusCode == 401) {\n        var reLogin = await loginFromAppdata();\n        if (reLogin.error) {\n          return const Res(null, errorMessage: \"登录失效且重新登录失败\");\n        } else {\n          return post(url, data);\n        }\n      } else {\n        return Res(null, errorMessage: \"Invalid Status Code ${res.statusCode}\");\n      }\n    } on DioException catch (e) {\n      String message;\n      if (e.type == DioExceptionType.connectionTimeout) {\n        message = \"连接超时\";\n      } else if (e.type != DioExceptionType.unknown) {\n        message = e.message!;\n      } else {\n        message = e.toString().split(\"\\n\")[1];\n      }\n      return Res(null, errorMessage: message);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///登录, 返回token\n  Future<Res<String>> login(String email, String password) async {\n    var api = \"https://picaapi.picacomic.com\";\n    var response = await post('$api/auth/sign-in', {\n      \"email\": email,\n      \"password\": password,\n    });\n    if (response.error) {\n      return Res(null, errorMessage: response.errorMessage);\n    }\n    var res = response.data;\n    if (res[\"message\"] == \"success\") {\n      try {\n        return Res(res[\"data\"][\"token\"]);\n      } catch (e) {\n        return const Res(null, errorMessage: \"Failed to get token\");\n      }\n    } else {\n      return Res(null, errorMessage: res[\"message\"]);\n    }\n  }\n\n  Future<Res<bool>> loginFromAppdata() async {\n    var res = await picacg.reLogin();\n    if (res) {\n      return const Res(true);\n    } else {\n      return const Res.error(\"Failed to re-login\");\n    }\n  }\n\n  ///获取用户信息\n  Future<Res<Profile>> getProfile([bool log = true]) async {\n    var response = await get(\"$apiUrl/users/profile\",\n        expiredTime: CacheExpiredTime.no, log: log);\n    if (response.error) {\n      return Res(null, errorMessage: response.errorMessage);\n    }\n    var res = response.data;\n    res = res[\"data\"][\"user\"];\n    String url = \"\";\n    if (res[\"avatar\"] == null) {\n      url = defaultAvatarUrl;\n    } else {\n      url = res[\"avatar\"][\"fileServer\"] + \"/static/\" + res[\"avatar\"][\"path\"];\n    }\n    var p = Profile(\n        res[\"_id\"],\n        url,\n        res[\"email\"],\n        res[\"exp\"],\n        res[\"level\"],\n        res[\"name\"],\n        res[\"title\"],\n        res[\"isPunched\"],\n        res[\"slogan\"],\n        res[\"character\"]);\n    return Res(p);\n  }\n\n  Future<Res<bool>> updateProfile() async {\n    if (token == \"\") {\n      return const Res(true);\n    }\n    var res = await getProfile();\n    if (res.error) {\n      return Res.fromErrorRes(res);\n    }\n    user = res.data;\n    picacg.data['user'] = user!.toJson();\n    picacg.saveData();\n    return const Res(true);\n  }\n\n  Future<Res<List<String>>> getHotTags() async {\n    var response =\n        await get(\"$apiUrl/keywords\", expiredTime: CacheExpiredTime.no);\n    if (response.error) {\n      return Res(null, errorMessage: response.errorMessageWithoutNull);\n    }\n    var res = response.data;\n    var k = <String>[];\n    for (int i = 0; i < (res[\"data\"][\"keywords\"] ?? []).length; i++) {\n      k.add(res[\"data\"][\"keywords\"][i]);\n    }\n    return Res(k);\n  }\n\n  ///获取分类\n  Future<Res<List<CategoryItem>>> getCategories() async {\n    var response =\n        await get(\"$apiUrl/categories\", expiredTime: CacheExpiredTime.no);\n    if (response.error) {\n      return Res(null, errorMessage: response.errorMessage);\n    }\n    var res = response.data;\n    try {\n      var c = <CategoryItem>[];\n      for (int i = 0; i < res[\"data\"][\"categories\"].length; i++) {\n        if (res[\"data\"][\"categories\"][i][\"isWeb\"] == true) continue;\n        String url = res[\"data\"][\"categories\"][i][\"thumb\"][\"fileServer\"];\n        if (url[url.length - 1] != '/') {\n          url = '$url/static/';\n        }\n        url = url + res[\"data\"][\"categories\"][i][\"thumb\"][\"path\"];\n        var ca = CategoryItem(res[\"data\"][\"categories\"][i][\"title\"], url);\n        c.add(ca);\n      }\n      return Res(c);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///获取分流ip\n  ///\n  /// 已被废弃, 要在Flutter中使用IP访问只有两种方式, 直接http连接或者忽略证书校验\n  ///\n  /// 由于存在安全问题, 因此放弃\n  Future<String?> init() async {\n    try {\n      var dio = Dio();\n      var res = await dio.get(\"http://68.183.234.72/init\");\n      var jsonResponse =\n          convert.jsonDecode(res.toString()) as Map<String, dynamic>;\n      return jsonResponse[\"addresses\"][0];\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\");\n      return null;\n    }\n  }\n\n  ///搜索\n  Future<Res<List<ComicItemBrief>>> search(\n      String keyWord, String sort, int page,\n      {bool addToHistory = false}) async {\n    var response = await post('$apiUrl/comics/advanced-search?page=$page',\n        {\"keyword\": keyWord, \"sort\": sort});\n    if (page == 1 && addToHistory && keyWord != \"\") {\n      appdata.searchHistory.remove(keyWord);\n      appdata.searchHistory.add(keyWord);\n      appdata.writeHistory();\n    }\n    if (response.error) {\n      return Res(null, errorMessage: response.errorMessage);\n    }\n    var res = response.data;\n    try {\n      var pages = res[\"data\"][\"comics\"][\"pages\"];\n      var comics = <ComicItemBrief>[];\n      for (int i = 0; i < res[\"data\"][\"comics\"][\"docs\"].length; i++) {\n        try {\n          var tags = <String>[];\n          tags.addAll(List<String>.from(\n              res[\"data\"][\"comics\"][\"docs\"][i][\"tags\"] ?? []));\n          tags.addAll(List<String>.from(\n              res[\"data\"][\"comics\"][\"docs\"][i][\"categories\"] ?? []));\n          var si = ComicItemBrief(\n              res[\"data\"][\"comics\"][\"docs\"][i][\"title\"] ?? \"Unknown\",\n              res[\"data\"][\"comics\"][\"docs\"][i][\"author\"] ?? \"Unknown\",\n              int.parse(\n                  res[\"data\"][\"comics\"][\"docs\"][i][\"likesCount\"].toString()),\n              res[\"data\"][\"comics\"][\"docs\"][i][\"thumb\"][\"fileServer\"] +\n                  \"/static/\" +\n                  res[\"data\"][\"comics\"][\"docs\"][i][\"thumb\"][\"path\"],\n              res[\"data\"][\"comics\"][\"docs\"][i][\"_id\"],\n              tags,\n              pages: res[\"data\"][\"comics\"][\"docs\"][i][\"pagesCount\"]);\n          comics.add(si);\n        } catch (e) {\n          continue;\n        }\n      }\n      if (addToHistory) {\n        Future.delayed(const Duration(microseconds: 500), () {\n          try {\n            StateController.find<PreSearchController>().update();\n          } catch (e) {\n            //忽视\n          }\n        });\n      }\n      return Res(comics, subData: pages);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///获取漫画信息\n  Future<Res<ComicItem>> getComicInfo(String id) async {\n    var response =\n        await get(\"$apiUrl/comics/$id\", expiredTime: CacheExpiredTime.no);\n    if (response.error) {\n      return Res(null, errorMessage: response.errorMessage);\n    }\n    var res = response.data;\n    var epsRes = await getEps(id);\n    if (epsRes.error) {\n      return Res(null, errorMessage: epsRes.errorMessage);\n    }\n    var recommendationRes = await getRecommendation(id);\n    if (recommendationRes.error) {\n      recommendationRes = const Res([]);\n    }\n    try {\n      String url;\n      if (res[\"data\"][\"comic\"][\"_creator\"][\"avatar\"] == null) {\n        url = defaultAvatarUrl;\n      } else {\n        url = res[\"data\"][\"comic\"][\"_creator\"][\"avatar\"][\"fileServer\"] +\n            \"/static/\" +\n            res[\"data\"][\"comic\"][\"_creator\"][\"avatar\"][\"path\"];\n      }\n      var creator = Profile(\n          res[\"data\"][\"comic\"][\"_id\"],\n          url,\n          \"\",\n          res[\"data\"][\"comic\"][\"_creator\"][\"exp\"],\n          res[\"data\"][\"comic\"][\"_creator\"][\"level\"],\n          res[\"data\"][\"comic\"][\"_creator\"][\"name\"],\n          res[\"data\"][\"comic\"][\"_creator\"][\"title\"] ?? \"Unknown\",\n          null,\n          res[\"data\"][\"comic\"][\"_creator\"][\"slogan\"] ?? \"无\",\n          null);\n      var categories = <String>[];\n      for (int i = 0; i < res[\"data\"][\"comic\"][\"categories\"].length; i++) {\n        categories.add(res[\"data\"][\"comic\"][\"categories\"][i]);\n      }\n      var tags = <String>[];\n      for (int i = 0; i < res[\"data\"][\"comic\"][\"tags\"].length; i++) {\n        tags.add(res[\"data\"][\"comic\"][\"tags\"][i]);\n      }\n      var ci = ComicItem(\n          creator,\n          res[\"data\"][\"comic\"][\"title\"] ?? \"Unknown\",\n          res[\"data\"][\"comic\"][\"description\"] ?? \"无\",\n          res[\"data\"][\"comic\"][\"thumb\"][\"fileServer\"] +\n                  \"/static/\" +\n                  res[\"data\"][\"comic\"][\"thumb\"][\"path\"] ??\n              \"\",\n          res[\"data\"][\"comic\"][\"author\"] ?? \"Unknown\",\n          res[\"data\"][\"comic\"][\"chineseTeam\"] ?? \"Unknown\",\n          categories,\n          tags,\n          res[\"data\"][\"comic\"][\"likesCount\"] ?? 0,\n          res[\"data\"][\"comic\"][\"commentsCount\"] ?? 0,\n          res[\"data\"][\"comic\"][\"isFavourite\"] ?? false,\n          res[\"data\"][\"comic\"][\"isLiked\"] ?? false,\n          res[\"data\"][\"comic\"][\"epsCount\"] ?? 0,\n          id,\n          res[\"data\"][\"comic\"][\"pagesCount\"],\n          res[\"data\"][\"comic\"][\"updated_at\"],\n          epsRes.data,\n          recommendationRes.data);\n      return Res(ci);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  ///获取漫画的章节信息\n  Future<Res<List<String>>> getEps(String id) async {\n    var eps = <String>[];\n    int i = 0;\n    bool flag = true;\n    try {\n      while (flag) {\n        i++;\n        var res = await get(\"$apiUrl/comics/$id/eps?page=$i\",\n            expiredTime: CacheExpiredTime.no);\n        if (res.error) {\n          return Res(null, errorMessage: res.errorMessage);\n        } else if (res.data[\"data\"][\"eps\"][\"pages\"] == i) {\n          flag = false;\n        }\n        for (int j = 0; j < res.data[\"data\"][\"eps\"][\"docs\"].length; j++) {\n          eps.add(res.data[\"data\"][\"eps\"][\"docs\"][j][\"title\"]);\n        }\n      }\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analyse\", \"$s\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n    return Res(eps.reversed.toList());\n  }\n\n  /// 获取漫画章节的图片链接\n  Future<Res<List<String>>> getComicContent(String id, int order) async {\n    var imageUrls = <String>[];\n    int i = 0;\n    bool flag = true;\n    while (flag) {\n      i++;\n      var res = await get(\"$apiUrl/comics/$id/order/$order/pages?page=$i\",\n          expiredTime: CacheExpiredTime.no);\n      if (res.error) {\n        return Res(null, errorMessage: res.errorMessage);\n      } else if (res.data[\"data\"][\"pages\"][\"pages\"] == i) {\n        flag = false;\n      }\n      for (int j = 0; j < res.data[\"data\"][\"pages\"][\"docs\"].length; j++) {\n        imageUrls.add(res.data[\"data\"][\"pages\"][\"docs\"][j][\"media\"]\n                [\"fileServer\"] +\n            \"/static/\" +\n            res.data[\"data\"][\"pages\"][\"docs\"][j][\"media\"][\"path\"]);\n      }\n    }\n    return Res(imageUrls);\n  }\n\n  Future<Res<bool>> loadMoreCommends(Comments c,\n      {String type = \"comics\"}) async {\n    if (c.loaded != c.pages) {\n      var response = await get(\n          \"$apiUrl/$type/${c.id}/comments?page=${c.loaded + 1}\",\n          expiredTime: CacheExpiredTime.no);\n      if (response.error) {\n        return Res(null, errorMessage: response.errorMessage);\n      }\n      var res = response.data;\n      c.pages = res[\"data\"][\"comments\"][\"pages\"];\n      for (int i = 0; i < res[\"data\"][\"comments\"][\"docs\"].length; i++) {\n        String url = \"\";\n        try {\n          url = res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"avatar\"]\n                  [\"fileServer\"] +\n              \"/static/\" +\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"avatar\"][\"path\"];\n        } catch (e) {\n          url = defaultAvatarUrl;\n        }\n        var t = Comment(\"\", \"\", \"\", 1, \"\", 0, \"\", false, 0, null, null, \"\");\n        if (res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"] != null) {\n          t = Comment(\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"name\"],\n              url,\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"_id\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"level\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"content\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"commentsCount\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_id\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"isLiked\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"likesCount\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"character\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"slogan\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"created_at\"]);\n        } else {\n          t = Comment(\n              \"Unknown\",\n              url,\n              \"\",\n              1,\n              res[\"data\"][\"comments\"][\"docs\"][i][\"content\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"commentsCount\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_id\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"isLiked\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"likesCount\"],\n              null,\n              null,\n              res[\"data\"][\"comments\"][\"docs\"][i][\"created_at\"]);\n        }\n        c.comments.add(t);\n      }\n      c.loaded++;\n    }\n    return const Res(true);\n  }\n\n  Future<Comments> getCommends(String id, {String type = \"comics\"}) async {\n    var t = Comments([], id, 1, 0);\n    await loadMoreCommends(t, type: type);\n    return t;\n  }\n\n  /// 获取收藏夹\n  Future<Res<List<ComicItemBrief>>> getFavorites(\n      int page, bool newToOld) async {\n    var response = await get(\n        \"$apiUrl/users/favourite?s=${newToOld ? \"dd\" : \"da\"}&page=$page\",\n        expiredTime: CacheExpiredTime.no);\n    if (response.error) {\n      return Res(null, errorMessage: response.errorMessage);\n    }\n    var res = response.data;\n    try {\n      var pages = res[\"data\"][\"comics\"][\"pages\"];\n      var comics = <ComicItemBrief>[];\n      for (int i = 0; i < res[\"data\"][\"comics\"][\"docs\"].length; i++) {\n        var tags = <String>[];\n        tags.addAll(\n            List<String>.from(res[\"data\"][\"comics\"][\"docs\"][i][\"tags\"] ?? []));\n        tags.addAll(List<String>.from(\n            res[\"data\"][\"comics\"][\"docs\"][i][\"categories\"] ?? []));\n        var si = ComicItemBrief(\n            res[\"data\"][\"comics\"][\"docs\"][i][\"title\"] ?? \"Unknown\",\n            res[\"data\"][\"comics\"][\"docs\"][i][\"author\"] ?? \"Unknown\",\n            int.parse(\n                res[\"data\"][\"comics\"][\"docs\"][i][\"likesCount\"].toString()),\n            res[\"data\"][\"comics\"][\"docs\"][i][\"thumb\"][\"fileServer\"] +\n                \"/static/\" +\n                res[\"data\"][\"comics\"][\"docs\"][i][\"thumb\"][\"path\"],\n            res[\"data\"][\"comics\"][\"docs\"][i][\"_id\"],\n            tags,\n            pages: res[\"data\"][\"comics\"][\"docs\"][i][\"pagesCount\"]);\n        comics.add(si);\n      }\n      return Res(comics, subData: pages);\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Data Analysis\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  Future<Res<List<ComicItemBrief>>> getRandomComics() async {\n    var comics = <ComicItemBrief>[];\n    var response =\n        await get(\"$apiUrl/comics/random\", expiredTime: CacheExpiredTime.no);\n    if (response.success) {\n      var res = response.data;\n      for (int i = 0; i < res[\"data\"][\"comics\"].length; i++) {\n        try {\n          var tags = <String>[];\n          tags.addAll(\n              List<String>.from(res[\"data\"][\"comics\"][i][\"tags\"] ?? []));\n          tags.addAll(\n              List<String>.from(res[\"data\"][\"comics\"][i][\"categories\"] ?? []));\n          var si = ComicItemBrief(\n              res[\"data\"][\"comics\"][i][\"title\"] ?? \"Unknown\",\n              res[\"data\"][\"comics\"][i][\"author\"] ?? \"Unknown\",\n              res[\"data\"][\"comics\"][i][\"totalLikes\"] ?? 0,\n              res[\"data\"][\"comics\"][i][\"thumb\"][\"fileServer\"] +\n                  \"/static/\" +\n                  res[\"data\"][\"comics\"][i][\"thumb\"][\"path\"],\n              res[\"data\"][\"comics\"][i][\"_id\"],\n              tags,\n              pages: res[\"data\"][\"comics\"][i][\"pagesCount\"]);\n          comics.add(si);\n        }  finally {}\n      }\n    } else {\n      return Res.fromErrorRes(response);\n    }\n    return Res(comics);\n  }\n\n  Future<bool> likeOrUnlikeComic(String id) async {\n    var res = await post('$apiUrl/comics/$id/like', {});\n    if (res.success) {\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  Future<bool> favouriteOrUnfavouriteComic(String id) async {\n    var res = await post('$apiUrl/comics/$id/favourite', {});\n    if (res.error) {\n      return false;\n    }\n    return true;\n  }\n\n  /// 获取排行榜, 传入参数为时间\n  /// - H24: 过去24小时\n  /// - D7: 过去7天\n  /// - D30: 过去30天\n  Future<Res<List<ComicItemBrief>>> getLeaderboard(String time) async {\n    var response = await get(\"$apiUrl/comics/leaderboard?tt=$time&ct=VC\",\n        expiredTime: CacheExpiredTime.no);\n    if (response.error) {\n      return Res(null, errorMessage: response.errorMessage);\n    }\n    var res = response.data;\n    var comics = <ComicItemBrief>[];\n    for (int i = 0; i < res[\"data\"][\"comics\"].length; i++) {\n      try {\n        var tags = <String>[];\n        tags.addAll(List<String>.from(res[\"data\"][\"comics\"][i][\"tags\"] ?? []));\n        tags.addAll(\n            List<String>.from(res[\"data\"][\"comics\"][i][\"categories\"] ?? []));\n        var si = ComicItemBrief(\n          res[\"data\"][\"comics\"][i][\"title\"] ?? \"Unknown\",\n          res[\"data\"][\"comics\"][i][\"author\"] ?? \"Unknown\",\n          res[\"data\"][\"comics\"][i][\"totalLikes\"] ?? 0,\n          res[\"data\"][\"comics\"][i][\"thumb\"][\"fileServer\"] +\n              \"/static/\" +\n              res[\"data\"][\"comics\"][i][\"thumb\"][\"path\"],\n          res[\"data\"][\"comics\"][i][\"_id\"],\n          tags,\n          pages: res[\"data\"][\"comics\"][i][\"pagesCount\"],\n        );\n        comics.add(si);\n      }  finally {}\n    }\n    return Res(comics, subData: 1);\n  }\n\n  Future<Res<String>> register(\n      String ans1,\n      String ans2,\n      String ans3,\n      String birthday,\n      String account,\n      String gender,\n      String name,\n      String password,\n      String que1,\n      String que2,\n      String que3) async {\n    //gender:m,f,bot\n    var res = await post(\"https://picaapi.picacomic.com/auth/register\", {\n      \"answer1\": ans1,\n      \"answer2\": ans2,\n      \"answer3\": ans3,\n      \"birthday\": birthday,\n      \"email\": account,\n      \"gender\": gender,\n      \"name\": name,\n      \"password\": password,\n      \"question1\": que1,\n      \"question2\": que2,\n      \"question3\": que3\n    });\n    if (res.error) {\n      return Res(null, errorMessage: res.errorMessageWithoutNull);\n    } else if (res.data[\"message\"] == \"failure\") {\n      return const Res(null, errorMessage: \"注册失败, 用户名或账号可能已存在\");\n    } else {\n      return const Res(\"注册成功\");\n    }\n  }\n\n  ///打卡\n  Future<bool> punchIn() async {\n    var res = await post(\"$apiUrl/users/punch-in\", null);\n    if (res.success) {\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  /// 上传头像\n  Future<bool> uploadAvatar(String imageData) async {\n    //数据仍然是json, 只有一条\"avatar\"数据, 数据内容为base64编码的图像, 例如{\"avatar\":\"[在这里放图像数据]\"}\n    var url = \"$apiUrl/users/avatar\";\n    var dio = logDio();\n    dio.options = getHeaders(\"put\", token, url.replaceAll(\"$apiUrl/\", \"\"));\n    try {\n      var res = await dio.put(url, data: {\"avatar\": imageData});\n      return res.statusCode == 200;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  Future<bool> changeSlogan(String slogan) async {\n    var url = \"$apiUrl/users/profile\";\n    var dio = logDio();\n    dio.options = getHeaders(\"put\", token, url.replaceAll(\"$apiUrl/\", \"\"));\n    try {\n      var res = await dio.put(url, data: {\"slogan\": slogan});\n      if (res.statusCode == 200) {\n        return true;\n      } else {\n        return false;\n      }\n    } catch (e) {\n      return false;\n    }\n  }\n\n  Future<void> getMoreReply(Reply reply) async {\n    if (reply.loaded == reply.total) return;\n    var response = await get(\n        \"$apiUrl/comments/${reply.id}/childrens?page=${reply.loaded + 1}\",\n        expiredTime: CacheExpiredTime.no); //哔咔的英语水平有点烂\n    if (response.success) {\n      var res = response.data;\n      reply.total = res[\"data\"][\"comments\"][\"pages\"];\n      for (int i = 0; i < res[\"data\"][\"comments\"][\"docs\"].length; i++) {\n        String url = \"\";\n        try {\n          url = res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"avatar\"]\n                  [\"fileServer\"] +\n              \"/static/\" +\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"avatar\"][\"path\"];\n        } catch (e) {\n          url = defaultAvatarUrl;\n        }\n        var t = Comment(\"\", \"\", \"\", 1, \"\", 0, \"\", false, 0, null, null, \"\");\n        if (res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"] != null) {\n          t = Comment(\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"name\"] ?? \"Unknown\",\n              url,\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"_id\"] ?? \"\",\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"level\"] ?? 0,\n              res[\"data\"][\"comments\"][\"docs\"][i][\"content\"] ?? \"\",\n              0,\n              \"\",\n              res[\"data\"][\"comments\"][\"docs\"][i][\"isLiked\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"likesCount\"] ?? 0,\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"character\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"_user\"][\"slogan\"] ?? \"\",\n              res[\"data\"][\"comments\"][\"docs\"][i][\"created_at\"]);\n        } else {\n          t = Comment(\n              \"Unknown\",\n              url,\n              \"\",\n              1,\n              res[\"data\"][\"comments\"][\"docs\"][i][\"content\"],\n              0,\n              \"\",\n              res[\"data\"][\"comments\"][\"docs\"][i][\"isLiked\"],\n              res[\"data\"][\"comments\"][\"docs\"][i][\"likesCount\"],\n              null,\n              null,\n              res[\"data\"][\"comments\"][\"docs\"][i][\"created_at\"]);\n        }\n        reply.comments.add(t);\n      }\n      reply.loaded++;\n    }\n  }\n\n  Future<Reply> getReply(String id) async {\n    var reply = Reply(id, 0, 1, []);\n    await getMoreReply(reply);\n    return reply;\n  }\n\n  Future<bool> likeOrUnlikeComment(String id) async {\n    var res = await post(\"$apiUrl/comments/$id/like\", {});\n    return res.success;\n  }\n\n  Future<bool> comment(String id, String text, bool isReply,\n      {String type = \"comics\"}) async {\n    Res<Map<String, dynamic>?> res;\n    if (!isReply) {\n      res = await post(\"$apiUrl/$type/$id/comments\", {\"content\": text});\n    } else {\n      res = await post(\"$apiUrl/comments/$id\", {\"content\": text});\n    }\n    return res.success;\n  }\n\n  /// 获取相关推荐\n  Future<Res<List<ComicItemBrief>>> getRecommendation(String id) async {\n    var comics = <ComicItemBrief>[];\n    var response = await get(\"$apiUrl/comics/$id/recommendation\");\n    if (response.success) {\n      var res = response.data;\n      for (int i = 0; i < res[\"data\"][\"comics\"].length; i++) {\n        try {\n          var tags = <String>[];\n          tags.addAll(\n              List<String>.from(res[\"data\"][\"comics\"][i][\"tags\"] ?? []));\n          tags.addAll(\n              List<String>.from(res[\"data\"][\"comics\"][i][\"categories\"] ?? []));\n          var si = ComicItemBrief(\n            res[\"data\"][\"comics\"][i][\"title\"] ?? \"Unknown\",\n            res[\"data\"][\"comics\"][i][\"author\"] ?? \"Unknown\",\n            int.parse(res[\"data\"][\"comics\"][i][\"likesCount\"].toString()),\n            res[\"data\"][\"comics\"][i][\"thumb\"][\"fileServer\"] +\n                \"/static/\" +\n                res[\"data\"][\"comics\"][i][\"thumb\"][\"path\"],\n            res[\"data\"][\"comics\"][i][\"_id\"],\n            tags,\n          );\n          comics.add(si);\n        }  finally {}\n      }\n    } else {\n      return Res.fromErrorRes(response);\n    }\n    return Res(comics);\n  }\n\n  /// 获取本子母/本子妹推荐\n  Future<Res<List<List<ComicItemBrief>>>> getCollection() async {\n    var comics = <List<ComicItemBrief>>[[], []];\n    var response =\n        await get(\"$apiUrl/collections\", expiredTime: CacheExpiredTime.no);\n    if (response.error) {\n      return Res(null, errorMessage: response.errorMessage);\n    }\n    var res = response.data;\n    try {\n      for (int i = 0; i < res[\"data\"][\"collections\"][0][\"comics\"].length; i++) {\n        try {\n          var si = ComicItemBrief(\n            res[\"data\"][\"collections\"][0][\"comics\"][i][\"title\"] ?? \"Unknown\",\n            res[\"data\"][\"collections\"][0][\"comics\"][i][\"author\"] ?? \"Unknown\",\n            res[\"data\"][\"collections\"][0][\"comics\"][i][\"totalLikes\"] ?? 0,\n            res[\"data\"][\"collections\"][0][\"comics\"][i][\"thumb\"][\"fileServer\"] +\n                \"/static/\" +\n                res[\"data\"][\"collections\"][0][\"comics\"][i][\"thumb\"][\"path\"],\n            res[\"data\"][\"collections\"][0][\"comics\"][i][\"_id\"],\n            [],\n            pages: res[\"data\"][\"collections\"][0][\"comics\"][i][\"pagesCount\"],\n          );\n          comics[0].add(si);\n        } catch (e) {\n          //出现错误跳过\n        }\n      }\n    }  finally {}\n    try {\n      for (int i = 0; i < res[\"data\"][\"collections\"][1][\"comics\"].length; i++) {\n        try {\n          var si = ComicItemBrief(\n            res[\"data\"][\"collections\"][1][\"comics\"][i][\"title\"] ?? \"Unknown\",\n            res[\"data\"][\"collections\"][1][\"comics\"][i][\"author\"] ?? \"Unknown\",\n            res[\"data\"][\"collections\"][1][\"comics\"][i][\"totalLikes\"] ?? 0,\n            res[\"data\"][\"collections\"][1][\"comics\"][i][\"thumb\"][\"fileServer\"] +\n                \"/static/\" +\n                res[\"data\"][\"collections\"][1][\"comics\"][i][\"thumb\"][\"path\"],\n            res[\"data\"][\"collections\"][1][\"comics\"][i][\"_id\"],\n            [],\n            pages: res[\"data\"][\"collections\"][1][\"comics\"][i][\"pagesCount\"],\n          );\n          comics[1].add(si);\n        } finally {}\n      }\n    }  finally {}\n    return Res(comics);\n  }\n\n  Future<void> getMoreGames(Games games) async {\n    if (games.total == games.loaded) return;\n    var response = await get(\"$apiUrl/games?page=${games.loaded + 1}\",\n        expiredTime: CacheExpiredTime.no);\n    if (response.success) {\n      var res = response.data;\n      games.total = res[\"data\"][\"games\"][\"pages\"];\n      for (int i = 0; i < res[\"data\"][\"games\"][\"docs\"].length; i++) {\n        var game = GameItemBrief(\n            res[\"data\"][\"games\"][\"docs\"][i][\"_id\"] ?? \"\",\n            res[\"data\"][\"games\"][\"docs\"][i][\"title\"] ?? \"Unknown\",\n            res[\"data\"][\"games\"][\"docs\"][i][\"adult\"],\n            res[\"data\"][\"games\"][\"docs\"][i][\"icon\"][\"fileServer\"] +\n                \"/static/\" +\n                res[\"data\"][\"games\"][\"docs\"][i][\"icon\"][\"path\"],\n            res[\"data\"][\"games\"][\"docs\"][i][\"publisher\"] ?? \"Unknown\");\n        games.games.add(game);\n      }\n    }\n    games.loaded++;\n  }\n\n  Future<Games> getGames() async {\n    var games = Games([], 0, 1);\n    await getMoreGames(games);\n    return games;\n  }\n\n  Future<Res<GameInfo>> getGameInfo(String id) async {\n    var response = await get(\"$apiUrl/games/$id\");\n    if (response.error) {\n      return Res(null, errorMessage: response.errorMessage);\n    }\n    var res = response.data;\n    var gameInfo = GameInfo(\n        id,\n        res[\"data\"][\"game\"][\"title\"] ?? \"Unknown\",\n        res[\"data\"][\"game\"][\"description\"],\n        res[\"data\"][\"game\"][\"icon\"][\"fileServer\"] +\n            \"/static/\" +\n            res[\"data\"][\"game\"][\"icon\"][\"path\"],\n        res[\"data\"][\"game\"][\"publisher\"],\n        [],\n        res[\"data\"][\"game\"][\"androidLinks\"][0],\n        res[\"data\"][\"game\"][\"isLiked\"],\n        res[\"data\"][\"game\"][\"likesCount\"],\n        res[\"data\"][\"game\"][\"commentsCount\"]);\n    for (int i = 0; i < res[\"data\"][\"game\"][\"screenshots\"].length; i++) {\n      gameInfo.screenshots.add(res[\"data\"][\"game\"][\"screenshots\"][i]\n              [\"fileServer\"] +\n          \"/static/\" +\n          res[\"data\"][\"game\"][\"screenshots\"][i][\"path\"]);\n    }\n    return Res(gameInfo);\n  }\n\n  Future<bool> likeGame(String id) async {\n    var res = await post(\"$apiUrl/games/$id/like\", {});\n    return res.success;\n  }\n\n  Future<Res<bool>> changePassword(\n      String oldPassword, String newPassword) async {\n    var url = \"$apiUrl/users/password\";\n    var dio = logDio();\n    dio.options = getHeaders(\"put\", token, url.replaceAll(\"$apiUrl/\", \"\"));\n    try {\n      var res = await dio.put(url,\n          data: {\"new_password\": newPassword, \"old_password\": oldPassword},\n          options: Options(validateStatus: (i) => i == 200 || i == 400));\n      if (res.statusCode == 200) {\n        return const Res(true);\n      } else {\n        return const Res(false);\n      }\n    } on DioException catch (e) {\n      return Res(null, errorMessage: e.toString());\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\");\n      return Res(null, errorMessage: e.toString());\n    }\n  }\n\n  /// 获取分类中的漫画\n  Future<Res<List<ComicItemBrief>>> getCategoryComics(\n      String keyWord, int page, String sort,\n      [String type = \"c\"]) async {\n    var response = await get(\n        '$apiUrl/comics?page=$page&$type=${Uri.encodeComponent(keyWord)}&s=$sort',\n        expiredTime: CacheExpiredTime.no);\n    if (response.error) {\n      return Res(null, errorMessage: response.errorMessage);\n    }\n    var res = response.data;\n    var pages = res[\"data\"][\"comics\"][\"pages\"];\n    var comics = <ComicItemBrief>[];\n    for (int i = 0; i < res[\"data\"][\"comics\"][\"docs\"].length; i++) {\n      try {\n        var tags = <String>[];\n        tags.addAll(\n            List<String>.from(res[\"data\"][\"comics\"][\"docs\"][i][\"tags\"] ?? []));\n        tags.addAll(List<String>.from(\n            res[\"data\"][\"comics\"][\"docs\"][i][\"categories\"] ?? []));\n        var si = ComicItemBrief(\n          res[\"data\"][\"comics\"][\"docs\"][i][\"title\"] ?? \"Unknown\",\n          res[\"data\"][\"comics\"][\"docs\"][i][\"author\"] ?? \"Unknown\",\n          int.parse(res[\"data\"][\"comics\"][\"docs\"][i][\"likesCount\"].toString()),\n          res[\"data\"][\"comics\"][\"docs\"][i][\"thumb\"][\"fileServer\"] +\n              \"/static/\" +\n              res[\"data\"][\"comics\"][\"docs\"][i][\"thumb\"][\"path\"],\n          res[\"data\"][\"comics\"][\"docs\"][i][\"_id\"],\n          tags,\n          pages: res[\"data\"][\"comics\"][\"docs\"][i][\"pagesCount\"],\n        );\n        comics.add(si);\n      } catch (e) {\n        continue;\n      }\n    }\n    return Res(comics, subData: pages);\n  }\n\n  ///获取最新漫画\n  Future<Res<List<ComicItemBrief>>> getLatest(int page) async {\n    var response = await get(\"$apiUrl/comics?page=$page&s=dd\",\n        expiredTime: CacheExpiredTime.no);\n    if (response.error) {\n      return Res(null, errorMessage: response.errorMessage);\n    }\n    var res = response.data;\n    var comics = <ComicItemBrief>[];\n    for (int i = 0; i < res[\"data\"][\"comics\"][\"docs\"].length; i++) {\n      try {\n        var tags = <String>[];\n        tags.addAll(\n            List<String>.from(res[\"data\"][\"comics\"][\"docs\"][i][\"tags\"] ?? []));\n        tags.addAll(List<String>.from(\n            res[\"data\"][\"comics\"][\"docs\"][i][\"categories\"] ?? []));\n\n        var si = ComicItemBrief(\n          res[\"data\"][\"comics\"][\"docs\"][i][\"title\"] ?? \"Unknown\",\n          res[\"data\"][\"comics\"][\"docs\"][i][\"author\"] ?? \"Unknown\",\n          int.parse(res[\"data\"][\"comics\"][\"docs\"][i][\"likesCount\"].toString()),\n          res[\"data\"][\"comics\"][\"docs\"][i][\"thumb\"][\"fileServer\"] +\n              \"/static/\" +\n              res[\"data\"][\"comics\"][\"docs\"][i][\"thumb\"][\"path\"],\n          res[\"data\"][\"comics\"][\"docs\"][i][\"_id\"],\n          tags,\n          pages: res[\"data\"][\"comics\"][\"docs\"][i][\"pagesCount\"],\n        );\n        comics.add(si);\n      } catch (e) {\n        continue;\n      }\n    }\n    return Res(comics);\n  }\n}\n\nString getImageUrl(String url) {\n  return url;\n}\n\nPicacgNetwork get network => PicacgNetwork();\n"
  },
  {
    "path": "lib/network/picacg_network/models.dart",
    "content": "import \"package:pica_comic/base.dart\";\nimport \"package:pica_comic/foundation/history.dart\";\nimport \"package:pica_comic/network/base_comic.dart\";\n\nclass Profile {\n  String id;\n  String title;\n  String email;\n  String name;\n  int level;\n  int exp;\n  String avatarUrl;\n  String? frameUrl;\n  bool? isPunched;\n  String? slogan;\n\n  Profile(this.id, this.avatarUrl, this.email, this.exp, this.level, this.name, this.title, this.isPunched, this.slogan, this.frameUrl);\n\n  Map<String,dynamic> toJson()=>{\n    \"id\": id,\n    \"title\": title,\n    \"email\": email,\n    \"name\": name,\n    \"level\": level,\n    \"exp\": exp,\n    \"avatarUrl\": avatarUrl,\n    \"frameUrl\": frameUrl,\n    \"isPunched\": isPunched,\n    \"slogan\": slogan\n  };\n\n  Profile.fromJson(Map<String,dynamic> json):\n    id = json[\"id\"],\n    title = json[\"title\"],\n    email = json[\"email\"],\n    name = json[\"name\"],\n    level = json[\"level\"],\n    exp = json[\"exp\"],\n    avatarUrl = json[\"avatarUrl\"],\n    frameUrl = json[\"frameUrl\"],\n    isPunched = json[\"isPunched\"],\n    slogan = json[\"slogan\"];\n}\n\nclass CategoryItem {\n  String title;\n  String path;\n  CategoryItem(this.title, this.path);\n}\n\nclass InitData {\n  String imageServer;\n  String fileServer;\n  var categories = <CategoryItem>[];\n  InitData(this.imageServer, this.fileServer);\n}\n\nclass ComicItemBrief extends BaseComic{\n  @override\n  String title;\n  String author;\n  int likes;\n  String path;\n  @override\n  String id;\n  @override\n  List<String> tags;\n  int? pages;\n\n  ComicItemBrief(this.title, this.author, this.likes, this.path, this.id, this.tags, {this.pages});\n\n  @override\n  String get cover => path;\n\n  @override\n  String get description => \"$likes pages\";\n\n  @override\n  String get subTitle => author;\n}\n\nclass ComicItem with HistoryMixin{\n  String id;\n  Profile creator;\n  @override\n  String title;\n  String description;\n  String thumbUrl;\n  String author;\n  String chineseTeam;\n  List<String> categories;\n  List<String> tags;\n  int likes;\n  int comments;\n  bool isLiked;\n  bool isFavourite;\n  int epsCount;\n  int pagesCount;\n  String time;\n  List<String> eps;\n  List<ComicItemBrief> recommendation;\n  ComicItem(\n      this.creator,\n      this.title,\n      this.description,\n      this.thumbUrl,\n      this.author,\n      this.chineseTeam,\n      this.categories,\n      this.tags,\n      this.likes,\n      this.comments,\n      this.isFavourite,\n      this.isLiked,\n      this.epsCount,\n      this.id,\n      this.pagesCount,\n      this.time,\n      this.eps,\n      this.recommendation\n      );\n  ComicItemBrief toBrief(){\n    return ComicItemBrief(title, author, likes, thumbUrl, id, []);\n  }\n\n  Map<String,dynamic> toJson()=>{\n    \"creator\": creator.toJson(),\n    \"id\": id,\n    \"title\": title,\n    \"description\": description,\n    \"thumbUrl\": thumbUrl,\n    \"author\": author,\n    \"chineseTeam\": chineseTeam,\n    \"categories\": categories,\n    \"tags\": tags,\n    \"likes\": likes,\n    \"comments\": comments,\n    \"isLiked\": isLiked,\n    \"isFavourite\": isFavourite,\n    \"epsCount\": epsCount,\n    \"time\": time,\n    \"pagesCount\": pagesCount\n  };\n\n  ComicItem.fromJson(Map<String,dynamic> json):\n    creator = Profile.fromJson(json[\"creator\"]),\n    id = json[\"id\"],\n    title = json[\"title\"],\n    description = json[\"description\"],\n    thumbUrl = json[\"thumbUrl\"],\n    author = json[\"author\"],\n    chineseTeam = json[\"chineseTeam\"],\n    categories = json[\"categories\"].cast<String>(),\n    tags = json[\"tags\"].cast<String>(),\n    likes = json[\"likes\"],\n    comments = json[\"comments\"],\n    isLiked = json[\"isLiked\"],\n    isFavourite = json[\"isFavourite\"],\n    epsCount = json[\"epsCount\"],\n    time = json[\"time\"],\n    pagesCount = json[\"pagesCount\"],\n    eps = [],\n    recommendation = [];\n\n  @override\n  String get cover => thumbUrl;\n\n  @override\n  HistoryType get historyType => HistoryType.picacg;\n\n  @override\n  String get subTitle => author;\n\n  @override\n  String get target => id;\n}\n\nclass Comment {\n  String name;\n  String avatarUrl;\n  String userId;\n  int level;\n  String text;\n  int reply;\n  String id;\n  bool isLiked;\n  int likes;\n  String? frame;\n  String? slogan;\n  String time;\n\n  @override\n  String toString()=>\"$name:$text\";\n\n  Comment(\n      this.name,\n      this.avatarUrl,\n      this.userId,\n      this.level,\n      this.text,\n      this.reply,\n      this.id,\n      this.isLiked,\n      this.likes,\n      this.frame,\n      this.slogan,\n      this.time\n      );\n}\n\nclass Comments {\n  List<Comment> comments;\n  String id;\n  int pages;\n  int loaded;\n\n  Comments(this.comments, this.id, this.pages, this.loaded);\n}\n\nclass Favorites {\n  List<ComicItemBrief> comics;\n  int pages;\n  int loaded;\n\n  Favorites(this.comics, this.pages, this.loaded);\n}\n\nclass SearchResult{\n  String keyWord;\n  String sort;\n  int pages;\n  int loaded;\n  List<ComicItemBrief> comics;\n  SearchResult(this.keyWord,this.sort,this.comics,this.pages,this.loaded);\n}\n\nclass Reply{\n  String id;\n  int loaded;\n  int total;\n  List<Comment> comments;\n  Reply(this.id,this.loaded,this.total,this.comments);\n}\n\nclass GameItemBrief{\n  String id;\n  String iconUrl;\n  String name;\n  String publisher;\n  bool adult;\n  GameItemBrief(this.id,this.name,this.adult,this.iconUrl,this.publisher);\n}\n\nclass Games{\n  List<GameItemBrief> games;\n  int total;\n  int loaded;\n  Games(this.games,this.loaded,this.total);\n}\n\nclass GameInfo{\n  String id;\n  String name;\n  String description;\n  String icon;\n  String publisher;\n  List<String> screenshots;\n  String link;\n  bool isLiked;\n  int likes;\n  int comments;\n  GameInfo(this.id,this.name,this.description,this.icon,this.publisher,this.screenshots,this.link,this.isLiked,this.likes,this.comments);\n}"
  },
  {
    "path": "lib/network/picacg_network/picacg_download_model.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'package:flutter/foundation.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport 'package:pica_comic/network/download_model.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/io_tools.dart';\nimport '../../base.dart';\nimport '../download.dart';\nimport 'methods.dart';\nimport 'models.dart';\nimport 'dart:io';\n\nclass DownloadedComic extends DownloadedItem {\n  ComicItem comicItem;\n  List<String> chapters;\n  List<int> downloadedChapters;\n  double? size;\n\n  DownloadedComic(\n      this.comicItem, this.chapters, this.size, this.downloadedChapters);\n\n  @override\n  Map<String, dynamic> toJson() => {\n        \"comicItem\": comicItem.toJson(),\n        \"chapters\": chapters,\n        \"size\": size,\n        \"downloadedChapters\": downloadedChapters\n      };\n\n  DownloadedComic.fromJson(Map<String, dynamic> json)\n      : comicItem = ComicItem.fromJson(json[\"comicItem\"]),\n        chapters = List<String>.from(json[\"chapters\"]),\n        size = json[\"size\"],\n        downloadedChapters = [] {\n    if (json[\"downloadedChapters\"] == null) {\n      //旧版本中的数据不包含这一项\n      for (int i = 0; i < chapters.length; i++) {\n        downloadedChapters.add(i);\n      }\n    } else {\n      downloadedChapters = List<int>.from(json[\"downloadedChapters\"]);\n    }\n  }\n\n  @override\n  DownloadType get type => DownloadType.picacg;\n\n  @override\n  List<int> get downloadedEps => downloadedChapters;\n\n  @override\n  List<String> get eps => chapters.getNoBlankList();\n\n  @override\n  String get name => comicItem.title;\n\n  @override\n  String get id => comicItem.id;\n\n  @override\n  String get subTitle => comicItem.author;\n\n  @override\n  double? get comicSize => size;\n\n  @override\n  set comicSize(double? value) => size = value;\n\n  @override\n  List<String> get tags => comicItem.tags;\n}\n\n///picacg的下载进程模型\nclass PicDownloadingItem extends DownloadingItem {\n  PicDownloadingItem(this.comic, this._downloadEps, super.whenFinish,\n      super.whenError, super.updateInfo, super.id,\n      {super.type = DownloadType.picacg});\n\n  ///漫画模型\n  final ComicItem comic;\n\n  ///章节名称\n  var _eps = <String>[];\n\n  ///要下载的章节序号\n  final List<int> _downloadEps;\n\n  ///获取各章节名称\n  List<String> get eps => _eps;\n\n  @override\n  get cover => getImageUrl(comic.thumbUrl);\n\n  @override\n  String get title => comic.title;\n\n  @override\n  Future<Map<int, List<String>>> getLinks() async {\n    var res = <int, List<String>>{};\n    _eps = (await network.getEps(id)).data;\n    for (var i in _downloadEps) {\n      res[i + 1] = (await network.getComicContent(id, i + 1)).data;\n    }\n    return res;\n  }\n\n  @override\n  Stream<DownloadProgress> downloadImage(String link) {\n    return ImageManager().getImage(getImageUrl(link));\n  }\n\n  @override\n  Map<String, dynamic> toMap() => {\n        \"comic\": comic.toJson(),\n        \"_eps\": _eps,\n        \"_downloadEps\": _downloadEps,\n        ...super.toBaseMap()\n      };\n\n  PicDownloadingItem.fromMap(\n      Map<String, dynamic> map,\n      DownloadProgressCallback whenFinish,\n      DownloadProgressCallback whenError,\n      DownloadProgressCallbackAsync updateInfo,\n      String id)\n      : comic = ComicItem.fromJson(map[\"comic\"]),\n        _eps = List<String>.from(map[\"_eps\"]),\n        _downloadEps = List<int>.from(map[\"_downloadEps\"]),\n        super.fromMap(map, whenFinish, whenError, updateInfo);\n\n  @override\n  FutureOr<DownloadedItem> toDownloadedItem() async {\n    var previous = <int>[];\n    if (DownloadManager().isExists(id)) {\n      var comic =\n          (await DownloadManager().getComicOrNull(id))! as DownloadedComic;\n      previous = comic.downloadedEps;\n    }\n    var downloaded = (_downloadEps + previous).toSet().toList();\n    downloaded.sort();\n    return DownloadedComic(\n      comic,\n      eps,\n      await getFolderSize(Directory(path)),\n      downloaded,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/network/res.dart",
    "content": "import 'package:flutter/cupertino.dart';\n\n@immutable\nclass Res<T> {\n  /// error info\n  final String? errorMessage;\n\n  String get errorMessageWithoutNull => errorMessage ?? \"Unknown Error\";\n\n  /// data\n  final T? _data;\n\n  /// is there an error\n  bool get error => errorMessage != null;\n\n  /// whether succeed\n  bool get success => !error;\n\n  /// data\n  ///\n  /// must be called when no error happened\n  T get data => _data ?? (throw Exception(errorMessage));\n\n  /// get data, or null if there is an error\n  T? get dataOrNull => _data;\n\n  final dynamic subData;\n\n  @override\n  String toString() => _data.toString();\n\n  Res.fromErrorRes(Res another, {this.subData})\n      : _data = null,\n        errorMessage = another.errorMessageWithoutNull;\n\n  /// network result\n  const Res(this._data, {this.errorMessage, this.subData});\n\n  const Res.error(String err)\n      : _data = null,\n        subData = null,\n        errorMessage = err;\n}\n"
  },
  {
    "path": "lib/network/update.dart",
    "content": "import 'package:dio/dio.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/network/app_dio.dart';\n\nString? _updateInfo;\n\nFuture<String> getLatestVersion() async {\n  var dio = logDio();\n  var res = await dio\n      .get(\"https://api.github.com/repos/wgh136/PicaComic/releases/latest\");\n  _updateInfo = res.data[\"body\"];\n  return (res.data[\"tag_name\"] as String).replaceFirst(\"v\", \"\");\n}\n\nFuture<bool?> checkUpdate() async {\n  try {\n    var version = appVersion;\n    var res = await getLatestVersion();\n    return compareSemVer(res, version);\n  } catch (e) {\n    return null;\n  }\n}\n\nbool compareSemVer(String ver1, String ver2) {\n  ver1 = ver1.replaceFirst(\"-\", \".\");\n  ver2 = ver2.replaceFirst(\"-\", \".\");\n  List<String> v1 = ver1.split('.');\n  List<String> v2 = ver2.split('.');\n\n  for (int i = 0; i < 3; i++) {\n    int num1 = int.parse(v1[i]);\n    int num2 = int.parse(v2[i]);\n\n    if (num1 > num2) {\n      return true;\n    } else if (num1 < num2) {\n      return false;\n    }\n  }\n\n  var v14 = v1.elementAtOrNull(3);\n  var v24 = v2.elementAtOrNull(3);\n\n  if (v14 != v24) {\n    if (v14 == null && v24 != \"hotfix\") {\n      return true;\n    } else if (v14 == null) {\n      return false;\n    }\n    if (v24 == null) {\n      if (v14 == \"hotfix\") {\n        return true;\n      }\n      return false;\n    }\n    return v14.compareTo(v24) > 0;\n  }\n\n  return false;\n}\n\nFuture<String?> getUpdatesInfo() async {\n  if(_updateInfo == null)  return null;\n  _updateInfo!.replaceAll('\\r\\n', '\\n');\n  var lines = _updateInfo!.split(\"\\n\");\n  if(lines.length > 5) {\n    lines.add(\"...\");\n    return lines.sublist(5).join(\"\\n\");\n  }\n  return _updateInfo;\n}\n\nFuture<String> getDownloadUrl() async {\n  return \"https://github.com/wgh136/PicaComic/releases/latest\";\n}\n"
  },
  {
    "path": "lib/network/webdav.dart",
    "content": "import 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/io_tools.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:webdav_client/webdav_client.dart';\n\nimport '../base.dart';\n\nFuture<bool> _retryZone(Future<bool> Function() fn) async {\n  int time = 1;\n  while (time < 1 << 3) {\n    var res = await fn();\n    if (res) {\n      return true;\n    }\n    await Future.delayed(Duration(seconds: time));\n    time *= 2;\n  }\n  return false;\n}\n\nclass Webdav {\n  static bool _isOperating = false;\n\n  static bool _haveWaitingTask = false;\n\n  /// Sync current data to webdav server. Return true if success.\n  static Future<bool> uploadData([String? config]) async {\n    if (_haveWaitingTask) {\n      return true;\n    }\n    if (_isOperating) {\n      _haveWaitingTask = true;\n      while (_isOperating) {\n        await Future.delayed(const Duration(milliseconds: 100));\n      }\n    }\n    _haveWaitingTask = false;\n    _isOperating = true;\n    appdata.settings[46] =\n        (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString();\n    appdata.updateSettings(false);\n    config ??= appdata.settings[45];\n    var configs = config.split(';');\n    if (configs.length != 4 || configs.elementAtOrNull(0) == \"\") {\n      _isOperating = false;\n      return true;\n    }\n    if (!configs[3].endsWith('/') && !configs[3].endsWith('\\\\')) {\n      configs[3] += '/';\n    }\n    LogManager.addLog(LogLevel.info, \"network\", \"Uploading Data\");\n    var client = newClient(\n      configs[0],\n      user: configs[1],\n      password: configs[2],\n      debug: false,\n    );\n    client.setHeaders({'content-type': 'text/plain'});\n    try {\n      var files = await client.readDir(configs[3]);\n      for (var file in files) {\n        var name = file.name;\n        if (name != null) {\n          var version = name.split(\".\").first;\n          if (version.isNum) {\n            var days = int.parse(version) ~/ 86400;\n            var currentDays =\n                DateTime.now().millisecondsSinceEpoch ~/ 1000 ~/ 86400;\n            if (currentDays == days && file.path != null) {\n              client.remove(file.path!);\n              break;\n            }\n          }\n        }\n      }\n      await client.writeFromFile(await exportDataToFile(false, \"${App.cachePath}/userdata.picadata\"),\n          \"${configs[3]}${appdata.settings[46]}.picadata\");\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Sync\",\n          \"Failed to upload data to webdav server.\\n$e\\n$s\");\n      _isOperating = false;\n      return false;\n    }\n    _isOperating = false;\n    return true;\n  }\n\n  static Future<bool> downloadData([String? config]) async {\n    _isOperating = true;\n    bool force = config != null;\n    try {\n      config ??= appdata.settings[45];\n      var configs = config.split(';');\n      if (configs.length != 4 || configs.elementAtOrNull(0) == \"\") {\n        return true;\n      }\n      if (!configs[3].endsWith('/') && !configs[3].endsWith('\\\\')) {\n        configs[3] += '/';\n      }\n      LogManager.addLog(LogLevel.info, \"network\", \"Downloading Data\");\n      var client = newClient(\n        configs[0],\n        user: configs[1],\n        password: configs[2],\n        debug: false,\n      );\n      client.setConnectTimeout(8000);\n      try {\n        var files = await client.readDir(configs[3]);\n        int? maxVersion;\n        for (var file in files) {\n          var name = file.name;\n          if (name != null) {\n            var version = name.split(\".\").first;\n            if (version.isNum) {\n              maxVersion = max(maxVersion ?? 0, int.parse(version));\n            }\n          }\n        }\n\n        if (!force && maxVersion.toString() == appdata.settings[46]) {\n          LogManager.addLog(LogLevel.info, \"Sync\",\n              \"No updated version of data.\\nStop downloading data.\");\n          return true;\n        }\n\n        final fileName =\n            maxVersion != null ? \"$maxVersion.picadata\" : \"picadata\";\n\n        var cachePath = (await getApplicationCacheDirectory()).path;\n        await client.read2File(\"${configs[3]}$fileName\", \"$cachePath/picadata\");\n        var res = await importData(\"$cachePath/picadata\");\n        return res;\n      } catch (e, s) {\n        LogManager.addLog(LogLevel.error, \"Sync\",\n            \"Failed to download data from webdav server.\\n$e\\n$s\");\n        return false;\n      }\n    } finally {\n      _isOperating = false;\n    }\n  }\n\n  static void syncData() async {\n    var configs = appdata.settings[45].split(';');\n    if (configs.length != 4 || configs.elementAtOrNull(0) == \"\") {\n      return;\n    }\n    var controller = showLoadingDialog(\n      App.globalContext!,\n      barrierDismissible: false,\n      allowCancel: true,\n      message: \"同步数据中\".tl,\n      cancelButtonText: \"隐藏\".tl,\n    );\n    var res = await _retryZone(Webdav.downloadData);\n    await Future.delayed(const Duration(milliseconds: 50));\n    if (!res) {\n      controller.close();\n      appdata.settings[45] = \"${appdata.settings[45]};0\";\n      showToast(\n        message: \"下载数据失败, 已禁用同步\".tl,\n        trailing: Button.icon(\n          onPressed: () {\n            appdata.settings[45] = configs.join(';');\n            syncData();\n          },\n          icon: const Icon(Icons.refresh),\n        ),\n      );\n    } else {\n      controller.close();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/accounts_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/ui_mode.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\n\nclass AccountsPageLogic extends StateController {\n  final _reLogin = <String, bool>{};\n}\n\nclass AccountsPage extends StatelessWidget {\n  const AccountsPage({super.key});\n\n  AccountsPageLogic get logic => StateController.find<AccountsPageLogic>();\n\n  @override\n  Widget build(BuildContext context) {\n    var body = StateBuilder<AccountsPageLogic>(\n      init: AccountsPageLogic(),\n      builder: (logic) {\n        return CustomScrollView(\n          slivers: [\n            SliverList(\n              delegate: SliverChildListDelegate(\n                buildContent(context).toList(),\n              ),\n            ),\n            SliverPadding(\n              padding: EdgeInsets.only(bottom: context.padding.bottom),\n            )\n          ],\n        );\n      },\n    );\n\n    if (PopupIndicatorWidget.maybeOf(context) != null) {\n      return PopUpWidgetScaffold(title: \"账号管理\".tl, body: body);\n    } else {\n      return Scaffold(\n        appBar: AppBar(\n          title: Text(\"账号管理\".tl),\n        ),\n        body: body,\n      );\n    }\n  }\n\n  Iterable<Widget> buildContent(BuildContext context) sync* {\n    var sources =\n        ComicSource.sources.where((element) => element.account != null);\n    if (sources.isEmpty) return;\n\n    for (var element in sources) {\n      final bool logged = element.isLogin;\n      yield Padding(\n        padding: const EdgeInsets.fromLTRB(16, 8, 16, 8),\n        child: Text(\n          element.name,\n          style: const TextStyle(fontSize: 20),\n        ),\n      );\n      if (!logged) {\n        yield ListTile(\n          title: Text(\"登录\".tl),\n          onTap: () async {\n            if (element.account!.onLogin != null) {\n              await element.account!.onLogin!(context);\n            }\n            if (element.account!.login != null && context.mounted) {\n              await context.to(\n                () => _LoginPage(\n                  login: element.account!.login!,\n                  registerWebsite: element.account!.registerWebsite,\n                ),\n              );\n              element.saveData();\n            }\n            logic.update();\n          },\n        );\n      }\n      if (logged) {\n        for (var item in element.account!.infoItems) {\n          if (item.builder != null) {\n            yield item.builder!(context);\n          } else {\n            yield ListTile(\n              title: Text(item.title.tl),\n              subtitle: item.data == null ? null : Text(item.data!()),\n              onTap: item.onTap,\n            );\n          }\n        }\n        if (element.account!.allowReLogin) {\n          bool loading = logic._reLogin[element.key] == true;\n          yield ListTile(\n            title: Text(\"重新登录\".tl),\n            subtitle: Text(\"如果登录失效点击此处\".tl),\n            onTap: () async {\n              if (element.data[\"account\"] == null) {\n                showToast(message: \"无数据\".tl);\n                return;\n              }\n              logic._reLogin[element.key] = true;\n              logic.update();\n              final List account = element.data[\"account\"];\n              var res = await element.account!.login!(account[0], account[1]);\n              if (res.error) {\n                showToast(message: res.errorMessage!);\n              } else {\n                showToast(message: \"重新登录成功\".tl);\n              }\n              logic._reLogin[element.key] = false;\n              logic.update();\n            },\n            trailing: loading\n                ? const SizedBox.square(\n                    dimension: 24,\n                    child: CircularProgressIndicator(\n                      strokeWidth: 2,\n                    ),\n                  )\n                : const Icon(Icons.refresh),\n          );\n        }\n        yield ListTile(\n          title: Text(\"退出登录\".tl),\n          onTap: () {\n            element.data[\"account\"] = null;\n            element.account?.logout();\n            element.saveData();\n            logic.update();\n          },\n          trailing: const Icon(Icons.logout),\n        );\n      }\n      yield const Divider();\n    }\n  }\n\n  void setClipboard(String text) {\n    Clipboard.setData(ClipboardData(text: text));\n    showToast(message: \"已复制\".tl, icon: const Icon(Icons.check));\n  }\n}\n\nclass _LoginPage extends StatefulWidget {\n  const _LoginPage({required this.login, this.registerWebsite});\n\n  final LoginFunction login;\n\n  final String? registerWebsite;\n\n  @override\n  State<_LoginPage> createState() => _LoginPageState();\n}\n\nclass _LoginPageState extends State<_LoginPage> {\n  String username = \"\";\n  String password = \"\";\n  bool loading = false;\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: Appbar(\n        title: Text(\"登录\".tl),\n      ),\n      body: Column(children: [\n        const Spacer(),\n        TextField(\n          decoration: InputDecoration(\n            labelText: \"用户名\".tl,\n            border: const OutlineInputBorder(),\n          ),\n          onChanged: (s) {\n            username = s;\n          },\n        ),\n        const SizedBox(height: 16),\n        TextField(\n          decoration: InputDecoration(\n            labelText: \"密码\".tl,\n            border: const OutlineInputBorder(),\n          ),\n          obscureText: true,\n          onChanged: (s) {\n            password = s;\n          },\n          onSubmitted: (s) => login(),\n        ),\n        const SizedBox(height: 32),\n        Button.filled(\n          isLoading: loading,\n          onPressed: login,\n          child: Text(\"继续\".tl),\n        ),\n        const Spacer(),\n        if (widget.registerWebsite != null)\n          TextButton(\n            onPressed: () => launchUrlString(widget.registerWebsite!),\n            child: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                const Icon(Icons.link),\n                const SizedBox(width: 8),\n                Text(\"注册\".tl),\n              ],\n            ),\n          ),\n        if (UiMode.m1(context))\n          SizedBox(\n            height: MediaQuery.of(context).padding.bottom,\n          ),\n      ]).paddingLeft(32).paddingRight(32).paddingBottom(16),\n    );\n  }\n\n  void login() {\n    if (username.isEmpty || password.isEmpty) {\n      showToast(message: \"不能为空\".tl, icon: const Icon(Icons.error_outline));\n      return;\n    }\n    setState(() {\n      loading = true;\n    });\n    widget.login(username, password).then((value) {\n      if (value.error) {\n        showToast(message: value.errorMessage!);\n        setState(() {\n          loading = false;\n        });\n      } else {\n        showToast(message: \"登录成功\".tl, icon: const Icon(Icons.check));\n        if(mounted) {\n          context.pop();\n        }\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "lib/pages/auth_page.dart",
    "content": "import 'package:flutter/scheduler.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:flutter/material.dart';\nimport 'package:local_auth/local_auth.dart';\nimport 'package:pica_comic/pages/main_page.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nclass AuthPage extends StatefulWidget {\n  const AuthPage({Key? key}) : super(key: key);\n\n  static bool lock = false;\n\n  static bool initial = true;\n\n  @override\n  State<AuthPage> createState() => _AuthPageState();\n}\n\nclass _AuthPageState extends State<AuthPage> with WidgetsBindingObserver {\n  @override\n  void initState() {\n    AuthPage.lock = true;\n    WidgetsBinding.instance.addObserver(this);\n    if(SchedulerBinding.instance.lifecycleState == AppLifecycleState.resumed) {\n      auth();\n    }\n    super.initState();\n  }\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    if(state == AppLifecycleState.resumed && AuthPage.lock && mounted && !inProgress) {\n      auth();\n    }\n    super.didChangeAppLifecycleState(state);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return GestureDetector(\n      onTap: auth,\n      child: Scaffold(\n        body: PopScope(\n          canPop: false,\n          child: SizedBox(\n            width: MediaQuery.of(context).size.width,\n            height: MediaQuery.of(context).size.height,\n            child: Center(\n              child: SizedBox(\n                height: 100,\n                child: Column(\n                  children: [\n                    Icon(\n                      Icons.security,\n                      size: 40,\n                      color: context.colorScheme.secondary,\n                    ),\n                    const SizedBox(\n                      height: 5,\n                    ),\n                    Text(\"点击完成身份验证\".tl)\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  bool inProgress = false;\n\n  void auth() async {\n    if(inProgress) {\n      return;\n    }\n    inProgress = true;\n    var res =\n        await LocalAuthentication().authenticate(localizedReason: \"需要身份验证\".tl);\n    inProgress = false;\n    if (res) {\n      AuthPage.lock = false;\n      if (AuthPage.initial) {\n        App.offAll(() => const MainPage());\n      } else {\n        App.globalBack();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/category_comics_page.dart",
    "content": "import \"package:flutter/material.dart\";\nimport \"package:pica_comic/comic_source/comic_source.dart\";\nimport 'package:pica_comic/components/components.dart';\nimport \"package:pica_comic/foundation/app.dart\";\nimport 'package:pica_comic/network/base_comic.dart';\nimport \"package:pica_comic/network/res.dart\";\nimport \"package:pica_comic/tools/translations.dart\";\n\nclass CategoryComicsPage extends StatefulWidget {\n  const CategoryComicsPage({\n    required this.category,\n    this.param,\n    required this.categoryKey,\n    super.key,\n  });\n\n  final String category;\n\n  final String? param;\n\n  final String categoryKey;\n\n  @override\n  State<CategoryComicsPage> createState() => _CategoryComicsPageState();\n}\n\nclass _CategoryComicsPageState extends State<CategoryComicsPage> {\n  late final CategoryComicsData data;\n  late final List<CategoryComicsOptions> options;\n  late List<String> optionsValue;\n\n  void findData() {\n    for (final source in ComicSource.sources) {\n      if (source.categoryData?.key == widget.categoryKey) {\n        data = source.categoryComicsData!;\n        options = data.options.where((element) {\n          if (element.notShowWhen.contains(widget.category)) {\n            return false;\n          } else if (element.showWhen != null) {\n            return element.showWhen!.contains(widget.category);\n          }\n          return true;\n        }).toList();\n        optionsValue = options.map((e) => e.options.keys.first).toList();\n        return;\n      }\n    }\n    throw \"${widget.categoryKey} Not found\";\n  }\n\n  @override\n  void initState() {\n    findData();\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: Appbar(\n        title: Text(widget.category),\n      ),\n      body: Column(\n        children: [\n          Expanded(\n            child: _CategoryComicsList(\n              key: ValueKey(\n                  \"${widget.category} with ${widget.param} and $optionsValue\"),\n              loader: data.load,\n              category: widget.category,\n              options: optionsValue,\n              param: widget.param,\n              header: buildOptions(),\n              sourceKey: ComicSource.sources\n                  .firstWhere((e) => e.categoryData?.key == widget.categoryKey)\n                  .key,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget buildOptionItem(\n      String text, String value, int group, BuildContext context) {\n    return OptionChip(\n      text: text,\n      isSelected: value == optionsValue[group],\n      onTap: () {\n        if (value == optionsValue[group]) return;\n        setState(() {\n          optionsValue[group] = value;\n        });\n      },\n    );\n  }\n\n  Widget buildOptions() {\n    List<Widget> children = [];\n    for (var optionList in options) {\n      children.add(Wrap(\n        spacing: 8,\n        runSpacing: 8,\n        children: [\n          for (var option in optionList.options.entries)\n            buildOptionItem(\n              option.value.tl,\n              option.key,\n              options.indexOf(optionList),\n              context,\n            )\n        ],\n      ));\n      if (options.last != optionList) {\n        children.add(const SizedBox(height: 8));\n      }\n    }\n    return SliverToBoxAdapter(\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [...children, const Divider()],\n      ).paddingLeft(8).paddingRight(8),\n    );\n  }\n}\n\nclass _CategoryComicsList extends ComicsPage<BaseComic> {\n  const _CategoryComicsList({\n    super.key,\n    required this.loader,\n    required this.category,\n    required this.options,\n    this.param,\n    required this.header,\n    required this.sourceKey,\n  });\n\n  final CategoryComicsLoader loader;\n\n  final String category;\n\n  final List<String> options;\n\n  final String? param;\n\n  @override\n  final String sourceKey;\n\n  @override\n  final Widget header;\n\n  @override\n  Future<Res<List<BaseComic>>> getComics(int i) async {\n    return await loader(category, param, options, i);\n  }\n\n  @override\n  String? get tag => \"$category with $param and $options\";\n\n  @override\n  String? get title => null;\n}\n"
  },
  {
    "path": "lib/pages/category_page.dart",
    "content": "import 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/pages/ranking_page.dart';\nimport 'package:pica_comic/pages/search_result_page.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\nimport 'package:pica_comic/pages/category_comics_page.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nclass AllCategoryPage extends StatelessWidget {\n  const AllCategoryPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return StateBuilder<SimpleController>(\n      tag: \"category\",\n      init: SimpleController(),\n      builder: (controller) {\n        var categories = appdata.appSettings.categoryPages;\n        var allCategories = ComicSource.sources\n            .map((e) => e.categoryData?.key)\n            .where((element) => element != null)\n            .map((e) => e!)\n            .toList();\n        categories = categories.where((element) => allCategories.contains(element)).toList();\n\n        return Material(\n          child: DefaultTabController(\n            length: categories.length,\n            key: Key(categories.toString()),\n            child: Column(\n              children: [\n                FilledTabBar(\n                  tabs: categories.map((e) {\n                    String title = e;\n                    try {\n                      title = getCategoryDataWithKey(e).title;\n                    } catch (e) {\n                      //\n                    }\n                    return Tab(\n                      text: title,\n                      key: Key(e),\n                    );\n                  }).toList(),\n                ),\n                Expanded(\n                  child: TabBarView(\n                      children:\n                          categories.map((e) => CategoryPage(e)).toList()),\n                )\n              ],\n            ),\n          ),\n        );\n      },\n    );\n  }\n}\n\ntypedef ClickTagCallback = void Function(String, String?);\n\nclass CategoryPage extends StatelessWidget {\n  const CategoryPage(this.category, {super.key});\n\n  final String category;\n\n  CategoryData get data => getCategoryDataWithKey(category);\n\n  String findComicSourceKey() {\n    for (var source in ComicSource.sources) {\n      if (source.categoryData?.key == category) {\n        return source.key;\n      }\n    }\n    return \"\";\n  }\n\n  void handleClick(\n    String tag,\n    String? param,\n    String type,\n    String namespace,\n    String categoryKey,\n  ) {\n    if (type == 'search') {\n      App.mainNavigatorKey?.currentContext?.to(\n        () => SearchResultPage(\n          keyword: tag,\n          options: const [],\n          sourceKey: findComicSourceKey(),\n        ),\n      );\n    } else if (type == \"search_with_namespace\") {\n      if (tag.contains(\" \")) {\n        tag = '\"$tag\"';\n      }\n      App.mainNavigatorKey?.currentContext?.to(\n        () => SearchResultPage(\n          keyword: \"$namespace:$tag\",\n          options: const [],\n          sourceKey: findComicSourceKey(),\n        ),\n      );\n    } else if (type == \"category\") {\n      App.mainNavigatorKey!.currentContext!.to(\n        () => CategoryComicsPage(\n          category: tag,\n          categoryKey: categoryKey,\n          param: param,\n        ),\n      );\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var children = <Widget>[];\n    if (data.enableRankingPage || data.buttons.isNotEmpty) {\n      children.add(buildTitle(data.title));\n      children.add(Padding(\n        padding: const EdgeInsets.fromLTRB(10, 0, 10, 16),\n        child: Wrap(\n          children: [\n            if (data.enableRankingPage)\n              buildTag(\"排行榜\".tl, (p0, p1) {\n                context.to(() => RankingPage(sourceKey: findComicSourceKey()));\n              }),\n            for (var buttonData in data.buttons)\n              buildTag(buttonData.label.tl, (p0, p1) => buttonData.onTap())\n          ],\n        ),\n      ));\n    }\n\n    for (var part in data.categories) {\n      if (part.enableRandom) {\n        children.add(StatefulBuilder(builder: (context, updater) {\n          return Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              buildTitleWithRefresh(part.title, () => updater(() {})),\n              buildTagsWithParams(\n                part.categories,\n                part.categoryParams,\n                part.title,\n                (key, param) => handleClick(\n                  key,\n                  param,\n                  part.categoryType,\n                  part.title,\n                  category,\n                ),\n              )\n            ],\n          );\n        }));\n      } else {\n        children.add(buildTitle(part.title));\n        children.add(\n          buildTagsWithParams(\n            part.categories,\n            part.categoryParams,\n            part.title,\n            (tag, param) => handleClick(\n              tag,\n              param,\n              part.categoryType,\n              part.title,\n              data.key,\n            ),\n          ),\n        );\n      }\n    }\n    return SingleChildScrollView(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: children,\n      ),\n    );\n  }\n\n  Widget buildTitle(String title) {\n    return Padding(\n      padding: const EdgeInsets.fromLTRB(16, 10, 5, 10),\n      child: Text(title.tl,\n          style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500)),\n    );\n  }\n\n  Widget buildTitleWithRefresh(String title, void Function() onRefresh) {\n    return Padding(\n      padding: const EdgeInsets.fromLTRB(16, 10, 5, 10),\n      child: Row(\n        children: [\n          Text(\n            title.tl,\n            style: const TextStyle(\n              fontSize: 20,\n              fontWeight: FontWeight.w500,\n            ),\n          ),\n          const Spacer(),\n          IconButton(onPressed: onRefresh, icon: const Icon(Icons.refresh))\n        ],\n      ),\n    );\n  }\n\n  Widget buildTagsWithParams(\n    List<String> tags,\n    List<String>? params,\n    String? namespace,\n    ClickTagCallback onClick,\n  ) {\n    return Padding(\n      padding: const EdgeInsets.fromLTRB(10, 0, 10, 16),\n      child: Wrap(\n        children: List<Widget>.generate(\n          tags.length,\n          (index) => buildTag(\n            tags[index],\n            onClick,\n            namespace,\n            params?.elementAtOrNull(index),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildTag(String tag, ClickTagCallback onClick,\n      [String? namespace, String? param]) {\n    String translateTag(String tag) {\n      if (enableTranslation) {\n        if (namespace != null) {\n          tag = TagsTranslation.translationTagWithNamespace(tag, namespace);\n        } else {\n          tag = tag.translateTagsToCN;\n        }\n      }\n      return tag;\n    }\n\n    return Padding(\n      padding: const EdgeInsets.fromLTRB(8, 6, 8, 6),\n      child: InkWell(\n        borderRadius: const BorderRadius.all(Radius.circular(16)),\n        onTap: () => onClick(tag, param),\n        child: Builder(\n          builder: (context) {\n            return Material(\n              elevation: 1,\n              borderRadius: const BorderRadius.all(Radius.circular(12)),\n              color: context.colorScheme.surfaceContainerLow,\n              child: Padding(\n                padding: const EdgeInsets.fromLTRB(16, 8, 16, 8),\n                child: Text(translateTag(tag)),\n              ),\n            );\n          },\n        ),\n      ),\n    );\n  }\n\n  bool get enableTranslation => App.locale.languageCode == 'zh';\n}\n"
  },
  {
    "path": "lib/pages/comic_page.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/comment.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/components/select_download_eps.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/foundation/image_loader/stream_image_provider.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/foundation/stack.dart' as stack;\nimport 'package:pica_comic/foundation/ui_mode.dart';\nimport 'package:pica_comic/network/base_comic.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/favorites/local_favorites.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/pages/search_result_page.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'show_image_page.dart';\nimport 'package:share_plus/share_plus.dart';\nimport 'package:shimmer_animation/shimmer_animation.dart';\nimport 'dart:math' as math;\n\nclass ComicPage extends StatelessWidget {\n  const ComicPage({\n    super.key,\n    required this.sourceKey,\n    required this.id,\n    this.cover,\n  });\n\n  final String sourceKey;\n\n  final String id;\n\n  final String? cover;\n\n  @override\n  Widget build(BuildContext context) {\n    var comicSource = ComicSource.find(sourceKey);\n    if (comicSource?.comicPageBuilder != null) {\n      return comicSource!.comicPageBuilder!(context, id, cover);\n    }\n    return _ComicPageImpl(\n      sourceKey: sourceKey,\n      id: id,\n      comicCover: cover,\n    );\n  }\n}\n\nclass _ComicPageImpl extends BaseComicPage<ComicInfoData> {\n  const _ComicPageImpl(\n      {required this.sourceKey, required this.id, this.comicCover});\n\n  @override\n  final String sourceKey;\n\n  @override\n  final String id;\n\n  final String? comicCover;\n\n  @override\n  String? get cover => comicCover ?? data?.cover;\n\n  @override\n  void download() async {\n    final downloadId = DownloadManager().generateId(sourceKey, id);\n    final eps = data!.chapters?.values.toList();\n    for (var i in DownloadManager().downloading) {\n      if (i.id == downloadId) {\n        showToast(message: \"下载中\".tl);\n        return;\n      }\n    }\n    var downloaded = <int>[];\n    if (DownloadManager().isExists(downloadId)) {\n      if (eps == null) {\n        showToast(message: \"已下载\".tl);\n        return;\n      }\n      var downloadedComic = await DownloadManager().getComicOrNull(downloadId);\n      downloaded.addAll(downloadedComic!.downloadedEps);\n    } else {\n      if (eps == null) {\n        DownloadManager().addCustomDownload(data!, [0]);\n        App.globalBack();\n        showToast(message: \"已加入下载\".tl);\n        return;\n      }\n    }\n    if (UiMode.m1(App.globalContext!)) {\n      showModalBottomSheet(\n          context: App.globalContext!,\n          builder: (context) {\n            return SelectDownloadChapter(eps, (selectedEps) {\n              DownloadManager().addCustomDownload(data!, selectedEps);\n              App.globalBack();\n              showToast(message: \"已加入下载\".tl);\n            }, downloaded);\n          });\n    } else {\n      showSideBar(\n          App.globalContext!,\n          SelectDownloadChapter(eps, (selectedEps) {\n            DownloadManager().addCustomDownload(data!, selectedEps);\n            App.globalBack();\n            showToast(message: \"已加入下载\".tl);\n          }, downloaded),\n          useSurfaceTintColor: true);\n    }\n  }\n\n  @override\n  EpsData? get eps {\n    if (data!.chapters != null && data!.chapters!.isNotEmpty) {\n      return EpsData(\n        data!.chapters!.values.toList(),\n        (ep) async {\n          await History.findOrCreate(data!);\n          App.globalTo(\n            () => ComicReadingPage(\n              CustomReadingData(\n                data!.target,\n                data!.title,\n                ComicSource.find(sourceKey)!,\n                data!.chapters,\n              ),\n              0,\n              ep + 1,\n            ),\n          );\n        },\n      );\n    }\n    return null;\n  }\n\n  @override\n  String? get introduction => data!.description;\n\n  ComicSource? get comicSource => ComicSource.find(sourceKey);\n\n  @override\n  Future<Res<ComicInfoData>> loadData() async {\n    if (comicSource == null) throw \"Comic Source Not Found\";\n    var res = await comicSource!.loadComicInfo!(id);\n    return res;\n  }\n\n  @override\n  Future<bool> loadFavorite(ComicInfoData data) async {\n    return data.isFavorite ?? false;\n  }\n\n  @override\n  int? get pages => null;\n\n  @override\n  void read(History? history) async {\n    history = await History.createIfNull(history, data!);\n    App.globalTo(\n      () => ComicReadingPage(\n        CustomReadingData(\n          data!.target,\n          data!.title,\n          ComicSource.find(sourceKey)!,\n          data!.chapters,\n        ),\n        history!.page,\n        history.ep,\n      ),\n    );\n  }\n\n  @override\n  Widget? recommendationBuilder(ComicInfoData data) {\n    if (data.suggestions == null) return null;\n\n    return SliverGridComics(comics: data.suggestions!, sourceKey: sourceKey);\n  }\n\n  @override\n  String get source => comicSource!.name;\n\n  @override\n  String get tag => \"$key comic page with id: $id\";\n\n  @override\n  Map<String, List<String>>? get tags => data!.tags;\n\n  @override\n  void tapOnTag(String tag, String key) {\n    context.to(\n      () => SearchResultPage(\n        keyword: tag,\n        options: const [],\n        sourceKey: sourceKey,\n      ),\n    );\n  }\n\n  @override\n  ThumbnailsData? get thumbnailsCreator {\n    if (data!.thumbnails == null && data!.thumbnailLoader == null) return null;\n\n    return ThumbnailsData(\n        data!.thumbnails ?? [],\n        (page) =>\n            data!.thumbnailLoader?.call(id, page) ??\n            Future.value(const Res.error(\"\")),\n        data!.thumbnailMaxPage);\n  }\n\n  @override\n  Widget thumbnailImageBuilder(int index, String imageUrl) {\n    return Image(\n      image: StreamImageProvider(\n          () => ImageManager().getCustomThumbnail(imageUrl, sourceKey),\n          imageUrl),\n      fit: BoxFit.contain,\n      errorBuilder: (context, s, d) => const Icon(Icons.error),\n    );\n  }\n\n  @override\n  String? get title => data?.title;\n\n  @override\n  FavoriteItem toLocalFavoriteItem() {\n    var tags = <String>[];\n    data!.tags.forEach((key, value) => tags.addAll(value));\n    return FavoriteItem.fromBaseComic(CustomComic(data!.title,\n        data!.subTitle ?? \"\", data!.cover, id, tags, \"\", sourceKey));\n  }\n\n  @override\n  Card? get uploaderInfo => null;\n\n  @override\n  bool? get favoriteOnPlatformInitial => data?.isFavorite;\n\n  ComicPageLogic<ComicInfoData> get logic =>\n      StateController.find<ComicPageLogic<ComicInfoData>>(tag: tag);\n\n  @override\n  void openFavoritePanel() {\n    favoriteComic(FavoriteComicWidget(\n      havePlatformFavorite:\n          comicSource!.favoriteData != null && comicSource!.isLogin,\n      needLoadFolderData: comicSource!.favoriteData?.multiFolder ?? false,\n      folders: {\n        if (!(comicSource!.favoriteData?.multiFolder ?? false))\n          '0': comicSource!.name\n      },\n      foldersLoader: comicSource?.favoriteData?.loadFolders == null\n          ? null\n          : () => comicSource!.favoriteData!.loadFolders!(data!.comicId),\n      initialFolder:\n          (comicSource!.favoriteData?.multiFolder ?? false) ? null : '0',\n      localFavoriteItem: toLocalFavoriteItem(),\n      setFavorite: (b) {\n        if (favorite != b) {\n          favorite = b;\n          update();\n        }\n      },\n      favoriteOnPlatform: logic.favoriteOnPlatform,\n      selectFolderCallback: (folder, type) async {\n        if (type == 1) {\n          LocalFavoritesManager().addComic(folder, toLocalFavoriteItem());\n          return const Res(true);\n        } else {\n          var res = await comicSource!.favoriteData!.addOrDelFavorite!(\n              id, folder, true);\n          if (!comicSource!.favoriteData!.multiFolder && res.success) {\n            logic.favoriteOnPlatform = true;\n            update();\n          }\n          return res;\n        }\n      },\n      cancelPlatformFavorite: () async {\n        var res =\n            await comicSource!.favoriteData!.addOrDelFavorite!(id, '0', false);\n        if (res.success) {\n          logic.favoriteOnPlatform = false;\n        }\n        return res;\n      },\n      cancelPlatformFavoriteWithFolder: (folder) {\n        return comicSource!.favoriteData!.addOrDelFavorite!(id, folder, false);\n      },\n    ));\n  }\n\n  @override\n  ActionFunc? get openComments => comicSource!.commentsLoader != null\n      ? () {\n          showSideBar(App.globalContext!,\n              _CommentsPage(data: data!, source: comicSource!),\n              title: \"评论\".tl);\n        }\n      : null;\n\n  @override\n  String get downloadedId => downloadManager.generateId(comicSource!.key, id);\n}\n\nclass _CommentsPage extends StatefulWidget {\n  const _CommentsPage({required this.data, required this.source, this.replyId});\n\n  final ComicInfoData data;\n\n  final ComicSource source;\n\n  final String? replyId;\n\n  @override\n  State<_CommentsPage> createState() => _CommentsPageState();\n}\n\nclass _CommentsPageState extends State<_CommentsPage> {\n  bool _loading = true;\n  List<Comment>? _comments;\n  String? _error;\n  int _page = 1;\n  int? maxPage;\n  var controller = TextEditingController();\n  bool sending = false;\n\n  void firstLoad() async {\n    var res = await widget.source.commentsLoader!(\n        widget.data.comicId, widget.data.subId, 1, widget.replyId);\n    if (res.error) {\n      setState(() {\n        _error = res.errorMessage;\n        _loading = false;\n      });\n    } else {\n      setState(() {\n        _comments = res.data;\n        _loading = false;\n        maxPage = res.subData;\n      });\n    }\n  }\n\n  void loadMore() async {\n    var res = await widget.source.commentsLoader!(\n        widget.data.comicId, widget.data.subId, _page + 1, widget.replyId);\n    if (res.error) {\n      showToast(message: res.errorMessage ?? \"Unknown Error\");\n    } else {\n      setState(() {\n        _comments!.addAll(res.data);\n        _page++;\n        if (maxPage == null && res.data.isEmpty) {\n          maxPage = _page;\n        }\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (_loading) {\n      firstLoad();\n      return const Center(\n        child: CircularProgressIndicator(),\n      );\n    } else if (_error != null) {\n      return NetworkError(\n        message: _error!,\n        retry: () {\n          setState(() {\n            _loading = true;\n          });\n        },\n        withAppbar: false,\n      );\n    } else {\n      return Column(\n        children: [\n          Expanded(\n            child: ListView.builder(\n              primary: false,\n              padding: EdgeInsets.zero,\n              itemCount: _comments!.length + 1,\n              itemBuilder: (context, index) {\n                if (index == _comments!.length) {\n                  if (_page < (maxPage ?? _page + 1)) {\n                    loadMore();\n                    return const ListLoadingIndicator();\n                  } else {\n                    return const SizedBox();\n                  }\n                }\n\n                bool enableReply = _comments![index].replyCount != null;\n\n                return CommentTile(\n                  leading: _comments![index].avatar == null\n                      ? null\n                      : Container(\n                          width: 40,\n                          height: 40,\n                          clipBehavior: Clip.antiAlias,\n                          decoration: BoxDecoration(\n                              borderRadius: BorderRadius.circular(20),\n                              color: Theme.of(context)\n                                  .colorScheme\n                                  .secondaryContainer),\n                          child: AnimatedImage(\n                            image: StreamImageProvider(\n                              () => ImageManager().getCustomThumbnail(\n                                _comments![index].avatar!,\n                                widget.data.sourceKey,\n                              ),\n                              _comments![index].avatar!,\n                            ),\n                          ),\n                        ),\n                  avatarUrl: null,\n                  name: _comments![index].userName,\n                  time: _comments![index].time,\n                  content: _comments![index].content,\n                  comments: _comments![index].replyCount,\n                  onTap: enableReply\n                      ? () {\n                          showSideBar(\n                            context,\n                            _CommentsPage(\n                              data: widget.data,\n                              source: widget.source,\n                              replyId: _comments![index].id,\n                            ),\n                            title: \"回复\".tl,\n                          );\n                        }\n                      : null,\n                );\n              },\n            ),\n          ),\n          buildBottom(context)\n        ],\n      );\n    }\n  }\n\n  Widget buildBottom(BuildContext context) {\n    if (widget.source.sendCommentFunc == null) {\n      return const SizedBox(\n        height: 0,\n      );\n    }\n    return Container(\n      decoration: BoxDecoration(\n          color: Theme.of(context).colorScheme.surface,\n          borderRadius: const BorderRadius.vertical(top: Radius.circular(16))),\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(10, 5, 10, 5),\n        child: Material(\n          child: Container(\n            decoration: BoxDecoration(\n                color: Theme.of(context)\n                    .colorScheme\n                    .surfaceContainerHighest\n                    .withAlpha(160),\n                borderRadius: const BorderRadius.all(Radius.circular(30))),\n            child: Row(\n              children: [\n                Expanded(\n                    child: Padding(\n                  padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),\n                  child: TextField(\n                    controller: controller,\n                    decoration: InputDecoration(\n                        border: InputBorder.none,\n                        isCollapsed: true,\n                        hintText: \"评论\".tl),\n                    minLines: 1,\n                    maxLines: 5,\n                  ),\n                )),\n                sending\n                    ? const Padding(\n                        padding: EdgeInsets.all(8.5),\n                        child: SizedBox(\n                          width: 23,\n                          height: 23,\n                          child: CircularProgressIndicator(),\n                        ),\n                      )\n                    : IconButton(\n                        onPressed: () async {\n                          if (controller.text.isEmpty) {\n                            return;\n                          }\n                          setState(() {\n                            sending = true;\n                          });\n                          var b = await widget.source.sendCommentFunc!(\n                              widget.data.comicId,\n                              widget.data.subId,\n                              controller.text,\n                              widget.replyId);\n                          if (!b.error) {\n                            controller.text = \"\";\n                            setState(() {\n                              sending = false;\n                              _loading = true;\n                              _comments?.clear();\n                              _page = 1;\n                              maxPage = null;\n                            });\n                          } else {\n                            showToast(message: b.errorMessage ?? \"Error\");\n                            setState(() {\n                              sending = false;\n                            });\n                          }\n                        },\n                        icon: Icon(\n                          Icons.send,\n                          color: Theme.of(context).colorScheme.secondary,\n                        ),\n                      )\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass EpsData {\n  /// episodes text\n  final List<String> eps;\n\n  /// callback when a episode button is tapped\n  final void Function(int) onTap;\n\n  /// comic episode data\n  const EpsData(this.eps, this.onTap);\n}\n\nclass ThumbnailsData {\n  List<String> thumbnails;\n  int current = 1;\n  final int maxPage;\n  final Future<Res<List<String>>> Function(int page) load;\n\n  Future<void> get(void Function() update) async {\n    if (current >= maxPage) {\n      return;\n    }\n    var res = await load(current + 1);\n    if (res.success) {\n      thumbnails.addAll(res.data);\n      current++;\n      update();\n    } else {\n      Log.error(\"Network\", \"Failed to load thumbnails: ${res.errorMessage}\");\n    }\n  }\n\n  ThumbnailsData(this.thumbnails, this.load, this.maxPage);\n}\n\nclass ComicPageLogic<T extends Object> extends StateController {\n  bool loading = true;\n  T? data;\n  String? message;\n  bool showAppbarTitle = false;\n  ScrollController controller = ScrollController();\n  ThumbnailsData? thumbnailsData;\n  double? width;\n  double? height;\n  bool favorite = false;\n  History? history;\n  bool reverseEpsOrder = false;\n  bool showFullEps = false;\n  int colorIndex = 0;\n  bool? favoriteOnPlatform;\n\n  void get(Future<Res<T>> Function() loadData,\n      Future<bool> Function(T) loadFavorite, String Function() getId) async {\n    var [res, _] = await Future.wait(\n        [loadData(), Future.delayed(const Duration(milliseconds: 300))]);\n    if (res.error) {\n      if (res.errorMessage == \"Exit\") {\n        return;\n      }\n      message = res.errorMessage;\n    } else {\n      data = res.data;\n      favorite = await loadFavorite(res.data);\n    }\n    loading = false;\n    history = await HistoryManager().find(getId());\n    update();\n  }\n\n  void refresh_() {\n    data = null;\n    message = null;\n    loading = true;\n    update();\n  }\n\n  updateHistory(History? newHistory) {\n    if (newHistory != null) {\n      history = newHistory;\n      update();\n    }\n  }\n}\n\nabstract class BaseComicPage<T extends Object> extends StatelessWidget {\n  /// comic info page, show comic's detailed information,\n  /// and allow user to download or read comic.\n  const BaseComicPage({super.key});\n\n  ComicPageLogic<T> get _logic =>\n      StateController.find<ComicPageLogic<T>>(tag: tag);\n\n  /// title\n  String? get title;\n\n  /// tags\n  Map<String, List<String>>? get tags;\n\n  /// load comic data\n  Future<Res<T>> loadData();\n\n  /// get comic data\n  @nonVirtual\n  T? get data => _logic.data;\n\n  /// Used by StateController.\n  ///\n  /// This should be a unique identifier,\n  /// to prevent loading same data when user open more than one comic page.\n  String get tag;\n\n  /// comic total page\n  ///\n  /// when not null, it will be display at the end of the title.\n  int? get pages;\n\n  /// link to comic cover.\n  String? get cover;\n\n  /// callback when user tap on a tag\n  void tapOnTag(String tag, String key);\n\n  void read(History? history);\n\n  void download();\n\n  void openFavoritePanel();\n\n  ActionFunc? get openComments => null;\n\n  String? get commentsCount => null;\n\n  ActionFunc? get onLike => null;\n\n  bool get isLiked => false;\n\n  String? get likeCount => null;\n\n  /// display uploader info\n  Card? get uploaderInfo;\n\n  /// episodes information\n  EpsData? get eps;\n\n  /// comic introduction\n  String? get introduction;\n\n  /// create thumbnails data\n  ThumbnailsData? get thumbnailsCreator;\n\n  @nonVirtual\n  ThumbnailsData? get thumbnails => _logic.thumbnailsData;\n\n  Widget? recommendationBuilder(T data);\n\n  /// update widget state\n  @nonVirtual\n  void update() => _logic.update();\n\n  /// get context\n  BuildContext get context => App.mainNavigatorKey!.currentContext!;\n\n  /// interface for building more info widget\n  Widget? get buildMoreInfo => null;\n\n  /// translation tags to CN\n  bool get enableTranslationToCN => false;\n\n  String? get subTitle => null;\n\n  Map<String, String> get headers => {};\n\n  @nonVirtual\n  bool get favorite => _logic.favorite;\n\n  @nonVirtual\n  set favorite(bool f) => _logic.favorite = f;\n\n  Future<bool> loadFavorite(T data);\n\n  /// used for history\n  String get id;\n\n  /// url linked to this comic\n  String? get url => null;\n\n  /// callback when a thumbnail is tapped\n  void onThumbnailTapped(int index) {}\n\n  ActionFunc? get searchSimilar => null;\n\n  Widget thumbnailImageBuilder(int index, String imageUrl) =>\n      _thumbnailImageBuilder(index);\n\n  /// The source of this comic, displayed at the beginning of the [title],\n  /// can be translated into the user's language.\n  String get source;\n\n  FavoriteItem toLocalFavoriteItem();\n\n  bool? get favoriteOnPlatformInitial => null;\n\n  String get downloadedId;\n\n  String get sourceKey;\n\n  void scrollListener() {\n    try {\n      var logic = _logic;\n      bool temp = logic.showAppbarTitle;\n      if (!logic.controller.hasClients) {\n        return;\n      }\n      logic.showAppbarTitle = logic.controller.position.pixels > 136;\n      if (temp != logic.showAppbarTitle) {\n        logic.update();\n      }\n    } catch (e) {\n      return;\n    }\n  }\n\n  static stack.Stack<ComicPageLogic> tagsStack = stack.Stack<ComicPageLogic>();\n\n  @override\n  Widget build(BuildContext context) {\n    return LayoutBuilder(builder: (context, constraints) {\n      return Scaffold(\n        body: StateBuilder<ComicPageLogic<T>>(\n          tag: tag,\n          init: ComicPageLogic<T>(),\n          initState: (logic) {\n            tagsStack.push(_logic);\n            _logic.favoriteOnPlatform = favoriteOnPlatformInitial;\n          },\n          dispose: (logic) {\n            tagsStack.pop();\n          },\n          builder: (logic) {\n            _logic.width = constraints.maxWidth;\n            _logic.height = constraints.maxHeight;\n            if (logic.loading) {\n              logic.get(loadData, loadFavorite, () => id);\n              return buildLoading(context);\n            } else if (logic.message != null) {\n              return NetworkError(\n                message: logic.message!,\n                retry: logic.refresh_,\n              );\n            } else {\n              _logic.thumbnailsData ??= thumbnailsCreator;\n              logic.controller.removeListener(scrollListener);\n              logic.controller.addListener(scrollListener);\n              return SmoothCustomScrollView(\n                controller: logic.controller,\n                slivers: [\n                  buildTitle(logic),\n                  buildComicInfo(logic, context),\n                  buildTags(logic, context),\n                  ...buildEpisodeInfo(context),\n                  ...buildIntroduction(context),\n                  ...buildThumbnails(context),\n                  ...buildRecommendation(context),\n                  SliverPadding(\n                    padding: EdgeInsets.only(\n                        bottom: MediaQuery.of(context).padding.bottom),\n                  )\n                ],\n              );\n            }\n          },\n        ),\n      );\n    });\n  }\n\n  Widget buildLoading(BuildContext context) {\n    return Shimmer(\n        color: Theme.of(context).colorScheme.surfaceContainerHighest,\n        colorOpacity: 0.5,\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            SizedBox(\n              height: 56,\n              child: const BackButton().toAlign(Alignment.centerLeft),\n            ).paddingLeft(8),\n            SizedBox(\n              width: double.infinity,\n              child: buildComicInfo(_logic, context, false),\n            ),\n            const Divider(),\n            SizedBox(\n              width: 100,\n              child: Row(\n                children: [\n                  const SizedBox(\n                    width: 18,\n                  ),\n                  Text(\n                    \"信息\".tl,\n                    style: const TextStyle(\n                        fontWeight: FontWeight.w500, fontSize: 18),\n                  )\n                ],\n              ),\n            ).paddingBottom(8),\n            Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: List.generate(\n                8,\n                (index) => Padding(\n                  padding: const EdgeInsets.fromLTRB(12, 0, 12, 0),\n                  child: Container(\n                    width: double.infinity,\n                    height: 32,\n                    constraints: const BoxConstraints(maxWidth: 400),\n                    margin: const EdgeInsets.symmetric(vertical: 4),\n                    decoration: BoxDecoration(\n                      color: Theme.of(context)\n                          .colorScheme\n                          .surfaceContainerHighest\n                          .withOpacity(0.4),\n                      borderRadius: BorderRadius.circular(12),\n                    ),\n                  ),\n                ),\n              ),\n            )\n          ],\n        )).paddingTop(MediaQuery.of(context).padding.top);\n  }\n\n  Widget buildTitle(ComicPageLogic<T> logic) {\n    return SliverAppbar(\n      title: AnimatedOpacity(\n        opacity: logic.showAppbarTitle ? 1.0 : 0.0,\n        duration: const Duration(milliseconds: 200),\n        child: Text(title!),\n      ),\n      actions: [\n        IconButton(\n            onPressed: showMoreActions, icon: const Icon(Icons.more_horiz))\n      ],\n    );\n  }\n\n  void showMoreActions() {\n    final width = MediaQuery.of(context).size.width;\n    showMenu(\n      context: context,\n      position: RelativeRect.fromLTRB(width, 0, 0, 0),\n      items: [\n        PopupMenuItem(\n          child: Text(\"复制标题\".tl),\n          onTap: () {\n            var text = title!;\n            if (url != null) {\n              text += \":$url\";\n            }\n            Clipboard.setData(ClipboardData(text: text));\n            showToast(message: \"已复制\".tl, icon: const Icon(Icons.check));\n          },\n        ),\n        if (url != null)\n          PopupMenuItem(\n            child: Text(\"复制链接\".tl),\n            onTap: () {\n              Clipboard.setData(ClipboardData(text: url!));\n              showToast(message: \"已复制\".tl, icon: const Icon(Icons.check));\n            },\n          ),\n        PopupMenuItem(\n          child: Text(\"分享\".tl),\n          onTap: () {\n            var text = title!;\n            if (url != null) {\n              text += \":$url\";\n            }\n            Share.share(text);\n          },\n        ),\n      ],\n    );\n  }\n\n  Widget buildComicInfo(ComicPageLogic<T> logic, BuildContext context,\n      [bool sliver = true]) {\n    var body = LayoutBuilder(builder: (context, constrains) {\n      var width = constrains.maxWidth;\n      return Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          SizedBox(\n            width: double.infinity,\n            child: Row(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                const SizedBox(\n                  width: 8,\n                ),\n                buildCover(context, logic, 136, 102),\n                const SizedBox(\n                  width: 12,\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      SizedBox(\n                        width: double.infinity,\n                        child: SelectableText(title?.trim() ?? \"\",\n                            style: const TextStyle(fontSize: 18)),\n                      ),\n                      const SizedBox(\n                        height: 8,\n                      ),\n                      if (subTitle != null)\n                        SizedBox(\n                          width: double.infinity,\n                          child: SelectableText(subTitle!,\n                              style: const TextStyle(fontSize: 14)),\n                        ),\n                      if (subTitle != null)\n                        const SizedBox(\n                          height: 8,\n                        ),\n                      SizedBox(\n                        width: double.infinity,\n                        child:\n                            Text(source, style: const TextStyle(fontSize: 12)),\n                      ),\n                      if (pages != null)\n                        const SizedBox(\n                          height: 8,\n                        ),\n                      if (pages != null)\n                        SizedBox(\n                          width: double.infinity,\n                          child: Text(\"${pages}P\",\n                              style: const TextStyle(fontSize: 12)),\n                        ),\n                      if (width >= 500)\n                        buildActions(logic, context, false).paddingTop(12),\n                    ],\n                  ),\n                )\n              ],\n            ),\n          ).paddingHorizontal(10).paddingBottom(12),\n          if (width < 500)\n            buildActions(logic, context, true).paddingHorizontal(12),\n        ],\n      );\n    });\n\n    if (sliver == true) {\n      return SliverToBoxAdapter(\n        child: body,\n      );\n    }\n\n    return body;\n  }\n\n  Widget buildCover(\n      BuildContext context, ComicPageLogic logic, double height, double width) {\n    if (cover == null) {\n      return Container(\n        width: width,\n        height: height,\n        decoration: BoxDecoration(\n          color: Theme.of(context).colorScheme.primaryContainer,\n          borderRadius: BorderRadius.circular(12),\n        ),\n      );\n    }\n\n    if (headers[\"host\"] == null && headers[\"Host\"] == null) {\n      headers[\"host\"] = Uri.parse(cover!).host;\n    }\n    ImageProvider image = StreamImageProvider(\n        () => ImageManager().getCustomThumbnail(cover!, sourceKey), cover!);\n    return GestureDetector(\n      child: Container(\n        width: width,\n        height: height,\n        decoration: BoxDecoration(\n          color: Theme.of(context).colorScheme.primaryContainer,\n          borderRadius: BorderRadius.circular(12),\n        ),\n        clipBehavior: Clip.antiAlias,\n        child: Hero(\n          tag: \"image$tag\",\n          child: Image(\n            image: image,\n            fit: BoxFit.cover,\n          ),\n        ),\n      ),\n      onTap: () =>\n          App.globalTo(() => ShowImagePageWithHero(cover!, \"image$tag\")),\n    );\n  }\n\n  Widget buildInfoCard(String text, BuildContext context,\n      {bool title = false, String key = \"key\"}) {\n    final colorScheme = Theme.of(context).colorScheme;\n\n    if (text == \"\") {\n      text = \"未知\".tl;\n    }\n\n    List<PopupMenuEntry<dynamic>> buildPopMenus() {\n      return [\n        PopupMenuItem(\n          child: Text(\"复制\".tl),\n          onTap: () {\n            Clipboard.setData(ClipboardData(text: (text)));\n            showToast(message: \"已复制\".tl);\n          },\n        ),\n        if (!title)\n          PopupMenuItem(\n            child: Text(\"屏蔽\".tl),\n            onTap: () {\n              appdata.blockingKeyword.add(text);\n              appdata.writeData();\n            },\n          ),\n        if (!title)\n          PopupMenuItem(\n            child: Text(\"收藏\".tl),\n            onTap: () {\n              var res = source.tlEN;\n              if (source == \"EHentai\") {\n                res += \":$key\";\n              }\n              if (source == \"Nhentai\" && key == \"Artists\") {\n                res += \":Artist\";\n              }\n              if (text.contains(\" \")) {\n                res += \":\\\"$text\\\"\";\n              } else {\n                res += \":$text\";\n              }\n              appdata.favoriteTags.add(res);\n              appdata.writeHistory();\n            },\n          )\n      ];\n    }\n\n    Widget label(String text) =>\n        Text(text, style: const TextStyle(fontSize: 13));\n\n    if (title) {\n      _logic.colorIndex++;\n    }\n\n    return GestureDetector(\n      onLongPressStart: (details) {\n        showMenu(\n            context: App.globalContext!,\n            position: RelativeRect.fromLTRB(\n                details.globalPosition.dx,\n                details.globalPosition.dy,\n                details.globalPosition.dx,\n                details.globalPosition.dy),\n            items: buildPopMenus());\n      },\n      child: Container(\n        margin: const EdgeInsets.fromLTRB(4, 4, 4, 4),\n        child: InkWell(\n          borderRadius: const BorderRadius.all(Radius.circular(12)),\n          onTap: title ? null : () => tapOnTag(text, key),\n          onSecondaryTapDown: (details) {\n            showMenu(\n                context: App.globalContext!,\n                position: RelativeRect.fromLTRB(\n                    details.globalPosition.dx,\n                    details.globalPosition.dy,\n                    details.globalPosition.dx,\n                    details.globalPosition.dy),\n                items: buildPopMenus());\n          },\n          child: Card(\n            margin: EdgeInsets.zero,\n            color: title\n                ? colors[_logic.colorIndex % colors.length]\n                    .shade100\n                    .withOpacity(0.6)\n                : ElevationOverlay.applySurfaceTint(\n                    colorScheme.surface, colorScheme.surfaceTint, 3),\n            shape:\n                RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),\n            elevation: 0,\n            child: Padding(\n              padding: const EdgeInsets.fromLTRB(12, 6, 12, 6),\n              child: enableTranslationToCN\n                  ? (title\n                      ? label(text.translateTagsCategoryToCN)\n                      : label(TagsTranslation.translationTagWithNamespace(\n                          text, key)))\n                  : label(text),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildActions(ComicPageLogic logic, BuildContext context, bool center) {\n    if (logic.loading) {\n      return Container(\n        decoration: BoxDecoration(\n          color: Theme.of(context)\n              .colorScheme\n              .surfaceContainerHighest\n              .withOpacity(0.4),\n          borderRadius: BorderRadius.circular(12),\n        ),\n        height: 72,\n        width: double.infinity,\n      );\n    }\n\n    Widget buildItem(String title, IconData icon, VoidCallback onTap,\n        [VoidCallback? onLongPress]) {\n      return InkWell(\n        onTap: onTap,\n        onLongPress: onLongPress,\n        borderRadius: const BorderRadius.all(Radius.circular(8)),\n        child: SizedBox(\n          height: 72,\n          width: 64,\n          child: Column(\n            children: [\n              const SizedBox(\n                height: 12,\n              ),\n              Icon(\n                icon,\n                size: 24,\n                color: Theme.of(context).colorScheme.primary,\n              ),\n              const SizedBox(\n                height: 8,\n              ),\n              Text(\n                title,\n                style: const TextStyle(fontSize: 12),\n              )\n            ],\n          ),\n        ),\n      );\n    }\n\n    final width = MediaQuery.of(context).size.width;\n\n    return SizedBox(\n      width: double.infinity,\n      child: Column(\n        crossAxisAlignment: UiMode.m1(context)\n            ? CrossAxisAlignment.center\n            : CrossAxisAlignment.start,\n        children: [\n          Wrap(\n            alignment: center ? WrapAlignment.center : WrapAlignment.start,\n            children: [\n              if (logic.history != null && width >= 500)\n                buildItem(\n                    \"继续阅读\".tl, Icons.menu_book, () => read(logic.history)),\n              if (width >= 500 || (width < 500 && logic.history != null))\n                buildItem(\n                    \"从头开始\".tl, Icons.not_started_outlined, () => read(null)),\n              buildItem(\"分享\".tl, Icons.share, () {\n                var text = title!;\n                if (url != null) {\n                  text += \":$url\";\n                }\n                Share.share(text);\n              }),\n              buildItem(\n                  favorite ? \"已收藏\".tl : \"收藏\".tl,\n                  favorite\n                      ? Icons.collections_bookmark\n                      : Icons.collections_bookmark_outlined,\n                  openFavoritePanel, () {\n                var folder = appdata.settings[51];\n                if (LocalFavoritesManager().folderNames.contains(folder)) {\n                  LocalFavoritesManager()\n                      .addComic(folder, toLocalFavoriteItem());\n                  showToast(message: \"已收藏\".tl);\n                }\n              }),\n              if (width >= 500) buildItem(\"下载\".tl, Icons.download, download),\n              if (onLike != null)\n                buildItem(likeCount ?? \"喜欢\".tl,\n                    isLiked ? Icons.favorite : Icons.favorite_border, onLike!),\n              if (openComments != null)\n                buildItem(\n                    commentsCount ?? \"评论\".tl, Icons.comment, openComments!),\n              if (searchSimilar != null)\n                buildItem(\"相似\".tl, Icons.search, searchSimilar!),\n              if (downloadManager.isExists(downloadedId))\n                Flyout(\n                  enableTap: true,\n                  navigator: App.navigatorKey.currentState!,\n                  withInkWell: true,\n                  borderRadius: 8,\n                  flyoutBuilder: (context) => FlyoutContent(\n                    title: \"是否删除下载\".tl,\n                    actions: [\n                      TextButton(\n                        onPressed: () async {\n                          Navigator.of(context).pop();\n                          await downloadManager.delete([downloadedId]);\n                          showToast(message: \"已删除\".tl);\n                          logic.update();\n                        },\n                        child: Text(\"删除\".tl),\n                      ),\n                      TextButton(\n                        onPressed: () {\n                          Navigator.of(context).pop();\n                        },\n                        child: Text(\"取消\".tl),\n                      ),\n                    ],\n                  ),\n                  child: SizedBox(\n                    height: 72,\n                    width: 64,\n                    child: Column(\n                      children: [\n                        const SizedBox(\n                          height: 12,\n                        ),\n                        Icon(\n                          Icons.delete_outline,\n                          size: 24,\n                          color: Theme.of(context).colorScheme.primary,\n                        ),\n                        const SizedBox(\n                          height: 8,\n                        ),\n                        Text(\n                          \"删除下载\".tl,\n                          style: const TextStyle(fontSize: 12),\n                        )\n                      ],\n                    ),\n                  ),\n                ),\n            ],\n          ),\n          if (width < 500)\n            SizedBox(\n              height: 48,\n              child: Row(\n                children: [\n                  Expanded(\n                    child: FilledButton.tonal(\n                      onPressed: download,\n                      child: Text(\"下载\".tl),\n                    ),\n                  ),\n                  const SizedBox(\n                    width: 16,\n                  ),\n                  Expanded(\n                    child: FilledButton.tonal(\n                      onPressed: () => read(_logic.history),\n                      child: Text(\"阅读\".tl),\n                    ),\n                  ),\n                ],\n              ),\n            ).paddingHorizontal(8)\n        ],\n      ),\n    );\n  }\n\n  Widget buildTags(ComicPageLogic logic, BuildContext context) {\n    return SliverToBoxAdapter(\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          const Divider(),\n          SizedBox(\n              width: 100,\n              child: Row(\n                children: [\n                  const SizedBox(\n                    width: 18,\n                  ),\n                  Text(\n                    \"信息\".tl,\n                    style: const TextStyle(\n                        fontWeight: FontWeight.w500, fontSize: 18),\n                  )\n                ],\n              )),\n          const SizedBox(\n            height: 12,\n          ),\n          ...buildInfoCards(logic, context)\n        ],\n      ),\n    );\n  }\n\n  Iterable<Widget> buildInfoCards(\n      ComicPageLogic logic, BuildContext context) sync* {\n    if (buildMoreInfo != null) {\n      yield Padding(\n        padding: const EdgeInsets.fromLTRB(18, 8, 30, 8),\n        child: buildMoreInfo!,\n      );\n    }\n\n    _logic.colorIndex = 0;\n\n    for (var key in tags!.keys) {\n      yield Padding(\n        padding: const EdgeInsets.fromLTRB(12, 0, 12, 0),\n        child: Wrap(\n          children: [\n            buildInfoCard(key, context, title: true),\n            for (var tag in tags![key]!) buildInfoCard(tag, context, key: key)\n          ],\n        ),\n      );\n    }\n\n    if (uploaderInfo != null) {\n      yield Padding(\n        padding: const EdgeInsets.fromLTRB(18, 4, 18, 4),\n        child: Align(\n          alignment: Alignment.centerLeft,\n          child: ConstrainedBox(\n            constraints: const BoxConstraints(\n              maxWidth: 420,\n            ),\n            child: uploaderInfo,\n          ),\n        ),\n      );\n    }\n  }\n\n  Iterable<Widget> buildEpisodeInfo(BuildContext context) sync* {\n    final colorScheme = Theme.of(context).colorScheme;\n    if (eps == null) return;\n\n    yield const SliverToBoxAdapter(\n      child: Divider(),\n    );\n\n    yield SliverToBoxAdapter(\n      child: Padding(\n        padding: const EdgeInsets.symmetric(horizontal: 16),\n        child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [\n          Text(\n            \"章节\".tl,\n            style: const TextStyle(fontWeight: FontWeight.w500, fontSize: 18),\n          ),\n          const Spacer(),\n          Tooltip(\n            message: \"排序\".tl,\n            child: IconButton(\n              icon: Icon(_logic.reverseEpsOrder\n                  ? Icons.vertical_align_top\n                  : Icons.vertical_align_bottom_outlined),\n              onPressed: () {\n                _logic.reverseEpsOrder = !_logic.reverseEpsOrder;\n                _logic.update();\n              },\n            ),\n          )\n        ]),\n      ),\n    );\n\n    yield const SliverPadding(padding: EdgeInsets.all(6));\n\n    int length = eps!.eps.length;\n\n    if (!_logic.showFullEps) {\n      length = math.min(length, 20);\n    }\n\n    yield SliverPadding(\n      padding: const EdgeInsets.symmetric(horizontal: 8),\n      sliver: SliverGrid(\n        delegate: SliverChildBuilderDelegate(childCount: length, (context, i) {\n          if (_logic.reverseEpsOrder) {\n            i = eps!.eps.length - i - 1;\n          }\n          bool visited =\n              (_logic.history?.readEpisode ?? const {}).contains(i + 1);\n          return Padding(\n            padding: const EdgeInsets.fromLTRB(8, 4, 8, 4),\n            child: InkWell(\n              borderRadius: const BorderRadius.all(Radius.circular(16)),\n              child: Material(\n                elevation: 5,\n                color: colorScheme.surface,\n                surfaceTintColor: colorScheme.surfaceTint,\n                borderRadius: const BorderRadius.all(Radius.circular(12)),\n                shadowColor: Colors.transparent,\n                child: Padding(\n                  padding:\n                      const EdgeInsets.symmetric(horizontal: 8, vertical: 4),\n                  child: Center(\n                    child: Text(\n                      eps!.eps[i],\n                      maxLines: 1,\n                      textAlign: TextAlign.center,\n                      overflow: TextOverflow.ellipsis,\n                      style: TextStyle(\n                          color: visited ? colorScheme.outline : null),\n                    ),\n                  ),\n                ),\n              ),\n              onTap: () => eps!.onTap(i),\n            ),\n          );\n        }),\n        gridDelegate: const SliverGridDelegateWithFixedHeight(\n            maxCrossAxisExtent: 200, itemHeight: 48),\n      ),\n    );\n\n    if (eps!.eps.length > 20 && !_logic.showFullEps) {\n      yield SliverToBoxAdapter(\n        child: Align(\n          alignment: Alignment.center,\n          child: FilledButton.tonal(\n            style: ButtonStyle(\n              shape: WidgetStateProperty.all(const RoundedRectangleBorder(\n                  borderRadius: BorderRadius.all(Radius.circular(8)))),\n            ),\n            onPressed: () {\n              _logic.showFullEps = true;\n              _logic.update();\n            },\n            child: Text(\"${\"显示全部\".tl} (${eps!.eps.length})\"),\n          ).paddingTop(12),\n        ),\n      );\n    }\n  }\n\n  List<Widget> buildIntroduction(BuildContext context) {\n    if (introduction == null) return [];\n\n    return [\n      const SliverPadding(padding: EdgeInsets.all(5)),\n      const SliverToBoxAdapter(\n        child: Divider(),\n      ),\n      SliverToBoxAdapter(\n        child: SizedBox(\n          width: 100,\n          child: Row(\n            children: [\n              const SizedBox(\n                width: 18,\n              ),\n              Text(\n                \"简介\".tl,\n                style:\n                    const TextStyle(fontWeight: FontWeight.w500, fontSize: 18),\n              )\n            ],\n          ),\n        ),\n      ),\n      SliverToBoxAdapter(\n        child: Padding(\n          padding: const EdgeInsets.fromLTRB(18, 10, 18, 0),\n          child: SelectableText(introduction!),\n        ),\n      ),\n      const SliverPadding(padding: EdgeInsets.all(5)),\n    ];\n  }\n\n  Widget _thumbnailImageBuilder(int index) {\n    return Image(\n      image:\n          CachedImageProvider(thumbnails!.thumbnails[index], headers: headers),\n      fit: BoxFit.contain,\n      errorBuilder: (context, s, d) => const Icon(Icons.error),\n    );\n  }\n\n  List<Widget> buildThumbnails(BuildContext context) {\n    if (thumbnails == null ||\n        (thumbnails!.thumbnails.isEmpty &&\n            !tag.contains(\"Hitomi\") &&\n            !tag.contains(\"Eh\"))) return [];\n    if (thumbnails!.thumbnails.isEmpty) {\n      thumbnails!.get(update);\n    }\n    return [\n      const SliverPadding(padding: EdgeInsets.all(5)),\n      const SliverToBoxAdapter(\n        child: Divider(),\n      ),\n      SliverToBoxAdapter(\n        child: SizedBox(\n          width: 100,\n          child: Row(\n            children: [\n              const SizedBox(\n                width: 18,\n              ),\n              Text(\n                \"预览\".tl,\n                style:\n                    const TextStyle(fontWeight: FontWeight.w500, fontSize: 18),\n              )\n            ],\n          ),\n        ),\n      ),\n      const SliverPadding(padding: EdgeInsets.all(5)),\n      SliverPadding(\n        padding: const EdgeInsets.symmetric(horizontal: 8),\n        sliver: SliverGrid(\n          delegate: SliverChildBuilderDelegate(\n              childCount: thumbnails!.thumbnails.length, (context, index) {\n            if (index == thumbnails!.thumbnails.length - 1) {\n              thumbnails!.get(update);\n            }\n            return Padding(\n              padding: UiMode.m1(context)\n                  ? const EdgeInsets.all(4)\n                  : const EdgeInsets.all(8),\n              child: Column(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Expanded(\n                      child: InkWell(\n                    onTap: () => onThumbnailTapped(index),\n                    borderRadius: const BorderRadius.all(Radius.circular(16)),\n                    child: Container(\n                      decoration: BoxDecoration(\n                        borderRadius:\n                            const BorderRadius.all(Radius.circular(16)),\n                        border: Border.all(\n                          color: Theme.of(context).colorScheme.outline,\n                        ),\n                      ),\n                      width: double.infinity,\n                      height: double.infinity,\n                      child: ClipRRect(\n                        borderRadius:\n                            const BorderRadius.all(Radius.circular(16)),\n                        child: thumbnailImageBuilder(\n                            index, thumbnails!.thumbnails[index]),\n                      ),\n                    ),\n                  )),\n                  const SizedBox(\n                    height: 4,\n                  ),\n                  Text((index + 1).toString()),\n                ],\n              ),\n            );\n          }),\n          gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(\n            maxCrossAxisExtent: 200,\n            childAspectRatio: 0.65,\n          ),\n        ),\n      ),\n      if (thumbnails!.current < thumbnails!.maxPage)\n        const SliverToBoxAdapter(\n          child: ListLoadingIndicator(),\n        ),\n    ];\n  }\n\n  List<Widget> buildRecommendation(BuildContext context) {\n    var recommendation = recommendationBuilder(_logic.data!);\n    if (recommendation == null) return [];\n    return [\n      const SliverToBoxAdapter(\n        child: Divider(),\n      ),\n      SliverToBoxAdapter(\n        child: SizedBox(\n            width: 100,\n            child: Row(\n              children: [\n                const SizedBox(\n                  width: 18,\n                ),\n                Text(\n                  \"相关推荐\".tl,\n                  style: const TextStyle(\n                      fontWeight: FontWeight.w500, fontSize: 18),\n                )\n              ],\n            )),\n      ),\n      const SliverPadding(padding: EdgeInsets.all(5)),\n      recommendation,\n    ];\n  }\n\n  void favoriteComic(FavoriteComicWidget widget) {\n    if (UiMode.m1(context)) {\n      showModalBottomSheet(context: context, builder: (context) => widget);\n    } else {\n      showSideBar(\n        App.globalContext!,\n        widget,\n        title: \"收藏漫画\".tl,\n        useSurfaceTintColor: true,\n      );\n    }\n  }\n}\n\nclass FavoriteComicWidget extends StatefulWidget {\n  const FavoriteComicWidget(\n      {required this.havePlatformFavorite,\n      required this.needLoadFolderData,\n      required this.localFavoriteItem,\n      this.folders = const {},\n      this.foldersLoader,\n      this.selectFolderCallback,\n      this.initialFolder,\n      this.favoriteOnPlatform = false,\n      this.cancelPlatformFavorite,\n      this.cancelPlatformFavoriteWithFolder,\n      required this.setFavorite,\n      super.key});\n\n  /// whether this platform has favorites feather\n  final bool havePlatformFavorite;\n\n  /// need load folder data before show folders\n  final bool needLoadFolderData;\n\n  /// initial folders, default is empty\n  ///\n  /// key - folder's name, value - folders id(used by callback)\n  final Map<String, String> folders;\n\n  /// load folders method\n  final Future<Res<Map<String, String>>> Function()? foldersLoader;\n\n  /// callback when user choose a folder\n  ///\n  /// type=0: platform, type=1:local\n  final FutureOr<Res<bool>> Function(String id, int type)? selectFolderCallback;\n\n  /// initial selected folder id\n  final String? initialFolder;\n\n  /// whether this comic have been added to platform's favorite folder\n  /// if this is null, it is required to send a request to check it\n  final bool? favoriteOnPlatform;\n\n  /// identifier for the comic\n  final FavoriteItem localFavoriteItem;\n\n  final Future<Res<bool>> Function()? cancelPlatformFavorite;\n\n  final Future<Res<bool>> Function(String folder)?\n      cancelPlatformFavoriteWithFolder;\n\n  final void Function(bool favorite) setFavorite;\n\n  @override\n  State<FavoriteComicWidget> createState() => _FavoriteComicWidgetState();\n}\n\nclass _FavoriteComicWidgetState extends State<FavoriteComicWidget> {\n  late List<String> selected;\n  late int page = 0;\n\n  /// network folders\n  late Map<String, String> folders;\n\n  /// network folders that have been added to favorite\n  var favoritedFolders = <String>[];\n  bool loadedData = false;\n  List<String> addedFolders = [];\n  bool isAdding = false;\n\n  @override\n  void initState() {\n    LocalFavoritesManager()\n        .find(widget.localFavoriteItem.target, widget.localFavoriteItem.type)\n        .then((folder) {\n      Future.microtask(() => setState(() => addedFolders = folder));\n    });\n    selected = widget.initialFolder != null ? [widget.initialFolder!] : [];\n    if (!widget.havePlatformFavorite) {\n      page = 1;\n    }\n    folders = widget.folders;\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    assert(widget.havePlatformFavorite || page != 0);\n\n    Widget buildFolder(String name, String id, int p) {\n      bool isSelected = selected.contains(id);\n      return InkWell(\n        onTap: () => setState(() {\n          page = p;\n          if(isSelected) {\n            selected.remove(id);\n            return;\n          }\n          if (p == 0) {\n            selected.clear();\n            selected.add(id);\n          } else {\n            selected.add(id);\n          }\n        }),\n        child: SizedBox(\n          height: App.isDesktop ? 42 : 48,\n          width: double.infinity,\n          child: Padding(\n            padding: const EdgeInsets.fromLTRB(16, 8, 16, 8),\n            child: Row(\n              children: [\n                Icon(\n                  isSelected ? Icons.folder : Icons.folder_outlined,\n                  size: App.isDesktop ? 24 : 28,\n                  color: Theme.of(context).colorScheme.secondary,\n                ),\n                const SizedBox(\n                  width: 12,\n                ),\n                Text(name),\n                if ((addedFolders.contains(name) && p == 1) ||\n                    (favoritedFolders.contains(id) && p == 0))\n                  const SizedBox(\n                    width: 12,\n                  ),\n                if ((addedFolders.contains(name) && p == 1) ||\n                    (favoritedFolders.contains(id) && p == 0))\n                  Container(\n                    height: 30,\n                    padding: const EdgeInsets.symmetric(horizontal: 8),\n                    decoration: BoxDecoration(\n                      color: Theme.of(context).colorScheme.tertiaryContainer,\n                      borderRadius: const BorderRadius.all(Radius.circular(16)),\n                    ),\n                    child: Center(\n                      child: Text(\"已收藏\".tl),\n                    ),\n                  ),\n                const Spacer(),\n                if (isSelected) const AnimatedCheckIcon()\n              ],\n            ),\n          ),\n        ),\n      );\n    }\n\n    Widget button = Button.filled(\n      isLoading: isAdding,\n      child: Text(\"收藏\".tl),\n      onPressed: () async {\n        if (selected.isNotEmpty) {\n          setState(() {\n            isAdding = true;\n          });\n          Res<bool> res = const Res(true);\n          for(var id in selected) {\n            if(addedFolders.contains(id)) {\n              continue;\n            }\n            res = await widget.selectFolderCallback!.call(id, page);\n          }\n          if (res.success) {\n            widget.setFavorite(true);\n            if (context.mounted) {\n              context.pop();\n            }\n            showToast(message: \"成功添加收藏\".tl);\n          } else {\n            setState(() {\n              isAdding = false;\n            });\n            showToast(message: res.errorMessage!);\n          }\n        }\n      },\n    );\n\n    Widget platform = SingleChildScrollView(\n      child: Column(\n        children: List.generate(\n            folders.length,\n            (index) => buildFolder(folders.values.elementAt(index),\n                folders.keys.elementAt(index), 0)),\n      ),\n    );\n\n    if (widget.favoriteOnPlatform == true) {\n      platform = Center(\n        child: Text(\"已收藏\".tl),\n      );\n      if (page == 0) {\n        button = Button.filled(\n          isLoading: isAdding,\n          onPressed: () async {\n            setState(() {\n              isAdding = true;\n            });\n            var res = await widget.cancelPlatformFavorite!.call();\n            if (res.success) {\n              if (addedFolders.isEmpty) {\n                widget.setFavorite(false);\n              }\n              showToast(message: \"取消收藏成功\".tl);\n              if (context.mounted) {\n                context.pop();\n              }\n            } else {\n              setState(() {\n                isAdding = false;\n              });\n              showToast(message: res.errorMessage!);\n            }\n          },\n          child: Text(\"取消收藏\".tl),\n        );\n      }\n    }\n\n    if (page == 1 && selected.isNotEmpty && selected.every((e) => addedFolders.contains(e))) {\n      button = Button.filled(\n        onPressed: () {\n          context.hideMessages();\n          App.globalBack();\n          if (addedFolders.length == 1 &&\n              widget.favoriteOnPlatform == false &&\n              favoritedFolders.isEmpty) {\n            widget.setFavorite(false);\n          }\n          for (var id in selected) {\n            LocalFavoritesManager().deleteComic(\n              id,\n              widget.localFavoriteItem,\n            );\n          }\n        },\n        child: Text(\"取消收藏\".tl),\n      );\n    } else if (widget.havePlatformFavorite &&\n        widget.needLoadFolderData &&\n        !loadedData) {\n      widget.foldersLoader!.call().then((res) {\n        if (res.error) {\n          showToast(message: res.errorMessage ?? \"Error\");\n        } else {\n          setState(() {\n            loadedData = true;\n            folders = res.data;\n            favoritedFolders = res.subData ?? [];\n          });\n        }\n      });\n      platform = const Center(\n        child: CircularProgressIndicator(),\n      );\n    } else if (page == 0 &&\n        selected.length == 1 &&\n        favoritedFolders.contains(selected[0])) {\n      button = Button.filled(\n        onPressed: () async {\n          var res = await widget.cancelPlatformFavoriteWithFolder!(selected[0]);\n          if (res.success) {\n            showToast(message: \"取消收藏成功\".tl);\n            if (context.mounted) {\n              context.pop();\n            }\n          } else {\n            showToast(message: res.errorMessage!);\n          }\n        },\n        child: Text(\"取消收藏\".tl),\n      );\n    }\n\n    Widget local;\n\n    var localFolders = LocalFavoritesManager().folderNames;\n\n    var children = List.generate(localFolders.length,\n        (index) => buildFolder(localFolders[index], localFolders[index], 1));\n    children.add(SizedBox(\n      height: 56,\n      width: double.infinity,\n      child: Center(\n        child: TextButton(\n          child: Row(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              Text(\"新建\".tl),\n              const SizedBox(\n                width: 4,\n              ),\n              const Icon(Icons.add),\n            ],\n          ),\n          onPressed: () => showDialog(\n                  context: App.globalContext!,\n                  builder: (_) => const CreateFolderDialog())\n              .then((value) => setState(() {})),\n        ),\n      ),\n    ));\n    local = SingleChildScrollView(\n      child: Column(\n        children: children,\n      ),\n    );\n\n    return DefaultTabController(\n        length: widget.havePlatformFavorite ? 2 : 1,\n        child: Column(\n          children: [\n            TabBar(\n              onTap: (i) {\n                setState(() {\n                  selected.clear();\n                  if (i == 0 && widget.initialFolder != null) {\n                    selected.add(widget.initialFolder!);\n                  }\n                  page = i;\n                  if (!widget.havePlatformFavorite) {\n                    page = 1;\n                  }\n                });\n              },\n              tabs: [\n                if (widget.havePlatformFavorite)\n                  Tab(\n                    text: \"网络\".tl,\n                  ),\n                Tab(\n                  text: \"本地\".tl,\n                ),\n              ],\n            ),\n            Expanded(\n              child: TabBarView(\n                children: [\n                  if (widget.havePlatformFavorite) platform,\n                  local,\n                ],\n              ),\n            ),\n            SizedBox(\n              height: 60,\n              child: Center(\n                child: button,\n              ),\n            ),\n            SizedBox(\n              height: MediaQuery.of(context).padding.bottom,\n            )\n          ],\n        ));\n  }\n}\n"
  },
  {
    "path": "lib/pages/download_page.dart",
    "content": "import 'package:dio/dio.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/network/app_dio.dart';\nimport 'package:pica_comic/network/base_comic.dart';\nimport 'package:pica_comic/network/custom_download_model.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_download_model.dart';\nimport 'package:pica_comic/network/download_model.dart';\nimport 'package:pica_comic/network/htmanga_network/ht_download_model.dart';\nimport 'package:pica_comic/network/nhentai_network/download.dart';\nimport 'package:pica_comic/network/nhentai_network/nhentai_main_network.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/picacg/comic_page.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/io_tools.dart';\nimport 'package:pica_comic/foundation/ui_mode.dart';\nimport 'package:pica_comic/tools/pdf.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\nimport 'package:pica_comic/pages/downloading_page.dart';\nimport 'package:pica_comic/pages/ehentai/eh_gallery_page.dart';\nimport 'package:pica_comic/pages/hitomi/hitomi_comic_page.dart';\nimport 'package:pica_comic/pages/jm/jm_comic_page.dart';\nimport 'package:pica_comic/pages/nhentai/comic_page.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/network/eh_network/eh_download_model.dart';\nimport 'package:pica_comic/network/jm_network/jm_download.dart';\nimport 'package:pica_comic/network/picacg_network/picacg_download_model.dart';\nimport 'dart:io';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/components/components.dart';\n\nimport 'htmanga/ht_comic_page.dart';\n\nextension ReadComic on DownloadedItem {\n  void read({int? ep}) async {\n    final comic = this;\n    if (comic.type == DownloadType.picacg) {\n      var history =\n          await History.findOrCreate((comic as DownloadedComic).comicItem);\n      App.globalTo(\n        () => ComicReadingPage.picacg(\n          comic.id,\n          ep ?? history.ep,\n          comic.eps,\n          comic.name,\n          initialPage: ep == null ? history.page : 0,\n        ),\n      );\n    } else if (comic.type == DownloadType.ehentai) {\n      var history =\n          await History.findOrCreate((comic as DownloadedGallery).gallery);\n      App.globalTo(\n        () => ComicReadingPage.ehentai(\n          (comic).gallery,\n          initialPage: ep == null ? history.page : 0,\n        ),\n      );\n    } else if (comic.type == DownloadType.jm) {\n      var history =\n          await History.findOrCreate((comic as DownloadedJmComic).comic);\n      App.globalTo(\n        () => ComicReadingPage.jmComic(\n          comic.comic,\n          ep ?? history.ep,\n          initialPage: ep == null ? history.page : 0,\n        ),\n      );\n    } else if (comic.type == DownloadType.hitomi) {\n      var history =\n          await History.findOrCreate((comic as DownloadedHitomiComic).comic);\n      App.globalTo(\n        () => ComicReadingPage.hitomi(\n          comic.comic,\n          comic.link,\n          initialPage: ep == null ? history.page : 0,\n        ),\n      );\n    } else if (comic.type == DownloadType.htmanga) {\n      var history =\n          await History.findOrCreate((comic as DownloadedHtComic).comic);\n      App.globalTo(\n        () => ComicReadingPage.htmanga(\n          comic.comic.id,\n          comic.comic.title,\n          initialPage: ep == null ? history.page : 0,\n        ),\n      );\n    } else if (comic.type == DownloadType.nhentai) {\n      var nc = NhentaiComic(\n          comic.id.replaceFirst(\"nhentai\", \"\"),\n          comic.name,\n          comic.subTitle,\n          (comic as NhentaiDownloadedComic).cover,\n          {},\n          false,\n          [],\n          [],\n          \"\");\n      var history = await History.findOrCreate(nc);\n      App.globalTo(\n        () => ComicReadingPage.nhentai(\n          comic.id.replaceFirst(\"nhentai\", \"\"),\n          comic.title,\n          initialPage: ep == null ? history.page : 0,\n        ),\n      );\n    } else if (comic.type == DownloadType.other) {\n      comic as CustomDownloadedItem;\n      var data = ComicInfoData(\n        name,\n        subTitle,\n        comic.cover,\n        null,\n        {},\n        null,\n        null,\n        null,\n        0,\n        null,\n        comic.sourceKey,\n        comic.id.replaceFirst(\"${comic.sourceKey}-\", \"\"),\n      );\n      var history = await History.findOrCreate(data);\n      App.globalTo(\n        () => ComicReadingPage(\n          CustomReadingData(\n            data.target,\n            data.title,\n            ComicSource.find(comic.sourceKey),\n            comic.chapters,\n          ),\n          ep == null ? history.page : 0,\n          ep ?? history.ep,\n        ),\n      );\n    }\n  }\n}\n\nclass DownloadPageLogic extends StateController {\n  ///是否正在加载\n  bool loading = true;\n\n  ///是否处于选择状态\n  bool selecting = false;\n\n  ///已选择的数量\n  int selectedNum = 0;\n\n  ///已选择的漫画\n  var selected = <bool>[];\n\n  ///已下载的漫画\n  var comics = <DownloadedItem>[];\n\n  var baseComics = <DownloadedItem>[];\n\n  bool searchMode = false;\n\n  String keyword = \"\";\n  String keyword_ = \"\";\n\n  void change() {\n    loading = !loading;\n    try {\n      update();\n    } catch (e) {\n      //忽视\n    }\n  }\n\n  void find() {\n    if (keyword == keyword_) {\n      return;\n    }\n    keyword_ = keyword;\n    comics.clear();\n    if (keyword == \"\") {\n      comics.addAll(baseComics);\n    } else {\n      for (var element in baseComics) {\n        if (element.name.toLowerCase().contains(keyword) ||\n            element.subTitle.toLowerCase().contains(keyword)) {\n          comics.add(element);\n        }\n      }\n    }\n    resetSelected(comics.length);\n  }\n\n  @override\n  void refresh() {\n    searchMode = false;\n    selecting = false;\n    selectedNum = 0;\n    selected.clear();\n    comics.clear();\n    change();\n  }\n\n  void resetSelected(int length) {\n    selected = List.generate(length, (index) => false);\n    selectedNum = 0;\n  }\n}\n\nclass DownloadPage extends StatelessWidget {\n  const DownloadPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return StateBuilder<DownloadPageLogic>(\n        init: DownloadPageLogic(),\n        builder: (logic) {\n          if (logic.loading) {\n            Future.wait([\n              getComics(logic),\n              Future.delayed(const Duration(milliseconds: 300))\n            ]).then((v) {\n              logic.resetSelected(logic.comics.length);\n              logic.change();\n            });\n            return const Scaffold(\n              body: Center(\n                child: CircularProgressIndicator(),\n              ),\n            );\n          } else {\n            return Scaffold(\n              floatingActionButton: buildFAB(context, logic),\n              body: SmoothCustomScrollView(\n                slivers: [\n                  buildAppbar(context, logic),\n                  buildComics(context, logic)\n                ],\n              ),\n            );\n          }\n        });\n  }\n\n  Widget buildComics(BuildContext context, DownloadPageLogic logic) {\n    logic.find();\n    final comics = logic.comics;\n    return SliverGrid(\n      delegate: SliverChildBuilderDelegate(childCount: comics.length,\n          (context, index) {\n        return buildItem(context, logic, index);\n      }),\n      gridDelegate: SliverGridDelegateWithComics(),\n    );\n  }\n\n  Future<void> getComics(DownloadPageLogic logic) async {\n    var order = '', direction = 'desc';\n    switch (appdata.settings[26][0]) {\n      case \"0\":\n        order = 'time';\n      case \"1\":\n        order = 'title';\n      case \"2\":\n        order = 'subtitle';\n      case \"3\":\n        order = 'size';\n      default:\n        throw UnimplementedError();\n    }\n    if (appdata.settings[26][1] == \"1\") {\n      direction = 'asc';\n    }\n    logic.comics = DownloadManager().getAll(order, direction);\n    logic.baseComics = logic.comics.toList();\n  }\n\n  Future<void> export(DownloadPageLogic logic) async {\n    var comics = <DownloadedItem>[];\n    for (int i = 0; i < logic.selected.length; i++) {\n      if (logic.selected[i]) {\n        comics.add(logic.comics[i]);\n      }\n    }\n    if (comics.isEmpty) {\n      return;\n    }\n    bool res;\n    if (comics.length > 1) {\n      res = await exportComics(comics);\n    } else {\n      res = await exportComic(\n          comics.first.id, comics.first.name, comics.first.eps);\n    }\n    App.globalBack();\n    if (!res) {\n      showToast(message: \"导出失败\".tl);\n    }\n  }\n\n  void downloadFont() async {\n    bool canceled = false;\n    var cancelToken = CancelToken();\n    var controller = showLoadingDialog(\n      App.globalContext!,\n      onCancel: () {\n        canceled = true;\n        cancelToken.cancel();\n      },\n      barrierDismissible: false,\n      allowCancel: true,\n      message: \"Downloading\",\n    );\n    var dio = logDio();\n    try {\n      await dio.download(\n        \"https://raw.githubusercontent.com/wgh136/PicaComic/dev/fonts/NotoSansSC-Regular.ttf\",\n        \"${App.dataPath}/font.ttf\",\n        cancelToken: cancelToken,\n      );\n    } catch (e) {\n      showToast(message: \"下载失败\".tl);\n      controller.close();\n      return;\n    }\n    if (!canceled) {\n      controller.close();\n      showToast(message: \"下载完成\".tl);\n    }\n  }\n\n  void exportAsPdf(DownloadedItem? comic, DownloadPageLogic logic) async {\n    if (comic == null) {\n      for (int i = 0; i < logic.selected.length; i++) {\n        if (logic.selected[i]) {\n          comic = logic.comics[i];\n        }\n      }\n    }\n    if (comic == null) {\n      showToast(message: \"请选择一个漫画\".tl);\n      return;\n    }\n    var file = File(\"${App.dataPath}/font.ttf\");\n    if (!App.isWindows && !await file.exists()) {\n      showConfirmDialog(App.globalContext!, \"缺少字体\".tl,\n          \"需要下载字体文件(10.1MB), 是否继续?\", downloadFont);\n    } else {\n      bool canceled = false;\n      var controller = showLoadingDialog(\n        App.globalContext!,\n        onCancel: () => canceled = true,\n        allowCancel: false,\n      );\n      var fileName = \"${comic.name}.pdf\";\n      fileName = fileName.replaceAll(RegExp(r'[\\\\/:*?\"<>|]'), '');\n      await createPdfFromComicWithIsolate(\n          title: comic.name,\n          comicPath: \"${downloadManager.path}/${downloadManager.getDirectory(comic.id)}\",\n          savePath: \"${App.cachePath}/$fileName\",\n          chapters: comic.eps,\n          chapterIndexes: comic.downloadedEps);\n      if (!canceled) {\n        controller.close();\n        await exportPdf(\"${App.cachePath}/$fileName\");\n        File(\"${App.cachePath}/$fileName\").deleteSync();\n      }\n    }\n  }\n\n  Widget buildItem(BuildContext context, DownloadPageLogic logic, int index) {\n    bool selected = logic.selected[index];\n    var type = logic.comics[index].type.name;\n    if (logic.comics[index].type == DownloadType.other) {\n      type = (logic.comics[index] as CustomDownloadedItem).sourceName;\n    }\n    return Padding(\n      padding: const EdgeInsets.all(2),\n      child: Container(\n        decoration: BoxDecoration(\n            color: selected\n                ? Theme.of(context).colorScheme.surfaceContainerHighest\n                : Colors.transparent,\n            borderRadius: const BorderRadius.all(Radius.circular(16))),\n        child: DownloadedComicTile(\n          name: logic.comics[index].name,\n          author: logic.comics[index].subTitle,\n          imagePath: downloadManager.getCover(logic.comics[index].id),\n          type: type,\n          tag: logic.comics[index].tags,\n          onTap: () async {\n            if (logic.selecting) {\n              logic.selected[index] = !logic.selected[index];\n              logic.selected[index] ? logic.selectedNum++ : logic.selectedNum--;\n              if (logic.selectedNum == 0) {\n                logic.selecting = false;\n              }\n              logic.update();\n            } else {\n              showInfo(index, logic, context);\n            }\n          },\n          size: () {\n            if (logic.comics[index].comicSize != null) {\n              return logic.comics[index].comicSize!.toStringAsFixed(2);\n            } else {\n              return \"未知大小\".tl;\n            }\n          }.call(),\n          onLongTap: () {\n            if (logic.selecting) return;\n            logic.selected[index] = true;\n            logic.selectedNum++;\n            logic.selecting = true;\n            logic.update();\n          },\n          onSecondaryTap: (details) {\n            showDesktopMenu(App.globalContext!,\n                Offset(details.globalPosition.dx, details.globalPosition.dy), [\n              DesktopMenuEntry(\n                text: \"阅读\".tl,\n                onClick: () {\n                  logic.comics[index].read();\n                },\n              ),\n              DesktopMenuEntry(\n                text: \"删除\".tl,\n                onClick: () {\n                  showConfirmDialog(context, \"确认删除\".tl, \"此操作无法撤销, 是否继续?\".tl,\n                      () {\n                    downloadManager.delete([logic.comics[index].id]);\n                    logic.comics.removeAt(index);\n                    logic.selected.removeAt(index);\n                    logic.update();\n                  });\n                },\n              ),\n              DesktopMenuEntry(\n                text: \"导出\".tl,\n                onClick: () =>\n                    Future.delayed(const Duration(milliseconds: 200), () {\n                  Future<void>.delayed(\n                    const Duration(milliseconds: 200),\n                    () => showDialog(\n                      context: App.globalContext!,\n                      barrierDismissible: false,\n                      barrierColor: Colors.black26,\n                      builder: (context) => SimpleDialog(\n                        children: [\n                          SizedBox(\n                            width: 200,\n                            height: 200,\n                            child: Center(\n                              child: SizedBox(\n                                width: 50,\n                                height: 80,\n                                child: Column(\n                                  children: [\n                                    const SizedBox(\n                                      height: 10,\n                                    ),\n                                    const CircularProgressIndicator(),\n                                    const SizedBox(\n                                      height: 9,\n                                    ),\n                                    Text(\"打包中\".tl)\n                                  ],\n                                ),\n                              ),\n                            ),\n                          )\n                        ],\n                      ),\n                    ),\n                  );\n                  Future<void>.delayed(const Duration(milliseconds: 500),\n                      () async {\n                    var res = await exportComic(logic.comics[index].id,\n                        logic.comics[index].name, logic.comics[index].eps);\n                    App.globalBack();\n                    if (res) {\n                      //忽视\n                    } else {\n                      showToast(message: \"导出失败\".tl);\n                    }\n                  });\n                }),\n              ),\n              DesktopMenuEntry(\n                text: \"导出为pdf\".tl,\n                onClick: () {\n                  exportAsPdf(logic.comics[index], logic);\n                },\n              ),\n              DesktopMenuEntry(\n                text: \"查看漫画详情\".tl,\n                onClick: () {\n                  Future.delayed(const Duration(milliseconds: 300), () {\n                    toComicInfoPage(logic.comics[index]);\n                  });\n                },\n              ),\n              DesktopMenuEntry(\n                text: \"复制路径\".tl,\n                onClick: () {\n                  Future.delayed(const Duration(milliseconds: 300), () {\n                    var path =\n                        \"${downloadManager.path}/${downloadManager.getDirectory(logic.comics[index].id)}\";\n                    Clipboard.setData(ClipboardData(text: path));\n                  });\n                },\n              ),\n            ]);\n          },\n        ),\n      ),\n    );\n  }\n\n  void toComicInfoPage(DownloadedItem comic) => _toComicInfoPage(comic);\n\n  void showInfo(int index, DownloadPageLogic logic, BuildContext context) {\n    if (UiMode.m1(context)) {\n      showModalBottomSheet(\n          context: context,\n          builder: (context) {\n            return DownloadedComicInfoView(logic.comics[index], logic);\n          });\n    } else {\n      showSideBar(App.globalContext!,\n          DownloadedComicInfoView(logic.comics[index], logic),\n          useSurfaceTintColor: true);\n    }\n  }\n\n  Widget buildFAB(BuildContext context, DownloadPageLogic logic) =>\n      FloatingActionButton(\n        enableFeedback: true,\n        onPressed: () {\n          if (!logic.selecting) {\n            logic.selecting = true;\n            logic.update();\n          } else {\n            if (logic.selectedNum == 0) return;\n            showDialog(\n                context: context,\n                builder: (dialogContext) {\n                  return AlertDialog(\n                    title: Text(\"删除\".tl),\n                    content: Text(\"要删除已选择的项目吗? 此操作无法撤销\".tl),\n                    actions: [\n                      TextButton(\n                          onPressed: () => App.globalBack(),\n                          child: Text(\"取消\".tl)),\n                      TextButton(\n                          onPressed: () async {\n                            App.globalBack();\n                            var comics = <String>[];\n                            for (int i = 0; i < logic.selected.length; i++) {\n                              if (logic.selected[i]) {\n                                comics.add(logic.comics[i].id);\n                              }\n                            }\n                            await downloadManager.delete(comics);\n                            logic.refresh();\n                          },\n                          child: Text(\"确认\".tl)),\n                    ],\n                  );\n                });\n          }\n        },\n        child: logic.selecting\n            ? const Icon(Icons.delete_forever_outlined)\n            : const Icon(Icons.checklist_outlined),\n      );\n\n  Widget buildTitle(BuildContext context, DownloadPageLogic logic) {\n    if (logic.searchMode && !logic.selecting) {\n      return TextField(\n        decoration:\n        InputDecoration(border: InputBorder.none, hintText: \"搜索\".tl),\n        onChanged: (s) {\n          logic.keyword = s.toLowerCase();\n          logic.update();\n        },\n      );\n    } else {\n      return logic.selecting\n          ? Text(\"已选择 @num 个项目\".tlParams({\"num\": logic.selectedNum.toString()}))\n          : Text(\"已下载\".tl);\n    }\n  }\n\n  Widget buildAppbar(BuildContext context, DownloadPageLogic logic) {\n    return SliverAppbar(\n      radius: UiMode.m1(context) ? 0 : 16,\n      color: logic.selecting\n        ? Theme.of(context).colorScheme.primaryContainer\n        : null,\n      leading: logic.selecting\n          ? IconButton(\n          onPressed: () {\n            logic.selecting = false;\n            logic.selectedNum = 0;\n            for (int i = 0; i < logic.selected.length; i++) {\n              logic.selected[i] = false;\n            }\n            logic.update();\n          },\n          icon: const Icon(Icons.close))\n          : IconButton(\n          onPressed: () => Navigator.pop(context),\n          icon: const Icon(Icons.arrow_back)),\n      title: buildTitle(context, logic),\n      actions: buildActions(context, logic),\n    );\n  }\n\n  List<Widget> buildActions(BuildContext context, DownloadPageLogic logic) {\n    return [\n      if (!logic.selecting && !logic.searchMode)\n        Tooltip(\n          message: \"排序\".tl,\n          child: IconButton(\n            icon: const Icon(Icons.sort),\n            onPressed: () async {\n              bool changed = false;\n              await showDialog(\n                  context: context,\n                  builder: (context) => SimpleDialog(\n                    title: Text(\"漫画排序模式\".tl),\n                    children: [\n                      SizedBox(\n                        width: 400,\n                        child: Column(\n                          children: [\n                            ListTile(\n                              title: Text(\"漫画排序模式\".tl),\n                              trailing: Select(\n                                initialValue:\n                                int.parse(appdata.settings[26][0]),\n                                onChange: (i) {\n                                  appdata.settings[26] = appdata\n                                      .settings[26]\n                                      .setValueAt(i.toString(), 0);\n                                  appdata.updateSettings();\n                                  changed = true;\n                                },\n                                values: [\"时间\", \"漫画名\", \"作者名\", \"大小\"].tl,\n                              ),\n                            ),\n                            ListTile(\n                              title: Text(\"倒序\".tl),\n                              trailing: StatefulSwitch(\n                                initialValue:\n                                appdata.settings[26][1] == \"1\",\n                                onChanged: (b) {\n                                  if (b) {\n                                    appdata.settings[26] = appdata\n                                        .settings[26]\n                                        .setValueAt(\"1\", 1);\n                                  } else {\n                                    appdata.settings[26] = appdata\n                                        .settings[26]\n                                        .setValueAt(\"0\", 1);\n                                  }\n                                  appdata.updateSettings();\n                                  changed = true;\n                                },\n                              ),\n                            ),\n                          ],\n                        ),\n                      )\n                    ],\n                  ));\n              if (changed) {\n                logic.refresh();\n              }\n            },\n          ),\n        ),\n      if (!logic.selecting && !logic.searchMode)\n        Tooltip(\n          message: \"下载管理器\".tl,\n          child: IconButton(\n            icon: const Icon(Icons.download_for_offline),\n            onPressed: () {\n              showPopUpWidget(\n                App.globalContext!,\n                const DownloadingPage(),\n              );\n            },\n          ),\n        )\n      else if (logic.selecting)\n        Tooltip(\n          message: \"更多\".tl,\n          child: IconButton(\n            icon: const Icon(Icons.more_horiz),\n            onPressed: () {\n              showMenu(\n                  context: context,\n                  position: RelativeRect.fromLTRB(\n                      MediaQuery.of(context).size.width - 60,\n                      50,\n                      MediaQuery.of(context).size.width - 60,\n                      50),\n                  items: [\n                    PopupMenuItem(\n                      child: Text(\"全选\".tl),\n                      onTap: () {\n                        for (int i = 0; i < logic.selected.length; i++) {\n                          logic.selected[i] = true;\n                        }\n                        logic.selectedNum = logic.comics.length;\n                        logic.update();\n                      },\n                    ),\n                    PopupMenuItem(\n                      child: Text(\"导出\".tl),\n                      onTap: () => exportSelectedComic(context, logic),\n                    ),\n                    PopupMenuItem(\n                      child: Text(\"导出为pdf\".tl),\n                      onTap: () => exportAsPdf(null, logic),\n                    ),\n                    PopupMenuItem(\n                      child: Text(\"查看漫画详情\".tl),\n                      onTap: () => Future.delayed(\n                          const Duration(milliseconds: 200), () {\n                        if (logic.selectedNum != 1) {\n                          showToast(message: \"请选择一个漫画\".tl);\n                        } else {\n                          for (int i = 0; i < logic.selected.length; i++) {\n                            if (logic.selected[i]) {\n                              toComicInfoPage(logic.comics[i]);\n                            }\n                          }\n                        }\n                      }),\n                    ),\n                    PopupMenuItem(\n                      child: Text(\"添加至本地收藏\".tl),\n                      onTap: () => Future.delayed(\n                        const Duration(milliseconds: 200),\n                            () => addToLocalFavoriteFolder(\n                            App.globalContext!, logic),\n                      ),\n                    ),\n                  ]);\n            },\n          ),\n        ),\n      if (!logic.selecting)\n        Tooltip(\n          message: \"搜索\".tl,\n          child: IconButton(\n            icon: const Icon(Icons.search),\n            onPressed: () {\n              logic.searchMode = !logic.searchMode;\n              if (!logic.searchMode) {\n                logic.keyword = \"\";\n              }\n              logic.update();\n            },\n          ),\n        )\n    ];\n  }\n\n  void exportSelectedComic(BuildContext context, DownloadPageLogic logic) {\n    if (logic.selectedNum == 0) {\n      showToast(message: \"请选择漫画\".tl);\n    } else {\n      Future<void>.delayed(\n        const Duration(milliseconds: 200),\n        () => showDialog(\n          context: App.globalContext!,\n          barrierColor: Colors.black26,\n          barrierDismissible: false,\n          builder: (context) => const SimpleDialog(\n            children: [\n              SizedBox(\n                width: 200,\n                height: 200,\n                child: Center(\n                  child: SizedBox(\n                    width: 50,\n                    height: 75,\n                    child: Column(\n                      children: [\n                        SizedBox(\n                          height: 10,\n                        ),\n                        CircularProgressIndicator(),\n                        SizedBox(\n                          height: 9,\n                        ),\n                        Text(\"打包中\")\n                      ],\n                    ),\n                  ),\n                ),\n              )\n            ],\n          ),\n        ),\n      );\n      Future<void>.delayed(\n          const Duration(milliseconds: 500), () => export(logic));\n    }\n  }\n\n  void addToLocalFavoriteFolder(BuildContext context, DownloadPageLogic logic) {\n    String? folder;\n    showDialog(\n        context: App.globalContext!,\n        builder: (context) => SimpleDialog(\n              title: const Text(\"复制到...\"),\n              children: [\n                SizedBox(\n                  width: 400,\n                  height: 132,\n                  child: Column(\n                    children: [\n                      ListTile(\n                        title: Text(\"收藏夹\".tl),\n                        trailing: Select(\n                          width: 156,\n                          values: LocalFavoritesManager().folderNames,\n                          initialValue: null,\n                          onChange: (i) =>\n                              folder = LocalFavoritesManager().folderNames[i],\n                        ),\n                      ),\n                      const Spacer(),\n                      Center(\n                        child: FilledButton(\n                          child: const Text(\"确认\"),\n                          onPressed: () {\n                            if (folder == null) {\n                              return;\n                            }\n                            for (int i = 0; i < logic.selected.length; i++) {\n                              if (logic.selected[i]) {\n                                var comic = logic.comics[i];\n                                LocalFavoritesManager().addComic(\n                                    folder!,\n                                    switch (comic.type) {\n                                      DownloadType.picacg =>\n                                        FavoriteItem.fromPicacg(\n                                            (comic as DownloadedComic)\n                                                .comicItem\n                                                .toBrief()),\n                                      DownloadType.ehentai =>\n                                        FavoriteItem.fromEhentai(\n                                            (comic as DownloadedGallery)\n                                                .gallery\n                                                .toBrief()),\n                                      DownloadType.jm =>\n                                        FavoriteItem.fromJmComic(\n                                            (comic as DownloadedJmComic)\n                                                .comic\n                                                .toBrief()),\n                                      DownloadType.nhentai => FavoriteItem\n                                          .fromNhentai(NhentaiComicBrief(\n                                              comic.name,\n                                              (comic as NhentaiDownloadedComic)\n                                                  .cover,\n                                              comic.id,\n                                              \"\",\n                                              const [])),\n                                      DownloadType.hitomi =>\n                                        FavoriteItem.fromHitomi((comic\n                                                as DownloadedHitomiComic)\n                                            .comic\n                                            .toBrief(comic.link, comic.cover)),\n                                      DownloadType.htmanga =>\n                                        FavoriteItem.fromHtcomic(\n                                            (comic as DownloadedHtComic)\n                                                .comic\n                                                .toBrief()),\n                                      DownloadType.other => () {\n                                          var c =\n                                              (comic as CustomDownloadedItem);\n                                          return FavoriteItem.custom(\n                                              CustomComic(\n                                                  c.name,\n                                                  c.subTitle,\n                                                  c.cover,\n                                                  c.comicId,\n                                                  c.tags,\n                                                  \"\",\n                                                  c.sourceKey));\n                                        }(),\n                                      DownloadType.favorite =>\n                                        throw UnimplementedError(),\n                                    });\n                              }\n                            }\n                            App.globalBack();\n                          },\n                        ),\n                      ),\n                      const SizedBox(\n                        height: 16,\n                      ),\n                    ],\n                  ),\n                )\n              ],\n            ));\n  }\n}\n\nclass DownloadedComicInfoView extends StatefulWidget {\n  const DownloadedComicInfoView(this.item, this.logic, {Key? key})\n      : super(key: key);\n  final DownloadedItem item;\n  final DownloadPageLogic logic;\n\n  @override\n  State<DownloadedComicInfoView> createState() =>\n      _DownloadedComicInfoViewState();\n}\n\nclass _DownloadedComicInfoViewState extends State<DownloadedComicInfoView> {\n  String name = \"\";\n  List<String> eps = [];\n  List<int> downloadedEps = [];\n  late final comic = widget.item;\n\n  deleteEpisode(int i) {\n    showConfirmDialog(context, \"确认删除\".tl, \"要删除这个章节吗\".tl, () async {\n      var message = await DownloadManager().deleteEpisode(comic, i);\n      if (message == null) {\n        setState(() {});\n      } else {\n        showToast(message: message);\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    getInfo();\n    return Padding(\n      padding: const EdgeInsets.only(left: 16, right: 16),\n      child: Column(\n        mainAxisAlignment: MainAxisAlignment.start,\n        children: [\n          Padding(\n            padding: const EdgeInsets.fromLTRB(0, 16, 0, 16),\n            child: Text(\n              name,\n              style: const TextStyle(fontSize: 22),\n            ),\n          ),\n          Expanded(\n            child: GridView.builder(\n              gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(\n                maxCrossAxisExtent: 300,\n                childAspectRatio: 4,\n              ),\n              itemBuilder: (BuildContext context, int i) {\n                return Padding(\n                  padding: const EdgeInsets.all(4),\n                  child: InkWell(\n                    borderRadius: const BorderRadius.all(Radius.circular(16)),\n                    child: Container(\n                      decoration: BoxDecoration(\n                        borderRadius:\n                            const BorderRadius.all(Radius.circular(16)),\n                        color: downloadedEps.contains(i)\n                            ? Theme.of(context).colorScheme.primaryContainer\n                            : Theme.of(context)\n                                .colorScheme\n                                .surfaceContainerHighest,\n                      ),\n                      child: Row(\n                        children: [\n                          const SizedBox(\n                            width: 16,\n                          ),\n                          Expanded(\n                            child: Text(\n                              eps[i],\n                            ),\n                          ),\n                          const SizedBox(\n                            width: 4,\n                          ),\n                          if (downloadedEps.contains(i))\n                            const Icon(Icons.download_done),\n                          const SizedBox(\n                            width: 16,\n                          ),\n                        ],\n                      ),\n                    ),\n                    onTap: () => readSpecifiedEps(i),\n                    onLongPress: () {\n                      deleteEpisode(i);\n                    },\n                    onSecondaryTapDown: (details) {\n                      deleteEpisode(i);\n                    },\n                  ),\n                );\n              },\n              itemCount: eps.length,\n            ),\n          ),\n          SizedBox(\n              height: 50,\n              child: Row(\n                children: [\n                  Expanded(\n                    child: FilledButton(\n                        onPressed: () {\n                          App.globalBack();\n                          _toComicInfoPage(widget.item);\n                        },\n                        child: Text(\"查看详情\".tl)),\n                  ),\n                  const SizedBox(\n                    width: 16,\n                  ),\n                  Expanded(\n                    child: FilledButton(\n                        onPressed: () => read(), child: Text(\"阅读\".tl)),\n                  ),\n                ],\n              )),\n          SizedBox(\n            height: MediaQuery.of(context).padding.bottom,\n          )\n        ],\n      ),\n    );\n  }\n\n  void getInfo() {\n    name = comic.name;\n    eps = comic.eps;\n    downloadedEps = comic.downloadedEps;\n  }\n\n  void read() {\n    comic.read();\n  }\n\n  void readSpecifiedEps(int i) {\n    comic.read(ep: i + 1);\n  }\n}\n\nclass DownloadedComicTile extends ComicTile {\n  final String size;\n  final File imagePath;\n  final String author;\n  final String name;\n  final String type;\n  final List<String> tag;\n  final void Function() onTap;\n  final void Function() onLongTap;\n  final void Function(TapDownDetails details) onSecondaryTap;\n\n  @override\n  List<String>? get tags => tag.map((e) => e.translateTagsToCN).toList();\n\n  @override\n  String get description => \"${size}MB\";\n\n  @override\n  Widget get image => Image.file(\n        imagePath,\n        fit: BoxFit.cover,\n        height: double.infinity,\n      );\n\n  @override\n  void onTap_() => onTap();\n\n  @override\n  String get subTitle => author;\n\n  @override\n  String get title => name;\n\n  @override\n  void onLongTap_() => onLongTap();\n\n  @override\n  void onSecondaryTap_(details) => onSecondaryTap(details);\n\n  @override\n  String? get badge => type;\n\n  const DownloadedComicTile(\n      {required this.size,\n      required this.imagePath,\n      required this.author,\n      required this.name,\n      required this.onTap,\n      required this.onLongTap,\n      required this.onSecondaryTap,\n      required this.type,\n      required this.tag,\n      super.key});\n}\n\nvoid _toComicInfoPage(DownloadedItem comic) {\n  var context = App.mainNavigatorKey!.currentContext!;\n  if (comic is DownloadedComic) {\n    context.to(() => PicacgComicPage((comic).comicItem.id, null));\n  } else if (comic is DownloadedGallery) {\n    context.to(() => EhGalleryPage((comic).gallery.toBrief()));\n  } else if (comic is DownloadedJmComic) {\n    context.to(() => JmComicPage((comic).comic.id));\n  } else if (comic is DownloadedHitomiComic) {\n    context.to(() => HitomiComicPage(comic.toBrief()));\n  } else if (comic is DownloadedHtComic) {\n    context.to(() => HtComicPage(comic.id.replaceFirst('Ht', '')));\n  } else if (comic is NhentaiDownloadedComic) {\n    context.to(() => NhentaiComicPage(comic.id.replaceFirst(\"nhentai\", \"\")));\n  } else if (comic is CustomDownloadedItem) {\n    context.to(() => ComicPage(sourceKey: comic.sourceKey, id: comic.comicId));\n  }\n}\n"
  },
  {
    "path": "lib/pages/downloading_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/network/eh_network/eh_download_model.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/network/download_model.dart';\nimport 'package:pica_comic/components/components.dart';\n\nclass DownloadingPage extends StatefulWidget {\n  const DownloadingPage({Key? key}) : super(key: key);\n\n  @override\n  State<DownloadingPage> createState() => _DownloadingPageState();\n}\n\nclass _DownloadingPageState extends State<DownloadingPage> {\n  var comics = <DownloadingItem>[];\n\n  @override\n  void dispose() {\n    downloadManager.removeListener(onChange);\n    super.dispose();\n  }\n\n  @override\n  void initState() {\n    downloadManager.addListener(onChange);\n    comics = List.from(downloadManager.downloading);\n    super.initState();\n  }\n\n  void onChange() {\n    if(downloadManager.error) {\n      setState(() {});\n    } else if (downloadManager.downloading.length != comics.length) {\n      rebuild();\n    } else if (key.currentState != null){\n      key.currentState!.updateUi();\n    }\n  }\n\n  void rebuild() {\n    key = GlobalKey<_DownloadingTileState>();\n    setState(() {\n      comics = List.from(downloadManager.downloading);\n    });\n  }\n\n  var key = GlobalKey<_DownloadingTileState>();\n\n  @override\n  Widget build(BuildContext context) {\n    var widgets = <Widget>[];\n    for (var i in comics) {\n      var key = Key(i.id);\n      if(i == comics.first) {\n        key = this.key;\n      }\n\n      widgets.add(_DownloadingTile(\n        comic: i,\n        cancel: () {\n          showConfirmDialog(context, \"删除\".tl, \"确认删除下载任务?\".tl, () {\n            setState(() {\n              downloadManager.cancel(i.id);\n            });\n          });\n        },\n        onComicPositionChange: rebuild,\n        key: key,\n      ));\n    }\n\n    final body = ListView.builder(\n        itemCount: downloadManager.downloading.length + 1,\n        padding: EdgeInsets.zero,\n        itemBuilder: (context, index) {\n          if (index == 0) {\n            String downloadStatus;\n            if (downloadManager.isDownloading) {\n              downloadStatus = \" 下载中\".tl;\n            } else if (downloadManager.downloading.isNotEmpty) {\n              downloadStatus = \" 已暂停\".tl;\n            } else {\n              downloadStatus = \"\";\n            }\n\n            String downloadTaskText = \"@length 项下载任务\".tlParams(\n                {\"length\": downloadManager.downloading.length.toString()});\n\n            String displayText = downloadManager.error\n                ? \"下载出错\".tl\n                : downloadTaskText + downloadStatus;\n            return Container(\n                decoration: BoxDecoration(\n                  border: Border(\n                    bottom: BorderSide(\n                      color: Theme.of(context).colorScheme.outlineVariant,\n                    ),\n                  ),\n                ),\n                height: 48,\n                child: Row(\n                  children: [\n                    const SizedBox(\n                      width: 16,\n                    ),\n                    downloadManager.isDownloading\n                        ? const Icon(\n                            Icons.downloading,\n                            color: Colors.blue,\n                          )\n                        : const Icon(\n                            Icons.pause_circle_outline_outlined,\n                            color: Colors.red,\n                          ),\n                    const SizedBox(\n                      width: 12,\n                    ),\n                    Text(displayText),\n                    const Spacer(),\n                    if (downloadManager.downloading.isNotEmpty)\n                      TextButton(\n                        onPressed: () {\n                          downloadManager.isDownloading\n                              ? downloadManager.pause()\n                              : downloadManager.start();\n                          setState(() {});\n                        },\n                        child: downloadManager.isDownloading\n                            ? Text(\"暂停\".tl)\n                            : (downloadManager.error\n                                ? Text(\"重试\".tl)\n                                : Text(\"继续\".tl)),\n                      ),\n                    const SizedBox(\n                      width: 16,\n                    ),\n                  ],\n                ));\n          } else {\n            return widgets[index - 1];\n          }\n        });\n\n    return PopUpWidgetScaffold(\n      title: \"下载管理器\".tl,\n      body: body,\n    );\n  }\n}\n\nclass _DownloadingTile extends StatefulWidget {\n  const _DownloadingTile({\n    required this.comic,\n    required this.cancel,\n    required this.onComicPositionChange,\n    super.key,\n  });\n\n  final DownloadingItem comic;\n\n  final void Function() cancel;\n\n  final void Function() onComicPositionChange;\n\n  @override\n  State<_DownloadingTile> createState() => _DownloadingTileState();\n}\n\nclass _DownloadingTileState extends State<_DownloadingTile> {\n  late DownloadingItem comic;\n\n  double value = 0.0;\n  int downloadPages = 0;\n  int? pagesCount;\n  int? speed;\n\n  @override\n  initState() {\n    super.initState();\n    comic = widget.comic;\n    updateStatistic();\n  }\n\n  @override\n  void didUpdateWidget(covariant _DownloadingTile oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.comic != comic) {\n      setState(() {\n        comic = widget.comic;\n      });\n    }\n  }\n\n  void updateStatistic() {\n    if(comic != DownloadManager().downloading.first) {\n      return;\n    }\n    comic = DownloadManager().downloading.first;\n    speed = comic.currentSpeed;\n    downloadPages = comic.downloadedPages;\n    pagesCount = comic.totalPages;\n    if (pagesCount == 0) {\n      pagesCount = null;\n    }\n    if (pagesCount != null && pagesCount! > 0) {\n      value = downloadPages / pagesCount!;\n    }\n  }\n\n  void updateUi() {\n    setState(() {\n      updateStatistic();\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Padding(\n      padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12),\n      child: SizedBox(\n        height: 114,\n        width: double.infinity,\n        child: Row(\n          children: [\n            Container(\n              width: 84,\n              height: double.infinity,\n              decoration: BoxDecoration(\n                borderRadius: BorderRadius.circular(8),\n                color: context.colorScheme.secondaryContainer,\n              ),\n              clipBehavior: Clip.antiAlias,\n              child: AnimatedImage(\n                image: CachedImageProvider(comic.cover,\n                    headers: {\"User-Agent\": webUA}),\n                width: 84,\n                height: double.infinity,\n                fit: BoxFit.cover,\n              ),\n            ),\n            const SizedBox(width: 8),\n            Expanded(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Text(\n                    comic.title,\n                    style: const TextStyle(\n                        fontSize: 14, fontWeight: FontWeight.w500),\n                    maxLines: 3,\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                  const Spacer(),\n                  Text(\n                    getProgressText(),\n                    style: const TextStyle(fontSize: 12),\n                  ),\n                  const SizedBox(height: 4),\n                  LinearProgressIndicator(value: value),\n                  const SizedBox(height: 4),\n                ],\n              ),\n            ),\n            const SizedBox(width: 4),\n            SizedBox(\n              width: 50,\n              child: Column(\n                children: [\n                  const Spacer(),\n                  IconButton(\n                    icon: const Icon(Icons.close),\n                    onPressed: widget.cancel,\n                  ),\n                  const Spacer(),\n                  IconButton(\n                    icon: const Icon(Icons.vertical_align_top),\n                    onPressed: () {\n                      DownloadManager().moveToFirst(comic);\n                      widget.onComicPositionChange();\n                    },\n                  ),\n                  const Spacer(),\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  String _bytesToSize(int bytes) {\n    if (bytes < 1024) {\n      return \"$bytes B\";\n    } else if (bytes < 1024 * 1024) {\n      return \"${(bytes / 1024).toStringAsFixed(2)} KB\";\n    } else if (bytes < 1024 * 1024 * 1024) {\n      return \"${(bytes / 1024 / 1024).toStringAsFixed(2)} MB\";\n    } else {\n      return \"${(bytes / 1024 / 1024 / 1024).toStringAsFixed(2)} GB\";\n    }\n  }\n\n  String getProgressText() {\n    if (pagesCount == null) {\n      if (comic == DownloadManager().downloading.first) {\n        return \"获取图片信息...\".tl;\n      } else {\n        return \"\";\n      }\n    }\n\n    String speedInfo = \"\";\n    if (speed != null) {\n      speedInfo = \"${_bytesToSize(speed!)}/s\";\n    }\n\n    String status = \"${\"已下载\".tl}$downloadPages/$pagesCount\";\n\n    if (comic is EhDownloadingItem\n        && (comic as EhDownloadingItem).downloadType != 0) {\n      status = \"${_bytesToSize(downloadPages).split(' ').first}\"\n          \"/${_bytesToSize(pagesCount!)}\";\n    }\n\n    return \"$status  $speedInfo\";\n  }\n}\n"
  },
  {
    "path": "lib/pages/ehentai/accounts.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/network/eh_network/eh_main_network.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nclass CookieManagementView extends StatefulWidget {\n  const CookieManagementView({super.key});\n\n  @override\n  State<CookieManagementView> createState() => _CookieManagementViewState();\n}\n\nclass _CookieManagementViewState extends State<CookieManagementView> {\n  @override\n  Widget build(BuildContext context) {\n    return ExpansionTile(\n      title: const Text(\"cookies\"),\n      shape: const RoundedRectangleBorder(),\n      children: [\n        ListTile(\n          title: const Text(\"ipb_member_id\"),\n          subtitle: Text(EhNetwork().id),\n          onTap: () => setClipboard(EhNetwork().id),\n        ),\n        ListTile(\n          title: const Text(\"ipb_pass_hash\"),\n          subtitle: Text(EhNetwork().hash),\n          onTap: () => setClipboard(EhNetwork().hash),\n        ),\n        ListTile(\n          title: const Text(\"igneous\"),\n          subtitle: Text(EhNetwork().igneous),\n          onTap: () => setClipboard(EhNetwork().igneous),\n          trailing: IconButton(\n            icon: const Icon(Icons.edit_outlined),\n            onPressed: () {\n              showDialog(\n                context: context,\n                builder: (context) {\n                  String text = EhNetwork().igneous;\n                  return AlertDialog(\n                    title: const Text(\"igneous\"),\n                    content: TextField(\n                      controller: TextEditingController(text: text),\n                      onChanged: (s) => text = s,\n                    ),\n                    actions: [\n                      TextButton(onPressed: context.pop, child: Text(\"取消\".tl)),\n                      TextButton(\n                        onPressed: () {\n                          EhNetwork().igneous = text;\n                          EhNetwork().cookieJar.saveFromResponse(\n                            Uri.parse(\"https://exhentai.org\"),\n                            [Cookie(\"igneous\", text)],\n                          );\n                          EhNetwork().cookieJar.saveFromResponse(\n                            Uri.parse(\"https://e-hentai.org\"),\n                            [Cookie(\"igneous\", text)],\n                          );\n                          context.pop();\n                          setState(() {});\n                        },\n                        child: Text(\"确定\".tl),\n                      ),\n                    ],\n                  );\n                },\n              );\n            },\n          ),\n        ),\n      ],\n    );\n  }\n\n  void setClipboard(String text) {\n    Clipboard.setData(ClipboardData(text: text));\n    showToast(message: \"已复制\".tl, icon: const Icon(Icons.check));\n  }\n}\n"
  },
  {
    "path": "lib/pages/ehentai/eh_comments_page.dart",
    "content": "import 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:html/dom.dart' as dom;\nimport 'package:html/parser.dart' as html_parser;\nimport 'package:pica_comic/comic_source/built_in/ehentai.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/network/eh_network/eh_main_network.dart';\nimport 'package:pica_comic/network/eh_network/eh_models.dart';\nimport 'package:pica_comic/tools/app_links.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/time.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\n\nclass CommentsPageLogic extends StateController {\n  bool isLoading = true;\n  var comments = <Comment>[];\n  bool sending = false;\n  String? message;\n  var controller = TextEditingController();\n\n  void change() {\n    isLoading = !isLoading;\n    update();\n  }\n\n  void get(String url) async {\n    var res = await EhNetwork().getComments(url);\n    if (res.error) {\n      message = res.errorMessageWithoutNull;\n    } else {\n      comments = res.data;\n    }\n    isLoading = false;\n    update();\n  }\n}\n\nclass _EhCommentWidget extends StatefulWidget {\n  const _EhCommentWidget({required this.comment, required this.uploader, required this.auth});\n\n  final Comment comment;\n\n  final String uploader;\n\n  final Map<String, String> auth;\n\n  @override\n  State<_EhCommentWidget> createState() => _EhCommentWidgetState();\n}\n\nclass _EhCommentWidgetState extends State<_EhCommentWidget> {\n  Comment get comment => widget.comment;\n\n  String get uploader => widget.uploader;\n\n  bool isVoteUp = false;\n\n  bool isVoteDown = false;\n\n  void voteUp() async {\n    if(isVoteUp || isVoteDown){\n      return;\n    }\n    setState(() {\n      isVoteUp = true;\n    });\n    var res = await EhNetwork().voteComment(widget.auth, comment.id, true);\n    if(res.success){\n      var isCancel = comment.voteUP == true;\n      comment.voteUP = isCancel ? null : true;\n      comment.score = res.data;\n      setState(() {\n        isVoteUp = false;\n      });\n    } else {\n      setState(() {\n        isVoteUp = false;\n      });\n      showToast(message: res.errorMessageWithoutNull);\n    }\n  }\n\n  void voteDown() async {\n    if(isVoteUp || isVoteDown){\n      return;\n    }\n    setState(() {\n      isVoteDown = true;\n    });\n    var res = await EhNetwork().voteComment(widget.auth, comment.id, false);\n    if(res.success){\n      var isCancel = comment.voteUP == false;\n      comment.voteUP = isCancel ? null : false;\n      comment.score = res.data;\n      setState(() {\n        isVoteDown = false;\n      });\n    } else {\n      setState(() {\n        isVoteDown = false;\n      });\n      showToast(message: res.errorMessageWithoutNull);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var upColor = context.colorScheme.outline;\n    bool darkMode = context.colorScheme.brightness == Brightness.dark;\n    if(comment.voteUP == true) {\n      upColor = darkMode ? Colors.red.shade200 : Colors.red.shade600;\n    }\n    var downColor = context.colorScheme.outline;\n    if(comment.voteUP == false) {\n      downColor = darkMode ? Colors.blue.shade200 : Colors.blue.shade600;\n    }\n\n    var isUploader = uploader == comment.name;\n\n    return Card(\n      margin: const EdgeInsets.fromLTRB(12, 4, 12, 4),\n      elevation: 0,\n      color: isUploader\n          ? Theme.of(context).colorScheme.primaryContainer\n          : Theme.of(context).colorScheme.surfaceContainer,\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(12, 8, 12, 8),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Row(\n              children: [\n                Text(\n                  \"${isUploader ? \"(上传者)\" : \"\"}${comment.name}\",\n                  style: const TextStyle(\n                      fontSize: 16, fontWeight: FontWeight.w500),\n                ),\n                const Spacer(),\n                Text(\n                  TimeExtension.parseEhTime(comment.time).toCompareString,\n                  style: const TextStyle(fontSize: 12),\n                )\n              ],\n            ),\n            const SizedBox(\n              height: 4,\n            ),\n            _EhComment(comment.content),\n            const SizedBox(\n              height: 4,\n            ),\n            if (comment.id != \"0\")\n              Align(\n                alignment: Alignment.centerRight,\n                child: Container(\n                  decoration: BoxDecoration(\n                    borderRadius: BorderRadius.circular(16),\n                    border: Border.all(\n                        color: Theme.of(context).colorScheme.outlineVariant),\n                  ),\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Button.icon(\n                        isLoading: isVoteUp,\n                        icon: const Icon(Icons.arrow_upward),\n                        size: 18,\n                        color: upColor,\n                        onPressed: voteUp,\n                      ),\n                      const SizedBox(\n                        width: 4,\n                      ),\n                      Text(comment.score.toString()),\n                      const SizedBox(\n                        width: 4,\n                      ),\n                      Button.icon(\n                        isLoading: isVoteDown,\n                        icon: const Icon(Icons.arrow_downward),\n                        size: 18,\n                        color: downColor,\n                        onPressed: voteDown,\n                      ),\n                    ],\n                  ),\n                ),\n              )\n          ],\n        ),\n      ),\n    );\n  }\n}\n\nclass CommentsPage extends StatelessWidget {\n  final String url;\n\n  final String uploader;\n\n  final Map<String, String> auth;\n\n  const CommentsPage(this.url, this.uploader, this.auth, {super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    Widget body = StateBuilder<CommentsPageLogic>(\n      init: CommentsPageLogic(),\n      builder: (logic) {\n        if (logic.isLoading) {\n          logic.get(url);\n          return const Center(\n            child: CircularProgressIndicator(),\n          );\n        } else if (logic.message != null) {\n          return NetworkError(\n            message: logic.message!,\n            retry: () => logic.change(),\n            withAppbar: false,\n          );\n        } else {\n          return Column(\n            children: [\n              Expanded(\n                  child: CustomScrollView(\n                slivers: [\n                  SliverList(\n                    delegate: SliverChildBuilderDelegate(\n                        childCount: logic.comments.length, (context, index) {\n                      var comment = logic.comments[index];\n                      return _EhCommentWidget(\n                        comment: comment,\n                        uploader: uploader,\n                        auth: auth,\n                      );\n                    }),\n                  ),\n                  SliverPadding(\n                    padding: EdgeInsets.only(\n                      top: MediaQuery.of(App.globalContext!).padding.bottom,\n                    ),\n                  )\n                ],\n              )),\n              buildBottom(context, logic),\n            ],\n          );\n        }\n      },\n    );\n\n    return body;\n  }\n\n  Widget buildBottom(BuildContext context, CommentsPageLogic logic) {\n    return Container(\n      decoration: BoxDecoration(\n          color: Theme.of(context).colorScheme.surface,\n          borderRadius: const BorderRadius.vertical(top: Radius.circular(16))),\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(10, 5, 10, 5),\n        child: Material(\n          child: Container(\n            decoration: BoxDecoration(\n                color: Theme.of(context)\n                    .colorScheme\n                    .surfaceContainerHighest\n                    .withAlpha(160),\n                borderRadius: const BorderRadius.all(Radius.circular(30))),\n            child: Row(\n              children: [\n                Expanded(\n                    child: Padding(\n                  padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),\n                  child: TextField(\n                    controller: logic.controller,\n                    decoration: InputDecoration(\n                        border: InputBorder.none,\n                        isCollapsed: true,\n                        hintText: \"评论\".tl),\n                    minLines: 1,\n                    maxLines: 5,\n                  ),\n                )),\n                logic.sending\n                    ? const Padding(\n                        padding: EdgeInsets.all(8.5),\n                        child: SizedBox(\n                          width: 23,\n                          height: 23,\n                          child: CircularProgressIndicator(),\n                        ),\n                      )\n                    : IconButton(\n                        onPressed: () async {\n                          var content = logic.controller.text;\n                          if (content.isEmpty) {\n                            showToast(message: \"请输入评论\".tl);\n                            return;\n                          }\n                          logic.sending = true;\n                          logic.update();\n                          var b = await EhNetwork()\n                              .comment(logic.controller.text, url);\n                          if (b.success) {\n                            logic.controller.text = \"\";\n                            logic.sending = false;\n                            logic.comments.add(Comment(\n                              '',\n                              ehentai.data['name'] ?? '',\n                              content,\n                              DateTime.now().toIso8601String(),\n                              0,\n                              null,\n                            ));\n                            logic.update();\n                          } else {\n                            showToast(message: b.errorMessage!);\n                            logic.sending = false;\n                            logic.update();\n                          }\n                        },\n                        icon: Icon(\n                          Icons.send,\n                          color: Theme.of(context).colorScheme.secondary,\n                        ))\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nvoid showComments(BuildContext context, String url, String uploader, Map<String, String> auth) {\n  showSideBar(\n    context,\n    CommentsPage(\n      url,\n      uploader,\n      auth,\n    ),\n    title: \"评论\".tl,\n  );\n}\n\nclass _EhComment extends StatelessWidget {\n  const _EhComment(this.html);\n\n  final String html;\n\n  @override\n  Widget build(BuildContext context) {\n    return SelectionArea(\n        child: Column(\n      children: _parse(html).toList(),\n    ));\n  }\n\n  void onLink(String link) {\n    if (canHandle(link)) {\n      App.globalBack();\n      handleAppLinks(Uri.parse(link));\n    } else {\n      launchUrlString(link);\n    }\n  }\n\n  Iterable<Widget> _parse(String html) sync* {\n    html = html.replaceAll(\"\\r\\n\", \"\\n\");\n    html = html.replaceAll(\"<br>\", \"\\n\");\n    var lines = html.split(\"\\n\");\n    for (var line in lines) {\n      yield SizedBox(\n        width: double.infinity,\n        child: _buildLine(line),\n      );\n    }\n  }\n\n  TextStyle _mergeStyleByTagName(TextStyle style, String tagName) {\n    var richTextStyle = RichTextStyle.defaultStyle;\n    switch (tagName) {\n      case 'strong':\n        style = style.merge(richTextStyle.strong!);\n      case 'em':\n        style = style.merge(richTextStyle.em!);\n      case 'h1':\n        style = style.merge(richTextStyle.h1!);\n      case 'h2':\n        style = style.merge(richTextStyle.h2!);\n      case 'h3':\n        style = style.merge(richTextStyle.h3!);\n      case 'h4':\n        style = style.merge(richTextStyle.h4!);\n      case 'h5':\n        style = style.merge(richTextStyle.h5!);\n      case 'h6':\n        style = style.merge(richTextStyle.h6!);\n      default:\n        style = style.merge(richTextStyle.paragraph!);\n    }\n    return style;\n  }\n\n  Widget _buildLine(String htmlText) {\n    htmlText = htmlText.replaceAll('\\n', '');\n    var html = html_parser.parseFragment(htmlText);\n\n    var widgets = <Widget>[];\n\n    List<TextSpan> spans = [];\n\n    void parse(dom.Node node, TextStyle style,\n        [TapGestureRecognizer? recognizer]) {\n      if (node is dom.Element) {\n        if (node.localName == 'a') {\n          recognizer = TapGestureRecognizer()\n            ..onTap = () {\n              onLink(node.attributes['href']!);\n            };\n        } else if (node.localName == 'img') {\n          widgets.add(Text.rich(TextSpan(children: spans)));\n          spans = [];\n          Widget widget = Image(\n            image: CachedImageProvider(node.attributes['src']!),\n          );\n          if (recognizer != null) {\n            widget = MouseRegion(\n              cursor: SystemMouseCursors.click,\n              child: GestureDetector(\n                onTap: recognizer.onTap,\n                child: widget,\n              ),\n            );\n          }\n          widgets.add(widget);\n        } else {\n          style = _mergeStyleByTagName(style, node.localName ?? '');\n        }\n        for (var child in node.nodes) {\n          parse(child, style, recognizer);\n        }\n      } else if (node is dom.Text) {\n        var text = node.text;\n        var splits = text.split(' ');\n        String buffer = '';\n        for (var part in splits) {\n          if (part.isURL) {\n            if (buffer.isNotEmpty) {\n              spans.add(TextSpan(text: buffer, style: style));\n              buffer = '';\n            }\n            spans.add(TextSpan(\n              text: part,\n              style: style.copyWith(\n                color: RichTextStyle.defaultStyle.link!.color,\n              ),\n              recognizer: TapGestureRecognizer()\n                ..onTap = () {\n                  onLink(part);\n                },\n            ));\n          } else {\n            buffer += '$part ';\n          }\n        }\n        if (buffer.isNotEmpty) {\n          spans.add(TextSpan(text: buffer, style: style));\n        }\n      }\n    }\n\n    for (var node in html.nodes) {\n      parse(node, const TextStyle());\n    }\n\n    if (spans.isNotEmpty) {\n      widgets.add(Text.rich(TextSpan(children: spans)));\n    }\n\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: widgets,\n    );\n  }\n}\n\nclass RichTextStyle {\n  final TextStyle? h1;\n  final TextStyle? h2;\n  final TextStyle? h3;\n  final TextStyle? h4;\n  final TextStyle? h5;\n  final TextStyle? h6;\n  final TextStyle? paragraph;\n  final TextStyle? link;\n  final TextStyle? strong;\n  final TextStyle? em;\n  final Color? contentColor;\n\n  const RichTextStyle._(\n      {required this.h1,\n      required this.h2,\n      required this.h3,\n      required this.h4,\n      required this.h5,\n      required this.h6,\n      required this.paragraph,\n      required this.link,\n      required this.strong,\n      required this.em})\n      : contentColor = null;\n\n  static const RichTextStyle defaultStyle = RichTextStyle._(\n    h1: TextStyle(fontSize: 28, fontWeight: FontWeight.bold),\n    h2: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),\n    h3: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),\n    h4: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),\n    h5: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),\n    h6: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),\n    paragraph: TextStyle(\n        fontSize: 16,\n        wordSpacing: 1,\n        letterSpacing: 0.2,\n        height: 1.2,\n        color: Color.fromARGB(255, 0, 0, 0)),\n    link: TextStyle(color: Color.fromARGB(255, 0, 140, 255)),\n    strong: TextStyle(fontWeight: FontWeight.bold),\n    em: TextStyle(fontStyle: FontStyle.italic),\n  );\n}\n"
  },
  {
    "path": "lib/pages/ehentai/eh_gallery_page.dart",
    "content": "import 'package:pica_comic/comic_source/built_in/ehentai.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'dart:ui' as ui;\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/network/eh_network/eh_main_network.dart';\nimport 'package:pica_comic/network/eh_network/eh_models.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/pages/search_result_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/pages/ehentai/eh_comments_page.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/network/eh_network/get_gallery_id.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/components/components.dart';\n\nclass EhGalleryPage extends BaseComicPage<Gallery> {\n  EhGalleryPage(EhGalleryBrief brief, {super.key})\n      : link = brief.link,\n        comicCover = brief.coverPath,\n        comicTitle = brief.title;\n\n  const EhGalleryPage.fromLink(this.link,\n      {super.key, this.comicCover, this.comicTitle});\n\n  final String link;\n\n  final String? comicCover;\n\n  final String? comicTitle;\n\n  @override\n  String get url => link;\n\n  @override\n  ActionFunc? get searchSimilar => () {\n        var title = data!.subTitle ?? data!.title;\n        title = title\n            .replaceAll(RegExp(r\"\\[.*?\\]\"), \"\")\n            .replaceAll(RegExp(r\"\\(.*?\\)\"), \"\");\n        context.to(\n          () => SearchResultPage(\n            keyword: \"\\\"$title\\\"\".trim(),\n            sourceKey: \"ehentai\",\n          ),\n        );\n      };\n\n  @override\n  String? get cover => (comicCover ?? data?.coverPath)\n      ?.replaceFirst(\"s.exhentai.org\", \"ehgt.org\");\n\n  @override\n  EpsData? get eps => null;\n\n  @override\n  String? get introduction => null;\n\n  @override\n  Future<Res<Gallery>> loadData() async {\n    var res =\n        await EhNetwork().getGalleryInfo(link, appdata.settings[47] == \"1\");\n    if (res.error && res.errorMessage == \"Content Warning\") {\n      bool shouldIgnore = false;\n      await showDialog(\n          context: App.globalContext!,\n          builder: (context) => AlertDialog(\n                title: Text(\"警告\".tl),\n                content: Text(\"此画廊存在令人不适的内容\\n在设置中可以禁用此警告\".tl),\n                actions: [\n                  TextButton(\n                      onPressed: () {\n                        App.globalBack();\n                      },\n                      child: Text(\"返回\".tl)),\n                  TextButton(\n                      onPressed: () {\n                        shouldIgnore = true;\n                        App.globalBack();\n                      },\n                      child: Text(\"忽略\".tl))\n                ],\n              ));\n      if (shouldIgnore) {\n        return await EhNetwork().getGalleryInfo(link, true);\n      } else if (context.mounted) {\n        context.pop();\n        return const Res(null, errorMessage: \"Exit\");\n      }\n    }\n    return res;\n  }\n\n  @override\n  int? get pages => int.tryParse(data?.maxPage ?? \"\");\n\n  @override\n  Future<bool> loadFavorite(Gallery data) async {\n    return data.favorite ||\n        (await LocalFavoritesManager().findWithModel(toLocalFavoriteItem())).isNotEmpty;\n  }\n\n  @override\n  SliverGrid? recommendationBuilder(Gallery data) => null;\n\n  @override\n  String get tag => \"Eh ComicPage $link\";\n\n  @override\n  Map<String, List<String>>? get tags => {\n        \"类型\".tl: data!.type.toList(),\n        \"时间\".tl: data!.time.toList(),\n        \"上传者\".tl: data!.uploader.toList(),\n        ...data!.tags\n      };\n\n  @override\n  bool get enableTranslationToCN => App.locale.languageCode == \"zh\";\n\n  @override\n  void onThumbnailTapped(int index) async {\n    await History.findOrCreate(data!);\n    App.globalTo(() => ComicReadingPage.ehentai(data!, initialPage: index + 1));\n  }\n\n  @override\n  void tapOnTag(String tag, String key) {\n    var namespace = \"\";\n    for (var entry in data!.tags.entries) {\n      if (entry.value.contains(tag)) {\n        namespace = entry.key;\n        break;\n      }\n    }\n    if (tag == data!.uploader) {\n      namespace = \"uploader\";\n    }\n    if (tag.contains(\" \")) {\n      tag = \"\\\"$tag\\\"\";\n    }\n    if (namespace != \"\") {\n      tag = \"$namespace:$tag\";\n    }\n    context.to(() => SearchResultPage(\n          keyword: tag,\n          sourceKey: \"ehentai\",\n        ));\n  }\n\n  @override\n  Map<String, String> get headers => {\n        \"Cookie\": EhNetwork().cookiesStr,\n        \"User-Agent\": webUA,\n        \"Referer\": EhNetwork().ehBaseUrl,\n      };\n\n  @override\n  ThumbnailsData? get thumbnailsCreator {\n    if (data?.auth?[\"thumbnailKey\"] != null &&\n        data!.auth![\"thumbnailKey\"]!.startsWith(\"large thumbnail\")) {\n      return ThumbnailsData(\n          data!.thumbnails,\n          (page) => EhNetwork().getLargeThumbnails(data!, page),\n          int.tryParse(data!.auth![\"thumbnailKey\"]!.nums) ?? 1);\n    } else {\n      return ThumbnailsData(\n        [],\n        (page) => EhNetwork().getThumbnailUrls(data!),\n        2,\n      );\n    }\n  }\n\n  @override\n  String? get title => comicTitle ?? data?.title;\n\n  @override\n  String? get subTitle => data?.subTitle;\n\n  @override\n  Card? get uploaderInfo => null;\n\n  @override\n  Widget thumbnailImageBuilder(int index, String imageUrl) {\n    imageUrl = imageUrl.replaceAll(\"s.exhentai.org\", \"ehgt.org\");\n    if (data?.auth?[\"thumbnailKey\"] != null &&\n        data!.auth![\"thumbnailKey\"]!.startsWith(\"large thumbnail\")) {\n      return super.thumbnailImageBuilder(index, imageUrl);\n    }\n    return ColoredBox(\n      color: context.colorScheme.surfaceContainerHighest,\n      child:\n          EhThumbnailLoader(image: CachedImageProvider(imageUrl), index: index),\n    );\n  }\n\n  void starRating(BuildContext context, Map<String, String> auth) {\n    if (!ehentai.isLogin) {\n      showToast(message: \"未登录\".tl);\n      return;\n    }\n    showDialog(\n        context: context,\n        builder: (dialogContext) => StateBuilder<RatingLogic>(\n            init: RatingLogic(),\n            builder: (logic) => SimpleDialog(\n                  title: const Text(\"评分\"),\n                  alignment: Alignment.center,\n                  children: [\n                    SizedBox(\n                      height: 100,\n                      child: Center(\n                        child: SizedBox(\n                          width: 210,\n                          child: Column(\n                            children: [\n                              const SizedBox(\n                                height: 10,\n                              ),\n                              RatingWidget(\n                                padding: 2,\n                                onRatingUpdate: (value) => logic.rating = value,\n                                value: 0,\n                                selectAble: true,\n                                size: 40,\n                              ),\n                              const Spacer(),\n                              Button.filled(\n                                isLoading: logic.running,\n                                onPressed: () {\n                                  logic.running = true;\n                                  logic.update();\n                                  EhNetwork()\n                                      .rateGallery(auth, logic.rating.toInt())\n                                      .then((b) {\n                                    if (!dialogContext.mounted) return;\n                                    if (b) {\n                                      dialogContext.pop();\n                                      showToast(message: \"评分成功\".tl);\n                                    } else {\n                                      logic.running = false;\n                                      logic.update();\n                                      showToast(message: \"网络错误\".tl);\n                                    }\n                                  });\n                                },\n                                child: Text(\"提交\".tl),\n                              )\n                            ],\n                          ),\n                        ),\n                      ),\n                    )\n                  ],\n                )));\n  }\n\n  @override\n  Widget get buildMoreInfo => MouseRegion(\n        cursor: SystemMouseCursors.click,\n        child: GestureDetector(\n          onTap: () => starRating(App.globalContext!, data!.auth!),\n          child: SizedBox(\n            height: 30,\n            child: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                for (int i = 0; i < (data!.stars ~/ 0.5) ~/ 2; i++)\n                  const Icon(\n                    Icons.star,\n                    size: 30,\n                    color: Color(0xffffbf00),\n                  ),\n                if ((data!.stars ~/ 0.5) % 2 == 1)\n                  const Icon(\n                    Icons.star_half,\n                    size: 30,\n                    color: Color(0xffffbf00),\n                  ),\n                for (int i = 0;\n                    i <\n                        (5 -\n                            (data!.stars ~/ 0.5) ~/ 2 -\n                            (data!.stars ~/ 0.5) % 2);\n                    i++)\n                  const Icon(\n                    Icons.star_border,\n                    size: 30,\n                    color: Color(0xffffbf00),\n                  ),\n                const SizedBox(\n                  width: 5,\n                ),\n                if (data!.rating != null) Text(data!.rating!)\n              ],\n            ),\n          ),\n        ),\n      );\n\n  @override\n  String get id => link;\n\n  @override\n  String get source => \"EHentai\";\n\n  @override\n  FavoriteItem toLocalFavoriteItem() =>\n      FavoriteItem.fromEhentai(data!.toBrief());\n\n  @override\n  void download() {\n    int current = 0;\n    bool loading = true;\n    ArchiveDownloadInfo? info;\n    bool cancelUnlock = false;\n\n    showDialog(\n        context: App.globalContext!,\n        builder: (dialogContext) => Dialog(\n              child: StatefulBuilder(\n                builder: (context, setState) {\n                  void load() async {\n                    if (data?.auth?[\"archiveDownload\"] == null) {\n                      return;\n                    }\n\n                    Res<ArchiveDownloadInfo> res;\n                    if (cancelUnlock) {\n                      cancelUnlock = false;\n                      res = await EhNetwork().cancelAndReloadArchiveInfo(info!);\n                    } else {\n                      res = await EhNetwork().getArchiveDownloadInfo(\n                          data!.auth![\"archiveDownload\"]!);\n                    }\n                    if (res.error) {\n                      showToast(message: \"网络错误\".tl);\n                    } else {\n                      info = res.data;\n                      loading = false;\n                      if (context.mounted) {\n                        setState(() {});\n                      }\n                    }\n                  }\n\n                  if (loading) {\n                    load();\n                  }\n\n                  return Container(\n                    width: 350,\n                    padding: const EdgeInsets.symmetric(vertical: 16),\n                    child: Column(\n                      mainAxisSize: MainAxisSize.min,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        Text(\"下载\".tl, style: const TextStyle(fontSize: 20))\n                            .paddingLeft(16),\n                        const Divider(),\n                        RadioListTile(\n                            value: 0,\n                            groupValue: current,\n                            onChanged: (value) =>\n                                setState(() => current = value as int),\n                            title: Text(\"普通下载\".tl)),\n                        ExpansionTile(\n                          title: Text(\"归档下载\".tl),\n                          shape: Border.all(color: Colors.transparent),\n                          children: [\n                            if (loading)\n                              const CircularProgressIndicator()\n                                  .paddingVertical(8)\n                                  .toCenter()\n                            else\n                              Column(\n                                mainAxisSize: MainAxisSize.min,\n                                children: [\n                                  RadioListTile(\n                                    value: 1,\n                                    groupValue: current,\n                                    onChanged: (value) =>\n                                        setState(() => current = value as int),\n                                    title: Text(\"Original\".tl),\n                                    subtitle: Text(\n                                        \"${info!.originCost} ${info!.originSize}\"),\n                                  ),\n                                  RadioListTile(\n                                    value: 2,\n                                    groupValue: current,\n                                    onChanged: (value) =>\n                                        setState(() => current = value as int),\n                                    title: Text(\"Resample\".tl),\n                                    subtitle: Text(\n                                        \"${info!.resampleCost} ${info!.resampleSize}\"),\n                                  ),\n                                  if (info!.cancelUnlockUrl != null)\n                                    ListTile(\n                                      leading: const Icon(Icons.lock_open),\n                                      title: Text(\"取消解锁\".tl),\n                                      subtitle: Text(\"长按执行此操作\".tl),\n                                      onLongPress: () {\n                                        setState(() {\n                                          cancelUnlock = true;\n                                          loading = true;\n                                        });\n                                      },\n                                    ).paddingLeft(6),\n                                ],\n                              )\n                          ],\n                        ),\n                        FilledButton(\n                          onPressed: () {\n                            startDownload(current);\n                            context.pop();\n                          },\n                          child: Text(\"确认\".tl),\n                        ).toCenter()\n                      ],\n                    ),\n                  );\n                },\n              ),\n            ));\n  }\n\n  void startDownload(int type) {\n    final id = getGalleryId(data!.link);\n    if (downloadManager.isExists(id)) {\n      showToast(message: \"已下载\".tl);\n      return;\n    }\n    for (var i in downloadManager.downloading) {\n      if (i.id == id) {\n        showToast(message: \"下载中\".tl);\n        return;\n      }\n    }\n    downloadManager.addEhDownload(data!, type);\n    showToast(message: \"已加入队列\".tl);\n  }\n\n  @override\n  void openFavoritePanel() {\n    favoriteComic(FavoriteComicWidget(\n      havePlatformFavorite: ehentai.isLogin,\n      needLoadFolderData: false,\n      folders: Map<String, String>.fromIterable(\n        EhNetwork().folderNames,\n      ),\n      favoriteOnPlatform: data!.favorite,\n      localFavoriteItem: toLocalFavoriteItem(),\n      setFavorite: (b) {\n        if (favorite != b) {\n          favorite = b;\n          update();\n        }\n      },\n      selectFolderCallback: (folder, page) async {\n        if (page == 0) {\n          var res = await EhNetwork().favorite(\n              data!.auth![\"gid\"]!, data!.auth![\"token\"]!,\n              id: EhNetwork().folderNames.indexOf(folder).toString());\n          if (res) {\n            data!.favorite = true;\n            return const Res(true);\n          } else {\n            return Res.error(\"网络错误\".tl);\n          }\n        } else {\n          LocalFavoritesManager()\n              .addComic(folder, FavoriteItem.fromEhentai(data!.toBrief()));\n          return const Res(true);\n        }\n      },\n      cancelPlatformFavorite: () async {\n        var res = await EhNetwork()\n            .unfavorite(data!.auth![\"gid\"]!, data!.auth![\"token\"]!);\n        if (res) {\n          data!.favorite = false;\n          return const Res(true);\n        } else {\n          return Res.error(\"网络错误\".tl);\n        }\n      },\n    ));\n  }\n\n  @override\n  void read(History? history) async {\n    history = await History.createIfNull(history, data!);\n    App.globalTo(\n      () => ComicReadingPage.ehentai(\n        data!,\n        initialPage: history!.page,\n      ),\n    );\n  }\n\n  @override\n  ActionFunc? get openComments => () =>\n      showComments(App.globalContext!, link, data!.uploader, data!.auth ?? {});\n\n  @override\n  String get downloadedId => getGalleryId(link);\n\n  @override\n  String get sourceKey => \"ehentai\";\n}\n\nclass RatingLogic extends StateController {\n  double rating = 0;\n  bool running = false;\n}\n\nclass CommentLogic extends StateController {\n  final controller = TextEditingController();\n  bool sending = false;\n}\n\nclass EhThumbnailLoader extends StatefulWidget {\n  const EhThumbnailLoader(\n      {required this.image, required this.index, super.key});\n\n  final ImageProvider image;\n\n  final int index;\n\n  @override\n  State<EhThumbnailLoader> createState() => _EhThumbnailLoaderState();\n}\n\nclass _EhThumbnailLoaderState extends State<EhThumbnailLoader> {\n  ui.Image? image;\n\n  bool failed = false;\n\n  @override\n  void initState() {\n    super.initState();\n    _loadImage();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (failed) {\n      return const Center(\n        child: Icon(Icons.error),\n      );\n    }\n\n    if (image == null) {\n      return const SizedBox();\n    } else {\n      return CustomPaint(\n        painter: _EhThumbnailPainter(widget.index, image!),\n        child: const SizedBox(\n          width: double.infinity,\n          height: double.infinity,\n        ),\n      );\n    }\n  }\n\n  void _loadImage() async {\n    final imageStream = widget.image.resolve(ImageConfiguration.empty);\n\n    var listener = ImageStreamListener((imageInfo, _) {\n      if (mounted) {\n        setState(() {\n          image = imageInfo.image;\n        });\n      }\n    }, onError: (error, stack) {\n      setState(() {\n        failed = true;\n      });\n    });\n\n    imageStream.addListener(listener);\n  }\n}\n\nclass _EhThumbnailPainter extends CustomPainter {\n  final int index;\n  final ui.Image image;\n\n  _EhThumbnailPainter(this.index, this.image);\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    final start = index % 20 * 100;\n    final end = start + 100;\n    final rect = Rect.fromLTRB(0, 0, size.width, size.height);\n    final srcRect = Rect.fromLTRB(\n        start.toDouble(), 0, end.toDouble(), image.height.toDouble());\n\n    canvas.drawImageRect(\n      image,\n      srcRect,\n      rect,\n      Paint(),\n    );\n  }\n\n  @override\n  bool shouldRepaint(covariant _EhThumbnailPainter oldDelegate) {\n    return image != oldDelegate.image;\n  }\n}\n\nclass RatingWidget extends StatefulWidget {\n  /// star number\n  final int count;\n\n  /// Max score\n  final double maxRating;\n\n  /// Current score value\n  final double value;\n\n  /// Star size\n  final double size;\n\n  /// Space between the stars\n  final double padding;\n\n  /// Whether the score can be modified by sliding\n  final bool selectAble;\n\n  /// Callbacks when ratings change\n  final ValueChanged<double> onRatingUpdate;\n\n  const RatingWidget(\n      {super.key,\n      this.maxRating = 10.0,\n      this.count = 5,\n      this.value = 10.0,\n      this.size = 20,\n      required this.padding,\n      this.selectAble = false,\n      required this.onRatingUpdate});\n\n  @override\n  State<RatingWidget> createState() => _RatingWidgetState();\n}\n\nclass _RatingWidgetState extends State<RatingWidget> {\n  double value = 10;\n\n  @override\n  Widget build(BuildContext context) {\n    return Listener(\n      onPointerDown: (PointerDownEvent event) {\n        double x = event.localPosition.dx;\n        if (x < 0) x = 0;\n        pointValue(x);\n      },\n      onPointerMove: (PointerMoveEvent event) {\n        double x = event.localPosition.dx;\n        if (x < 0) x = 0;\n        pointValue(x);\n      },\n      onPointerUp: (_) {},\n      behavior: HitTestBehavior.deferToChild,\n      child: buildRowRating(),\n    );\n  }\n\n  pointValue(double dx) {\n    if (!widget.selectAble) {\n      return;\n    }\n    if (dx >=\n        widget.size * widget.count + widget.padding * (widget.count - 1)) {\n      value = widget.maxRating;\n    } else {\n      for (double i = 1; i < widget.count + 1; i++) {\n        if (dx > widget.size * i + widget.padding * (i - 1) &&\n            dx < widget.size * i + widget.padding * i) {\n          value = i * (widget.maxRating / widget.count);\n          break;\n        } else if (dx > widget.size * (i - 1) + widget.padding * (i - 1) &&\n            dx < widget.size * i + widget.padding * i) {\n          value = (dx - widget.padding * (i - 1)) /\n              (widget.size * widget.count) *\n              widget.maxRating;\n          break;\n        }\n      }\n    }\n    if (value % 1 >= 0.5) {\n      value = value ~/ 1 + 1;\n    } else {\n      value = (value ~/ 1).toDouble();\n    }\n    if (value < 0) {\n      value = 0;\n    } else if (value > 10) {\n      value = 10;\n    }\n    setState(() {\n      widget.onRatingUpdate(value);\n    });\n  }\n\n  int fullStars() {\n    return (value / (widget.maxRating / widget.count)).floor();\n  }\n\n  double star() {\n    if (widget.count / fullStars() == widget.maxRating / value) {\n      return 0;\n    }\n    return (value % (widget.maxRating / widget.count)) /\n        (widget.maxRating / widget.count);\n  }\n\n  List<Widget> buildRow() {\n    int full = fullStars();\n    List<Widget> children = [];\n    for (int i = 0; i < full; i++) {\n      children.add(\n          Icon(Icons.star, size: widget.size, color: const Color(0xffffbf00)));\n      if (i < widget.count - 1) {\n        children.add(\n          SizedBox(\n            width: widget.padding,\n          ),\n        );\n      }\n    }\n    if (full < widget.count) {\n      children.add(ClipRect(\n        clipper: SMClipper(rating: star() * widget.size),\n        child:\n            Icon(Icons.star, size: widget.size, color: const Color(0xffffbf00)),\n      ));\n    }\n\n    return children;\n  }\n\n  List<Widget> buildNormalRow() {\n    List<Widget> children = [];\n    for (int i = 0; i < widget.count; i++) {\n      children.add(Icon(\n        Icons.star_border,\n        size: widget.size,\n        color: const Color(0xffffbf00),\n      ));\n      if (i < widget.count - 1) {\n        children.add(SizedBox(\n          width: widget.padding,\n        ));\n      }\n    }\n    return children;\n  }\n\n  Widget buildRowRating() {\n    return Stack(\n      children: <Widget>[\n        Row(\n          children: buildNormalRow(),\n        ),\n        Row(\n          children: buildRow(),\n        )\n      ],\n    );\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    value = widget.value;\n  }\n}\n\nclass SMClipper extends CustomClipper<Rect> {\n  final double rating;\n\n  SMClipper({required this.rating});\n\n  @override\n  Rect getClip(Size size) {\n    return Rect.fromLTRB(0.0, 0.0, rating, size.height);\n  }\n\n  @override\n  bool shouldReclip(SMClipper oldClipper) {\n    return rating != oldClipper.rating;\n  }\n}\n"
  },
  {
    "path": "lib/pages/ehentai/eh_login_page.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/pages/ehentai/eh_user_cookie_parser.dart';\nimport 'package:pica_comic/pages/webview.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\n\nimport '../../foundation/app.dart';\nimport '../../network/eh_network/eh_main_network.dart';\n\nclass EhLoginPage extends StatefulWidget {\n  const EhLoginPage({Key? key}) : super(key: key);\n\n  @override\n  State<EhLoginPage> createState() => _EhLoginPageState();\n}\n\nclass _EhLoginPageState extends State<EhLoginPage> {\n  final c1 = TextEditingController();\n  final c2 = TextEditingController();\n  final c3 = TextEditingController();\n  final c4 = TextEditingController();\n  bool logging = false;\n  late EhUserCookieParserController cookieParserController;\n\n  @override\n  void initState() {\n    super.initState();\n    cookieParserController = EhUserCookieParserController();\n  }\n\n  @override\n  void dispose() {\n    c1.dispose();\n    c2.dispose();\n    c3.dispose();\n    c4.dispose();\n\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text(\"登录\".tl),\n      ),\n      body: SingleChildScrollView(\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.center,\n          children: [\n            Center(\n              child: SizedBox(\n                width: 400,\n                child: Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    const Text(\n                      \"Cookies\",\n                      style: TextStyle(fontSize: 18),\n                    ).paddingLeft(6),\n                    const SizedBox(\n                      height: 8,\n                    ),\n                    Padding(\n                      padding: const EdgeInsets.all(5),\n                      child: TextField(\n                        controller: c1,\n                        decoration: const InputDecoration(\n                            border: OutlineInputBorder(),\n                            labelText: \"ipb_member_id\"),\n                      ),\n                    ),\n                    Padding(\n                      padding: const EdgeInsets.all(5),\n                      child: TextField(\n                        controller: c2,\n                        decoration: const InputDecoration(\n                            border: OutlineInputBorder(),\n                            labelText: \"ipb_pass_hash\"),\n                      ),\n                    ),\n                    Padding(\n                      padding: const EdgeInsets.all(5),\n                      child: TextField(\n                        controller: c3,\n                        decoration: InputDecoration(\n                            border: const OutlineInputBorder(),\n                            labelText: \"igneous(非必要)\".tl),\n                      ),\n                    ),\n                    Padding(\n                      padding: const EdgeInsets.all(5),\n                      child: TextField(\n                        controller: c4,\n                        decoration: InputDecoration(\n                            border: const OutlineInputBorder(),\n                            labelText: \"star(非必要)\".tl),\n                      ),\n                    ),\n                    EhUserCookieParser(\n                      controller: cookieParserController,\n                    ),\n                    AnimatedSwitcher(\n                      duration: const Duration(milliseconds: 500),\n                      switchInCurve: Curves.easeInOut,\n                      switchOutCurve: Curves.easeInOut,\n                      child: cookieParserController.visible\n                          ? _buildCookieParserButtonGroup(cookieParserController)\n                          : TextButton(\n                        onPressed: () {\n                          if (cookieParserController.visible) return;\n                          cookieParserController.show();\n                          setState(() {});\n                        },\n                        child: Text('通过 cookie 身份信息快速填写'.tl),\n                      ),\n                    ),\n                    const SizedBox(height: 8,),\n                    Center(\n                      child: Padding(\n                        padding: const EdgeInsets.fromLTRB(0, 8, 0, 0),\n                        child: !logging\n                            ? FilledButton(\n                                child: Text(\"登录\".tl),\n                                onPressed: () {\n                                  if (c1.text == \"\" || c2.text == \"\") {\n                                    showToast(message: \"请填写完整\".tl);\n                                  } else {\n                                    login(c1.text, c2.text, c3.text, c4.text);\n                                  }\n                                },\n                              )\n                            : const CircularProgressIndicator(),\n                      ),\n                    ),\n                    const SizedBox(\n                      height: 10,\n                    ),\n                    Center(\n                      child: SizedBox(\n                        height: 40,\n                        child: TextButton(\n                          onPressed: loginWithWebview,\n                          child: Row(\n                            mainAxisSize: MainAxisSize.min,\n                            children: [\n                              Text(\"在Webview中登录\".tl),\n                              const Icon(\n                                Icons.arrow_outward,\n                                size: 15,\n                              )\n                            ],\n                          ),\n                        ),\n                      ),\n                    ),\n                    const SizedBox(\n                      height: 5,\n                    ),\n                    Center(\n                      child: SizedBox(\n                        height: 40,\n                        child: TextButton(\n                          onPressed: () => launchUrlString(\n                              \"https://forums.e-hentai.org/index.php?act=Reg&CODE=00\",\n                              mode: LaunchMode.externalApplication),\n                          child: Row(\n                            mainAxisSize: MainAxisSize.min,\n                            children: [\n                              Text(\"注册\".tl),\n                              const Icon(\n                                Icons.arrow_outward,\n                                size: 15,\n                              )\n                            ],\n                          ),\n                        ),\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            )\n          ],\n        ),\n      ),\n    );\n  }\n\n  Row _buildCookieParserButtonGroup(\n      EhUserCookieParserController cookieParserController) {\n    return Row(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        Button.text(\n          onPressed: () {\n            cookieParserController.hide();\n            setState(() {});\n          },\n          child: Text('隐藏'.tl),\n        ),\n        const SizedBox(width: 16),\n        Button.outlined(\n          onPressed: () {\n            final cookieMap = cookieParserController.parse();\n            setState(() {\n              c1.text = cookieMap['ipb_member_id'] ?? '';\n              c2.text = cookieMap['ipb_pass_hash'] ?? '';\n              c3.text = cookieMap['igneous'] ?? '';\n              c4.text = cookieMap['star'] ?? '';\n            });\n          },\n          child: Text('解析'.tl),\n        ),\n        const SizedBox(width: 4),\n      ],\n    );\n  }\n\n  void loginWithWebview() async {\n    if (App.isMobile) {\n      App.globalTo(() => AppWebview(\n            singlePage: true,\n            initialUrl:\n                \"https://forums.e-hentai.org/index.php?act=Login&CODE=00\",\n            onTitleChange: (title, controller) async {\n              if (title == \"E-Hentai Forums\") {\n                var cookies1 =\n                    await controller.getCookies(\"https://e-hentai.org\") ?? {};\n                var cookies2 =\n                    await controller.getCookies(\"https://exhentai.org\") ?? {};\n                var cookies = <String, String>{};\n                cookies1.forEach((key, value) {\n                  cookies[key] = value;\n                });\n                cookies2.forEach((key, value) {\n                  cookies[key] = value;\n                });\n                loginWithCookies(cookies);\n                App.globalBack();\n              }\n            },\n          ));\n    } else if (App.isDesktop) {\n      if (await DesktopWebview.isAvailable()) {\n        var webview = DesktopWebview(\n          initialUrl: \"https://forums.e-hentai.org/index.php?act=Login&CODE=00\",\n          onTitleChange: (url, webview) async {\n            if (url == \"E-Hentai Forums\") {\n              var cookies1 =\n                  await webview.getCookies(\"https://e-hentai.org\");\n              var cookies2 =\n                  await webview.getCookies(\"https://exhentai.org\");\n              webview.close();\n              var cookies = <String, String>{};\n              cookies1.forEach((key, value) {\n                cookies[key] = value;\n              });\n              cookies2.forEach((key, value) {\n                cookies[key] = value;\n              });\n              loginWithCookies(cookies);\n            }\n          },\n        );\n        webview.open();\n      } else {\n        showToast(message: \"Unsupported device\".tl);\n      }\n    }\n  }\n\n  void login(String id, String hash, String igneous, String star) {\n    loginWithCookies({\n      \"ipb_member_id\": id,\n      \"ipb_pass_hash\": hash,\n      if (igneous != \"\") \"igneous\": igneous,\n      if (star != \"\") \"star\": star,\n    });\n  }\n\n  void loginWithCookies(Map<String, String> cookiesMap) async {\n    setState(() {\n      logging = true;\n    });\n\n    EhNetwork().cookieJar.deleteUri(Uri.parse('https://e-hentai.org'));\n    EhNetwork().cookieJar.deleteUri(Uri.parse('https://exhentai.org'));\n\n    var cookies =\n        cookiesMap.entries.map((e) => Cookie(e.key, e.value)).toList();\n    cookies.forEach((element) => element.domain = \".e-hentai.org\");\n    EhNetwork()\n        .cookieJar\n        .saveFromResponse(Uri.parse(\"https://e-hentai.org\"), cookies);\n    cookies.forEach((element) => element.domain = \".exhentai.org\");\n    EhNetwork()\n        .cookieJar\n        .saveFromResponse(Uri.parse(\"https://exhentai.org\"), cookies);\n\n    EhNetwork().getUserName().then((b) {\n      if(!mounted)  return;\n      if (b) {\n        context.pop();\n        showToast(message: \"登录成功\".tl);\n      } else {\n        EhNetwork().cookieJar.deleteUri(Uri.parse('https://e-hentai.org'));\n        EhNetwork().cookieJar.deleteUri(Uri.parse('https://exhentai.org'));\n        showToast(message: \"登录失败\".tl);\n        setState(() {\n          logging = false;\n        });\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "lib/pages/ehentai/eh_user_cookie_parser.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nconst sample = '''ipb_member_id: ...\nipb_pass_hash: ...\nigneous: ...\nstar: ...''';\n\nclass EhUserCookieParser extends StatefulWidget {\n  const EhUserCookieParser({super.key, required this.controller});\n\n  final EhUserCookieParserController controller;\n\n  @override\n  State<EhUserCookieParser> createState() => _EhUserCookieParserState();\n}\n\nclass _EhUserCookieParserState extends State<EhUserCookieParser>\n    with SingleTickerProviderStateMixin {\n  late TextEditingController cookieDataController;\n  late Map<String, String> cookieMap;\n\n  late AnimationController scaleController;\n  late Animation<double> scaleAnimation;\n\n  @override\n  void initState() {\n    super.initState();\n    cookieDataController = TextEditingController();\n\n    scaleController = AnimationController(\n        vsync: this, duration: const Duration(milliseconds: 500));\n    scaleAnimation = Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(\n      parent: scaleController,\n      curve: Curves.easeInOut,\n    ));\n\n    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {\n      widget.controller.setFunctions(show, hide, parse);\n    });\n  }\n\n  @override\n  void dispose() {\n    cookieDataController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedBuilder(\n      animation: scaleAnimation,\n      builder: (context, child) => Center(\n        child: SizedBox(\n          height: 150 * scaleAnimation.value,\n          child: Transform.scale(\n            scale: scaleAnimation.value,\n            child: Padding(\n              padding: const EdgeInsets.all(5),\n              child: TextField(\n                maxLines: null,\n                minLines: 5,\n                scrollPhysics: const AlwaysScrollableScrollPhysics(),\n                controller: cookieDataController,\n                decoration: InputDecoration(\n                  border: const OutlineInputBorder(),\n                  hintText: sample.tl,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  void show() {\n    scaleController.forward();\n  }\n\n  void hide() {\n    scaleController.reverse();\n  }\n\n  Map<String, String> parse() {\n    if (cookieDataController.text.isEmpty) {\n      showToast(message: \"空的内容不能解析哦\".tl);\n      return {};\n    }\n    cookieMap = {};\n    final rawCookieData = cookieDataController.text;\n    final cookieDataPairs = rawCookieData.split('\\n');\n    for (var pair in cookieDataPairs) {\n      final splitData = pair.split(':');\n      if (splitData.length != 2) {\n        showToast(message:  \"cookie 信息格式可能有误\".tl);\n        continue;\n      }\n      final key = splitData[0].trim();\n      final value = splitData[1].trim();\n      cookieMap[key] = value;\n    }\n    return cookieMap;\n  }\n}\n\nclass EhUserCookieParserController {\n  EhUserCookieParserController();\n\n  void Function()? showFunction, hideFunction;\n  Map<String, String> Function()? parseFunction;\n\n  var visible = false;\n\n  void setFunctions(\n      Function() show, Function() hide, Map<String, String> Function() parse) {\n    showFunction = show;\n    hideFunction = hide;\n    parseFunction = parse;\n  }\n\n  void show() {\n    if (visible) return;\n    visible = true;\n    showFunction?.call();\n  }\n\n  void hide() {\n    if (!visible) return;\n    visible = false;\n    hideFunction?.call();\n  }\n\n  Map<String, String> parse() {\n    return parseFunction?.call() ?? {};\n  }\n}\n"
  },
  {
    "path": "lib/pages/ehentai/subscription.dart",
    "content": "import 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport '../../network/eh_network/eh_main_network.dart';\nimport '../../network/eh_network/eh_models.dart';\nimport '../../network/res.dart';\n\nclass SubscriptionPage extends StatefulWidget {\n  const SubscriptionPage({super.key});\n\n  @override\n  State<SubscriptionPage> createState() => _SubscriptionPageState();\n}\n\nclass _SubscriptionPageState extends State<SubscriptionPage> {\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: Appbar(title: Text(\"EH订阅\".tl), actions: [\n        Tooltip(\n          message: \"更多\".tl,\n          child: IconButton(\n            icon: const Icon(Icons.more_horiz),\n            onPressed: (){\n              Future.microtask(() => showDialog(context: App.globalContext!, builder: (context){\n                return AlertDialog(\n                  title: Text(\"订阅\".tl),\n                  content: Text(\"其它漫画源的订阅尚未完成\\n如需管理EH订阅, 请前往EH网站\".tl),\n                  actions: [\n                    TextButton(onPressed: ()=>App.globalBack(), child: Text(\"返回\".tl)),\n                  ],\n                );\n              }));\n            },\n          ),\n        )\n      ],),\n      body: EhSubscriptionComics(),\n    );\n  }\n}\n\n\nclass PageData{\n  Galleries? galleries;\n  int page = 1;\n  Map<int, List<EhGalleryBrief>> comics = {};\n}\n\nclass EhSubscriptionComics extends ComicsPage<EhGalleryBrief>{\n  EhSubscriptionComics({super.key});\n\n  final data = PageData();\n\n  @override\n  Future<Res<List<EhGalleryBrief>>> getComics(int i) async{\n    if(data.galleries == null){\n      Res<Galleries> res = await EhNetwork().getGalleries(\"${EhNetwork().ehBaseUrl}/watched\");\n      if(res.error){\n        return Res(null, errorMessage: res.errorMessage);\n      }else{\n        data.galleries = res.data;\n        data.comics[1] = [];\n        data.comics[1]!.addAll(data.galleries!.galleries);\n        data.galleries!.galleries.clear();\n      }\n    }\n    if(data.comics[i] != null){\n      return Res(data.comics[i]!);\n    }else{\n      while(data.comics[i] == null){\n        data.page++;\n        if(! await EhNetwork().getNextPageGalleries(data.galleries!)){\n          return const Res(null, errorMessage: \"网络错误\");\n        }\n        data.comics[data.page] = [];\n        data.comics[data.page]!.addAll(data.galleries!.galleries);\n        data.galleries!.galleries.clear();\n      }\n      return Res(data.comics[i]);\n    }\n  }\n\n  @override\n  String? get tag => \"EhSubscriptionPage\";\n\n  @override\n  String? get title => null;\n\n  @override\n  String get sourceKey => 'ehentai';\n}"
  },
  {
    "path": "lib/pages/explore_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/network/base_comic.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/category_comics_page.dart';\nimport 'package:pica_comic/pages/search_result_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nclass ExplorePage extends StatefulWidget {\n  const ExplorePage({super.key});\n\n  @override\n  State<ExplorePage> createState() => _ExplorePageState();\n}\n\nclass _ExplorePageState extends State<ExplorePage>\n    with TickerProviderStateMixin {\n  late TabController controller;\n\n  bool showFB = true;\n\n  double location = 0;\n\n  var pages = appdata.appSettings.explorePages;\n\n  @override\n  void initState() {\n    pages = appdata.appSettings.explorePages;\n    var all = ComicSource.sources.map((e) => e.explorePages).expand((e) => e.map((e) => e.title)).toList();\n    pages = pages.where((e) => all.contains(e)).toList();\n    if(pages.isEmpty && appdata.appSettings.explorePages.isNotEmpty) {\n      if(appdata.appSettings.explorePages.first.isNum) {\n        // is odd data, update\n        appdata.appSettings.explorePages = all;\n        pages = all;\n        appdata.updateSettings();\n      }\n    }\n    controller = TabController(\n      length: pages.length,\n      vsync: this,\n    );\n    super.initState();\n  }\n\n  void refresh() {\n    int page = controller.index;\n    String currentPageId = pages[page];\n    StateController.find<SimpleController>(tag: currentPageId).refresh();\n  }\n\n  Widget buildFAB() => Material(\n        color: Colors.transparent,\n        child: FloatingActionButton(\n          key: const Key(\"FAB\"),\n          onPressed: refresh,\n          child: const Icon(Icons.refresh),\n        ),\n      );\n\n  Tab buildTab(String i) {\n    return Tab(text: i.tl, key: Key(i));\n  }\n\n  Widget buildBody(String i) => _SingleExplorePage(i, key: Key(i));\n\n  @override\n  Widget build(BuildContext context) {\n    Widget tabBar = Material(\n      child: FilledTabBar(\n        tabs: pages.map((e) => buildTab(e)).toList(),\n        controller: controller,\n      ),\n    );\n\n    return Stack(\n      children: [\n        Positioned.fill(\n            child: Column(\n          children: [\n            tabBar,\n            Expanded(\n              child: NotificationListener<ScrollNotification>(\n                onNotification: (notifications) {\n                  if (notifications.metrics.axis == Axis.horizontal) {\n                    if (!showFB) {\n                      setState(() {\n                        showFB = true;\n                      });\n                    }\n                    return true;\n                  }\n\n                  var current = notifications.metrics.pixels;\n\n                  if ((current > location && current != 0) && showFB) {\n                    setState(() {\n                      showFB = false;\n                    });\n                  } else if ((current < location || current == 0) && !showFB) {\n                    setState(() {\n                      showFB = true;\n                    });\n                  }\n\n                  location = current;\n                  return false;\n                },\n                child: MediaQuery.removePadding(\n                  context: context,\n                  removeTop: true,\n                  child: TabBarView(\n                    controller: controller,\n                    children: pages\n                        .map((e) => buildBody(e))\n                        .toList(),\n                  ),\n                ),\n              ),\n            )\n          ],\n        )),\n        Positioned(\n          right: 16,\n          bottom: 16,\n          child: AnimatedSwitcher(\n            duration: const Duration(milliseconds: 150),\n            reverseDuration: const Duration(milliseconds: 150),\n            child: showFB ? buildFAB() : const SizedBox(),\n            transitionBuilder: (widget, animation) {\n              var tween = Tween<Offset>(\n                  begin: const Offset(0, 1), end: const Offset(0, 0));\n              return SlideTransition(\n                position: tween.animate(animation),\n                child: widget,\n              );\n            },\n          ),\n        )\n      ],\n    );\n  }\n}\n\nclass _SingleExplorePage extends StatefulWidget {\n  const _SingleExplorePage(this.title, {super.key});\n\n  final String title;\n\n  @override\n  State<_SingleExplorePage> createState() => _SingleExplorePageState();\n}\n\nclass _SingleExplorePageState extends StateWithController<_SingleExplorePage> {\n  late final ExplorePageData data;\n\n  bool loading = true;\n\n  String? message;\n\n  List<ExplorePagePart>? parts;\n\n  late final String comicSourceKey;\n\n  int key = 0;\n\n  @override\n  void initState() {\n    super.initState();\n    for (var source in ComicSource.sources) {\n      for (var d in source.explorePages) {\n        if (d.title == widget.title) {\n          data = d;\n          comicSourceKey = source.key;\n          return;\n        }\n      }\n    }\n    throw \"Explore Page ${widget.title} Not Found!\";\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (data.loadMultiPart != null) {\n      return buildMultiPart();\n    } else if (data.loadPage != null) {\n      return buildComicList();\n    } else if (data.loadMixed != null) {\n      return _MixedExplorePage(\n        data,\n        comicSourceKey,\n        key: ValueKey(key),\n      );\n    } else if (data.overridePageBuilder != null) {\n      return Builder(\n        builder: (context) {\n          return data.overridePageBuilder!(context);\n        },\n        key: ValueKey(key),\n      );\n    } else {\n      return const Center(\n        child: Text(\"Empty Page\"),\n      );\n    }\n  }\n\n  Widget buildComicList() =>\n      _ComicList(data.loadPage!, tag.toString(), comicSourceKey);\n\n  void load() async {\n    var res = await data.loadMultiPart!();\n    loading = false;\n    if (mounted) {\n      setState(() {\n        if (res.error) {\n          message = res.errorMessageWithoutNull;\n        } else {\n          parts = res.data;\n        }\n      });\n    }\n  }\n\n  Widget buildMultiPart() {\n    if (loading) {\n      load();\n      return const Center(\n        child: CircularProgressIndicator(),\n      );\n    } else if (message != null) {\n      return NetworkError(\n        message: message!,\n        retry: refresh,\n        withAppbar: false,\n      );\n    } else {\n      return buildPage();\n    }\n  }\n\n  Widget buildPage() {\n    return SmoothCustomScrollView(\n      slivers: _buildPage().toList(),\n    );\n  }\n\n  Iterable<Widget> _buildPage() sync* {\n    for (var part in parts!) {\n      yield* _buildExplorePagePart(part, comicSourceKey);\n    }\n  }\n\n  @override\n  Object? get tag => widget.title;\n\n  @override\n  void refresh() {\n    message = null;\n    if (data.loadMultiPart != null) {\n      setState(() {\n        loading = true;\n      });\n    } else if (data.loadPage != null) {\n      StateController.findOrNull<ComicsPageLogic>(tag: tag.toString())\n          ?.refresh();\n    } else {\n      setState(() {\n        key++;\n      });\n    }\n  }\n}\n\nclass _ComicList extends ComicsPage<BaseComic> {\n  const _ComicList(this.builder, this.tag, this.sourceKey);\n\n  @override\n  final String tag;\n\n  final ComicListBuilder builder;\n\n  @override\n  final String sourceKey;\n\n  @override\n  Future<Res<List<BaseComic>>> getComics(int i) {\n    return builder(i);\n  }\n\n  @override\n  String? get title => null;\n}\n\nclass _MixedExplorePage extends StatefulWidget {\n  const _MixedExplorePage(this.data, this.sourceKey, {super.key});\n\n  final ExplorePageData data;\n\n  final String sourceKey;\n\n  @override\n  State<_MixedExplorePage> createState() => _MixedExplorePageState();\n}\n\nclass _MixedExplorePageState\n    extends MultiPageLoadingState<_MixedExplorePage, Object> {\n  Iterable<Widget> buildSlivers(BuildContext context, List<Object> data) sync* {\n    List<BaseComic> cache = [];\n    for (var part in data) {\n      if (part is ExplorePagePart) {\n        if (cache.isNotEmpty) {\n          yield SliverGridComics(\n            comics: (cache),\n            sourceKey: widget.sourceKey,\n          );\n          yield const SliverToBoxAdapter(child: Divider());\n          cache.clear();\n        }\n        yield* _buildExplorePagePart(part, widget.sourceKey);\n        yield const SliverToBoxAdapter(child: Divider());\n      } else {\n        cache.addAll(part as List<BaseComic>);\n      }\n    }\n    if (cache.isNotEmpty) {\n      yield SliverGridComics(\n        comics: (cache),\n        sourceKey: widget.sourceKey,\n      );\n    }\n  }\n\n  @override\n  Widget buildContent(BuildContext context, List<Object> data) {\n    return SmoothCustomScrollView(\n      slivers: [\n        ...buildSlivers(context, data),\n        if (haveNextPage) const ListLoadingIndicator().toSliver()\n      ],\n    );\n  }\n\n  @override\n  Future<Res<List<Object>>> loadData(int page) async {\n    var res = await widget.data.loadMixed!(page);\n    if (res.error) {\n      return res;\n    }\n    for (var element in res.data) {\n      if (element is! ExplorePagePart && element is! List<BaseComic>) {\n        return const Res.error(\"function loadMixed return invalid data\");\n      }\n    }\n    return res;\n  }\n}\n\nIterable<Widget> _buildExplorePagePart(\n    ExplorePagePart part, String sourceKey) sync* {\n  Widget buildTitle(ExplorePagePart part) {\n    return SliverToBoxAdapter(\n      child: SizedBox(\n        height: 60,\n        child: Padding(\n          padding: const EdgeInsets.fromLTRB(16, 10, 5, 10),\n          child: Row(\n            children: [\n              Text(\n                part.title,\n                style:\n                    const TextStyle(fontSize: 20, fontWeight: FontWeight.w500),\n              ),\n              const Spacer(),\n              if (part.viewMore != null)\n                TextButton(\n                  onPressed: () {\n                    var context = App.mainNavigatorKey!.currentContext!;\n                    if (part.viewMore!.startsWith(\"search:\")) {\n                      context.to(\n                        () => SearchResultPage(\n                          keyword: part.viewMore!.replaceFirst(\"search:\", \"\"),\n                          sourceKey: sourceKey,\n                        ),\n                      );\n                    } else if (part.viewMore!.startsWith(\"category:\")) {\n                      var cp = part.viewMore!.replaceFirst(\"category:\", \"\");\n                      var c = cp.split('@').first;\n                      String? p = cp.split('@').last;\n                      if (p == c) {\n                        p = null;\n                      }\n                      context.to(\n                        () => CategoryComicsPage(\n                          category: c,\n                          categoryKey:\n                              ComicSource.find(sourceKey)!.categoryData!.key,\n                          param: p,\n                        ),\n                      );\n                    }\n                  },\n                  child: Text(\"查看更多\".tl),\n                )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildComics(ExplorePagePart part) {\n    return SliverGridComics(comics: part.comics, sourceKey: sourceKey);\n  }\n\n  yield buildTitle(part);\n  yield buildComics(part);\n}\n"
  },
  {
    "path": "lib/pages/favorites/local_favorites.dart",
    "content": "import 'package:flutter_reorderable_grid_view/widgets/reorderable_builder.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/pre_search_page.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\nimport 'package:pica_comic/pages/download_page.dart';\nimport 'main_favorites_page.dart';\nimport 'network_to_local.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'dart:io';\nimport '../../foundation/app.dart';\nimport '../../network/eh_network/eh_main_network.dart';\nimport '../../network/hitomi_network/hitomi_main_network.dart';\nimport '../../network/htmanga_network/htmanga_main_network.dart';\nimport '../../network/jm_network/jm_network.dart';\nimport '../../network/nhentai_network/nhentai_main_network.dart';\nimport '../../network/picacg_network/methods.dart';\nimport '../../tools/io_tools.dart';\n\nextension LocalFavoritesExt on FavoriteItem {\n  void addDownload() {\n    if (DownloadManager().isExists(toDownloadId())) {\n      return;\n    }\n    try {\n      DownloadManager().addFavoriteDownload(this);\n    } catch (e) {\n      log(\"Failed to add a download.\\n Missing comic source config file.\",\n          \"Download\", LogLevel.error);\n    }\n  }\n\n  Future<bool> updateInfo(String folder) async {\n    if (type == FavoriteType.picacg) {\n      var res = await PicacgNetwork().getComicInfo(target);\n      if (res.error) return false;\n      name = res.data.title;\n      author = res.data.author;\n      tags = res.data.tags;\n      coverPath = res.data.cover;\n    } else if (type == FavoriteType.ehentai) {\n      var res = await EhNetwork().getGalleryInfo(target);\n      if (res.error) return false;\n      name = res.data.title;\n      coverPath = res.data.cover;\n    } else if (type == FavoriteType.jm) {\n      var res = await JmNetwork().getComicInfo(target);\n      if (res.error) return false;\n      name = res.data.title;\n      author = res.data.author.firstOrNull ?? '';\n      tags = res.data.tags;\n      coverPath = res.data.cover;\n    } else if (type == FavoriteType.nhentai) {\n      var res = await NhentaiNetwork().getComicInfo(target);\n      if (res.error) return false;\n      name = res.data.title;\n      coverPath = res.data.cover;\n    } else if (type == FavoriteType.htManga) {\n      var res = await HtmangaNetwork().getComicInfo(target);\n      if (res.error) return false;\n      name = res.data.title;\n      author = res.data.uploader;\n      coverPath = res.data.cover;\n    } else if (type == FavoriteType.hitomi) {\n      var res = await HiNetwork().getComicInfo(target);\n      if (res.error) return false;\n      name = res.data.title;\n      author = res.data.subTitle;\n      coverPath = res.data.cover;\n    } else {\n      var comicSource = type.comicSource;\n      var res = await comicSource.loadComicInfo!(target);\n      if (res.error) return false;\n      name = res.data.title;\n      author = res.data.subTitle ?? '';\n      coverPath = res.data.cover;\n    }\n    LocalFavoritesManager().updateInfo(folder, this);\n    return true;\n  }\n}\n\nclass UpdateFavoritesInfoDialog extends StatefulWidget {\n  const UpdateFavoritesInfoDialog(\n      {super.key, required this.comics, required this.folder});\n\n  final List<FavoriteItem> comics;\n\n  final String folder;\n\n  static show(List<FavoriteItem> comics, String folder) {\n    showDialog(\n      context: App.globalContext!,\n      builder: (context) =>\n          UpdateFavoritesInfoDialog(comics: comics, folder: folder),\n    );\n  }\n\n  @override\n  State<UpdateFavoritesInfoDialog> createState() =>\n      _UpdateFavoritesInfoDialogState();\n}\n\nclass _UpdateFavoritesInfoDialogState extends State<UpdateFavoritesInfoDialog> {\n  int finished = 0;\n\n  int get total => widget.comics.length;\n\n  bool cancel = false;\n\n  void load() async {\n    for (var comic in widget.comics) {\n      if (cancel) return;\n      if (await comic.updateInfo(widget.folder)) {\n        finished++;\n      }\n      if (!cancel) {\n        setState(() {});\n      }\n    }\n    if (mounted) {\n      StateController.findOrNull<SimpleController>(\n              tag: \"ComicsPageView ${widget.folder}\")\n          ?.refresh();\n      context.pop();\n    }\n  }\n\n  @override\n  void initState() {\n    load();\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    cancel = true;\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ContentDialog(\n      title: \"更新漫画信息\".tl,\n      content: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          LinearProgressIndicator(\n            value: finished / total,\n          ),\n          const SizedBox(\n            height: 8,\n          ),\n          Text(\"$finished/$total\").toAlign(Alignment.centerRight),\n        ],\n      ).paddingHorizontal(24).paddingVertical(12),\n      actions: [\n        Button.filled(\n          onPressed: () {\n            Navigator.of(context).pop();\n          },\n          child: Text(\"取消\".tl),\n        ),\n      ],\n    );\n  }\n}\n\nclass CreateFolderDialog extends StatelessWidget {\n  const CreateFolderDialog({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    final controller = TextEditingController();\n    return SimpleDialog(\n      title: Text(\"创建收藏夹\".tl),\n      children: [\n        Padding(\n          padding: const EdgeInsets.fromLTRB(20, 0, 20, 0),\n          child: TextField(\n            controller: controller,\n            onEditingComplete: () {\n              try {\n                LocalFavoritesManager().createFolder(controller.text);\n                App.globalBack();\n              } catch (e) {\n                showToast(message: e.toString());\n              }\n            },\n            decoration: InputDecoration(\n              border: const OutlineInputBorder(),\n              labelText: \"名称\".tl,\n            ),\n          ),\n        ),\n        const SizedBox(\n          height: 8,\n        ),\n        SizedBox(\n          width: 260,\n          child: Row(\n            children: [\n              const Spacer(),\n              TextButton(\n                child: Text(\"从文件导入\".tl),\n                onPressed: () async {\n                  context.pop();\n                  var data = await getDataFromUserSelectedFile([\"json\"]);\n                  if (data == null) {\n                    return;\n                  }\n                  var (error, message) =\n                      LocalFavoritesManager().loadFolderData(data);\n                  if (error) {\n                    showToast(message: message);\n                  } else {\n                    StateController.find(tag: \"me page\").update();\n                  }\n                },\n              ),\n              const Spacer(),\n              TextButton(\n                child: Text(\"从网络导入\".tl),\n                onPressed: () async {\n                  App.globalBack();\n                  await Future.delayed(const Duration(milliseconds: 200));\n                  networkToLocal();\n                },\n              ),\n              const Spacer(),\n            ],\n          ),\n        ),\n        const SizedBox(\n          height: 8,\n        ),\n        SizedBox(\n            height: 35,\n            child: Center(\n              child: FilledButton(\n                  onPressed: () {\n                    try {\n                      LocalFavoritesManager().createFolder(controller.text);\n                      App.globalBack();\n                    } catch (e) {\n                      showToast(message: e.toString());\n                    }\n                  },\n                  child: Text(\"提交\".tl)),\n            ))\n      ],\n    );\n  }\n}\n\nclass RenameFolderDialog extends StatelessWidget {\n  const RenameFolderDialog(this.before, {Key? key}) : super(key: key);\n\n  final String before;\n\n  @override\n  Widget build(BuildContext context) {\n    final controller = TextEditingController();\n    return SimpleDialog(\n      title: Text(\"重命名\".tl),\n      children: [\n        Padding(\n          padding: const EdgeInsets.fromLTRB(20, 0, 20, 0),\n          child: TextField(\n            controller: controller,\n            onEditingComplete: () {\n              try {\n                LocalFavoritesManager().rename(before, controller.text);\n                context.pop();\n              } catch (e) {\n                showToast(message: e.toString());\n              }\n            },\n            decoration: InputDecoration(\n              border: const OutlineInputBorder(),\n              labelText: \"名称\".tl,\n            ),\n          ),\n        ),\n        const SizedBox(\n          width: 200,\n          height: 10,\n        ),\n        SizedBox(\n            height: 35,\n            child: Center(\n              child: TextButton(\n                  onPressed: () {\n                    try {\n                      LocalFavoritesManager().rename(before, controller.text);\n                      context.pop();\n                    } catch (e) {\n                      showToast(message: e.toString());\n                    }\n                  },\n                  child: Text(\"提交\".tl)),\n            ))\n      ],\n    );\n  }\n}\n\nclass LocalFavoriteTile extends ComicTile {\n  const LocalFavoriteTile(\n      this.comic, this.folderName, this.onDelete, this._enableLongPressed,\n      {this.showFolderInfo = false, this.onLongPressed, this.onTap, super.key});\n\n  final FavoriteItem comic;\n\n  final String folderName;\n\n  final void Function() onDelete;\n\n  /// return true to disable default action\n  final bool Function()? onTap;\n\n  final bool _enableLongPressed;\n\n  final void Function()? onLongPressed;\n\n  final bool showFolderInfo;\n\n  static Map<String, File> cache = {};\n\n  @override\n  String? get badge =>\n      DownloadManager().isExists(comic.toDownloadId()) ? \"已下载\".tl : null;\n\n  @override\n  bool get enableLongPressed => _enableLongPressed;\n\n  @override\n  String get description => \"${comic.time} | ${comic.type.name}\";\n\n  @override\n  bool get showFavorite => false;\n\n  @override\n  Widget get image => () {\n        if (DownloadManager().isExists(comic.toDownloadId())) {\n          return Image.file(\n            DownloadManager().getCover(comic.toDownloadId()),\n            fit: BoxFit.cover,\n            height: double.infinity,\n            filterQuality: FilterQuality.medium,\n          );\n        } else if (cache[comic.target] == null) {\n          return FutureBuilder<File>(\n            future: LocalFavoritesManager().getCover(comic),\n            builder: (context, file) {\n              Widget child;\n              if (file.hasError) {\n                LogManager.addLog(\n                    LogLevel.error, \"Network\", file.stackTrace.toString());\n                child = const Center(\n                  child: Icon(Icons.error),\n                );\n              } else if (file.data == null) {\n                child = ColoredBox(\n                    color: Theme.of(context).colorScheme.secondaryContainer,\n                    child: const SizedBox(\n                      width: double.infinity,\n                      height: double.infinity,\n                    ));\n              } else {\n                cache[comic.target] = file.data!;\n                child = Image.file(\n                  file.data!,\n                  fit: BoxFit.cover,\n                  height: double.infinity,\n                  filterQuality: FilterQuality.medium,\n                );\n              }\n              return AnimatedSwitcher(\n                duration: const Duration(milliseconds: 200),\n                child: child,\n              );\n            },\n          );\n        } else {\n          return Image.file(\n            cache[comic.target]!,\n            fit: BoxFit.cover,\n            height: double.infinity,\n            filterQuality: FilterQuality.medium,\n          );\n        }\n      }();\n\n  BuildContext get context => App.mainNavigatorKey!.currentContext!;\n\n  void showInfo() {\n    context.to(\n      () => ComicPage(\n          sourceKey: comic.type.comicSource.key,\n          id: comic.target,\n          cover: comic.coverPath),\n    );\n  }\n\n  @override\n  String get subTitle => comic.author;\n\n  @override\n  String get title => comic.name;\n\n  List<String> _generateTags(List<String> tags) {\n    if (App.locale.languageCode != \"zh\") {\n      return tags;\n    }\n    List<String> res = [];\n    List<String> res2 = [];\n    for (var tag in tags) {\n      if (tag.contains(\":\")) {\n        var splits = tag.split(\":\");\n        var lowLevelKey = [\"character\", \"artist\", \"cosplayer\", \"group\"];\n        if (lowLevelKey.contains(splits[0])) {\n          res2.add(splits[1].translateTagsToCN);\n        } else {\n          res.add(splits[1].translateTagsToCN);\n        }\n      } else {\n        var name = tag;\n        if (name.contains('♀')) {\n          name = \"${name.replaceFirst(\" ♀\", \"\").translateTagsToCN}♀\";\n        } else if (name.contains('♂')) {\n          name = \"${name.replaceFirst(\" ♂\", \"\").translateTagsToCN}♂\";\n        } else {\n          name = name.translateTagsToCN;\n        }\n        res.add(name);\n      }\n    }\n    return res + res2;\n  }\n\n  @override\n  List<String>? get tags => _generateTags(comic.tags);\n\n  @override\n  void onSecondaryTap_(TapDownDetails details) {\n    showDesktopMenu(\n      App.globalContext!,\n      Offset(details.globalPosition.dx, details.globalPosition.dy),\n      [\n        DesktopMenuEntry(\n          text: \"查看\".tl,\n          onClick: () =>\n              Future.delayed(const Duration(milliseconds: 200), showInfo),\n        ),\n        DesktopMenuEntry(\n          text: \"阅读\".tl,\n          onClick: () =>\n              Future.delayed(const Duration(milliseconds: 200), read),\n        ),\n        DesktopMenuEntry(\n          text: \"搜索\".tl,\n          onClick: () => Future.delayed(\n            const Duration(milliseconds: 200),\n            () {\n              if (context.mounted) {\n                context.to(\n                  () => PreSearchPage(\n                    initialValue: title,\n                  ),\n                );\n              }\n            },\n          ),\n        ),\n        DesktopMenuEntry(\n          text: \"取消收藏\".tl,\n          onClick: () {\n            LocalFavoritesManager().deleteComic(folderName, comic);\n            onDelete();\n          },\n        ),\n        DesktopMenuEntry(\n          text: \"复制到\".tl,\n          onClick: copyTo,\n        ),\n        DesktopMenuEntry(\n          text: \"编辑标签\".tl,\n          onClick: editTags,\n        ),\n        DesktopMenuEntry(\n          text: \"下载\".tl,\n          onClick: () {\n            comic.addDownload();\n            showToast(message: \"已添加下载任务\".tl);\n          },\n        ),\n        DesktopMenuEntry(\n          text: \"更新漫画信息\".tl,\n          onClick: () {\n            UpdateFavoritesInfoDialog.show([comic], folderName);\n          },\n        ),\n      ],\n    );\n  }\n\n  @override\n  void onLongTap_() {\n    if (onLongPressed != null) {\n      onLongPressed!();\n    } else {\n      showMenu();\n    }\n  }\n\n  void showMenu() {\n    showDialog(\n        context: App.globalContext!,\n        builder: (context) => Dialog(\n              child: ConstrainedBox(\n                constraints: const BoxConstraints(maxWidth: 400),\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Padding(\n                      padding: const EdgeInsets.fromLTRB(16, 16, 16, 8),\n                      child: SelectableText(\n                        title.replaceAll(\"\\n\", \"\"),\n                        style: const TextStyle(fontSize: 22),\n                      ),\n                    ),\n                    const Divider(),\n                    ListTile(\n                      leading: const Icon(Icons.article),\n                      title: Text(\"查看详情\".tl),\n                      onTap: () {\n                        App.back(context);\n                        showInfo();\n                      },\n                    ),\n                    ListTile(\n                      leading: const Icon(Icons.bookmark_remove),\n                      title: Text(\"取消收藏\".tl),\n                      onTap: () {\n                        App.globalBack();\n                        LocalFavoritesManager().deleteComic(folderName, comic);\n                        onDelete();\n                      },\n                    ),\n                    ListTile(\n                      leading: const Icon(Icons.chrome_reader_mode_rounded),\n                      title: Text(\"阅读\".tl),\n                      onTap: () {\n                        App.globalBack();\n                        read();\n                      },\n                    ),\n                    ListTile(\n                      leading: const Icon(Icons.copy),\n                      title: Text(\"复制到\".tl),\n                      onTap: () {\n                        App.globalBack();\n                        copyTo();\n                      },\n                    ),\n                    ListTile(\n                      leading: const Icon(Icons.edit_note),\n                      title: Text(\"编辑标签\".tl),\n                      onTap: () {\n                        App.globalBack();\n                        editTags();\n                      },\n                    ),\n                    ListTile(\n                      leading: const Icon(Icons.download),\n                      title: Text(\"下载\".tl),\n                      onTap: () {\n                        App.globalBack();\n                        comic.addDownload();\n                        showToast(message: \"已添加下载任务\".tl);\n                      },\n                    ),\n                    ListTile(\n                      leading: const Icon(Icons.update),\n                      title: Text(\"更新漫画信息\".tl),\n                      onTap: () {\n                        App.globalBack();\n                        UpdateFavoritesInfoDialog.show([comic], folderName);\n                      },\n                    ),\n                    const SizedBox(\n                      height: 16,\n                    ),\n                  ],\n                ),\n              ),\n            ));\n  }\n\n  void readComic() async {\n    if (DownloadManager().isExists(comic.toDownloadId())) {\n      var download =\n          await DownloadManager().getComicOrNull(comic.toDownloadId());\n      if (download != null) {\n        download.read();\n        return;\n      }\n    }\n    bool cancel = false;\n    var controller = showLoadingDialog(\n      App.globalContext!,\n      onCancel: () => cancel = true,\n      barrierDismissible: false,\n    );\n    switch (comic.type.comicType) {\n      case ComicType.picacg:\n        {\n          var res = await network.getEps(comic.target);\n          if (cancel) return;\n          controller.close();\n          if (res.error) {\n            showToast(message: res.errorMessage ?? \"Error\");\n          } else {\n            var history = await HistoryManager().find(comic.target);\n            if (history == null) {\n              history = History(\n                HistoryType.picacg,\n                DateTime.now(),\n                comic.name,\n                comic.author,\n                comic.coverPath,\n                0,\n                0,\n                comic.target,\n              );\n              await HistoryManager().addHistory(history);\n            }\n            App.globalTo(\n              () => ComicReadingPage.picacg(\n                comic.target,\n                history!.ep,\n                res.data,\n                comic.name,\n                initialPage: history.page,\n              ),\n            );\n          }\n        }\n      case ComicType.ehentai:\n        {\n          var res = await EhNetwork().getGalleryInfo(comic.target);\n          if (cancel) return;\n          controller.close();\n          if (res.error) {\n            showToast(message: res.errorMessage ?? \"Error\");\n          } else {\n            var history = await History.findOrCreate(res.data);\n            App.globalTo(\n              () => ComicReadingPage.ehentai(\n                res.data,\n                initialPage: history.page,\n              ),\n            );\n          }\n        }\n      case ComicType.jm:\n        {\n          var res = await JmNetwork().getComicInfo(comic.target);\n          if (cancel) return;\n          controller.close();\n          if (res.error) {\n            showToast(message: res.errorMessage ?? \"Error\");\n          } else {\n            var history = await History.findOrCreate(res.data);\n            App.globalTo(\n              () => ComicReadingPage.jmComic(\n                res.data,\n                history.ep,\n                initialPage: history.page,\n              ),\n            );\n          }\n        }\n      case ComicType.hitomi:\n        {\n          var res = await HiNetwork().getComicInfo(comic.target);\n          if (cancel) return;\n          controller.close();\n          if (res.error) {\n            showToast(message: res.errorMessage ?? \"Error\");\n          } else {\n            var history = await History.findOrCreate(res.data);\n            App.globalTo(\n              () => ComicReadingPage.hitomi(\n                res.data,\n                comic.target,\n                initialPage: history.page,\n              ),\n            );\n          }\n        }\n      case ComicType.htManga:\n        {\n          var res = await HtmangaNetwork().getComicInfo(comic.target);\n          if (cancel) return;\n          controller.close();\n          if (res.error) {\n            showToast(message: res.errorMessage ?? \"Error\");\n          } else {\n            var history = await History.findOrCreate(res.data);\n            App.globalTo(\n              () => ComicReadingPage.htmanga(\n                res.data.id,\n                comic.name,\n                initialPage: history.page,\n              ),\n            );\n          }\n        }\n      case ComicType.nhentai:\n        {\n          var res = await NhentaiNetwork().getComicInfo(comic.target);\n          if (cancel) return;\n          controller.close();\n          if (res.error) {\n            showToast(message: res.errorMessage ?? \"Error\");\n          } else {\n            var history = await History.findOrCreate(res.data);\n            App.globalTo(\n              () => ComicReadingPage.nhentai(\n                res.data.id,\n                res.data.title,\n                initialPage: history.page,\n              ),\n            );\n          }\n        }\n      default:\n        {\n          var res = await comic.type.comicSource.loadComicInfo!(comic.target);\n          if (cancel) return;\n          controller.close();\n          if (res.error) {\n            showToast(message: res.errorMessage ?? \"Error\");\n          } else {\n            var history = await History.findOrCreate(res.data);\n            App.globalTo(\n              () => ComicReadingPage(\n                CustomReadingData(\n                  res.data.target,\n                  res.data.title,\n                  comic.type.comicSource,\n                  res.data.chapters,\n                ),\n                history.page,\n                history.ep,\n              ),\n            );\n          }\n        }\n    }\n  }\n\n  @override\n  ActionFunc get read => readComic;\n\n  void copyTo() {\n    String? folder;\n    showDialog(\n        context: App.globalContext!,\n        builder: (context) => SimpleDialog(\n              title: Text(\"复制到\".tl),\n              children: [\n                SizedBox(\n                  width: 280,\n                  height: 132,\n                  child: Column(\n                    children: [\n                      ListTile(\n                        title: Text(\"收藏夹\".tl),\n                        trailing: Select(\n                          outline: true,\n                          width: 156,\n                          values: LocalFavoritesManager().folderNames,\n                          initialValue: null,\n                          onChange: (i) =>\n                              folder = LocalFavoritesManager().folderNames[i],\n                        ),\n                      ),\n                      const Spacer(),\n                      Center(\n                        child: FilledButton(\n                          child: Text(\"确认\".tl),\n                          onPressed: () {\n                            LocalFavoritesManager().addComic(folder!, comic);\n                            App.globalBack();\n                          },\n                        ),\n                      ),\n                      const SizedBox(\n                        height: 16,\n                      ),\n                    ],\n                  ),\n                )\n              ],\n            ));\n  }\n\n  @override\n  void onTap_() {\n    if (onTap != null) {\n      var res = onTap!();\n      if (res) return;\n    }\n    if (!comic.available) {\n      showToast(message: \"无效的漫画\".tl);\n      return;\n    }\n    if (appdata.settings[60] == \"0\") {\n      showInfo();\n    } else {\n      read();\n    }\n  }\n\n  @override\n  String get comicID => comic.target;\n\n  void editTags() {\n    showDialog(\n        context: App.globalContext!,\n        builder: (context) {\n          var tags = comic.tags;\n          var controller = TextEditingController();\n          return SimpleDialog(\n            elevation: 1,\n            title: Text(\"编辑标签\".tl),\n            children: [\n              StatefulBuilder(\n                  builder: (context, setState) => SizedBox(\n                        width: 400,\n                        child: Column(\n                          children: [\n                            Wrap(\n                              children: tags\n                                  .map((e) => Container(\n                                        margin: const EdgeInsets.all(4),\n                                        padding: const EdgeInsets.symmetric(\n                                            horizontal: 8, vertical: 6),\n                                        decoration: BoxDecoration(\n                                            color: Theme.of(context)\n                                                .colorScheme\n                                                .secondaryContainer,\n                                            borderRadius:\n                                                BorderRadius.circular(8)),\n                                        child: Row(\n                                          mainAxisSize: MainAxisSize.min,\n                                          children: [\n                                            Text(e),\n                                            const SizedBox(\n                                              width: 4,\n                                            ),\n                                            InkWell(\n                                              borderRadius:\n                                                  BorderRadius.circular(10),\n                                              child: const Icon(\n                                                Icons.close,\n                                                size: 20,\n                                              ),\n                                              onTap: () {\n                                                tags.remove(e);\n                                                setState(() {});\n                                              },\n                                            )\n                                          ],\n                                        ),\n                                      ))\n                                  .toList(),\n                            ),\n                            const SizedBox(\n                              height: 8,\n                            ),\n                            SizedBox(\n                              height: 56,\n                              child: TextField(\n                                controller: controller,\n                                decoration: InputDecoration(\n                                  border: const UnderlineInputBorder(),\n                                  suffix: IconButton(\n                                    icon: const Icon(Icons.add),\n                                    onPressed: () {\n                                      var value = controller.text;\n                                      if (value.isNotEmpty) {\n                                        controller.clear();\n                                        tags.add(value);\n                                        setState(() {});\n                                      }\n                                    },\n                                  ).paddingTop(8),\n                                ),\n                                onSubmitted: (value) {\n                                  if (value.isNotEmpty) {\n                                    tags.add(value);\n                                    controller.clear();\n                                    setState(() {});\n                                  }\n                                },\n                              ),\n                            ).paddingHorizontal(36),\n                            const SizedBox(\n                              height: 16,\n                            ),\n                            Center(\n                              child: FilledButton(\n                                  onPressed: () {\n                                    LocalFavoritesManager().editTags(\n                                        comic.target, folderName, tags);\n                                    App.globalBack();\n                                    StateController.findOrNull<\n                                            FavoritesPageController>()\n                                        ?.update();\n                                    StateController.findOrNull(\n                                            tag: \"local_search_page\")\n                                        ?.update();\n                                  },\n                                  child: Text(\"提交\".tl)),\n                            )\n                          ],\n                        ),\n                      ))\n            ],\n          );\n        });\n  }\n}\n\nvoid copyAllTo(String source, List<FavoriteItem> comics) {\n  String? folder;\n  showDialog(\n      context: App.globalContext!,\n      builder: (context) => SimpleDialog(\n            title: Text(\"复制到\".tl),\n            children: [\n              SizedBox(\n                width: 280,\n                height: 132,\n                child: Column(\n                  children: [\n                    ListTile(\n                      title: Text(\"收藏夹\".tl),\n                      trailing: Select(\n                        outline: true,\n                        width: 156,\n                        values: LocalFavoritesManager().folderNames,\n                        initialValue: null,\n                        onChange: (i) =>\n                            folder = LocalFavoritesManager().folderNames[i],\n                      ),\n                    ),\n                    const Spacer(),\n                    Center(\n                      child: FilledButton(\n                        child: Text(\"确认\".tl),\n                        onPressed: () {\n                          for (var comic in comics) {\n                            LocalFavoritesManager().addComic(\n                                folder!,\n                                LocalFavoritesManager().getComic(\n                                    source, comic.target, comic.type));\n                          }\n                          App.globalBack();\n                        },\n                      ),\n                    ),\n                    const SizedBox(\n                      height: 16,\n                    ),\n                  ],\n                ),\n              )\n            ],\n          ));\n}\n\nclass LocalFavoritesFolder extends StatefulWidget {\n  const LocalFavoritesFolder(this.name, {super.key});\n\n  final String name;\n\n  @override\n  State<LocalFavoritesFolder> createState() => _LocalFavoritesFolderState();\n}\n\nclass _LocalFavoritesFolderState extends State<LocalFavoritesFolder> {\n  final _key = GlobalKey();\n  var reorderWidgetKey = UniqueKey();\n  final _scrollController = ScrollController();\n  late var comics = LocalFavoritesManager().getAllComics(widget.name);\n  double? width;\n  bool changed = false;\n\n  Color lightenColor(Color color, double lightenValue) {\n    int red = (color.red + ((255 - color.red) * lightenValue)).round();\n    int green = (color.green + ((255 - color.green) * lightenValue)).round();\n    int blue = (color.blue + ((255 - color.blue) * lightenValue)).round();\n\n    return Color.fromARGB(color.alpha, red, green, blue);\n  }\n\n  @override\n  void initState() {\n    width = MediaQuery.of(App.globalContext!).size.width;\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    if (changed) {\n      LocalFavoritesManager().reorder(comics, widget.name);\n    }\n    LocalFavoriteTile.cache.clear();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var tiles = List.generate(\n        comics.length,\n        (index) => LocalFavoriteTile(\n              comics[index],\n              widget.name,\n              () {\n                changed = true;\n                setState(() {\n                  comics = LocalFavoritesManager().getAllComics(widget.name);\n                });\n              },\n              false,\n              key: Key(comics[index].target),\n            ));\n    return Scaffold(\n      appBar: AppBar(title: Text(widget.name)),\n      body: Column(\n        children: [\n          Expanded(\n            child: ReorderableBuilder(\n              key: reorderWidgetKey,\n              scrollController: _scrollController,\n              longPressDelay: App.isDesktop\n                  ? const Duration(milliseconds: 100)\n                  : const Duration(milliseconds: 500),\n              onReorder: (reorderFunc) {\n                changed = true;\n                setState(() {\n                  comics = reorderFunc(comics) as List<FavoriteItem>;\n                });\n              },\n              dragChildBoxDecoration: BoxDecoration(\n                  borderRadius: BorderRadius.circular(16),\n                  color: lightenColor(\n                      Theme.of(context).splashColor.withOpacity(1), 0.2)),\n              builder: (children) {\n                return GridView(\n                  key: _key,\n                  controller: _scrollController,\n                  gridDelegate: SliverGridDelegateWithComics(),\n                  children: children,\n                );\n              },\n              children: tiles,\n            ),\n          )\n        ],\n      ),\n    );\n  }\n}\n\n/// Check the availability of comics in folder\nFuture<void> checkFolder(String name) async {\n  var comics = LocalFavoritesManager().getAllComics(name);\n  int unavailableNum = 0;\n  int networkError = 0;\n  int checked = 0;\n\n  Stream<(int current, int total)> check() async* {\n    for (var comic in comics) {\n      bool available = true;\n      switch (comic.type.comicType) {\n        case ComicType.picacg:\n          var res = await PicacgNetwork().getComicInfo(comic.target);\n          if (res.error && !res.errorMessageWithoutNull.contains(\"404\")) {\n            networkError++;\n          } else if (res.error) {\n            available = false;\n          }\n        case ComicType.ehentai:\n          var res = await EhNetwork().getGalleryInfo(comic.target);\n          if (res.error && !res.errorMessageWithoutNull.contains(\"404\")) {\n            networkError++;\n          } else if (res.error) {\n            available = false;\n          }\n        case ComicType.jm:\n          var res = await JmNetwork().getComicInfo(comic.target);\n          if (res.error && !res.errorMessageWithoutNull.contains(\"404\")) {\n            networkError++;\n          } else if (res.error) {\n            available = false;\n          }\n        case ComicType.hitomi:\n          var res = await HiNetwork().getComicInfo(comic.target);\n          if (res.error && !res.errorMessageWithoutNull.contains(\"404\")) {\n            networkError++;\n          } else if (res.error) {\n            available = false;\n          }\n        case ComicType.htManga:\n          var res = await HtmangaNetwork().getComicInfo(comic.target);\n          if (res.error && !res.errorMessageWithoutNull.contains(\"404\")) {\n            networkError++;\n          } else if (res.error) {\n            available = false;\n          }\n        case ComicType.nhentai:\n          var res = await NhentaiNetwork().getComicInfo(comic.target);\n          if (res.error && !res.errorMessageWithoutNull.contains(\"404\")) {\n            networkError++;\n          } else if (res.error) {\n            available = false;\n          }\n        default:\n          var res = await comic.type.comicSource.loadComicInfo!(comic.target);\n          if (res.error && !res.errorMessageWithoutNull.contains(\"404\")) {\n            networkError++;\n          } else if (res.error) {\n            available = false;\n          }\n      }\n      if (!available) {\n        unavailableNum++;\n        if (!comic.tags.contains(\"Unavailable\")) {\n          LocalFavoritesManager().addTagTo(name, comic.target, \"Unavailable\");\n        }\n      }\n      checked++;\n      yield (checked, comics.length);\n    }\n  }\n\n  await showDialog(\n      context: App.globalContext!,\n      builder: (context) {\n        return Dialog(\n          child: StreamBuilder(\n              stream: check(),\n              builder: (context, snapshot) {\n                if (checked == comics.length) {\n                  return SizedBox(\n                    height: 200,\n                    width: 200,\n                    child: Center(\n                      child: Column(\n                        mainAxisSize: MainAxisSize.min,\n                        children: [\n                          Icon(\n                            Icons.check_circle,\n                            size: 54,\n                            color: Theme.of(context).colorScheme.primary,\n                          ),\n                          const SizedBox(\n                            height: 12,\n                          ),\n                          Text(\"Unavailable: $unavailableNum\"),\n                          Text(\"Network Error: $networkError\"),\n                        ],\n                      ),\n                    ),\n                  );\n                }\n                return SizedBox(\n                  height: 200,\n                  width: 200,\n                  child: Center(\n                    child: Column(\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        const CircularProgressIndicator(),\n                        const SizedBox(\n                          height: 12,\n                        ),\n                        Text(\"$checked/${comics.length}\")\n                      ],\n                    ),\n                  ),\n                );\n              }),\n        );\n      });\n}\n"
  },
  {
    "path": "lib/pages/favorites/local_search_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/foundation/ui_mode.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/components/components.dart';\nimport '../../foundation/app.dart';\nimport '../../foundation/local_favorites.dart';\nimport 'local_favorites.dart';\nimport 'main_favorites_page.dart';\n\nclass LocalSearchPage extends StatefulWidget {\n  /// Search page for local favorites\n  const LocalSearchPage({super.key});\n\n  @override\n  State<LocalSearchPage> createState() => _LocalSearchPageState();\n}\n\nclass _LocalSearchPageState extends StateWithController<LocalSearchPage> {\n  var comics = <FavoriteItemWithFolderInfo>[];\n\n  String keyword = \"\";\n\n  final controller = TextEditingController();\n\n  final _focusNode = FocusNode();\n\n  void search() {\n    if (keyword.isEmpty) {\n      comics = [];\n    } else {\n      comics = LocalFavoritesManager().search(keyword);\n    }\n  }\n\n  @override\n  void initState() {\n    Future.delayed(const Duration(milliseconds: 200), _focusNode.requestFocus);\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    search();\n    return Material(\n      child: Column(\n        children: [\n          SizedBox(\n            height:\n            UiMode.m1(context) ? MediaQuery.of(context).padding.top : null,\n          ),\n          Container(\n            height: 56,\n            width: double.infinity,\n            decoration: BoxDecoration(\n                border: Border(\n                    bottom: BorderSide(\n                        color: Theme.of(context).colorScheme.outline,\n                        width: 0.8))),\n            child: Row(\n              children: [\n                Tooltip(\n                  message: \"Back\",\n                  child: IconButton(\n                    icon: const Icon(Icons.arrow_back_sharp),\n                    onPressed: () {\n                      App.back(context);\n                    },\n                  ),\n                ),\n                Expanded(\n                  child: TextField(\n                    focusNode: _focusNode,\n                    controller: controller,\n                    decoration: const InputDecoration(\n                        border: InputBorder.none, hintText: \"Search\"),\n                    onSubmitted: (s) => search(),\n                    onChanged: (s) => setState(() {\n                      keyword = s;\n                    }),\n                  ),\n                ),\n                if (keyword.isNotEmpty)\n                  Tooltip(\n                    message: \"clear\",\n                    child: IconButton(\n                      icon: const Icon(Icons.clear_rounded),\n                      onPressed: () {\n                        controller.clear();\n                        setState(() {\n                          keyword = \"\";\n                        });\n                      },\n                    ),\n                  ),\n                if (comics.isNotEmpty)\n                  Tooltip(\n                    message: \"create folder\",\n                    child: IconButton(\n                      icon: const Icon(Icons.create_new_folder_outlined),\n                      onPressed: () {\n                        showConfirmDialog(\n                          App.globalContext!,\n                          \"创建收藏夹\".tl,\n                          \"从当前的搜索结果创建新的收藏夹\".tl,\n                              () {\n                            var name = LocalFavoritesManager()\n                                .createFolder(\"search result\", true);\n                            for (var comic in comics) {\n                              LocalFavoritesManager().addComic(name, comic.comic);\n                            }\n                            StateController.findOrNull<FavoritesPageController>()\n                                ?.update();\n                          },\n                        );\n                      },\n                    ),\n                  ),\n              ],\n            ),\n          ),\n          Expanded(\n            child: GridView.builder(\n              primary: false,\n              gridDelegate: SliverGridDelegateWithComics(),\n              itemCount: comics.length,\n              padding: EdgeInsets.zero,\n              itemBuilder: (BuildContext context, int index) {\n                return LocalFavoriteTile(\n                  comics[index].comic,\n                  comics[index].folder,\n                      () => setState(() {}),\n                  true,\n                  showFolderInfo: true,\n                );\n              },\n            ),\n          )\n        ],\n      ),\n    );\n  }\n\n  @override\n  Object? get tag => \"local_search_page\";\n}\n"
  },
  {
    "path": "lib/pages/favorites/main_favorites_page.dart",
    "content": "import \"dart:async\";\n\nimport \"package:collection/collection.dart\";\nimport \"package:flutter/material.dart\";\nimport \"package:flutter_reorderable_grid_view/widgets/reorderable_builder.dart\";\nimport \"package:pica_comic/base.dart\";\nimport \"package:pica_comic/comic_source/comic_source.dart\";\nimport 'package:pica_comic/components/components.dart';\nimport \"package:pica_comic/foundation/app.dart\";\nimport \"package:pica_comic/foundation/local_favorites.dart\";\nimport \"package:pica_comic/foundation/log.dart\";\nimport \"package:pica_comic/network/download.dart\";\nimport \"package:pica_comic/tools/translations.dart\";\n\nimport \"../../network/net_fav_to_local.dart\";\nimport \"../../tools/io_tools.dart\";\nimport \"local_favorites.dart\";\nimport \"local_search_page.dart\";\nimport \"network_favorite_page.dart\";\n\nclass FavoritesPageController extends StateController {\n  String? current;\n\n  bool? isNetwork;\n\n  bool selectingFolder = true;\n\n  FavoriteData? networkData;\n\n  var selectedComics = <FavoriteItem>[];\n\n  var openComicMenuFuncs = <FavoriteItem, Function>{};\n\n  bool get isSelectingComics => selectedComics.isNotEmpty;\n\n  FavoritesPageController() {\n    var data = appdata.implicitData[0].split(\";\");\n    selectingFolder = data[0] == \"1\";\n    if (data[1] == \"\") {\n      isNetwork = null;\n    } else {\n      isNetwork = data[1] == \"1\";\n    }\n    if (data.length > 3) {\n      current = data.sublist(2).join(\";\");\n    } else {\n      current = data[2];\n    }\n    if (current == \"\") {\n      current = null;\n    }\n    if (isNetwork ?? false) {\n      final folders =\n          appdata.settings[68].split(',').map((e) => getFavoriteDataOrNull(e));\n      networkData =\n          folders.firstWhereOrNull((element) => element?.title == current);\n      if (networkData == null) {\n        current = null;\n        selectingFolder = true;\n        isNetwork = null;\n      }\n    }\n  }\n\n  @override\n  void update([List<Object>? ids]) {\n    if (selectedComics.isEmpty) {\n      openComicMenuFuncs.clear();\n    }\n    super.update(ids);\n  }\n}\n\nconst _kSecondaryTopBarHeight = 48.0;\n\nclass FavoritesPage extends StatelessWidget with _LocalFavoritesManager {\n  FavoritesPage({super.key});\n\n  final controller = StateController.putIfNotExists<FavoritesPageController>(\n      FavoritesPageController());\n\n  @override\n  Widget build(BuildContext context) {\n    return StateBuilder<FavoritesPageController>(builder: (controller) {\n      return buildPage(context);\n    });\n  }\n\n  Widget buildPage(BuildContext context) {\n    return LayoutBuilder(\n        builder: (context, constrains) => Stack(\n              children: [\n                Positioned(\n                  top: _kSecondaryTopBarHeight,\n                  left: 0,\n                  right: 0,\n                  bottom: 0,\n                  child: buildContent(context),\n                ),\n                AnimatedPositioned(\n                  key: const Key(\"folders\"),\n                  duration: const Duration(milliseconds: 180),\n                  left: 0,\n                  right: 0,\n                  bottom: controller.selectingFolder\n                      ? 0\n                      : constrains.maxHeight - _kSecondaryTopBarHeight,\n                  child: buildFoldersList(\n                      context, constrains.maxHeight - _kSecondaryTopBarHeight),\n                ),\n                Positioned(\n                  top: 0,\n                  left: 0,\n                  right: 0,\n                  child: buildTopBar(context),\n                ),\n              ],\n            ));\n  }\n\n  void multiSelectedMenu() {\n    final size = MediaQuery.of(App.globalContext!).size;\n    showMenu(\n        context: App.globalContext!,\n        position: RelativeRect.fromLTRB(size.width, 0, 0, size.height),\n        items: [\n          PopupMenuItem(\n            child: Text(\"删除\".tl),\n            onTap: () {\n              for (var comic in controller.selectedComics) {\n                LocalFavoritesManager().deleteComic(controller.current!, comic);\n              }\n              controller.selectedComics.clear();\n              controller.update();\n            },\n          ),\n          PopupMenuItem(\n            child: Text(\"复制到\".tl),\n            onTap: () {\n              Future.delayed(\n                const Duration(milliseconds: 200),\n                () => copyAllTo(controller.current!, controller.selectedComics),\n              );\n            },\n          ),\n          PopupMenuItem(\n            child: Text(\"下载\".tl),\n            onTap: () {\n              Future.delayed(\n                const Duration(milliseconds: 200),\n                () {\n                  var comics = controller.selectedComics;\n                  for (var comic in comics) {\n                    DownloadManager().addFavoriteDownload(comic);\n                  }\n                  showToast(message: \"已添加下载任务\".tl);\n                },\n              );\n            },\n          ),\n          PopupMenuItem(\n            child: Text(\"更新漫画信息\".tl),\n            onTap: () {\n              Future.delayed(\n                const Duration(milliseconds: 200),\n                () {\n                  var comics = controller.selectedComics;\n                  UpdateFavoritesInfoDialog.show(comics, controller.current!);\n                },\n              );\n            },\n          ),\n        ]);\n  }\n\n  Widget buildTopBar(BuildContext context) {\n    final iconColor = Theme.of(context).colorScheme.primary;\n\n    if (controller.isSelectingComics) {\n      return Material(\n        elevation: 1,\n        child: SizedBox(\n          height: _kSecondaryTopBarHeight,\n          child: Row(children: [\n            Icon(\n              Icons.local_activity,\n              color: iconColor,\n            ),\n            const SizedBox(\n              width: 8,\n            ),\n            Text(\n              \"已选择 @num 个项目\".tlParams(\n                  {\"num\": controller.selectedComics.length.toString()}),\n              style: const TextStyle(fontSize: 16),\n            ).paddingBottom(3),\n            const Spacer(),\n            Tooltip(\n              message: \"全选\".tl,\n              child: IconButton(\n                icon: const Icon(Icons.select_all),\n                onPressed: () {\n                  controller.selectedComics = LocalFavoritesManager()\n                      .getAllComics(controller.current!)\n                      .toList();\n                  controller.update();\n                },\n              ),\n            ),\n            Tooltip(\n              message: \"取消\".tl,\n              child: IconButton(\n                icon: const Icon(Icons.deselect),\n                onPressed: () {\n                  controller.selectedComics.clear();\n                  controller.update();\n                },\n              ),\n            ),\n            Tooltip(\n              message: \"菜单\".tl,\n              child: IconButton(\n                icon: const Icon(Icons.more_horiz),\n                onPressed: () {\n                  if (controller.selectedComics.length == 1) {\n                    controller.openComicMenuFuncs[controller.selectedComics[0]]\n                        ?.call();\n                  } else {\n                    multiSelectedMenu();\n                  }\n                },\n              ),\n            ),\n          ]).paddingHorizontal(16),\n        ),\n      );\n    }\n\n    return Material(\n      elevation: 1,\n      child: InkWell(\n        hoverColor: Colors.transparent,\n        onTap: () {\n          if (controller.selectingFolder) {\n            if (controller.current == null) {\n              showToast(message: \"选择收藏夹\".tl);\n              return;\n            }\n            controller.selectingFolder = false;\n            controller.update();\n          } else {\n            controller.selectingFolder = true;\n            controller.update();\n            appdata.implicitData[0] = \"1;;\";\n            appdata.writeImplicitData();\n          }\n        },\n        child: SizedBox(\n          height: _kSecondaryTopBarHeight,\n          child: Row(children: [\n            if (controller.isNetwork == null)\n              Icon(\n                Icons.folder,\n                color: iconColor,\n              )\n            else if (controller.isNetwork!)\n              Icon(\n                Icons.folder_special,\n                color: iconColor,\n              )\n            else\n              Icon(\n                Icons.local_activity,\n                color: iconColor,\n              ),\n            const SizedBox(\n              width: 8,\n            ),\n            Text(\n              controller.current ?? \"未选择\".tl,\n              style: const TextStyle(fontSize: 16),\n            ).paddingBottom(3),\n            const Spacer(),\n            if (controller.selectingFolder)\n              const Icon(Icons.keyboard_arrow_up)\n            else\n              const Icon(Icons.keyboard_arrow_down),\n          ]).paddingHorizontal(16),\n        ),\n      ),\n    );\n  }\n\n  Widget buildFoldersList(BuildContext context, double height) {\n    return Material(\n      child: SizedBox(\n        height: height,\n        width: double.infinity,\n        child: SmoothCustomScrollView(\n          slivers: [\n            buildTitle(\"网络\".tl)\n                .sliverPadding(const EdgeInsets.fromLTRB(12, 8, 12, 0)),\n            buildNetwork().sliverPaddingHorizontal(12),\n            const SliverToBoxAdapter(child: Divider())\n                .sliverPaddingHorizontal(12),\n            buildTitle(\"本地\".tl).sliverPaddingHorizontal(12),\n            buildUtils(context),\n            buildLocal().sliverPaddingHorizontal(12),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildTitle(String title) {\n    return SliverToBoxAdapter(\n      child: Padding(\n        padding: const EdgeInsets.all(8),\n        child: Text(title, style: const TextStyle(fontSize: 18)),\n      ),\n    );\n  }\n\n  Widget buildNetwork() {\n    var folders = appdata.appSettings.networkFavorites\n        .map((e) => getFavoriteDataOrNull(e));\n    folders = folders.whereType<FavoriteData>();\n    return SliverGrid(\n      gridDelegate: const SliverGridDelegateWithFixedHeight(\n        maxCrossAxisExtent: 240,\n        itemHeight: 48,\n      ),\n      delegate: SliverChildBuilderDelegate((context, index) {\n        final data = folders.elementAt(index);\n        return InkWell(\n          onTap: () {\n            controller.current = data?.title;\n            controller.isNetwork = true;\n            controller.selectingFolder = false;\n            controller.networkData = data;\n            controller.update();\n            appdata.implicitData[0] = \"0;1;${data?.title ?? \"\"}\";\n            appdata.writeImplicitData();\n          },\n          borderRadius: BorderRadius.circular(8),\n          child: Row(\n            children: [\n              const SizedBox(width: 16),\n              Icon(\n                Icons.folder_special,\n                color: Theme.of(context).colorScheme.secondary,\n              ),\n              const SizedBox(width: 8),\n              Text(data?.title ?? \"Unknown\"),\n            ],\n          ),\n        );\n      }, childCount: folders.length),\n    );\n  }\n\n  Widget buildLocal() {\n    final folders = LocalFavoritesManager().folderNames;\n    return SliverGrid(\n      gridDelegate: const SliverGridDelegateWithFixedHeight(\n        maxCrossAxisExtent: 260,\n        itemHeight: 48,\n      ),\n      delegate: SliverChildBuilderDelegate((context, index) {\n        final data = folders.elementAt(index);\n        return GestureDetector(\n          onLongPressStart: (details) =>\n              _showMenu(data, details.globalPosition),\n          child: InkWell(\n            onTap: () {\n              controller.current = data;\n              controller.isNetwork = false;\n              controller.selectingFolder = false;\n              controller.update();\n              appdata.implicitData[0] = \"0;0;$data\";\n              appdata.writeImplicitData();\n            },\n            onSecondaryTapUp: (details) =>\n                _showDesktopMenu(data, details.globalPosition),\n            borderRadius: BorderRadius.circular(8),\n            child: Row(\n              children: [\n                const SizedBox(width: 16),\n                Icon(\n                  Icons.local_activity,\n                  color: Theme.of(context).colorScheme.secondary,\n                ),\n                const SizedBox(width: 8),\n                Expanded(\n                  child: Text(\n                    data,\n                    maxLines: 2,\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                ),\n                const SizedBox(width: 8),\n                Container(\n                  height: 18,\n                  padding: const EdgeInsets.symmetric(horizontal: 6),\n                  decoration: BoxDecoration(\n                      color: Theme.of(context).colorScheme.primaryContainer,\n                      borderRadius: BorderRadius.circular(8)),\n                  child: Text(\n                    LocalFavoritesManager().count(data).toString(),\n                    style: const TextStyle(fontSize: 12),\n                  ),\n                ),\n                const SizedBox(width: 12),\n              ],\n            ),\n          ),\n        );\n      }, childCount: folders.length),\n    );\n  }\n\n  Widget buildUtils(BuildContext context) {\n    Widget buildItem(String title, IconData icon, VoidCallback onTap) {\n      return InkWell(\n        onTap: onTap,\n        borderRadius: const BorderRadius.all(Radius.circular(8)),\n        child: SizedBox(\n          height: 72,\n          width: 64,\n          child: Column(\n            children: [\n              const SizedBox(\n                height: 12,\n              ),\n              Icon(\n                icon,\n                size: 24,\n                color: Theme.of(context).colorScheme.primary,\n              ),\n              const SizedBox(\n                height: 8,\n              ),\n              Text(\n                title,\n                style: const TextStyle(fontSize: 12),\n              )\n            ],\n          ),\n        ),\n      );\n    }\n\n    return SliverToBoxAdapter(\n      child: Wrap(\n        children: [\n          buildItem(\"新建\".tl, Icons.add, () {\n            showDialog(\n                    context: context,\n                    builder: (context) => const CreateFolderDialog())\n                .then((value) => controller.update());\n          }),\n          buildItem(\"搜索\".tl, Icons.search,\n              () => App.to(context, () => const LocalSearchPage())),\n          buildItem(\"排序\".tl, Icons.reorder, () {\n            context.to(() => const _FoldersReorderPage());\n          })\n        ],\n      ).paddingHorizontal(12),\n    );\n  }\n\n  Widget buildContent(BuildContext context) {\n    if (controller.current == null) {\n      return const SizedBox();\n    } else if (controller.isNetwork!) {\n      return NetworkFavoritePage(\n        controller.networkData!,\n        key: Key(controller.current ?? \"\"),\n      );\n    } else {\n      var count = LocalFavoritesManager().count(controller.current!);\n      return ComicsPageView(\n        key: Key(controller.current! + count.toString()),\n        folder: controller.current!,\n        selectedComics: controller.selectedComics,\n        onClick: (key) {\n          if (controller.isSelectingComics) {\n            if (controller.selectedComics.contains(key)) {\n              controller.selectedComics.remove(key);\n            } else {\n              controller.selectedComics.add(key);\n            }\n            controller.update();\n            return true;\n          }\n          return false;\n        },\n        onLongPressed: (key) {\n          if (controller.selectedComics.contains(key)) {\n            controller.selectedComics.remove(key);\n          } else {\n            controller.selectedComics.add(key);\n          }\n          controller.update();\n        },\n      );\n    }\n  }\n\n  void _showMenu(String folder, Offset location) {\n    showMenu(\n        context: App.globalContext!,\n        position: RelativeRect.fromLTRB(\n            location.dx, location.dy, location.dx, location.dy),\n        items: [\n          PopupMenuItem(\n            child: Text(\"删除\".tl),\n            onTap: () {\n              App.globalBack();\n              deleteFolder(folder);\n            },\n          ),\n          PopupMenuItem(\n            child: Text(\"排序\".tl),\n            onTap: () {\n              App.globalBack();\n              App.globalTo(() => LocalFavoritesFolder(folder))\n                  .then((value) => controller.update());\n            },\n          ),\n          PopupMenuItem(\n            child: Text(\"重命名\".tl),\n            onTap: () {\n              App.globalBack();\n              rename(folder);\n            },\n          ),\n          PopupMenuItem(\n            child: Text(\"检查漫画存活\".tl),\n            onTap: () {\n              App.globalBack();\n              checkFolder(folder).then((value) {\n                controller.update();\n              });\n            },\n          ),\n          PopupMenuItem(\n            child: Text(\"导出\".tl),\n            onTap: () {\n              App.globalBack();\n              export(folder);\n            },\n          ),\n          PopupMenuItem(\n            child: Text(\"下载全部\".tl),\n            onTap: () {\n              App.globalBack();\n              addDownload(folder);\n            },\n          ),\n          PopupMenuItem(\n            child: Text(\"更新漫画信息\".tl),\n            onTap: () {\n              App.globalBack();\n              var comics = LocalFavoritesManager().getAllComics(folder);\n              UpdateFavoritesInfoDialog.show(comics, folder);\n            },\n          ),\n        ]);\n  }\n\n  void _showDesktopMenu(String folder, Offset location) {\n    showDesktopMenu(App.globalContext!, location, [\n      DesktopMenuEntry(\n          text: \"删除\".tl,\n          onClick: () {\n            deleteFolder(folder);\n          }),\n      DesktopMenuEntry(\n          text: \"排序\".tl,\n          onClick: () {\n            App.globalTo(() => LocalFavoritesFolder(folder))\n                .then((value) => controller.update());\n          }),\n      DesktopMenuEntry(\n          text: \"重命名\".tl,\n          onClick: () {\n            rename(folder);\n          }),\n      DesktopMenuEntry(\n          text: \"检查漫画存活\".tl,\n          onClick: () {\n            checkFolder(folder).then((value) {\n              controller.update();\n            });\n          }),\n      DesktopMenuEntry(\n          text: \"导出\".tl,\n          onClick: () {\n            export(folder);\n          }),\n      DesktopMenuEntry(\n          text: \"下载全部\".tl,\n          onClick: () {\n            addDownload(folder);\n          }),\n      DesktopMenuEntry(\n          text: \"更新漫画信息\".tl,\n          onClick: () {\n            var comics = LocalFavoritesManager().getAllComics(folder);\n            UpdateFavoritesInfoDialog.show(comics, folder);\n          }),\n    ]);\n  }\n}\n\nmixin class _LocalFavoritesManager {\n  void deleteFolder(String folder) {\n    showConfirmDialog(App.globalContext!, \"确认删除\".tl, \"此操作无法撤销, 是否继续?\", () {\n      App.globalBack();\n      LocalFavoritesManager().deleteFolder(folder);\n      final controller = StateController.find<FavoritesPageController>();\n      if (controller.current == folder && !controller.isNetwork!) {\n        controller.current = null;\n        controller.isNetwork = null;\n      }\n      controller.update();\n    });\n  }\n\n  void rename(String folder) async {\n    await showDialog(\n        context: App.globalContext!,\n        builder: (context) => RenameFolderDialog(folder));\n    StateController.find<FavoritesPageController>().update();\n  }\n\n  void export(String folder) async {\n    var controller = showLoadingDialog(\n      App.globalContext!,\n      onCancel: () {},\n      message: \"正在导出\".tl,\n    );\n    try {\n      await exportStringDataAsFile(\n          LocalFavoritesManager().folderToJsonString(folder), \"$folder.json\");\n      controller.close();\n    } catch (e, s) {\n      controller.close();\n      showToast(message: e.toString());\n      log(\"$e\\n$s\", \"IO\", LogLevel.error);\n    }\n  }\n\n  void addDownload(String folder) {\n    for (var comic in LocalFavoritesManager().getAllComics(folder)) {\n      comic.addDownload();\n    }\n    showToast(message: \"已添加下载任务\".tl);\n  }\n}\n\nclass ComicsPageView extends StatefulWidget {\n  const ComicsPageView(\n      {required this.folder,\n      required this.onClick,\n      required this.selectedComics,\n      required this.onLongPressed,\n      super.key});\n\n  final String folder;\n\n  /// return true to disable default action\n  final bool Function(FavoriteItem item) onClick;\n\n  final void Function(FavoriteItem item) onLongPressed;\n\n  final List<FavoriteItem> selectedComics;\n\n  @override\n  State<ComicsPageView> createState() => _ComicsPageViewState();\n}\n\nclass _ComicsPageViewState extends StateWithController<ComicsPageView> {\n  late ScrollController scrollController;\n  bool showFB = true;\n  double location = 0;\n\n  String get folder => widget.folder;\n\n  FolderSync? folderSync() {\n    final folderSyncArr = LocalFavoritesManager()\n        .folderSync\n        .where((element) => element.folderName == folder)\n        .toList();\n    if (folderSyncArr.isEmpty) return null;\n    return folderSyncArr[0];\n  }\n\n  late List<FavoriteItem> comics;\n\n  @override\n  void initState() {\n    scrollController = ScrollController();\n    scrollController.addListener(() {\n      var current = scrollController.offset;\n\n      if ((current > location && current != 0) && showFB) {\n        setState(() {\n          showFB = false;\n        });\n      } else if ((current < location || current == 0) && !showFB) {\n        setState(() {\n          showFB = true;\n        });\n      }\n\n      location = current;\n    });\n    comics = LocalFavoritesManager().getAllComics(folder);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    scrollController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return buildFolderComics(folder);\n  }\n\n  void rebuild() {\n    setState(() {\n      comics = LocalFavoritesManager().getAllComics(folder);\n    });\n  }\n\n  Future<void> onRefresh(context) async {\n    return startFolderSync(context, folderSync()!);\n  }\n\n  Widget buildFolderComics(String folder) {\n    if (comics.isEmpty) {\n      return buildEmptyView();\n    }\n\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      body: MediaQuery.removePadding(\n        key: Key(folder),\n        removeTop: true,\n        context: context,\n        child: RefreshIndicator(\n          notificationPredicate: (notify) {\n            return folderSync() != null;\n          },\n          onRefresh: () => onRefresh(context),\n          child: Scrollbar(\n            controller: scrollController,\n            interactive: true,\n            thickness: App.isMobile ? 12 : null,\n            radius: const Radius.circular(8),\n            child: ScrollConfiguration(\n              behavior: const ScrollBehavior().copyWith(scrollbars: false),\n              child: SmoothScrollProvider(\n                controller: scrollController,\n                builder: (context, controller, physic) {\n                  return GridView.builder(\n                    key: Key(folder),\n                    primary: false,\n                    controller: controller,\n                    gridDelegate: SliverGridDelegateWithComics(),\n                    itemCount: comics.length,\n                    padding: EdgeInsets.zero,\n                    physics: physic,\n                    itemBuilder: (BuildContext context, int index) {\n                      var comic = comics[index];\n                      var tile = LocalFavoriteTile(\n                        key: ValueKey(comic.toString()),\n                        comic,\n                        folder,\n                        () {\n                          rebuild();\n                          if(widget.selectedComics.contains(comic)) {\n                            var c = StateController.find<FavoritesPageController>();\n                            c.selectedComics.remove(comic);\n                            c.update();\n                          }\n                        },\n                        true,\n                        onTap: () => widget.onClick(comic),\n                        onLongPressed: () => widget.onLongPressed(comic),\n                        showFolderInfo: true,\n                      );\n                      StateController.find<FavoritesPageController>()\n                          .openComicMenuFuncs[comic] = tile.showMenu;\n\n                      Color? color;\n\n                      if (widget.selectedComics.contains(comic)) {\n                        color = Theme.of(context)\n                            .colorScheme\n                            .surfaceContainerHighest;\n                      }\n                      return AnimatedContainer(\n                        decoration: BoxDecoration(\n                          color: color,\n                          borderRadius: BorderRadius.circular(12),\n                        ),\n                        margin: const EdgeInsets.symmetric(\n                            vertical: 2, horizontal: 4),\n                        duration: const Duration(milliseconds: 160),\n                        child: tile,\n                      );\n                    },\n                  );\n                },\n              ),\n            ),\n          ),\n        ),\n      ),\n      floatingActionButton: AnimatedSwitcher(\n        duration: const Duration(milliseconds: 150),\n        reverseDuration: const Duration(milliseconds: 150),\n        child: showFB && folderSync() != null ? buildFAB() : const SizedBox(),\n        transitionBuilder: (widget, animation) {\n          var tween =\n              Tween<Offset>(begin: const Offset(0, 1), end: const Offset(0, 0));\n          return SlideTransition(\n            position: tween.animate(animation),\n            child: widget,\n          );\n        },\n      ),\n    );\n  }\n\n  Widget buildFAB() => Material(\n        color: Colors.transparent,\n        child: FloatingActionButton(\n          key: const Key(\"FAB\"),\n          onPressed: () => onRefresh(context),\n          child: const Icon(Icons.refresh),\n        ),\n      );\n\n  Widget buildEmptyView() {\n    return Padding(\n      padding: const EdgeInsets.only(top: 64),\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Text(\"这里什么都没有\".tl),\n          const SizedBox(\n            height: 8,\n          ),\n          RichText(\n            text: TextSpan(\n              style: Theme.of(context).textTheme.bodyMedium,\n              children: [\n                TextSpan(\n                  text: '前往'.tl,\n                ),\n                TextSpan(\n                  text: '探索页面'.tl,\n                ),\n                TextSpan(\n                  text: '寻找漫画'.tl,\n                ),\n              ],\n            ),\n          )\n        ],\n      ),\n    );\n  }\n\n  @override\n  Object? get tag => \"ComicsPageView $folder\";\n\n  @override\n  refresh() {\n    comics = LocalFavoritesManager().getAllComics(folder);\n    update();\n  }\n}\n\nclass _FoldersReorderPage extends StatefulWidget {\n  const _FoldersReorderPage();\n\n  @override\n  State<_FoldersReorderPage> createState() => _FoldersReorderPageState();\n}\n\nclass _FoldersReorderPageState extends State<_FoldersReorderPage> {\n  var folders = LocalFavoritesManager().folderNames;\n  var changed = false;\n\n  final reorderKey = UniqueKey();\n  final _scrollController = ScrollController();\n  final _key = GlobalKey();\n\n  Color lightenColor(Color color, double lightenValue) {\n    int red = (color.red + ((255 - color.red) * lightenValue)).round();\n    int green = (color.green + ((255 - color.green) * lightenValue)).round();\n    int blue = (color.blue + ((255 - color.blue) * lightenValue)).round();\n\n    return Color.fromARGB(color.alpha, red, green, blue);\n  }\n\n  @override\n  void dispose() {\n    if (changed) {\n      LocalFavoritesManager().updateOrder(Map<String, int>.fromEntries(\n          folders.mapIndexed((index, element) => MapEntry(element, index))));\n      scheduleMicrotask(() {\n        StateController.find<FavoritesPageController>().update();\n      });\n    }\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var tiles = List.generate(\n        folders.length,\n        (index) => MouseRegion(\n              key: ValueKey(folders[index]),\n              cursor: SystemMouseCursors.click,\n              child: Row(\n                children: [\n                  const SizedBox(width: 16),\n                  Icon(\n                    Icons.local_activity,\n                    color: Theme.of(context).colorScheme.secondary,\n                  ),\n                  const SizedBox(width: 8),\n                  Expanded(\n                    child: Text(\n                      folders[index],\n                      maxLines: 2,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                  ),\n                  const SizedBox(width: 12),\n                ],\n              ),\n            ));\n\n    return Scaffold(\n      appBar: AppBar(title: Text(\"排序\".tl)),\n      body: Column(\n        children: [\n          Expanded(\n            child: ReorderableBuilder(\n              key: reorderKey,\n              scrollController: _scrollController,\n              longPressDelay: App.isDesktop\n                  ? const Duration(milliseconds: 100)\n                  : const Duration(milliseconds: 500),\n              onReorder: (reorderFunc) {\n                changed = true;\n                setState(() {\n                  folders = reorderFunc(folders) as List<String>;\n                });\n              },\n              dragChildBoxDecoration: BoxDecoration(\n                  borderRadius: BorderRadius.circular(8),\n                  color: lightenColor(\n                      Theme.of(context).splashColor.withOpacity(1), 0.2)),\n              builder: (children) {\n                return GridView(\n                  key: _key,\n                  controller: _scrollController,\n                  gridDelegate: const SliverGridDelegateWithFixedHeight(\n                    maxCrossAxisExtent: 260,\n                    itemHeight: 56,\n                  ),\n                  children: children,\n                );\n              },\n              children: tiles,\n            ),\n          )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/favorites/network_favorite_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/network/base_comic.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\n\nclass NetworkFavoritePage extends StatelessWidget {\n  const NetworkFavoritePage(this.data, {super.key});\n\n  final FavoriteData data;\n\n  @override\n  Widget build(BuildContext context) {\n    return data.multiFolder\n        ? _MultiFolderFavoritesPage(data)\n        : _NormalFavoritePage(data);\n  }\n}\n\nclass _NormalFavoritePage extends ComicsPage<BaseComic> {\n  const _NormalFavoritePage(this.data);\n\n  final FavoriteData data;\n\n  @override\n  Future<Res<List<BaseComic>>> getComics(int i) {\n    return data.loadComic(i);\n  }\n\n  @override\n  String? get tag => \"Network Comics Page: ${data.title}\";\n\n  @override\n  String? get title => null;\n\n  @override\n  String get sourceKey => data.key;\n\n  @override\n  List<ComicTileMenuOption>? get addonMenuOptions {\n    return [\n      if (data.addOrDelFavorite != null)\n        ComicTileMenuOption(\n          \"取消收藏\".tl,\n          Icons.playlist_remove_outlined,\n          (id) {\n            if (id == null) return;\n            var dialog = showLoadingDialog(App.globalContext!);\n            data.addOrDelFavorite!(id, \"0\", false).then((res) {\n              dialog.close();\n              if (res.error) {\n                showToast(message: res.errorMessage!);\n              } else {\n                refresh();\n              }\n            });\n          },\n        )\n    ];\n  }\n}\n\nclass _MultiFolderFavoritesPage extends StatefulWidget {\n  const _MultiFolderFavoritesPage(this.data);\n\n  final FavoriteData data;\n\n  @override\n  State<_MultiFolderFavoritesPage> createState() =>\n      _MultiFolderFavoritesPageState();\n}\n\nclass _MultiFolderFavoritesPageState extends State<_MultiFolderFavoritesPage> {\n  bool _loading = true;\n\n  String? _errorMessage;\n\n  Map<String, String>? folders;\n\n  void loadPage() async {\n    var res = await widget.data.loadFolders!();\n    _loading = false;\n    if (res.error) {\n      setState(() {\n        _errorMessage = res.errorMessage;\n      });\n    } else {\n      setState(() {\n        folders = res.data;\n      });\n    }\n  }\n\n  void openFolder(String key, String title) {\n    context.to(() => _FavoriteFolder(widget.data, key, title));\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (_loading) {\n      loadPage();\n      return const Center(\n        child: CircularProgressIndicator(),\n      );\n    } else if (_errorMessage != null) {\n      return NetworkError(message: _errorMessage!, withAppbar: false,);\n    } else {\n      var length = folders!.length;\n      if (widget.data.allFavoritesId != null) length++;\n      final keys = folders!.keys.toList();\n\n      return SmoothCustomScrollView(\n        slivers: [\n          SliverGridViewWithFixedItemHeight(\n            delegate:\n                SliverChildBuilderDelegate(childCount: length, (context, i) {\n              if (widget.data.allFavoritesId != null) {\n                if (i == 0) {\n                  return _FolderTile(\n                      name: \"全部\".tl,\n                      onTap: () =>\n                          openFolder(widget.data.allFavoritesId!, \"全部\".tl));\n                } else {\n                  i--;\n                  return _FolderTile(\n                    name: folders![keys[i]]!,\n                    onTap: () => openFolder(keys[i], folders![keys[i]]!),\n                    deleteFolder: widget.data.deleteFolder == null\n                        ? null\n                        : () => widget.data.deleteFolder!(keys[i]),\n                    updateState: () => setState(() {\n                      _loading = true;\n                    }),\n                  );\n                }\n              } else {\n                return _FolderTile(\n                  name: folders![keys[i]]!,\n                  onTap: () => openFolder(keys[i], folders![keys[i]]!),\n                  deleteFolder: widget.data.deleteFolder == null\n                      ? null\n                      : () => widget.data.deleteFolder!(keys[i]),\n                  updateState: () => setState(() {\n                    _loading = true;\n                  }),\n                );\n              }\n            }),\n            maxCrossAxisExtent: 450,\n            itemHeight: 64,\n          ),\n          if (widget.data.addFolder != null)\n            SliverToBoxAdapter(\n              child: SizedBox(\n                height: 60,\n                width: double.infinity,\n                child: Center(\n                  child: TextButton(\n                    child: Row(\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        Text(\"创建收藏夹\".tl),\n                        const Icon(\n                          Icons.add,\n                          size: 18,\n                        ),\n                      ],\n                    ),\n                    onPressed: () {\n                      showDialog(\n                          context: context,\n                          builder: (context) {\n                            return _CreateFolderDialog(\n                                widget.data,\n                                () => setState(() {\n                                      _loading = true;\n                                    }));\n                          });\n                    },\n                  ),\n                ),\n              ),\n            )\n        ],\n      );\n    }\n  }\n}\n\nclass _FolderTile extends StatelessWidget {\n  const _FolderTile(\n      {required this.name,\n      required this.onTap,\n      this.deleteFolder,\n      this.updateState});\n\n  final String name;\n\n  final Future<Res<bool>> Function()? deleteFolder;\n\n  final void Function()? updateState;\n\n  final void Function() onTap;\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      child: InkWell(\n        onTap: onTap,\n        borderRadius: const BorderRadius.all(Radius.circular(8)),\n        child: Padding(\n          padding: const EdgeInsets.fromLTRB(8, 8, 16, 8),\n          child: Row(\n            children: [\n              const SizedBox(\n                width: 16,\n              ),\n              Icon(\n                Icons.folder,\n                size: 35,\n                color: Theme.of(context).colorScheme.secondary,\n              ),\n              const SizedBox(\n                width: 16,\n              ),\n              Expanded(\n                child: Align(\n                  alignment: Alignment.centerLeft,\n                  child: Text(\n                    name,\n                    style: const TextStyle(\n                        fontSize: 16, fontWeight: FontWeight.w500),\n                  ),\n                ),\n              ),\n              if (deleteFolder != null)\n                IconButton(\n                  icon: const Icon(Icons.delete_forever_outlined),\n                  onPressed: () => onDeleteFolder(context),\n                )\n              else\n                const Icon(Icons.arrow_right),\n              if (deleteFolder == null)\n                const SizedBox(\n                  width: 8,\n                )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  void onDeleteFolder(BuildContext context) {\n    showDialog(\n        context: context,\n        builder: (context) {\n          return AlertDialog(\n            title: Text(\"确认删除\".tl),\n            content: Text(\"要删除这个收藏夹吗\".tl),\n            actions: [\n              TextButton(\n                  onPressed: () => App.globalBack(), child: const Text(\"取消\")),\n              TextButton(\n                  onPressed: () async {\n                    context.pop();\n                    showToast(message: \"正在删除收藏夹\".tl);\n                    var res = await deleteFolder!();\n                    showToast(\n                        message: res.error ? res.errorMessage! : \"删除成功\".tl);\n                    if (!res.error) {\n                      updateState?.call();\n                    } else {\n                      showToast(\n                          message: res.error ? res.errorMessage! : \"删除失败\".tl);\n                    }\n                  },\n                  child: Text(\"确认\".tl)),\n            ],\n          );\n        });\n  }\n}\n\nclass _CreateFolderDialog extends StatefulWidget {\n  const _CreateFolderDialog(this.data, this.updateState);\n\n  final FavoriteData data;\n\n  final void Function() updateState;\n\n  @override\n  State<_CreateFolderDialog> createState() => _CreateFolderDialogState();\n}\n\nclass _CreateFolderDialogState extends State<_CreateFolderDialog> {\n  var controller = TextEditingController();\n  bool loading = false;\n\n  @override\n  Widget build(BuildContext context) {\n    return SimpleDialog(\n      title: Text(\"创建收藏夹\".tl),\n      children: [\n        Padding(\n          padding: const EdgeInsets.fromLTRB(20, 0, 20, 0),\n          child: TextField(\n            controller: controller,\n            decoration: InputDecoration(\n              border: const OutlineInputBorder(),\n              labelText: \"名称\".tl,\n            ),\n          ),\n        ),\n        const SizedBox(\n          width: 200,\n          height: 10,\n        ),\n        if (loading)\n          const SizedBox(\n            child: Center(\n              child: CircularProgressIndicator(),\n            ),\n          )\n        else\n          SizedBox(\n              height: 35,\n              child: Center(\n                child: TextButton(\n                    onPressed: () {\n                      setState(() {\n                        loading = true;\n                      });\n                      widget.data.addFolder!(controller.text).then((b) {\n                        if (b.error) {\n                          showToast(message: b.errorMessage!);\n                          setState(() {\n                            loading = false;\n                          });\n                        } else {\n                          context.pop();\n                          showToast(message: \"成功创建\".tl);\n                          widget.updateState();\n                        }\n                      });\n                    },\n                    child: Text(\"提交\".tl)),\n              ))\n      ],\n    );\n  }\n}\n\nclass _FavoriteFolder extends ComicsPage<BaseComic> {\n  const _FavoriteFolder(this.data, this.folderID, this.title);\n\n  final FavoriteData data;\n\n  final String folderID;\n\n  @override\n  final String title;\n\n  @override\n  Future<Res<List<BaseComic>>> getComics(int i) {\n    return data.loadComic(i, folderID);\n  }\n\n  @override\n  String? get tag => \"Favorites Folder $folderID\";\n\n  @override\n  String get sourceKey => data.key;\n}\n"
  },
  {
    "path": "lib/pages/favorites/network_to_local.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/foundation/ui_mode.dart';\nimport 'package:pica_comic/network/eh_network/eh_main_network.dart';\nimport 'package:pica_comic/network/eh_network/eh_models.dart';\nimport 'package:pica_comic/network/net_fav_to_local.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/components/components.dart';\n\nimport '../../base.dart';\nimport '../../network/base_comic.dart';\nimport '../../network/res.dart';\n\nclass _ChooseNetworkFolderWidget extends StatefulWidget {\n  const _ChooseNetworkFolderWidget();\n\n  @override\n  State<_ChooseNetworkFolderWidget> createState() =>\n      _ChooseNetworkFolderWidgetState();\n}\n\nclass LoadComicClass {\n  NetToLocalEhPageData data = NetToLocalEhPageData();\n\n  Future<Res<List<BaseComic>>> loadComic(\n      FavoriteData fData, int i, String folder) async {\n    if (fData.key == \"ehentai\") {\n      if (data.galleries == null) {\n        Res<Galleries> res = await EhNetwork().getGalleries(\n            \"${EhNetwork().ehBaseUrl}/favorites.php?favcat=$folder\",\n            favoritePage: true);\n        if (res.error) {\n          return Res(null, errorMessage: res.errorMessage);\n        } else {\n          data.galleries = res.data;\n          data.comics[1] = [];\n          data.comics[1]!.addAll(data.galleries!.galleries);\n          data.galleries!.galleries.clear();\n        }\n      }\n      if (data.comics[i] != null) {\n        return Res(data.comics[i]!);\n      } else {\n        while (data.comics[i] == null) {\n          data.page++;\n          if (!await EhNetwork().getNextPageGalleries(data.galleries!)) {\n            return Res(null, errorMessage: \"网络错误\".tl);\n          }\n          data.comics[data.page] = [];\n          data.comics[data.page]!.addAll(data.galleries!.galleries);\n          data.galleries!.galleries.clear();\n        }\n        return Res(data.comics[i]);\n      }\n    }\n    return fData.loadComic(i, folder);\n  }\n}\n\nclass _ChooseNetworkFolderWidgetState\n    extends State<_ChooseNetworkFolderWidget> {\n  late final List<FavoriteData> _folders;\n\n  late List<bool> isExpanded;\n\n  String? selected;\n  bool agreeSync = false;\n\n  Map<String, Map<String, String>> multiFolderData = {\n    \"ehentai\": Map.fromIterables(\n        List.generate(10, (index) => index.toString()), EhNetwork().folderNames)\n  };\n\n  @override\n  void initState() {\n    var folders = <FavoriteData>[];\n    for (var key in appdata.settings[68].split(',')) {\n      folders.add(getFavoriteData(key));\n    }\n    _folders = folders;\n    isExpanded = _folders.map((e) => false).toList();\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: Appbar(\n        title: Text(\"选择收藏夹\".tl),\n        actions: [\n          IconButton(\n            onPressed: context.pop,\n            icon: const Icon(Icons.close),\n          )\n        ],\n      ),\n      body: Column(\n        children: [\n          Expanded(\n            child: SingleChildScrollView(\n              child: ExpansionPanelList(\n                materialGapSize: 0,\n                expandedHeaderPadding: EdgeInsets.zero,\n                expansionCallback: (i, value) =>\n                    setState(() => isExpanded[i] = value),\n                children: _folders.map((e) => buildItem(e)).toList(),\n              ),\n            ),\n          ),\n          const Divider(\n            height: 1,\n          ),\n          SizedBox(\n            height: 56,\n            child: Row(\n              children: [\n                const SizedBox(\n                  width: 8,\n                ),\n                Checkbox(\n                    value: agreeSync,\n                    onChanged: (b) {\n                      setState(() {\n                        agreeSync = b ?? false;\n                      });\n                    }),\n                Text(\"支持下拉更新\".tl),\n                const Spacer(),\n                FilledButton(onPressed: onConfirm, child: Text(\"继续\".tl)),\n                const SizedBox(\n                  width: 24,\n                ),\n              ],\n            ),\n          ),\n          if (UiMode.m1(context))\n            SizedBox(height: MediaQuery.of(context).padding.bottom)\n        ],\n      ),\n    );\n  }\n\n  ExpansionPanel buildItem(FavoriteData data) {\n    return ExpansionPanel(\n        headerBuilder: (context, expand) {\n          return ListTile(\n            title: Text(data.title),\n          );\n        },\n        isExpanded: isExpanded[_folders.indexOf(data)],\n        body: buildBody(data),\n        canTapOnHeader: true);\n  }\n\n  Widget buildTile(String key, String title) {\n    return RadioListTile<String?>(\n        title: Text(title),\n        value: key,\n        groupValue: selected,\n        onChanged: (newValue) {\n          setState(() {\n            selected = newValue;\n          });\n        });\n  }\n\n  Widget buildBody(FavoriteData data) {\n    if (!data.multiFolder) {\n      return buildTile(data.key, data.title);\n    } else {\n      return StatefulBuilder(builder: (context, updater) {\n        if (multiFolderData[data.key] == null) {\n          if (isExpanded[_folders.indexOf(data)]) {\n            data.loadFolders!().then((value) {\n              if (value.error) {\n                showToast(message: \"网络错误\".tl);\n              } else {\n                updater(() {\n                  multiFolderData[data.key] = value.data;\n                });\n              }\n            });\n          }\n          return const SizedBox(\n            height: 56,\n            width: double.infinity,\n            child: Center(\n              child: CircularProgressIndicator(),\n            ),\n          );\n        } else {\n          return Column(\n            mainAxisSize: MainAxisSize.min,\n            children: multiFolderData[data.key]!\n                .entries\n                .map((e) => buildTile(\"${data.key}:${e.key}\", e.value))\n                .toList(),\n          );\n        }\n      });\n    }\n  }\n\n  void onConfirm() {\n    var key = selected!.split(\":\").first;\n    var folderId = selected!.split(\":\").last;\n    var data = _folders.firstWhere((element) => element.key == key);\n    String name;\n    if (!data.multiFolder) {\n      name = data.title;\n    } else {\n      name = multiFolderData[data.key]![folderId]!;\n      if (data.key == \"ehentai\") {\n        name = name.substring(0, name.lastIndexOf(\"(\"));\n      }\n    }\n    App.globalBack();\n    final loadComicObj = LoadComicClass();\n    startConvert<BaseComic>(\n        (page) => loadComicObj.loadComic(data, page, folderId),\n        null,\n        App.globalContext!,\n        name,\n        (comic) => FavoriteItem.fromBaseComic(comic),\n        data.key,\n        agreeSync,\n        {\"folderId\": folderId});\n  }\n}\n\nvoid networkToLocal() {\n  showPopUpWidget(App.globalContext!, const _ChooseNetworkFolderWidget());\n}\n\nclass NetToLocalEhPageData {\n  Galleries? galleries;\n  int page = 1;\n  Map<int, List<EhGalleryBrief>> comics = {};\n}\n"
  },
  {
    "path": "lib/pages/history_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/network/eh_network/eh_main_network.dart';\nimport 'package:pica_comic/network/jm_network/jm_image.dart';\nimport 'package:pica_comic/network/picacg_network/models.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/tools/time.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport '../base.dart';\nimport '../foundation/app.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/components/components.dart';\n\nclass HistoryPage extends StatefulWidget {\n  const HistoryPage({Key? key}) : super(key: key);\n\n  @override\n  State<HistoryPage> createState() => _HistoryPageState();\n}\n\nclass _HistoryPageState extends State<HistoryPage> {\n  final comics = HistoryManager().getAll();\n  bool searchMode = false;\n  String keyword = \"\";\n  var results = <History>[];\n  bool isModified = false;\n\n  @override\n  void dispose() {\n    if (isModified) {\n      appdata.history.saveData();\n    }\n    super.dispose();\n  }\n\n  Widget buildTitle() {\n    if (searchMode) {\n      return Padding(\n        padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top / 2),\n        child: Center(\n          child: Container(\n            height: 42,\n            padding: const EdgeInsets.fromLTRB(0, 0, 8, 6),\n            child: TextField(\n              decoration:\n                  InputDecoration(border: InputBorder.none, hintText: \"搜索\".tl),\n              onChanged: (s) {\n                setState(() {\n                  keyword = s.toLowerCase();\n                });\n              },\n            ),\n          ),\n        ),\n      );\n    } else {\n      return Text(\"${\"历史记录\".tl}(${comics.length})\");\n    }\n  }\n\n  void find() {\n    results.clear();\n    if (keyword == \"\") {\n      results.addAll(comics);\n    } else {\n      for (var element in comics) {\n        if (element.title.toLowerCase().contains(keyword) ||\n            element.subtitle.toLowerCase().contains(keyword)) {\n          results.add(element);\n        }\n      }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (searchMode) {\n      find();\n    }\n    return Scaffold(\n      body: SmoothCustomScrollView(\n        slivers: [\n          SliverAppbar(\n            title: buildTitle(),\n            actions: [\n              Tooltip(\n                message: \"清除\".tl,\n                child: IconButton(\n                  icon: const Icon(Icons.clear_all),\n                  onPressed: () => showDialog(\n                      context: context,\n                      builder: (dialogContext) => AlertDialog(\n                            title: Text(\"清除记录\".tl),\n                            content: Text(\"要清除历史记录吗?\".tl),\n                            actions: [\n                              TextButton(\n                                  onPressed: () => App.globalBack(),\n                                  child: Text(\"取消\".tl)),\n                              TextButton(\n                                  onPressed: () {\n                                    appdata.history.clearHistory();\n                                    setState(() => comics.clear());\n                                    isModified = true;\n                                    App.globalBack();\n                                  },\n                                  child: Text(\"清除\".tl)),\n                            ],\n                          )),\n                ),\n              ),\n              Tooltip(\n                message: \"搜索\".tl,\n                child: IconButton(\n                  icon: const Icon(Icons.search),\n                  onPressed: () {\n                    setState(() {\n                      searchMode = !searchMode;\n                      if (!searchMode) {\n                        keyword = \"\";\n                      }\n                    });\n                  },\n                ),\n              )\n            ],\n          ),\n          if (!searchMode) buildComics(comics) else buildComics(results),\n          SliverPadding(\n            padding:\n                EdgeInsets.only(top: MediaQuery.of(context).padding.bottom),\n          )\n        ],\n      ),\n    );\n  }\n\n  Widget buildComics(List<History> comics_) {\n    return SliverGrid(\n      delegate:\n          SliverChildBuilderDelegate(childCount: comics_.length, (context, i) {\n        final comic = ComicItemBrief(\n          comics_[i].title,\n          comics_[i].subtitle,\n          0,\n          comics_[i].cover != \"\"\n              ? comics_[i].cover\n              : getJmCoverUrl(comics_[i].target),\n          comics_[i].target,\n          [],\n        );\n        return NormalComicTile(\n          key: Key(comics_[i].target),\n          sourceKey: comics_[i].type.comicSource?.key,\n          onLongTap: () {\n            showDialog(\n                context: context,\n                builder: (context) {\n                  return AlertDialog(\n                    title: Text(\"删除\".tl),\n                    content: Text(\"要删除这条历史记录吗\".tl),\n                    actions: [\n                      TextButton(\n                          onPressed: () => App.globalBack(),\n                          child: Text(\"取消\".tl)),\n                      TextButton(\n                          onPressed: () {\n                            appdata.history.remove(comics_[i].target);\n                            setState(() {\n                              isModified = true;\n                              comics.removeWhere((element) =>\n                                  element.target == comics_[i].target);\n                            });\n                            App.globalBack();\n                          },\n                          child: Text(\"删除\".tl)),\n                    ],\n                  );\n                });\n          },\n          description_: timeToString(comics_[i].time),\n          coverPath: comic.path,\n          name: comic.title,\n          subTitle_: comic.author,\n          badgeName: comics_[i].type.name,\n          headers: {\n            if (comics_[i].type == HistoryType.ehentai)\n              \"cookie\": EhNetwork().cookiesStr,\n            if (comics_[i].type == HistoryType.ehentai ||\n                comics_[i].type == HistoryType.hitomi)\n              \"User-Agent\": webUA,\n            if (comics_[i].type == HistoryType.hitomi)\n              \"Referer\": \"https://hitomi.la/\"\n          },\n          onTap: () {\n            toComicPageWithHistory(context, comics_[i]);\n          },\n        );\n      }),\n      gridDelegate: SliverGridDelegateWithComics(),\n    );\n  }\n}\n\nvoid toComicPageWithHistory(BuildContext context, History history) {\n  var source = history.type.comicSource;\n  if (source == null) {\n    showToast(message: \"Comic Source Not Found\");\n    return;\n  }\n  context.to(\n    () => ComicPage(\n      sourceKey: source.key,\n      id: history.target,\n      cover: history.cover,\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/hitomi/hitomi_comic_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_main_network.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_models.dart';\nimport 'package:pica_comic/network/hitomi_network/image.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/hitomi/hitomi_search.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/pages/search_result_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nclass HitomiComicPage extends BaseComicPage<HitomiComic> {\n  HitomiComicPage(HitomiComicBrief comic, {super.key})\n      : link = comic.link,\n        comicCover = comic.cover;\n\n  const HitomiComicPage.fromLink(this.link, {super.key, String? cover})\n      : comicCover = cover;\n\n  final String link;\n\n  final String? comicCover;\n\n  @override\n  String? get url => link;\n\n  @override\n  void openFavoritePanel() {\n    favoriteComic(FavoriteComicWidget(\n      havePlatformFavorite: false,\n      needLoadFolderData: false,\n      localFavoriteItem: toLocalFavoriteItem(),\n      setFavorite: (b) {\n        if (favorite != b) {\n          favorite = b;\n          update();\n        }\n      },\n      selectFolderCallback: (folder, page) {\n        LocalFavoritesManager().addComic(\n          folder,\n          FavoriteItem.fromHitomi(data!.toBrief(link, cover!)),\n        );\n        return Future.value(const Res(true));\n      },\n    ));\n  }\n\n  @override\n  String? get cover => data?.cover ?? comicCover;\n\n  @override\n  void download() => _downloadComic(data!, context, cover!, link);\n\n  @override\n  EpsData? get eps => null;\n\n  @override\n  String? get introduction => null;\n\n  @override\n  Future<Res<HitomiComic>> loadData() async {\n    return HiNetwork().getComicInfo(link);\n  }\n\n  @override\n  int? get pages => null;\n\n  @override\n  void read(History? history) async {\n    history = await History.createIfNull(history, data!);\n    App.globalTo(\n      () => ComicReadingPage.hitomi(\n        data!,\n        link,\n        initialPage: history!.page,\n      ),\n    );\n  }\n\n  @override\n  Widget? recommendationBuilder(HitomiComic data) => SliverGrid(\n        delegate: SliverChildBuilderDelegate(childCount: data.related.length,\n            (context, i) {\n          return HitomiComicTileDynamicLoading(data.related[i]);\n        }),\n        gridDelegate: SliverGridDelegateWithComics(),\n      );\n\n  @override\n  String get tag => \"Hitomi ComicPage $link\";\n\n  @override\n  Map<String, List<String>>? get tags => {\n        \"Artists\".categoryTextDynamic: data!.artists ?? [\"N/A\"],\n        \"Groups\".categoryTextDynamic: data!.group,\n        \"Categories\".categoryTextDynamic: data!.type.toList(),\n        \"Time\".categoryTextDynamic: data!.time.toList(),\n        \"Languages\".categoryTextDynamic: data!.lang.toList(),\n        \"Tags\".categoryTextDynamic:\n            List.generate(data!.tags.length, (index) => data!.tags[index].name)\n      };\n\n  @override\n  bool get enableTranslationToCN => App.locale.languageCode == \"zh\";\n\n  @override\n  void tapOnTag(String tag, String key) {\n    context.to(() => SearchResultPage(\n          keyword: tag,\n          sourceKey: 'hitomi',\n        ));\n  }\n\n  @override\n  Map<String, String> get headers =>\n      {\"User-Agent\": webUA, \"Referer\": \"https://hitomi.la/\"};\n\n  @override\n  ThumbnailsData? get thumbnailsCreator => ThumbnailsData([], (page) async {\n        try {\n          var gg = GG();\n          var images = <String>[];\n          for (var file in data!.files) {\n            images.add(await gg.urlFromUrlFromHash(\n                data!.id, file, \"webpsmallsmalltn\", \"webp\", 'tn'));\n          }\n          return Res(images);\n        } catch (e, s) {\n          LogManager.addLog(LogLevel.error, \"Network\", \"$e\\n$s\");\n          return Res(null, errorMessage: e.toString());\n        }\n      }, 2);\n\n  @override\n  void onThumbnailTapped(int index) async {\n    await History.findOrCreate(data!, page: index + 1);\n    App.globalTo(() => ComicReadingPage.hitomi(\n          data!,\n          link,\n          initialPage: index + 1,\n        ));\n  }\n\n  @override\n  String? get title => data?.title;\n\n  @override\n  Card? get uploaderInfo => null;\n\n  @override\n  Future<bool> loadFavorite(HitomiComic data) async {\n    return (await LocalFavoritesManager().findWithModel(toLocalFavoriteItem()))\n        .isNotEmpty;\n  }\n\n  @override\n  String get id => data!.id;\n\n  @override\n  String get source => \"hitomi\";\n\n  @override\n  FavoriteItem toLocalFavoriteItem() =>\n      FavoriteItem.fromHitomi(data!.toBrief(link, cover!));\n\n  @override\n  String get downloadedId => \"hitomi${data!.id}\";\n\n  @override\n  String get sourceKey => \"hitomi\";\n}\n\nvoid _downloadComic(\n    HitomiComic comic, BuildContext context, String cover, String link) {\n  if (downloadManager.isExists(comic.id)) {\n    showToast(message: \"已下载\".tl);\n    return;\n  }\n  for (var i in downloadManager.downloading) {\n    if (i.id == comic.id) {\n      showToast(message: \"下载中\".tl);\n      return;\n    }\n  }\n  downloadManager.addHitomiDownload(comic, cover, link);\n  showToast(message: \"已加入下载\".tl);\n}\n"
  },
  {
    "path": "lib/pages/hitomi/hitomi_home_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_main_network.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport '../../foundation/app.dart';\nimport '../../network/hitomi_network/hitomi_models.dart';\nimport 'package:pica_comic/components/components.dart';\n\nclass HitomiHomePageLogic extends StateController {\n  bool loading = true;\n  String? message;\n  int currentPage = 1;\n  ComicList? comics;\n  List<HitomiComicBrief> hitomiComics = [];\n\n  void get(String url) async {\n    var res = await HiNetwork().getComics(url);\n    if (res.error) {\n      message = res.errorMessage!;\n    } else {\n      var parseRes = await parseIds(res.data);\n      if(parseRes) {\n        comics = res.data;\n      }\n    }\n    loading = false;\n    update();\n  }\n\n  void loadNextPage(String url) async {\n    var res = await HiNetwork().loadNextPage(comics!);\n    if (res.error) {\n      showToast(message: res.errorMessage!);\n    } else {\n      var parseRes = await parseIds(comics!);\n      if(parseRes) {\n        update();\n      } else {\n        showToast(message: message ?? \"Error\");\n      }\n    }\n  }\n\n  Future<bool> parseIds(ComicList comics) async {\n    var futures = <Future<Res<HitomiComicBrief>>>[];\n    Future<bool> wait() async {\n      var result = await Future.wait(futures);\n      futures.clear();\n      for (var r in result) {\n        if(r.error) {\n          message = r.errorMessage;\n          return false;\n        }\n        hitomiComics.add(r.data);\n      }\n      return true;\n    }\n    for(var id in comics.comicIds) {\n      if(futures.length >= 5) {\n        var res = await wait();\n        if(!res) return false;\n      }\n      futures.add(HiNetwork().getComicInfoBrief(id.toString()));\n    }\n    var res = await wait();\n    if(!res) return false;\n    comics.comicIds.clear();\n    return true;\n  }\n\n  void refresh_() {\n    loading = true;\n    comics = null;\n    message = null;\n    currentPage = 1;\n    update();\n  }\n}\n\nclass HitomiHomePageComics extends StatelessWidget {\n  const HitomiHomePageComics(this.url, {Key? key}) : super(key: key);\n  final String url;\n\n  static void Function() refresh = () {};\n\n  @override\n  Widget build(BuildContext context) {\n    return StateBuilder<HitomiHomePageLogic>(\n        tag: url,\n        init: HitomiHomePageLogic(),\n        builder: (logic) {\n          refresh = logic.refresh_;\n          if (logic.loading) {\n            logic.get(url);\n            return const Center(\n              child: CircularProgressIndicator(),\n            );\n          } else if (logic.message != null) {\n            return NetworkError(\n              message: logic.message!,\n              retry: () => logic.refresh_(),\n              withAppbar: false,\n            );\n          } else {\n            return CustomScrollView(\n              slivers: [\n                SliverGridComics(\n                  comics: logic.hitomiComics,\n                  sourceKey: \"hitomi\",\n                  onLastItemBuild: () {\n                    logic.loadNextPage(url);\n                  },\n                ),\n                if (logic.comics!.toLoad < logic.comics!.total)\n                  const SliverToBoxAdapter(\n                    child: ListLoadingIndicator(),\n                  )\n              ],\n            );\n          }\n        });\n  }\n}\n\nclass HitomiHomePage extends StatefulWidget {\n  const HitomiHomePage({super.key});\n\n  @override\n  State<HitomiHomePage> createState() => _HitomiHomePageState();\n}\n\nclass _HitomiHomePageState extends State<HitomiHomePage> {\n  var type = \"index\";\n  var lang = \"-all\";\n\n  @override\n  Widget build(BuildContext context) {\n    var url = \"https://ltn.hitomi.la/$type$lang.nozomi\";\n    return Column(\n      children: [\n        Material(\n          textStyle: Theme.of(context).textTheme.headlineMedium,\n          child: SizedBox(\n            height: 50,\n            child: Row(\n              crossAxisAlignment: CrossAxisAlignment.end,\n              children: [\n                const SizedBox(\n                  width: 16,\n                ),\n                const Padding(\n                  padding: EdgeInsets.only(bottom: 4),\n                  child: Text(\"hitomi\"),\n                ),\n                const Spacer(),\n                Material(\n                  child: Select(\n                    values: [\n                      \"最新\".tl,\n                      \"热门 | 今天\".tl,\n                      \"热门 | 一周\".tl,\n                      \"热门 | 本月\".tl,\n                      \"热门 | 一年\".tl\n                    ],\n                    initialValue: 0,\n                    onChange: (i) => setState(() {\n                      type = [\n                        \"index\",\n                        \"popular/today\",\n                        \"popular/week\",\n                        \"popular/month\",\n                        \"popular/year\"\n                      ][i];\n                    }),\n                  ),\n                ),\n                const SizedBox(\n                  width: 16,\n                ),\n                Material(\n                  child: Select(\n                    width: 100,\n                    values: const [\"All\", \"中文\", \"日本語\", \"English\"],\n                    initialValue: 0,\n                    onChange: (i) => setState(() {\n                      lang = [\"-all\", \"-chinese\", \"-japanese\", \"-english\"][i];\n                    }),\n                  ),\n                ),\n                const SizedBox(\n                  width: 16,\n                ),\n              ],\n            ),\n          ),\n        ),\n        const Divider(),\n        Expanded(\n          child: HitomiHomePageComics(\n            url,\n            key: Key(url),\n          ),\n        )\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/hitomi/hitomi_search.dart",
    "content": "import 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_main_network.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_models.dart';\nimport 'package:shimmer_animation/shimmer_animation.dart';\n\nimport '../../foundation/app.dart';\nimport '../../network/res.dart';\n\nclass SearchPageComicList extends StatefulWidget {\n  const SearchPageComicList(\n      {super.key, required this.keyword, required this.head});\n\n  final String keyword;\n\n  final Widget head;\n\n  @override\n  State<SearchPageComicList> createState() => _SearchPageComicListState();\n}\n\nclass _SearchPageComicListState\n    extends LoadingState<SearchPageComicList, List<int>> {\n  @override\n  Widget buildContent(BuildContext context, List<int> data) {\n    return SmoothCustomScrollView(\n      slivers: [\n        widget.head,\n        SliverGrid(\n          delegate: SliverChildBuilderDelegate(\n            (context, index) => HitomiComicTileDynamicLoading(data[index]),\n            childCount: data.length,\n          ),\n          gridDelegate: SliverGridDelegateWithComics(),\n        ),\n      ],\n    );\n  }\n\n  @override\n  Future<Res<List<int>>> loadData() {\n    return HiNetwork().search(widget.keyword);\n  }\n}\n\nclass HitomiSearchPage extends StatefulWidget {\n  const HitomiSearchPage(this.keyword, {Key? key}) : super(key: key);\n  final String keyword;\n\n  @override\n  State<HitomiSearchPage> createState() => _HitomiSearchPageState();\n}\n\nclass _HitomiSearchPageState extends State<HitomiSearchPage> {\n  late String keyword;\n  var controller = TextEditingController();\n\n  @override\n  void initState() {\n    keyword = widget.keyword;\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    controller.text = keyword;\n    return SearchPageComicList(\n      keyword: keyword,\n      key: Key(keyword),\n      head: SliverPersistentHeader(\n        floating: true,\n        delegate: _SliverAppBarDelegate(\n          minHeight: 60,\n          maxHeight: 0,\n          child: FloatingSearchBar(\n            onSearch: (s) {\n              App.back(context);\n              if (s == \"\") return;\n              setState(() {\n                keyword = s;\n              });\n            },\n            controller: controller,\n          ),\n        ),\n      ),\n    ).paddingTop(context.padding.top);\n  }\n}\n\nclass _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {\n  _SliverAppBarDelegate(\n      {required this.child, required this.maxHeight, required this.minHeight});\n\n  final double minHeight;\n  final double maxHeight;\n  final Widget child;\n\n  @override\n  Widget build(\n      BuildContext context, double shrinkOffset, bool overlapsContent) {\n    return SizedBox.expand(\n      child: child,\n    );\n  }\n\n  @override\n  double get maxExtent => minHeight;\n\n  @override\n  double get minExtent => max(maxHeight, minHeight);\n\n  @override\n  bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {\n    return maxHeight != oldDelegate.maxExtent ||\n        minHeight != oldDelegate.minExtent;\n  }\n}\n\nclass HitomiComicTileDynamicLoading extends StatefulWidget {\n  const HitomiComicTileDynamicLoading(this.id,\n      {Key? key, this.addonMenuOptions})\n      : super(key: key);\n  final int id;\n\n  final List<ComicTileMenuOption>? addonMenuOptions;\n\n  @override\n  State<HitomiComicTileDynamicLoading> createState() =>\n      _HitomiComicTileDynamicLoadingState();\n}\n\nclass _HitomiComicTileDynamicLoadingState\n    extends State<HitomiComicTileDynamicLoading> {\n  HitomiComicBrief? comic;\n  bool onScreen = true;\n\n  static List<HitomiComicBrief> cache = [];\n\n  @override\n  void dispose() {\n    onScreen = false;\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    for (var cachedComic in cache) {\n      var id = RegExp(r\"\\d+(?=\\.html)\").firstMatch(cachedComic.link)![0]!;\n      if (id == widget.id.toString()) {\n        comic = cachedComic;\n      }\n    }\n    if (comic == null) {\n      HiNetwork().getComicInfoBrief(widget.id.toString()).then((c) {\n        if (c.error) {\n          showToast(message: c.errorMessage!);\n          return;\n        }\n        cache.add(c.data);\n        if (onScreen) {\n          setState(() {\n            comic = c.data;\n          });\n        }\n      });\n\n      return buildLoadingWidget();\n    } else {\n      return buildComicTile(context, comic!, 'hitomi');\n    }\n  }\n\n  Widget buildPlaceHolder() {\n    return const ComicTilePlaceholder();\n  }\n\n  Widget buildLoadingWidget() {\n    return Shimmer(\n      color: Theme.of(context).colorScheme.surfaceContainerHighest,\n      child: buildPlaceHolder(),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/htmanga/ht_comic_page.dart",
    "content": "import 'package:pica_comic/comic_source/built_in/ht_manga.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/network/htmanga_network/htmanga_main_network.dart';\nimport 'package:pica_comic/network/htmanga_network/models.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/pages/search_result_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/components/components.dart';\n\nclass HtComicPage extends BaseComicPage<HtComicInfo> {\n  const HtComicPage(this.id, {super.key, this.comicCover});\n\n  @override\n  final String id;\n\n  final String? comicCover;\n\n  @override\n  void openFavoritePanel() {\n    favoriteComic(FavoriteComicWidget(\n      havePlatformFavorite: htManga.isLogin,\n      needLoadFolderData: true,\n      foldersLoader: () => HtmangaNetwork().getFolders(),\n      localFavoriteItem: toLocalFavoriteItem(),\n      setFavorite: (b) {},\n      selectFolderCallback: (folder, page) async {\n        if (page == 0) {\n          return HtmangaNetwork().addFavorite(data!.id, folder);\n        } else {\n          LocalFavoritesManager()\n              .addComic(folder, FavoriteItem.fromHtcomic(data!.toBrief()));\n          return const Res(true);\n        }\n      },\n    ));\n  }\n\n  @override\n  String? get cover => data?.cover ?? comicCover;\n\n  @override\n  void download() {\n    final id = \"Ht${data!.id}\";\n    if (DownloadManager().isExists(id)) {\n      showToast(message: \"已下载\".tl);\n      return;\n    }\n    for (var i in DownloadManager().downloading) {\n      if (i.id == id) {\n        showToast(message: \"下载中\".tl);\n        return;\n      }\n    }\n    DownloadManager().addHtDownload(data!);\n    showToast(message: \"已加入下载队列\".tl);\n  }\n\n  @override\n  void onThumbnailTapped(int index) async {\n    await History.findOrCreate(data!);\n    App.globalTo(\n      () => ComicReadingPage.htmanga(\n        data!.target,\n        data!.title,\n        initialPage: index + 1,\n      ),\n    );\n  }\n\n  @override\n  EpsData? get eps => null;\n\n  @override\n  String? get introduction => data!.description;\n\n  @override\n  Future<Res<HtComicInfo>> loadData() => HtmangaNetwork().getComicInfo(id);\n\n  @override\n  int? get pages => null;\n\n  @override\n  void read(History? history) async {\n    history = await History.createIfNull(history, data!);\n    App.globalTo(\n      () => ComicReadingPage.htmanga(\n        data!.target,\n        data!.title,\n        initialPage: history!.page,\n      ),\n    );\n  }\n\n  @override\n  SliverGrid? recommendationBuilder(HtComicInfo data) => null;\n\n  @override\n  String get tag => \"Ht ComicPage $id\";\n\n  @override\n  Map<String, List<String>>? get tags =>\n      {\"分类\".tl: data!.category.toList(), \"标签\".tl: data!.tags.keys.toList()};\n\n  @override\n  void tapOnTag(String tag, String key) => context.to(() => SearchResultPage(\n        keyword: tag,\n        sourceKey: sourceKey,\n      ));\n\n  @override\n  ThumbnailsData? get thumbnailsCreator => ThumbnailsData(\n      data!.thumbnails,\n      (page) => HtmangaNetwork().getThumbnails(data!.id, page),\n      (data!.pages / 12).ceil());\n\n  @override\n  String? get title => data?.name.removeAllBlank;\n\n  @override\n  Card? get uploaderInfo => Card(\n        elevation: 0,\n        color: Theme.of(context).colorScheme.inversePrimary,\n        child: SizedBox(\n          height: 60,\n          child: Row(\n            children: [\n              Expanded(\n                flex: 0,\n                child: Avatar(\n                  size: 50,\n                  avatarUrl: data!.avatar,\n                  couldBeShown: false,\n                  name: data!.uploader,\n                ),\n              ),\n              Expanded(\n                flex: 3,\n                child: Padding(\n                  padding: const EdgeInsets.fromLTRB(15, 10, 0, 0),\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      Text(\n                        data!.uploader,\n                        style: const TextStyle(\n                            fontSize: 15, fontWeight: FontWeight.w600),\n                      ),\n                      Text(\"投稿作品${data!.uploadNum}部\")\n                    ],\n                  ),\n                ),\n              ),\n            ],\n          ),\n        ),\n      );\n\n  @override\n  Future<bool> loadFavorite(HtComicInfo data) => Future.value(false);\n\n  @override\n  String get source => \"绅士漫画\".tl;\n\n  @override\n  FavoriteItem toLocalFavoriteItem() =>\n      FavoriteItem.fromHtcomic(data!.toBrief());\n\n  @override\n  String get downloadedId => \"Ht${data!.id}\";\n\n  @override\n  String get sourceKey => 'htmanga';\n}\n\nclass HtComicPageLogic extends StateController {\n  bool loading = true;\n  HtComicInfo? comic;\n  String? message;\n  ScrollController controller = ScrollController();\n  bool showAppbarTitle = false;\n  List<String> images = [];\n\n  void get(String id) async {\n    var res = await HtmangaNetwork().getComicInfo(id);\n    message = res.errorMessage;\n    comic = res.dataOrNull;\n    if (res.subData != null) {\n      images.addAll(res.subData);\n    }\n    loading = false;\n    update();\n  }\n\n  void refresh_() {\n    comic = null;\n    message = null;\n    loading = true;\n    update();\n  }\n\n  void getImages() async {\n    var nextPage = images.length ~/ 12 + 1;\n    var res = await HtmangaNetwork().getThumbnails(comic!.id, nextPage);\n    if (!res.error) {\n      images.addAll(res.data);\n      update();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/image_favorites.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:typed_data';\n\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/image_loader/base_image_provider.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport 'package:pica_comic/foundation/ui_mode.dart';\nimport 'package:pica_comic/network/eh_network/eh_models.dart';\nimport 'package:pica_comic/network/hitomi_network/hitomi_models.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/components/components.dart';\n\nimport 'reader/comic_reading_page.dart';\n\nclass ImageFavoritesPage extends StatefulWidget {\n  const ImageFavoritesPage({super.key});\n\n  @override\n  State<ImageFavoritesPage> createState() => _ImageFavoritesPageState();\n}\n\nclass _ImageFavoritesPageState extends State<ImageFavoritesPage> {\n  @override\n  Widget build(BuildContext context) {\n    return StateBuilder(\n      tag: \"image_favorites_page\",\n      init: SimpleController(),\n      builder: (controller) {\n        if (UiMode.m1(context)) {\n          return Scaffold(\n            appBar: AppBar(\n              title: Text(\"图片收藏\".tl),\n            ),\n            body: buildPage(),\n          );\n        } else {\n          return Material(\n            child: Column(\n              children: [\n                Appbar(\n                  title: Text(\"图片收藏\".tl),\n                ),\n                Expanded(\n                  child: buildPage(),\n                )\n              ],\n            ),\n          );\n        }\n      },\n    );\n  }\n\n  Widget buildPage() {\n    var images = ImageFavoriteManager.getAll();\n\n    return GridView.builder(\n      gridDelegate: SliverGridDelegateWithComics(true, appdata.settings[74]),\n      itemCount: images.length,\n      itemBuilder: (context, index) {\n        return FavoriteImageTile(images[index]);\n      },\n    );\n  }\n}\n\nclass FavoriteImageTile extends StatelessWidget {\n  const FavoriteImageTile(this.image, {super.key});\n\n  final ImageFavorite image;\n\n  @override\n  Widget build(BuildContext context) {\n    return Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 8),\n      child: Material(\n        color: Colors.transparent,\n        borderRadius: BorderRadius.circular(8),\n        elevation: 1,\n        child: Stack(\n          children: [\n            Positioned.fill(\n                child: Container(\n                    decoration: BoxDecoration(\n                        color: Theme.of(context).colorScheme.secondaryContainer,\n                        borderRadius: BorderRadius.circular(8)),\n                    clipBehavior: Clip.antiAlias,\n                    child: Image(\n                      image: _ImageProvider(image),\n                    ))),\n            Positioned(\n                bottom: 0,\n                left: 0,\n                right: 0,\n                child: Container(\n                  width: double.infinity,\n                  decoration: BoxDecoration(\n                      gradient: LinearGradient(\n                          begin: Alignment.topCenter,\n                          end: Alignment.bottomCenter,\n                          colors: [\n                            Colors.transparent,\n                            Colors.black.withOpacity(0.3),\n                            Colors.black.withOpacity(0.5),\n                          ]),\n                      borderRadius: const BorderRadius.only(\n                          bottomLeft: Radius.circular(8),\n                          bottomRight: Radius.circular(8))),\n                  child: Padding(\n                    padding: const EdgeInsets.fromLTRB(8, 4, 8, 4),\n                    child: Text(\n                      image.title.replaceAll(\"\\n\", \"\"),\n                      style: const TextStyle(\n                        fontWeight: FontWeight.w500,\n                        fontSize: 14.0,\n                        color: Colors.white,\n                      ),\n                      maxLines: 2,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                  ),\n                )),\n            Positioned.fill(\n              child: Material(\n                color: Colors.transparent,\n                child: InkWell(\n                  onTap: onTap,\n                  onLongPress: onLongTap,\n                  onSecondaryTapDown: onSecondaryTap,\n                  borderRadius: BorderRadius.circular(8),\n                  child: const SizedBox.expand(),\n                ),\n              ),\n            )\n          ],\n        ),\n      ),\n    );\n  }\n\n  void onTap() {\n    var type = image.id.split(\"-\")[0];\n    _readWithKey(type, image.id.replaceFirst(\"$type-\", \"\"), image.ep, image.page,\n        image.title, image.otherInfo);\n  }\n\n  void _readWithKey(String key, String target, int ep, int page, String title,\n      Map<String, dynamic> otherInfo) async {\n    switch (key) {\n      case \"picacg\":\n        App.globalTo(() => ComicReadingPage.picacg(\n            target, ep, List.from(otherInfo[\"eps\"]), title,\n            initialPage: page));\n      case \"ehentai\":\n        App.globalTo(\n          () => ComicReadingPage.ehentai(\n            Gallery.fromJson(otherInfo[\"gallery\"]),\n            initialPage: page,\n          ),\n        );\n      case \"jm\":\n        App.globalTo(\n          () => ComicReadingPage(\n            JmReadingData(\n              title,\n              target,\n              List.from(otherInfo[\"eps\"]),\n              List.from(\n                otherInfo[\"jmEpNames\"],\n              ),\n            ),\n            page,\n            ep,\n          ),\n        );\n      case \"hitomi\":\n        App.globalTo(\n          () => ComicReadingPage(\n            HitomiReadingData(\n              title,\n              target,\n              (otherInfo[\"hitomi\"] as List)\n                  .map((e) => HitomiFile.fromMap(e))\n                  .toList(),\n              target,\n            ),\n            page,\n            0,\n          ),\n        );\n      case \"htManga\":\n      case \"htmanga\":\n        App.globalTo(\n          () => ComicReadingPage.htmanga(target, title, initialPage: page),\n        );\n      case \"nhentai\":\n        App.globalTo(\n          () => ComicReadingPage.nhentai(target, title, initialPage: page),\n        );\n      default:\n        var source = ComicSource.find(key);\n        if (source == null) throw \"Unknown source $key\";\n        App.globalTo(\n          () => ComicReadingPage(\n            CustomReadingData(\n              target,\n              title,\n              source,\n              Map.from(otherInfo[\"eps\"]),\n            ),\n            page,\n            ep,\n          ),\n        );\n    }\n  }\n\n  void onLongTap() {\n    showConfirmDialog(App.globalContext!, \"确认删除\".tl, \"要删除这个图片吗\".tl, delete);\n  }\n\n  void delete() {\n    ImageFavoriteManager.delete(image);\n    showToast(message: \"删除成功\".tl);\n    StateController.findOrNull(tag: \"image_favorites_page\")?.update();\n  }\n\n  void onSecondaryTap(TapDownDetails details) {\n    showDesktopMenu(App.globalContext!, details.globalPosition, [\n      DesktopMenuEntry(text: \"查看\".tl, onClick: onTap),\n      DesktopMenuEntry(text: \"删除\".tl, onClick: delete),\n    ]);\n  }\n}\n\nclass _ImageProvider extends BaseImageProvider<_ImageProvider> {\n  _ImageProvider(this.image);\n\n  final ImageFavorite image;\n\n  @override\n  String get key => image.id + image.ep.toString() + image.page.toString();\n\n  @override\n  Future<Uint8List> load(StreamController<ImageChunkEvent> chunkEvents) async {\n    if (File(image.imagePath).existsSync()) {\n      return await File(\"${App.dataPath}/images/${image.imagePath}\")\n          .readAsBytes();\n    } else {\n      var type = image.id.split(\"-\")[0];\n      Stream<DownloadProgress> stream;\n      switch (type) {\n        case \"ehentai\":\n          stream = ImageManager().getEhImageNew(\n              Gallery.fromJson(image.otherInfo[\"gallery\"]), image.page);\n        case \"jm\":\n          stream = ImageManager().getJmImage(image.otherInfo[\"url\"], null,\n              epsId: image.otherInfo[\"epsId\"],\n              scrambleId: \"220980\",\n              bookId: image.otherInfo[\"bookId\"]);\n        case \"hitomi\":\n          stream = ImageManager().getHitomiImage(\n              HitomiFile.fromMap(image.otherInfo[\"hitomi\"][image.page - 1]),\n              image.otherInfo[\"galleryId\"]);\n        default:\n          stream = ImageManager().getImage(image.otherInfo[\"url\"]);\n      }\n      DownloadProgress? finishProgress;\n      await for (var progress in stream) {\n        if (progress.currentBytes == progress.expectedBytes) {\n          finishProgress = progress;\n        }\n        chunkEvents.add(ImageChunkEvent(\n            cumulativeBytesLoaded: progress.currentBytes,\n            expectedTotalBytes: progress.expectedBytes));\n      }\n      var file = finishProgress!.getFile();\n      var data = await file.readAsBytes();\n      var file2 = File(\"${App.dataPath}/images/${image.imagePath}\");\n      if (!file2.existsSync()) {\n        await file2.create(recursive: true);\n      }\n      await file2.writeAsBytes(data);\n      return data;\n    }\n  }\n\n  @override\n  Future<_ImageProvider> obtainKey(ImageConfiguration configuration) async {\n    return this;\n  }\n}\n"
  },
  {
    "path": "lib/pages/jm/jm_comic_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/built_in/jm.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/components/select_download_eps.dart';\nimport 'package:pica_comic/network/jm_network/jm_download.dart';\nimport 'package:pica_comic/network/jm_network/jm_image.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/pages/search_result_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nimport '../../foundation/app.dart';\nimport '../../foundation/history.dart';\nimport '../../foundation/local_favorites.dart';\nimport '../../foundation/ui_mode.dart';\nimport '../../network/download.dart';\nimport '../../network/jm_network/jm_models.dart';\nimport '../../network/jm_network/jm_network.dart';\nimport 'jm_comments_page.dart';\n\nclass JmComicPage extends BaseComicPage<JmComicInfo> {\n  const JmComicPage(this.id, {super.key});\n\n  @override\n  final String id;\n\n  @override\n  ActionFunc? get onLike => () {\n        if (!data!.liked) {\n          jmNetwork.likeComic(data!.id);\n        }\n        data!.liked = true;\n        update();\n      };\n\n  @override\n  bool get isLiked => data!.liked;\n\n  @override\n  String? get likeCount => data!.likes.toString().replaceLast(\"000\", \"K\");\n\n  @override\n  void openFavoritePanel() {\n    favoriteComic(FavoriteComicWidget(\n      havePlatformFavorite: jm.isLogin,\n      needLoadFolderData: true,\n      setFavorite: (b) {\n        if (favorite != b) {\n          favorite = b;\n          update();\n        }\n      },\n      foldersLoader: () async {\n        var res = await jmNetwork.getFolders();\n        if (res.error) {\n          return res;\n        } else {\n          var resData = <String, String>{\"0\": \"全部收藏\".tl};\n          resData.addAll(res.data);\n          return Res(resData);\n        }\n      },\n      localFavoriteItem: toLocalFavoriteItem(),\n      favoriteOnPlatform: data!.favorite,\n      selectFolderCallback: (folder, page) async {\n        if (page == 0) {\n          var res = await jmNetwork.favorite(id, folder);\n          if (res.success) {\n            data!.favorite = true;\n          }\n          return res;\n        } else {\n          LocalFavoritesManager().addComic(\n            folder,\n            toLocalFavoriteItem(),\n          );\n          return const Res(true);\n        }\n      },\n      cancelPlatformFavorite: () async {\n        var res = await jmNetwork.favorite(id, null);\n        if(res.success) {\n          data!.favorite = false;\n        }\n        return res;\n      },\n    ));\n  }\n\n  @override\n  ActionFunc? get openComments => () {\n        showComments(App.globalContext!, id, data!.comments);\n      };\n\n  @override\n  String get cover => getJmCoverUrl(id);\n\n  @override\n  void download() => downloadComic(data!, App.globalContext!);\n\n  String _getEpName(int index) {\n    final epName = data!.epNames.elementAtOrNull(index);\n    if (epName != null) {\n      return epName;\n    }\n    var name = \"第 @c 章\".tlParams({\"c\": (index + 1).toString()});\n    return name;\n  }\n\n  @override\n  EpsData? get eps {\n    return EpsData(\n      List<String>.generate(\n          data!.series.values.length, (index) => _getEpName(index)),\n      (i) async {\n        await History.findOrCreate(data!);\n        App.globalTo(() => ComicReadingPage.jmComic(data!, i + 1));\n      },\n    );\n  }\n\n  @override\n  String? get introduction => data!.description;\n\n  @override\n  Future<Res<JmComicInfo>> loadData() => JmNetwork().getComicInfo(id);\n\n  @override\n  int? get pages => null;\n\n  @override\n  Future<bool> loadFavorite(JmComicInfo data) async {\n    return data.favorite ||\n        (await LocalFavoritesManager().findWithModel(toLocalFavoriteItem())).isNotEmpty;\n  }\n\n  @override\n  void read(History? history) async {\n    history = await History.createIfNull(history, data!);\n    App.globalTo(\n      () => ComicReadingPage.jmComic(\n        data!,\n        history!.ep,\n        initialPage: history.page,\n      ),\n    );\n  }\n\n  @override\n  Widget recommendationBuilder(JmComicInfo data) =>\n      SliverGridComics(comics: data.relatedComics, sourceKey: 'jm');\n\n  @override\n  String get tag => \"Jm ComicPage $id\";\n\n  @override\n  Map<String, List<String>>? get tags => {\n        \"作者\".tl: (data!.author.isEmpty) ? \"未知\".tl.toList() : data!.author,\n        \"ID\": \"JM${data!.id}\".toList(),\n        \"标签\".tl: data!.tags\n      };\n\n  @override\n  void tapOnTag(String tag, String key) => context.to(() => SearchResultPage(\n        keyword: tag,\n        sourceKey: \"jm\",\n      ));\n\n  @override\n  ThumbnailsData? get thumbnailsCreator => null;\n\n  @override\n  String? get title => data?.name;\n\n  @override\n  Card? get uploaderInfo => null;\n\n  @override\n  String get source => \"禁漫天堂\".tl;\n\n  @override\n  FavoriteItem toLocalFavoriteItem() => FavoriteItem.fromJmComic(JmComicBrief(\n      id,\n      data!.author.elementAtOrNull(0) ?? \"\",\n      data!.name,\n      data!.description,\n      []));\n\n  @override\n  String get downloadedId => \"jm${data!.id}\";\n\n  @override\n  String get sourceKey => \"jm\";\n}\n\nvoid downloadComic(JmComicInfo comic, BuildContext context) async {\n  for (var i in downloadManager.downloading) {\n    if (i.id == comic.id) {\n      showToast(message: \"下载中\".tl);\n      return;\n    }\n  }\n\n  List<String> eps = [];\n  if (comic.series.isEmpty) {\n    eps.add(\"第1章\".tl);\n  } else {\n    eps = List<String>.generate(comic.series.length,\n        (index) => \"第 @c 章\".tlParams({\"c\": (index + 1).toString()}));\n  }\n\n  var downloaded = <int>[];\n  if (DownloadManager().isExists(\"jm${comic.id}\")) {\n    var downloadedComic =\n        (await DownloadManager().getComicOrNull(\"jm${comic.id}\"))!\n        as DownloadedJmComic;\n    downloaded.addAll(downloadedComic.downloadedEps);\n  }\n\n  if (UiMode.m1(App.globalContext!)) {\n    showModalBottomSheet(\n        context: App.globalContext!,\n        builder: (context) {\n          return SelectDownloadChapter(eps, (selectedEps) {\n            downloadManager.addJmDownload(comic, selectedEps);\n            App.globalBack();\n            showToast(message: \"已加入下载\".tl);\n          }, downloaded);\n        });\n  } else {\n    showSideBar(\n        App.globalContext!,\n        SelectDownloadChapter(eps, (selectedEps) {\n          downloadManager.addJmDownload(comic, selectedEps);\n          App.globalBack();\n          showToast(message: \"已加入下载\".tl);\n        }, downloaded),\n        useSurfaceTintColor: true);\n  }\n}\n"
  },
  {
    "path": "lib/pages/jm/jm_comments_page.dart",
    "content": "import 'package:pica_comic/components/comment.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/network/jm_network/jm_models.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/network/jm_network/jm_network.dart';\nimport 'package:pica_comic/components/components.dart';\n\nclass JmCommentsPageLogic extends StateController {\n  JmCommentsPageLogic(this.totalComments);\n\n  bool loading = true;\n  List<Comment>? comments;\n  String? message;\n  int totalComments;\n  int page = 1;\n  var controller = TextEditingController();\n\n  void change() {\n    loading = !loading;\n    update();\n  }\n\n  void get(String id, [String? mode]) async {\n    var res = await jmNetwork.getComment(id, 1);\n    if (res.error) {\n      message = res.errorMessage;\n      change();\n    } else {\n      comments = res.data;\n      change();\n    }\n  }\n\n  void retry() async {\n    message = null;\n    comments = null;\n    loading = true;\n    page = 1;\n    update();\n  }\n\n  void loadMore(String id) async {\n    if (totalComments <= comments!.length) {\n      return;\n    }\n    var res = await jmNetwork.getComment(id, page + 1);\n    totalComments = res.subData ?? totalComments;\n    if (res.error) {\n      return;\n    } else {\n      page++;\n      comments!.addAll(res.data);\n      update();\n    }\n  }\n\n  void refresh_() {\n    comments = null;\n    message = null;\n    page = 1;\n    controller.text = \"\";\n    loading = true;\n    update();\n  }\n}\n\nclass JmCommentsPage extends StatelessWidget {\n  const JmCommentsPage(this.id, this.totalComments,\n      {this.mode, this.popUp = false, Key? key})\n      : super(key: key);\n  final String id;\n  final bool popUp;\n  final String? mode;\n  final int totalComments;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget body = StateBuilder<JmCommentsPageLogic>(\n        init: JmCommentsPageLogic(totalComments),\n        builder: (logic) {\n          if (logic.loading) {\n            logic.get(id, mode);\n            return const Center(\n              child: CircularProgressIndicator(),\n            );\n          } else if (logic.comments == null) {\n            return NetworkError(message: logic.message!, retry: logic.retry);\n          } else {\n            return Column(\n              children: [\n                Expanded(\n                    child: CustomScrollView(\n                  slivers: [\n                    SliverList(\n                        delegate: SliverChildBuilderDelegate(\n                            childCount: logic.comments!.length,\n                            (context, index) {\n                      if (index == logic.comments!.length - 1) {\n                        logic.loadMore(id);\n                      }\n                      return CommentTile(\n                        avatarUrl: logic.comments![index].avatar,\n                        name: logic.comments![index].name,\n                        content: logic.comments![index].content,\n                        comments: logic.comments![index].reply.length,\n                        onTap: () => showReply(\n                            context,\n                            logic.comments![index].reply,\n                            logic.comments![index]),\n                        time: logic.comments![index].time,\n                      );\n                    })),\n                    if (logic.totalComments > logic.comments!.length)\n                      const SliverToBoxAdapter(\n                        child: ListLoadingIndicator(),\n                      ),\n                    SliverPadding(\n                        padding: EdgeInsets.only(\n                            top: MediaQuery.of(App.globalContext!)\n                                .padding\n                                .bottom))\n                  ],\n                )),\n                Container(\n                  decoration: BoxDecoration(\n                      color: Theme.of(context)\n                          .colorScheme\n                          .surfaceTint\n                          .withAlpha(0),\n                      borderRadius: const BorderRadius.vertical(\n                          top: Radius.circular(16))),\n                  child: Padding(\n                    padding: const EdgeInsets.fromLTRB(10, 5, 10, 5),\n                    child: Container(\n                      decoration: BoxDecoration(\n                          color: Theme.of(context)\n                              .colorScheme\n                              .surfaceContainerHighest\n                              .withAlpha(160),\n                          borderRadius:\n                              const BorderRadius.all(Radius.circular(30))),\n                      child: Row(\n                        children: [\n                          Expanded(\n                              child: Padding(\n                            padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),\n                            child: TextField(\n                              controller: logic.controller,\n                              decoration: InputDecoration(\n                                border: InputBorder.none,\n                                isCollapsed: true,\n                                hintText: \"评论\".tl,\n                              ),\n                              minLines: 1,\n                              maxLines: 5,\n                            ),\n                          )),\n                          IconButton(\n                              onPressed: () async {\n                                showToast(message: \"正在发送评论\".tl);\n                                var res = await JmNetwork()\n                                    .comment(id, logic.controller.text);\n                                if (res.error) {\n                                  showToast(message:  res.errorMessage!);\n                                } else {\n                                  showToast(message: \"成功发表评论\".tl);\n                                  logic.refresh_();\n                                }\n                              },\n                              icon: Icon(\n                                Icons.send,\n                                color: Theme.of(context).colorScheme.secondary,\n                              ))\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n              ],\n            );\n          }\n        });\n    if (popUp) {\n      return body;\n    } else {\n      return Scaffold(\n        appBar: AppBar(\n          title: Text(\"评论\".tl),\n        ),\n        body: body,\n      );\n    }\n  }\n}\n\nvoid showReply(BuildContext context, List<Comment> comments, Comment replyTo) {\n  if (comments.isEmpty) return;\n  showSideBar(\n      context,\n      SingleChildScrollView(\n        child: Column(\n          children: [\n            CommentTile(\n              avatarUrl: replyTo.avatar,\n              name: replyTo.name,\n              content: replyTo.content,\n              time: replyTo.time,\n            ),\n            const Divider(),\n            for (int index = 0; index < comments.length; index++)\n              CommentTile(\n                avatarUrl: comments[index].avatar,\n                name: comments[index].name,\n                content: comments[index].content,\n                time: comments[index].time,\n              )\n          ],\n        ),\n      ),\n      title: \"回复\".tl,\n      showBarrier: false);\n}\n\nvoid showComments(BuildContext context, String id, int totalComments,\n    [String? mode]) {\n  showSideBar(\n      context,\n      JmCommentsPage(\n        id,\n        totalComments,\n        popUp: true,\n        mode: mode,\n      ),\n      title: \"评论\".tl);\n}\n"
  },
  {
    "path": "lib/pages/jm/week_recommendation_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/network/jm_network/jm_network.dart';\nimport 'package:pica_comic/network/jm_network/jm_models.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/components/components.dart';\n\nclass JWRPLogic extends StateController {\n  bool loading = true;\n  Map<String, String>? rec;\n  String? message;\n  String currentName = \"\";\n  String currentId = \"\";\n\n  void change() {\n    loading = !loading;\n    update();\n  }\n\n  void get() async {\n    rec = null;\n    message = null;\n    var res = await JmNetwork().getWeekRecommendation();\n    if (res.error) {\n      message = res.errorMessage;\n    } else {\n      rec = res.data;\n      currentName = rec!.values.first;\n      currentId = rec!.keys.first;\n    }\n    loading = false;\n    update();\n  }\n}\n\nclass JmWeekRecommendationPage extends StatelessWidget {\n  JmWeekRecommendationPage({Key? key}) : super(key: key);\n  final logic = StateController.put(JWRPLogic());\n\n  @override\n  Widget build(BuildContext context) {\n    var key = GlobalKey();\n    const titleLength = 190;\n    return Scaffold(\n      appBar: Appbar(\n        title: Text(\"每周必看\".tl),\n        actions: [\n          StateBuilder<JWRPLogic>(\n            builder: (logic) => Container(\n              key: key,\n              margin: const EdgeInsets.all(5),\n              padding: const EdgeInsets.all(5),\n              width: MediaQuery.of(context).size.width > 250 + titleLength\n                  ? 250\n                  : MediaQuery.of(context).size.width - titleLength,\n              height: 40,\n              decoration: BoxDecoration(\n                  color: Theme.of(context).colorScheme.surfaceContainerHighest,\n                  borderRadius: const BorderRadius.all(Radius.circular(16))),\n              child: Row(\n                children: [\n                  const SizedBox(\n                    width: 8,\n                  ),\n                  Expanded(\n                    child: Text(\n                      logic.currentName,\n                      maxLines: 1,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                  ),\n                  IconButton(\n                    icon: const Icon(Icons.arrow_drop_down_sharp),\n                    iconSize: 16,\n                    onPressed: () {\n                      if (logic.rec == null) return;\n                      var renderObject =\n                          key.currentContext!.findRenderObject() as RenderBox;\n                      var offset = renderObject.localToGlobal(Offset.zero);\n                      offset = Offset(offset.dx + 246, offset.dy + 53);\n                      showMenu(\n                          constraints: BoxConstraints(\n                              maxHeight: 300,\n                              minWidth: (MediaQuery.of(context).size.width > 250\n                                      ? 250\n                                      : MediaQuery.of(context).size.width) -\n                                  16),\n                          context: context,\n                          position: RelativeRect.fromLTRB(\n                              offset.dx,\n                              offset.dy,\n                              MediaQuery.of(context).size.width - offset.dx,\n                              MediaQuery.of(context).size.height - offset.dy),\n                          items: [\n                            for (var item in logic.rec!.entries)\n                              PopupMenuItem(\n                                child: Text(item.value),\n                                onTap: () {\n                                  logic.currentId = item.key;\n                                  logic.currentName = item.value;\n                                  logic.update();\n                                },\n                              )\n                          ]);\n                    },\n                  ),\n                ],\n              ),\n            ),\n          )\n        ],\n      ),\n      body: Column(\n        children: [\n          Expanded(\n            child: StateBuilder<JWRPLogic>(\n              builder: (logic) {\n                if (logic.loading) {\n                  logic.get();\n                  return const Center(\n                    child: CircularProgressIndicator(),\n                  );\n                } else if (logic.message != null) {\n                  return NetworkError(\n                    message: logic.message!,\n                    retry: () {\n                      logic.change();\n                      logic.get();\n                    },\n                  );\n                } else {\n                  return WeekRecommendationList(\n                    logic.currentId,\n                    key: Key(logic.currentId),\n                  );\n                }\n              },\n            ),\n          )\n        ],\n      ),\n    );\n  }\n}\n\nclass WRLLogic extends StateController {\n  var comics = <List<JmComicBrief>>[[], [], []];\n  var messages = <String?>[null, null, null];\n  var loading = <bool>[true, true, true];\n\n  void get(int index, String id) async {\n    var res = await JmNetwork()\n        .getWeekRecommendationComics(id, WeekRecommendationType.values[index]);\n    if (res.error) {\n      messages[index] = res.errorMessage;\n    } else {\n      comics[index] = res.data;\n    }\n    loading[index] = false;\n    update();\n  }\n\n  void retry(int index, String id) {\n    loading[index] = true;\n    messages[index] = null;\n    update();\n    get(index, id);\n  }\n}\n\nclass WeekRecommendationList extends StatelessWidget {\n  const WeekRecommendationList(this.id, {Key? key}) : super(key: key);\n  final String id;\n\n  @override\n  Widget build(BuildContext context) {\n    return DefaultTabController(\n        length: 3,\n        child: Column(\n          children: [\n            TabBar(tabs: [\n              Tab(\n                text: \"韩漫\".tl,\n              ),\n              Tab(\n                text: \"日漫\".tl,\n              ),\n              Tab(\n                text: \"其它\".tl,\n              )\n            ]),\n            Expanded(\n                child: StateBuilder<WRLLogic>(\n                    init: WRLLogic(),\n                    tag: id,\n                    builder: (logic) {\n                      return TabBarView(children: [\n                        for (int i = 0; i <= 2; i++)\n                          buildPage(i, logic, context)\n                      ]);\n                    }))\n          ],\n        ));\n  }\n\n  Widget buildPage(int index, WRLLogic logic, BuildContext context) {\n    if (logic.loading[index]) {\n      logic.get(index, id);\n      return const Center(\n        child: CircularProgressIndicator(),\n      );\n    } else if (logic.comics[index].isEmpty) {\n      return NetworkError(\n        message: logic.messages[index] ?? \"未知错误\".tl,\n        retry: () => logic.retry(index, id),\n      );\n    } else {\n      return CustomScrollView(\n        slivers: [\n          SliverGridComics(comics: logic.comics[index], sourceKey: \"jm\"),\n        ],\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/logs_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/tools/io_tools.dart';\nimport 'package:pica_comic/components/components.dart';\n\nclass LogsPage extends StatefulWidget {\n  const LogsPage({super.key});\n\n  @override\n  State<LogsPage> createState() => _LogsPageState();\n}\n\nclass _LogsPageState extends State<LogsPage> {\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"Logs\"),\n        actions: [\n          IconButton(onPressed: ()=>setState(() {\n            final RelativeRect position = RelativeRect.fromLTRB(\n              MediaQuery.of(context).size.width,\n              MediaQuery.of(context).padding.top + kToolbarHeight,\n              0.0,\n              0.0,\n            );\n            showMenu(context: context, position: position, items: [\n              PopupMenuItem(\n                child: const Text(\"清空\"),\n                onTap: () => setState(()=>LogManager.clear()),\n              ),\n              PopupMenuItem(\n                child: const Text(\"禁用长度限制\"),\n                onTap: (){\n                  LogManager.ignoreLimitation = true;\n                  showToast(message: \"仅在本次运行时有效\");\n                },\n              ),\n              PopupMenuItem(\n                child: const Text(\"导出\"),\n                onTap: () => saveLog(LogManager().toString()),\n              ),\n            ]);\n          }), icon: const Icon(Icons.more_horiz))\n        ],\n      ),\n      body: ListView.builder(\n        reverse: true,\n        controller: ScrollController(),\n        itemCount: LogManager.logs.length,\n        itemBuilder: (context, index){\n          index =  LogManager.logs.length - index - 1;\n          return Padding(\n            padding: const EdgeInsets.fromLTRB(16, 0, 16, 8),\n            child: SelectionArea(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Row(\n                    children: [\n                      Container(\n                        decoration: BoxDecoration(\n                          color: Theme.of(context).colorScheme.surfaceContainerHighest,\n                          borderRadius: const BorderRadius.all(Radius.circular(16)),\n                        ),\n                        child: Padding(\n                          padding: const EdgeInsets.fromLTRB(5, 0, 5, 1),\n                          child: Text(LogManager.logs[index].title),\n                        ),\n                      ),\n                      const SizedBox(width: 3,),\n                      Container(\n                        decoration: BoxDecoration(\n                          color: [\n                            Theme.of(context).colorScheme.error,\n                            Theme.of(context).colorScheme.errorContainer,\n                            Theme.of(context).colorScheme.primaryContainer\n                          ][LogManager.logs[index].level.index],\n                          borderRadius: const BorderRadius.all(Radius.circular(16)),\n                        ),\n                        child: Padding(\n                          padding: const EdgeInsets.fromLTRB(5, 0, 5, 1),\n                          child: Text(\n                            LogManager.logs[index].level.name,\n                            style: TextStyle(color: LogManager.logs[index].level.index==0?Colors.white:Colors.black),),\n                        ),\n                      ),\n                    ],\n                  ),\n                  Text(LogManager.logs[index].content),\n                  Text(LogManager.logs[index].time.toString().replaceAll(RegExp(r\"\\.\\w+\"), \"\")),\n                  TextButton(onPressed: (){\n                    Clipboard.setData(ClipboardData(text: LogManager.logs[index].content));\n                  }, child: const Text(\"复制\")),\n                  const Divider(),\n                ],\n              ),\n            ),\n          );\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/main_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app_page_route.dart';\nimport 'package:pica_comic/network/webdav.dart';\nimport 'package:pica_comic/tools/app_links.dart';\nimport 'package:pica_comic/tools/background_service.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:shared_preferences/shared_preferences.dart';\nimport 'category_page.dart';\nimport 'explore_page.dart';\nimport 'favorites/main_favorites_page.dart';\nimport 'pre_search_page.dart';\nimport 'settings/settings_page.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/network/update.dart';\nimport 'me_page.dart';\nimport 'package:pica_comic/network/picacg_network/methods.dart';\n\nbool _haveClipboardDialog = false;\n\nvoid checkClipboard() async {\n  if (appdata.settings[61] == \"0\") {\n    return;\n  }\n  var data = await Clipboard.getData(Clipboard.kTextPlain);\n  if (data?.text != null && canHandle(data!.text!)) {\n    await Future.delayed(const Duration(milliseconds: 200));\n    if (_haveClipboardDialog) {\n      return;\n    }\n    _haveClipboardDialog = true;\n    await showDialog(\n      context: App.globalContext!,\n      builder: (context) => ContentDialog(\n        title: \"发现剪切板中的链接\".tl,\n        content: Text(data.text!),\n        actions: [\n          TextButton(\n            onPressed: () {\n              App.globalContext!.pop();\n              handleAppLinks(Uri.parse(data.text!));\n            },\n            child: Text(\"打开\".tl),\n          ),\n        ],\n      ),\n    );\n    _haveClipboardDialog = false;\n  }\n}\n\nclass MainPage extends StatefulWidget {\n  const MainPage({Key? key}) : super(key: key);\n\n  static MainPageState of(BuildContext context) {\n    return context.findAncestorStateOfType<MainPageState>()!;\n  }\n\n  @override\n  State<MainPage> createState() => MainPageState();\n}\n\nclass MainPageState extends State<MainPage> {\n  GlobalKey<NavigatorState>? _navigatorKey;\n\n  late final NaviObserver _observer;\n\n  void to(Widget Function() widget, {bool preventDuplicate = false}) async {\n    if (preventDuplicate) {\n      var page = widget();\n      if (\"/${page.runtimeType}\" == _observer.routes.last.toString()) return;\n    }\n    App.to(_navigatorKey!.currentContext!, widget);\n  }\n\n  void back() {\n    _navigatorKey!.currentContext!.pop();\n  }\n\n  List<Widget> get _pages => [\n        const MePage(),\n        FavoritesPage(),\n        ExplorePage(\n          key: Key(appdata.appSettings.explorePages.length.toString()),\n        ),\n        const AllCategoryPage(),\n      ];\n\n  void _login() {\n    network.updateProfile().then((res) {\n      if (res.error) {\n        showToast(message: res.errorMessageWithoutNull);\n      } else {\n        //检查是否打卡\n        if (network.user?.isPunched == false && appdata.settings[6] == \"1\") {\n          if (App.isMobile) {\n            runBackgroundService();\n          } else {\n            network.user?.isPunched = true;\n            network.punchIn().then((b) {\n              if (b) {\n                showToast(message: \"打卡成功\".tl);\n                network.user?.exp += 10;\n              }\n            });\n          }\n        }\n      }\n    });\n  }\n\n  void _checkUpdates() async {\n    var s = await SharedPreferences.getInstance();\n    var lastCheck = s.getInt(\"lastCheckUpdate\");\n    if (lastCheck != null) {\n      if (DateTime.now().difference(DateTime.fromMillisecondsSinceEpoch(lastCheck)).inDays < 1) {\n        return;\n      }\n    }\n    if (appdata.settings[2] != \"1\") {\n      return;\n    }\n    var res = await checkUpdate();\n    s.setInt(\"lastCheckUpdate\", DateTime.now().millisecondsSinceEpoch);\n    if (res != true) return;\n    var info = await getUpdatesInfo();\n    if (info == null) return;\n    showDialog(\n        context: App.globalContext!,\n        builder: (dialogContext) {\n          return AlertDialog(\n            title: Text(\"有可用更新\".tl),\n            content: Text(info),\n            actions: [\n              TextButton(\n                  onPressed: () {\n                    dialogContext.pop();\n                    appdata.settings[2] = \"0\";\n                    appdata.writeData();\n                  },\n                  child: const Text(\"关闭更新检查\")),\n              TextButton(onPressed: dialogContext.pop, child: Text(\"取消\".tl)),\n              TextButton(\n                  onPressed: () {\n                    getDownloadUrl().then((s) {\n                      launchUrlString(s, mode: LaunchMode.externalApplication);\n                    });\n                  },\n                  child: Text(\"下载\".tl))\n            ],\n          );\n        });\n\n    if (appdata.settings[80] == \"1\") {\n      ComicSourceSettings.checkCustomComicSourceUpdate();\n    }\n  }\n\n  void _checkDownload() {\n    if (downloadManager.downloading.isNotEmpty) {\n      Future.delayed(const Duration(microseconds: 500), () {\n        if (mounted) {\n          showDialog(\n            context: context,\n            builder: (dialogContext) {\n              return AlertDialog(\n                title: Text(\"下载管理器\".tl),\n                content: Text(\"有未完成的下载, 是否继续?\".tl),\n                actions: [\n                  TextButton(onPressed: dialogContext.pop, child: Text(\"否\".tl)),\n                  TextButton(\n                      onPressed: () {\n                        downloadManager.start();\n                        dialogContext.pop();\n                      },\n                      child: Text(\"是\".tl))\n                ],\n              );\n            },\n          );\n        }\n      });\n    }\n  }\n\n  @override\n  void initState() {\n    _navigatorKey = GlobalKey();\n    App.mainNavigatorKey = _navigatorKey;\n    _login();\n    notifications.requestPermission();\n    notifications.cancelAll();\n    _checkUpdates();\n    _checkDownload();\n\n    if (appdata.firstUse[3] == \"0\") {\n      appdata.firstUse[3] = \"1\";\n      appdata.writeData();\n    }\n\n    Future.delayed(const Duration(milliseconds: 300), () => Webdav.syncData())\n        .then((v) => checkClipboard());\n    _observer = NaviObserver();\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return NaviPane(\n      initialPage: int.parse(appdata.settings[23]),\n      observer: _observer,\n      paneItems: [\n        PaneItemEntry(\n            label: '我'.tl,\n            icon: Icons.person_outline,\n            activeIcon: Icons.person),\n        PaneItemEntry(\n            label: '收藏'.tl,\n            icon: Icons.local_activity_outlined,\n            activeIcon: Icons.local_activity),\n        PaneItemEntry(\n            label: '探索'.tl,\n            icon: Icons.explore_outlined,\n            activeIcon: Icons.explore),\n        PaneItemEntry(\n            label: '分类'.tl,\n            icon: Icons.account_tree_outlined,\n            activeIcon: Icons.account_tree),\n      ],\n      paneActions: [\n        PaneActionEntry(\n            icon: Icons.search,\n            label: \"搜索\".tl,\n            onTap: () => to(() => PreSearchPage(), preventDuplicate: true)),\n        PaneActionEntry(\n            icon: Icons.settings,\n            label: \"设置\".tl,\n            onTap: () => SettingsPage.open()),\n      ],\n      pageBuilder: (index) {\n        return Navigator(\n          observers: [_observer],\n          key: _navigatorKey,\n          onGenerateRoute: (settings) => AppPageRoute(\n            preventRebuild: false,\n            isRootRoute: true,\n            builder: (context) {\n              return NaviPaddingWidget(child: _pages[index]);\n            },\n          ),\n        );\n      },\n      onPageChange: (index) {\n        _navigatorKey!.currentState?.pushAndRemoveUntil(\n            AppPageRoute(\n                preventRebuild: false,\n                isRootRoute: true,\n                builder: (context) {\n                  return NaviPaddingWidget(child: _pages[index]);\n                }),\n            (route) => false);\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/me_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'accounts_page.dart';\nimport 'package:pica_comic/pages/download_page.dart';\nimport 'package:pica_comic/pages/tools.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'history_page.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'image_favorites.dart';\n\nclass MePage extends StatelessWidget {\n  const MePage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return SizedBox.expand(\n      child: LayoutBuilder(\n        builder: (context, constrains) {\n          final width = constrains.maxWidth;\n          bool shouldShowTwoPanel = width > 600;\n          return SingleChildScrollView(\n            padding: const EdgeInsets.symmetric(horizontal: 12),\n            child: Column(\n              children: [\n                const SizedBox(\n                  height: 12,\n                ),\n                buildHistory(context),\n                if (shouldShowTwoPanel)\n                  Row(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      Expanded(\n                        child: Column(\n                          children: [\n                            const SizedBox(\n                              height: 12,\n                            ),\n                            buildAccount(width),\n                            const SizedBox(\n                              height: 12,\n                            ),\n                            buildDownload(context, width),\n                          ],\n                        ),\n                      ),\n                      const SizedBox(\n                        width: 12,\n                      ),\n                      Expanded(\n                        child: Column(\n                          children: [\n                            const SizedBox(\n                              height: 12,\n                            ),\n                            buildImageFavorite(context, width),\n                            const SizedBox(\n                              height: 12,\n                            ),\n                            buildTools(width),\n                          ],\n                        ),\n                      ),\n                    ],\n                  )\n                else ...[\n                  const SizedBox(\n                    height: 12,\n                  ),\n                  buildAccount(width),\n                  const SizedBox(\n                    height: 12,\n                  ),\n                  buildDownload(context, width),\n                  const SizedBox(\n                    height: 12,\n                  ),\n                  buildImageFavorite(context, width),\n                  const SizedBox(\n                    height: 12,\n                  ),\n                  buildTools(width),\n                ],\n              ],\n            ),\n          );\n        },\n      ),\n    );\n  }\n\n  Widget buildHistory(BuildContext context) {\n    var history = HistoryManager().getRecent();\n    return InkWell(\n      onTap: () => context.to(() => const HistoryPage()),\n      mouseCursor: SystemMouseCursors.click,\n      borderRadius: BorderRadius.circular(12),\n      child: Card.outlined(\n        margin: EdgeInsets.zero,\n        color: Colors.transparent,\n        child: Container(\n          margin: EdgeInsets.zero,\n          width: double.infinity,\n          child: Column(\n            children: [\n              ListTile(\n                leading: const Icon(Icons.history),\n                title: Text(\"${\"历史记录\".tl}(${HistoryManager().count()})\"),\n                trailing: const Icon(Icons.chevron_right),\n                mouseCursor: SystemMouseCursors.click,\n              ),\n              SizedBox(\n                height: 128,\n                child: ListView.builder(\n                  scrollDirection: Axis.horizontal,\n                  itemCount: history.length,\n                  itemBuilder: (context, index) {\n                    return InkWell(\n                      onTap: () =>\n                          toComicPageWithHistory(context, history[index]),\n                      borderRadius: BorderRadius.circular(8),\n                      child: Container(\n                        width: 96,\n                        height: 128,\n                        margin: const EdgeInsets.symmetric(horizontal: 8),\n                        decoration: BoxDecoration(\n                          borderRadius: BorderRadius.circular(8),\n                          color:\n                              Theme.of(context).colorScheme.secondaryContainer,\n                        ),\n                        clipBehavior: Clip.antiAlias,\n                        child: AnimatedImage(\n                          image: CachedImageProvider(\n                            history[index].cover,\n                            sourceKey: history[index].type.comicSource?.key,\n                          ),\n                          width: 96,\n                          height: 128,\n                          fit: BoxFit.cover,\n                          filterQuality: FilterQuality.medium,\n                        ),\n                      ),\n                    );\n                  },\n                ),\n              ).paddingHorizontal(8),\n              const SizedBox(\n                height: 12,\n              )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildAccount(double width) {\n    var accounts = findAccounts();\n\n    Widget buildItem(String name) {\n      return Container(\n        height: 24,\n        padding: const EdgeInsets.symmetric(horizontal: 12),\n        decoration: BoxDecoration(\n          color: Theme.of(App.globalContext!).colorScheme.secondaryContainer,\n          borderRadius: BorderRadius.circular(12),\n        ),\n        child: Text(\n          name,\n          style: const TextStyle(fontSize: 12),\n        ).paddingTop(4),\n      );\n    }\n\n    return _MePageCard(\n      icon: const Icon(Icons.switch_account),\n      title: \"账号管理\".tl,\n      description: \"已登录 @a 个账号\".tlParams({\"a\": accounts.length.toString()}),\n      onTap: () => showPopUpWidget(App.globalContext!, const AccountsPage()),\n      child: Wrap(\n        spacing: 8,\n        runSpacing: 8,\n        children: accounts.map((e) => buildItem(e)).toList(),\n      ).paddingHorizontal(12).paddingBottom(12),\n    );\n  }\n\n  Widget buildDownload(BuildContext context, double width) {\n    return _MePageCard(\n      icon: const Icon(Icons.download_for_offline),\n      title: \"已下载\".tl,\n      description:\n          \"共 @a 部漫画\".tlParams({\"a\": DownloadManager().total.toString()}),\n      onTap: () => context.to(() => const DownloadPage()),\n    );\n  }\n\n  Widget buildImageFavorite(BuildContext context, double width) {\n    return _MePageCard(\n      icon: const Icon(Icons.image),\n      title: \"图片收藏\".tl,\n      description:\n          \"@a 条图片收藏\".tlParams({\"a\": ImageFavoriteManager.length.toString()}),\n      onTap: () => context.to(() => const ImageFavoritesPage()),\n    );\n  }\n\n  Widget buildTools(double width) {\n    Widget buildItem(String name) {\n      return Container(\n        height: 24,\n        padding: const EdgeInsets.symmetric(horizontal: 12),\n        decoration: BoxDecoration(\n          color: Theme.of(App.globalContext!).colorScheme.primaryContainer,\n          borderRadius: BorderRadius.circular(12),\n        ),\n        child: Text(\n          name,\n          style: const TextStyle(fontSize: 12),\n        ).paddingTop(4),\n      );\n    }\n\n    return _MePageCard(\n      icon: const Icon(Icons.build_circle),\n      title: \"工具\".tl,\n      description: \"使用工具发现更多漫画\".tl,\n      onTap: openTool,\n      child: Wrap(\n        spacing: 8,\n        runSpacing: 8,\n        children: [\n          buildItem(\"Eh订阅\".tl),\n          buildItem(\"图片搜索\".tl),\n          buildItem(\"打开链接\".tl),\n        ],\n      ).paddingHorizontal(12).paddingBottom(12),\n    );\n  }\n\n  List<String> findAccounts() {\n    var result = <String>[];\n    for (var source in ComicSource.sources) {\n      if (source.isLogin) {\n        result.add(source.name);\n      }\n    }\n    return result;\n  }\n}\n\nclass _MePageCard extends StatelessWidget {\n  const _MePageCard({\n    required this.icon,\n    required this.title,\n    required this.description,\n    required this.onTap,\n    this.child,\n  });\n\n  final Widget icon;\n  final String title;\n  final String description;\n  final VoidCallback onTap;\n  final Widget? child;\n\n  @override\n  Widget build(BuildContext context) {\n    return InkWell(\n      onTap: onTap,\n      borderRadius: BorderRadius.circular(12),\n      child: Card.outlined(\n        margin: EdgeInsets.zero,\n        color: Colors.transparent,\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            ListTile(\n              leading: icon,\n              title: Text(title),\n              trailing: const Icon(Icons.chevron_right),\n              mouseCursor: SystemMouseCursors.click,\n            ),\n            Text(description)\n                .paddingHorizontal(16)\n                .paddingBottom(16)\n                .paddingTop(8),\n            if (child != null) child!\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/nhentai/comic_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/network/nhentai_network/nhentai_main_network.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/category_comics_page.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/pages/search_result_page.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nimport '../../base.dart';\nimport '../../foundation/app.dart';\nimport '../../foundation/history.dart';\nimport '../../foundation/local_favorites.dart';\nimport '../../network/download.dart';\nimport 'comments.dart';\n\nclass NhentaiComicPage extends BaseComicPage<NhentaiComic> {\n  const NhentaiComicPage(String id, {super.key, this.comicCover}) : _id = id;\n\n  final String _id;\n\n  final String? comicCover;\n\n  @override\n  String get url => \"https://nhentai.net/g/$_id/\";\n\n  @override\n  String get id => (data?.id) ?? _id;\n\n  @override\n  ActionFunc? get searchSimilar => () {\n        String? subTitle = data!.subTitle;\n        if (subTitle == \"\") {\n          subTitle = null;\n        }\n        var title = subTitle ?? data!.title;\n        title = title\n            .replaceAll(RegExp(r\"\\[.*?\\]\"), \"\")\n            .replaceAll(RegExp(r\"\\(.*?\\)\"), \"\");\n        context.to(\n          () => SearchResultPage(\n            keyword: \"\\\"$title\\\"\".trim(),\n            sourceKey: sourceKey,\n          ),\n        );\n      };\n\n  @override\n  void openFavoritePanel() {\n    favoriteComic(FavoriteComicWidget(\n      havePlatformFavorite: NhentaiNetwork().logged,\n      needLoadFolderData: false,\n      favoriteOnPlatform: data!.favorite,\n      initialFolder: \"0\",\n      localFavoriteItem: toLocalFavoriteItem(),\n      setFavorite: (b) {\n        if (favorite != b) {\n          favorite = b;\n          update();\n        }\n      },\n      folders: const {\"0\": \"Nhentai\"},\n      selectFolderCallback: (folder, page) async {\n        if (page == 0) {\n          var res = await NhentaiNetwork().favoriteComic(id, data!.token);\n          if (res.success) {\n            data!.favorite = true;\n          }\n          return res;\n        } else {\n          LocalFavoritesManager().addComic(\n            folder,\n            FavoriteItem.fromNhentai(\n              NhentaiComicBrief(\n                data!.title,\n                data!.cover,\n                id,\n                \"Unknown\",\n                data!.tags[\"Tags\"] ?? const <String>[],\n              ),\n            ),\n          );\n          return const Res(true);\n        }\n      },\n      cancelPlatformFavorite: () async {\n        var res = await NhentaiNetwork().unfavoriteComic(id, data!.token);\n        if(res.success) {\n          data!.favorite = false;\n        }\n        return res;\n      },\n    ));\n  }\n\n  @override\n  ActionFunc? get openComments => () {\n        showComments(App.globalContext!, id);\n      };\n\n  @override\n  String? get cover => comicCover ?? data?.cover;\n\n  @override\n  void download() {\n    final id = \"nhentai${data!.id}\";\n    if (DownloadManager().isExists(id)) {\n      showToast(message: \"已下载\".tl);\n      return;\n    }\n    for (var i in DownloadManager().downloading) {\n      if (i.id == id) {\n        showToast(message: \"下载中\".tl);\n        return;\n      }\n    }\n    DownloadManager().addNhentaiDownload(data!);\n    showToast(message: \"已加入下载队列\".tl);\n  }\n\n  @override\n  EpsData? get eps => null;\n\n  @override\n  String? get introduction => null;\n\n  @override\n  bool get enableTranslationToCN => App.locale.languageCode == \"zh\";\n\n  @override\n  Future<Res<NhentaiComic>> loadData() => NhentaiNetwork().getComicInfo(_id);\n\n  @override\n  int? get pages => int.tryParse(data?.tags[\"Pages\"]?.elementAtOrNull(0) ?? \"\");\n\n  @override\n  String? get subTitle => data?.subTitle;\n\n  @override\n  void read(History? history) async {\n    history = await History.createIfNull(history, data!);\n    App.globalTo(() => ComicReadingPage.nhentai(data!.id, data!.title));\n  }\n\n  @override\n  void onThumbnailTapped(int index) async {\n    await History.findOrCreate(data!);\n    App.globalTo(\n      () => ComicReadingPage.nhentai(\n        data!.id,\n        data!.title,\n        initialPage: index + 1,\n      ),\n    );\n  }\n\n  @override\n  Future<bool> loadFavorite(NhentaiComic data) async {\n    return data.favorite ||\n        (await LocalFavoritesManager().findWithModel(toLocalFavoriteItem())).isNotEmpty;\n  }\n\n  @override\n  Widget? recommendationBuilder(NhentaiComic data) =>\n      SliverGridComics(comics: data.recommendations, sourceKey: sourceKey);\n\n  @override\n  String get tag => \"Nhentai $_id\";\n\n  Map<String, List<String>> generateTags() {\n    var tags = Map<String, List<String>>.from(data!.tags);\n    tags.remove(\"Pages\");\n    tags.removeWhere((key, value) => value.isEmpty);\n    return tags;\n  }\n\n  @override\n  Map<String, List<String>>? get tags => generateTags();\n\n  @override\n  void tapOnTag(String tag, String key) {\n    if (tag.contains(\" | \")) {\n      tag = tag.replaceAll(' | ', '-');\n    }\n    if (tag.contains(\" \")) {\n      tag = tag.replaceAll(' ', '-');\n    }\n    String? categoryParam = switch (key) {\n      \"Parodies\" => \"/parody/$tag\",\n      \"Character\" => \"/character/$tag\",\n      \"Tags\" => \"/tag/$tag\",\n      \"Artists\" => \"/artist/$tag\",\n      \"Groups\" => \"/group/$tag\",\n      \"Languages\" => \"/language/$tag\",\n      \"Categories\" => \"/category/$tag\",\n      _ => null\n    };\n\n    if (categoryParam == null) {\n      context.to(\n        () => SearchResultPage(\n          keyword: tag,\n          sourceKey: sourceKey,\n        ),\n      );\n    } else {\n      context.to(\n        () => CategoryComicsPage(\n          category: tag,\n          categoryKey: ComicSource.find(sourceKey)!.categoryData!.key,\n          param: categoryParam,\n        ),\n      );\n    }\n  }\n\n  @override\n  ThumbnailsData? get thumbnailsCreator =>\n      ThumbnailsData(data!.thumbnails, (page) async => const Res([]), 1);\n\n  @override\n  String? get title => data?.title;\n\n  @override\n  Card? get uploaderInfo => null;\n\n  @override\n  String get source => \"Nhentai\";\n\n  @override\n  FavoriteItem toLocalFavoriteItem() =>\n      FavoriteItem.fromNhentai(NhentaiComicBrief(data!.title, data!.cover, id,\n          \"Unknown\", data!.tags[\"Tags\"] ?? const <String>[]));\n\n  @override\n  String get downloadedId => \"nhentai${data!.id}\";\n\n  @override\n  String get sourceKey => 'nhentai';\n}\n"
  },
  {
    "path": "lib/pages/nhentai/comments.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/components/comment.dart';\nimport 'package:pica_comic/network/nhentai_network/nhentai_main_network.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/components/components.dart';\n\nclass NhentaiCommentsPage extends StatefulWidget {\n  const NhentaiCommentsPage(this.id, {super.key});\n\n  final String id;\n\n  @override\n  State<NhentaiCommentsPage> createState() => _NhentaiCommentsPageState();\n}\n\nclass _NhentaiCommentsPageState extends State<NhentaiCommentsPage> {\n  bool loading = true;\n  List<NhentaiComment>? comments;\n  String? message;\n  var controller = TextEditingController();\n\n  @override\n  Widget build(BuildContext context) {\n    if (loading) {\n      get();\n      return const Center(\n        child: CircularProgressIndicator(),\n      );\n    } else if (message != null) {\n      return NetworkError(\n        message: message!,\n        retry: () => setState(\n          () {\n            loading = true;\n            message = null;\n            comments = null;\n          },\n        ),\n        withAppbar: false,\n      );\n    } else {\n      return Column(\n        children: [\n          Expanded(\n              child: CustomScrollView(\n            slivers: [\n              SliverList(\n                  delegate: SliverChildBuilderDelegate(\n                      childCount: comments!.length, (context, index) {\n                return CommentTile(\n                  avatarUrl: comments![index].avatar,\n                  name: comments![index].userName,\n                  content: comments![index].content,\n                );\n              })),\n              SliverPadding(\n                  padding: EdgeInsets.only(\n                      top: MediaQuery.of(context).padding.bottom))\n            ],\n          )),\n          Container(\n            decoration: BoxDecoration(\n                color: Theme.of(context).colorScheme.surfaceTint.withAlpha(0),\n                borderRadius:\n                    const BorderRadius.vertical(top: Radius.circular(16))),\n            child: Padding(\n              padding: const EdgeInsets.fromLTRB(10, 5, 10, 5),\n              child: Container(\n                decoration: BoxDecoration(\n                    color: Theme.of(context)\n                        .colorScheme\n                        .surfaceContainerHighest\n                        .withAlpha(160),\n                    borderRadius: const BorderRadius.all(Radius.circular(30))),\n                child: Row(\n                  children: [\n                    Expanded(\n                        child: Padding(\n                      padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),\n                      child: TextField(\n                        enabled: false,\n                        controller: controller,\n                        decoration: InputDecoration(\n                          border: InputBorder.none,\n                          isCollapsed: true,\n                          hintText: \"评论\".tl,\n                        ),\n                        minLines: 1,\n                        maxLines: 5,\n                      ),\n                    )),\n                    IconButton(\n                        onPressed: () {\n                          //TODO\n                          showToast(message: \"未完成\");\n                        },\n                        icon: Icon(\n                          Icons.send,\n                          color: Theme.of(context).colorScheme.secondary,\n                        ))\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ],\n      );\n    }\n  }\n\n  void get() async {\n    var res = await NhentaiNetwork().getComments(widget.id);\n    setState(() {\n      loading = false;\n      if (res.error) {\n        message = res.errorMessageWithoutNull;\n      } else {\n        comments = res.data;\n      }\n    });\n  }\n}\n\nvoid showComments(BuildContext context, String id) {\n  showSideBar(context, NhentaiCommentsPage(id), title: \"评论\".tl);\n}\n"
  },
  {
    "path": "lib/pages/picacg/collections_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/network/picacg_network/methods.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\n\nclass CollectionPageLogic extends StateController {\n  bool isLoading = true;\n  var c1 = <ComicItemBrief>[];\n  var c2 = <ComicItemBrief>[];\n  bool status = true;\n  String? message;\n\n  void change() {\n    isLoading = !isLoading;\n    update();\n  }\n\n  void get() async {\n    var collections = await network.getCollection();\n    if (collections.success) {\n      c1 = collections.data[0];\n      c2 = collections.data[1];\n      change();\n    } else {\n      status = false;\n      message = collections.errorMessageWithoutNull;\n      change();\n    }\n  }\n}\n\nclass CollectionsPage extends StatelessWidget {\n  const CollectionsPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text(\"推荐\".tl),\n      ),\n      body: StateBuilder<CollectionPageLogic>(\n        init: CollectionPageLogic(),\n        builder: (logic) {\n          if (logic.isLoading) {\n            network.getCollection().then((collections) {\n              if (collections.success) {\n                logic.c1 = collections.data[0];\n                logic.c2 = collections.data[1];\n                logic.change();\n              } else {\n                logic.status = false;\n                logic.change();\n              }\n            });\n            return const Center(\n              child: CircularProgressIndicator(),\n            );\n          } else if (logic.status) {\n            return CustomScrollView(\n              slivers: [\n                SliverGridComics(\n                  comics: logic.c1 + logic.c2,\n                  sourceKey: 'picacg',\n                ),\n                SliverPadding(\n                  padding: EdgeInsets.only(\n                    top: MediaQuery.of(App.globalContext!).padding.bottom,\n                  ),\n                )\n              ],\n            );\n          } else {\n            return NetworkError(\n              message: logic.message ?? \"网络错误\".tl,\n              retry: () {\n                logic.status = true;\n                logic.change();\n              },\n            );\n          }\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/picacg/comic_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/comic_source/built_in/picacg.dart';\nimport 'package:pica_comic/components/select_download_eps.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/network/picacg_network/methods.dart';\nimport 'package:pica_comic/foundation/ui_mode.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/category_comics_page.dart';\nimport 'package:pica_comic/pages/picacg/comments_page.dart';\nimport 'package:pica_comic/pages/reader/comic_reading_page.dart';\nimport 'package:pica_comic/pages/search_result_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/components/components.dart';\nimport '../../network/picacg_network/picacg_download_model.dart';\nimport '../comic_page.dart';\n\nclass PicacgComicPage extends BaseComicPage<ComicItem> {\n  @override\n  final String id;\n\n  @override\n  final String? cover;\n\n  const PicacgComicPage(this.id, this.cover, {super.key});\n\n  @override\n  ActionFunc? get onLike => () {\n        network.likeOrUnlikeComic(id);\n        data!.isLiked = !data!.isLiked;\n        update();\n      };\n\n  @override\n  String? get likeCount => data?.likes.toString();\n\n  @override\n  bool get isLiked => data!.isLiked;\n\n  @override\n  void openFavoritePanel() {\n    favoriteComic(FavoriteComicWidget(\n      havePlatformFavorite: picacg.isLogin,\n      needLoadFolderData: false,\n      folders: const {\"Picacg\": \"Picacg\"},\n      initialFolder: data!.isFavourite ? null : \"Picacg\",\n      favoriteOnPlatform: data!.isFavourite,\n      localFavoriteItem: toLocalFavoriteItem(),\n      setFavorite: (b) {\n        if (favorite != b) {\n          favorite = b;\n          update();\n        }\n      },\n      cancelPlatformFavorite: () async {\n        var res = await network.favouriteOrUnfavouriteComic(id);\n        if(res) {\n          data!.isFavourite = false;\n          return const Res(true);\n        }\n        return Res.error(\"网络错误\".tl);\n      },\n      selectFolderCallback: (name, p) async {\n        if (p == 0) {\n          var res = await network.favouriteOrUnfavouriteComic(id);\n          if(res) {\n            data!.isFavourite = true;\n            update();\n            return const Res(true);\n          } else {\n            return Res.error(\"网络错误\".tl);\n          }\n        } else {\n          LocalFavoritesManager().addComic(name, toLocalFavoriteItem());\n          return const Res(true);\n        }\n      },\n    ));\n  }\n\n  @override\n  ActionFunc? get openComments => () => showComments(App.globalContext!, id);\n\n  @override\n  String? get commentsCount => data!.comments.toString();\n\n  @override\n  void download() {\n    _downloadComic(data!, App.globalContext!, data!.eps);\n  }\n\n  @override\n  EpsData? get eps {\n    return EpsData(\n      data!.eps,\n      (i) async {\n        await History.findOrCreate(data!);\n        App.globalTo(\n            () => ComicReadingPage.picacg(id, i + 1, data!.eps, data!.title));\n      },\n    );\n  }\n\n  @override\n  String? get introduction => data?.description;\n\n  @override\n  Future<Res<ComicItem>> loadData() => network.getComicInfo(id);\n\n  @override\n  int? get pages => data?.pagesCount;\n\n  @override\n  void read(History? history) async {\n    history = await History.createIfNull(history, data!);\n    App.globalTo(\n      () => ComicReadingPage.picacg(\n        id,\n        history!.ep,\n        data!.eps,\n        data!.title,\n        initialPage: history.page,\n      ),\n    );\n  }\n\n  @override\n  Widget recommendationBuilder(data) =>\n      SliverGridComics(comics: data.recommendation, sourceKey: sourceKey);\n\n  @override\n  String get tag => \"Picacg Comic Page $id\";\n\n  @override\n  Map<String, List<String>>? get tags => {\n        \"作者\".tl: data!.author.toList(),\n        \"汉化\".tl: data!.chineseTeam.toList(),\n        \"分类\".tl: data!.categories,\n        \"标签\".tl: data!.tags\n      };\n\n  @override\n  void tapOnTag(String tag, String key) {\n    if (data!.categories.contains(tag)) {\n      context.to(\n        () => CategoryComicsPage(\n          category: tag,\n          categoryKey: \"picacg\",\n        ),\n      );\n    } else if (data!.author == tag) {\n      context.to(\n        () => CategoryComicsPage(\n          category: tag,\n          param: \"a\",\n          categoryKey: \"picacg\",\n        ),\n      );\n    } else {\n      context.to(\n        () => SearchResultPage(\n          keyword: tag,\n          sourceKey: sourceKey,\n        ),\n      );\n    }\n  }\n\n  @override\n  ThumbnailsData? get thumbnailsCreator => null;\n\n  @override\n  String? get title => data?.title;\n\n  @override\n  Future<bool> loadFavorite(ComicItem data) async {\n    return data.isFavourite ||\n        (await LocalFavoritesManager().findWithModel(toLocalFavoriteItem())).isNotEmpty;\n  }\n\n  @override\n  Card? get uploaderInfo => Card(\n        elevation: 0,\n        color: context.colorScheme.inversePrimary,\n        child: SizedBox(\n          height: 60,\n          child: Row(\n            children: [\n              Expanded(\n                flex: 0,\n                child: Avatar(\n                  size: 50,\n                  avatarUrl: data!.creator.avatarUrl,\n                  frame: data!.creator.frameUrl,\n                  couldBeShown: true,\n                  name: data!.creator.name,\n                  slogan: data!.creator.slogan,\n                  level: data!.creator.level,\n                ),\n              ),\n              Expanded(\n                flex: 3,\n                child: Padding(\n                  padding: const EdgeInsets.fromLTRB(15, 10, 0, 0),\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      Text(\n                        data!.creator.name,\n                        style: const TextStyle(\n                            fontSize: 15, fontWeight: FontWeight.w600),\n                      ),\n                      Text(\n                          \"${data!.time.substring(0, 10)} ${data!.time.substring(11, 19)}更新\")\n                    ],\n                  ),\n                ),\n              ),\n            ],\n          ),\n        ),\n      );\n\n  @override\n  String get source => \"Picacg\";\n\n  @override\n  FavoriteItem toLocalFavoriteItem() => FavoriteItem(\n        target: id,\n        name: data!.title,\n        coverPath: data!.thumbUrl,\n        author: data!.author,\n        type: FavoriteType.picacg,\n        tags: data!.tags,\n      );\n\n  @override\n  String get downloadedId => id;\n\n  @override\n  String get sourceKey => \"picacg\";\n}\n\nclass ComicPageLogic extends StateController {\n  bool isLoading = true;\n  ComicItem? comicItem;\n  bool showAppbarTitle = false;\n  String? message;\n  var tags = <Widget>[];\n  var categories = <Widget>[];\n  var recommendation = <ComicItemBrief>[];\n  var controller = ScrollController();\n  var eps = <Widget>[\n    ListTile(\n      leading: const Icon(Icons.library_books),\n      title: Text(\"章节\".tl),\n    ),\n  ];\n  var epsStr = <String>[\"\"];\n\n  void change() {\n    isLoading = !isLoading;\n    update();\n  }\n}\n\nvoid _downloadComic(\n    ComicItem comic, BuildContext context, List<String> eps) async {\n  for (var i in downloadManager.downloading) {\n    if (i.id == comic.id) {\n      showToast(message: \"下载中\".tl);\n      return;\n    }\n  }\n  var downloaded = <int>[];\n  if (DownloadManager().isExists(comic.id)) {\n    var downloadedComic = (await DownloadManager().getComicOrNull(comic.id))!\n      as DownloadedComic;\n    downloaded.addAll(downloadedComic.downloadedEps);\n  }\n  var content = SelectDownloadChapter(\n    eps,\n    (selectedEps) {\n      downloadManager.addPicDownload(comic, selectedEps);\n      App.globalBack();\n      showToast(message: \"已加入下载\".tl);\n    },\n    downloaded,\n  );\n  if (UiMode.m1(App.globalContext!)) {\n    showModalBottomSheet(\n      context: App.globalContext!,\n      builder: (context) => content,\n    );\n  } else {\n    showSideBar(\n      App.globalContext!,\n      content,\n      useSurfaceTintColor: true,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/picacg/comments_page.dart",
    "content": "import 'package:pica_comic/components/comment.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/network/picacg_network/methods.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nclass CommentsPageLogic extends StateController {\n  bool isLoading = true;\n  var comments = Comments([], \"\", 0, 0);\n  bool sending = false;\n  var controller = TextEditingController();\n\n  void change() {\n    isLoading = !isLoading;\n    update();\n  }\n}\n\nclass CommentsPage extends StatelessWidget {\n  final String id;\n  final String type;\n  final bool popUp;\n\n  const CommentsPage(this.id,\n      {Key? key, this.type = \"comics\", this.popUp = false})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    Widget body = StateBuilder<CommentsPageLogic>(\n      init: CommentsPageLogic(),\n      builder: (logic) {\n        if (logic.isLoading) {\n          network.getCommends(id, type: type).then((c) {\n            logic.comments = c;\n            logic.change();\n          });\n          return const Center(\n            child: CircularProgressIndicator(),\n          );\n        } else if (logic.comments.loaded == 0) {\n          return NetworkError(\n            message: \"网络错误\".tl,\n            retry: () => logic.change(),\n            withAppbar: false,\n          );\n        } else {\n          return Column(\n            children: [\n              Expanded(\n                  child: CustomScrollView(\n                slivers: [\n                  SliverList(\n                      delegate: SliverChildBuilderDelegate(\n                          childCount: logic.comments.comments.length,\n                          (context, index) {\n                    if (index == logic.comments.comments.length - 1 &&\n                        logic.comments.pages != logic.comments.loaded) {\n                      network\n                          .loadMoreCommends(logic.comments, type: type)\n                          .then((t) {\n                        logic.update();\n                      });\n                    }\n                    var comment = logic.comments.comments[index];\n                    var subInfo =\n                        \"${comment.time.substring(0, 10)}  ${comment.time.substring(11, 19)}\";\n                    return CommentTile(\n                      avatarUrl: comment.avatarUrl,\n                      name: comment.name,\n                      content: comment.text,\n                      slogan: comment.slogan,\n                      level: comment.level,\n                      time: subInfo,\n                      like: () {\n                        network.likeOrUnlikeComment(comment.id);\n                        comment.isLiked = !comment.isLiked;\n                        comment.isLiked ? comment.likes++ : comment.likes--;\n                        logic.update();\n                      },\n                      likes: comment.likes,\n                      liked: comment.isLiked,\n                      comments: comment.reply,\n                      onTap: () => showReply(context, comment.id, comment),\n                    );\n                  })),\n                  if (logic.comments.loaded != logic.comments.pages &&\n                      logic.comments.pages != 1)\n                    const SliverToBoxAdapter(\n                      child: ListLoadingIndicator(),\n                    ),\n                  SliverPadding(\n                      padding: EdgeInsets.only(\n                          top:\n                              MediaQuery.of(App.globalContext!).padding.bottom))\n                ],\n              )),\n              Container(\n                decoration: BoxDecoration(\n                    color: Theme.of(context).colorScheme.surface,\n                    borderRadius:\n                        const BorderRadius.vertical(top: Radius.circular(16))),\n                child: Padding(\n                  padding: const EdgeInsets.fromLTRB(10, 5, 10, 5),\n                  child: Material(\n                    child: Container(\n                      decoration: BoxDecoration(\n                          color: Theme.of(context)\n                              .colorScheme\n                              .surfaceContainerHighest\n                              .withAlpha(160),\n                          borderRadius:\n                              const BorderRadius.all(Radius.circular(30))),\n                      child: Row(\n                        children: [\n                          Expanded(\n                              child: Padding(\n                            padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),\n                            child: TextField(\n                              controller: logic.controller,\n                              decoration: InputDecoration(\n                                  border: InputBorder.none,\n                                  isCollapsed: true,\n                                  hintText: \"评论\".tl),\n                              minLines: 1,\n                              maxLines: 5,\n                            ),\n                          )),\n                          logic.sending\n                              ? const Padding(\n                                  padding: EdgeInsets.all(8.5),\n                                  child: SizedBox(\n                                    width: 23,\n                                    height: 23,\n                                    child: CircularProgressIndicator(),\n                                  ),\n                                )\n                              : IconButton(\n                                  onPressed: () async {\n                                    if (logic.controller.text.length < 2) {\n                                      showToast(message: \"评论至少需要2个字\".tl);\n                                      return;\n                                    }\n                                    logic.sending = true;\n                                    logic.update();\n                                    var b = await network.comment(\n                                        id, logic.controller.text, false);\n                                    if (b) {\n                                      logic.controller.text = \"\";\n                                      logic.sending = false;\n                                      var res = await network.getCommends(id);\n                                      logic.comments = Comments([], id, 1, 1);\n                                      logic.update();\n                                      await Future.delayed(\n                                          const Duration(milliseconds: 200));\n                                      logic.comments = res;\n                                      logic.update();\n                                    } else {\n                                      showToast(message: \"网络错误\".tl);\n                                      logic.sending = false;\n                                      logic.update();\n                                    }\n                                  },\n                                  icon: Icon(\n                                    Icons.send,\n                                    color:\n                                        Theme.of(context).colorScheme.secondary,\n                                  ))\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ],\n          );\n        }\n      },\n    );\n\n    if (popUp) {\n      return body;\n    } else {\n      return Scaffold(\n        appBar: AppBar(\n          title: Text(\"评论\".tl),\n        ),\n        body: body,\n      );\n    }\n  }\n}\n\nvoid showComments(BuildContext context, String id) {\n  showSideBar(\n      context,\n      CommentsPage(\n        id,\n        popUp: true,\n      ),\n      title: \"评论\".tl);\n}\n\nclass ReplyPageLogic extends StateController {\n  bool isLoading = true;\n  var comments = Reply(\"\", 0, 1, []);\n  bool sending = false;\n  var controller = TextEditingController();\n\n  void change() {\n    isLoading = !isLoading;\n    update();\n  }\n}\n\nclass ReplyPage extends StatelessWidget {\n  final String id;\n  final Comment replyTo;\n  final bool popUp;\n\n  const ReplyPage(this.id, this.replyTo, {this.popUp = false, Key? key})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    var body = StateBuilder<ReplyPageLogic>(\n      init: ReplyPageLogic(),\n      builder: (commentsPageLogic) {\n        if (commentsPageLogic.isLoading) {\n          network.getReply(id).then((c) {\n            commentsPageLogic.comments = c;\n            commentsPageLogic.change();\n          });\n          return const Center(\n            child: CircularProgressIndicator(),\n          );\n        } else if (commentsPageLogic.comments.loaded == 0) {\n          return NetworkError(\n            message: \"网络错误\".tl,\n            retry: () => commentsPageLogic.change(),\n            withAppbar: false,\n          );\n        } else {\n          return Column(\n            children: [\n              Expanded(\n                  child: CustomScrollView(\n                slivers: [\n                  SliverToBoxAdapter(\n                    child: CommentTile(\n                      avatarUrl: replyTo.avatarUrl,\n                      name: replyTo.name,\n                      content: replyTo.text,\n                      time:\n                          \"${replyTo.time.substring(0, 10)}  ${replyTo.time.substring(11, 19)}\",\n                      slogan: replyTo.slogan,\n                      level: replyTo.level,\n                    ),\n                  ),\n                  const SliverPadding(padding: EdgeInsets.all(2)),\n                  const SliverToBoxAdapter(\n                    child: Padding(\n                      padding: EdgeInsets.symmetric(horizontal: 15),\n                      child: Divider(),\n                    ),\n                  ),\n                  SliverList(\n                      delegate: SliverChildBuilderDelegate(\n                          childCount: commentsPageLogic\n                              .comments.comments.length, (context, index) {\n                    if (index ==\n                            commentsPageLogic.comments.comments.length - 1 &&\n                        commentsPageLogic.comments.total !=\n                            commentsPageLogic.comments.loaded) {\n                      network\n                          .getMoreReply(commentsPageLogic.comments)\n                          .then((t) {\n                        commentsPageLogic.update();\n                      });\n                    }\n                    var comment = commentsPageLogic.comments.comments[index];\n                    var subInfo =\n                        \"${comment.time.substring(0, 10)}  ${comment.time.substring(11, 19)}\";\n                    return CommentTile(\n                      avatarUrl: comment.avatarUrl,\n                      name: comment.name,\n                      content: comment.text,\n                      slogan: comment.slogan,\n                      level: comment.level,\n                      time: subInfo,\n                      like: () {\n                        network.likeOrUnlikeComment(comment.id);\n                        comment.isLiked = !comment.isLiked;\n                        comment.isLiked ? comment.likes++ : comment.likes--;\n                        commentsPageLogic.update();\n                      },\n                      likes: comment.likes,\n                      liked: comment.isLiked,\n                    );\n                  })),\n                  if (commentsPageLogic.comments.loaded !=\n                          commentsPageLogic.comments.total &&\n                      commentsPageLogic.comments.total != 1)\n                    const SliverToBoxAdapter(\n                      child: ListLoadingIndicator(),\n                    ),\n                  SliverPadding(\n                      padding: EdgeInsets.only(\n                          top:\n                              MediaQuery.of(App.globalContext!).padding.bottom))\n                ],\n              )),\n              Container(\n                decoration: BoxDecoration(\n                    color: Theme.of(context).colorScheme.surface,\n                    borderRadius:\n                        const BorderRadius.vertical(top: Radius.circular(16))),\n                child: Padding(\n                  padding: const EdgeInsets.fromLTRB(10, 5, 10, 5),\n                  child: Material(\n                    child: Container(\n                      decoration: BoxDecoration(\n                          color: Theme.of(context)\n                              .colorScheme\n                              .surfaceContainerHighest\n                              .withAlpha(160),\n                          borderRadius:\n                              const BorderRadius.all(Radius.circular(30))),\n                      child: Row(\n                        children: [\n                          Expanded(\n                              child: Padding(\n                            padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),\n                            child: TextField(\n                              controller: commentsPageLogic.controller,\n                              decoration: InputDecoration(\n                                  border: InputBorder.none,\n                                  isCollapsed: true,\n                                  hintText: \"回复\".tl),\n                              minLines: 1,\n                              maxLines: 5,\n                            ),\n                          )),\n                          commentsPageLogic.sending\n                              ? const Padding(\n                                  padding: EdgeInsets.all(8.5),\n                                  child: SizedBox(\n                                    width: 23,\n                                    height: 23,\n                                    child: CircularProgressIndicator(),\n                                  ),\n                                )\n                              : IconButton(\n                                  onPressed: () async {\n                                    if (commentsPageLogic\n                                            .controller.text.length <\n                                        2) {\n                                      showToast(message: \"评论至少需要2个字\".tl);\n                                      return;\n                                    }\n                                    commentsPageLogic.sending = true;\n                                    commentsPageLogic.update();\n                                    var b = await network.comment(\n                                        id,\n                                        commentsPageLogic.controller.text,\n                                        true);\n                                    if (b) {\n                                      commentsPageLogic.controller.text = \"\";\n                                      commentsPageLogic.sending = false;\n                                      var res = await network.getReply(id);\n                                      commentsPageLogic.comments =\n                                          Reply(id, 1, 1, []);\n                                      commentsPageLogic.update();\n                                      await Future.delayed(\n                                          const Duration(milliseconds: 200));\n                                      commentsPageLogic.comments = res;\n                                      commentsPageLogic.update();\n                                    } else {\n                                      showToast(message: \"网络错误\".tl);\n                                      commentsPageLogic.sending = false;\n                                      commentsPageLogic.update();\n                                    }\n                                  },\n                                  icon: Icon(\n                                    Icons.send,\n                                    color:\n                                        Theme.of(context).colorScheme.secondary,\n                                  ))\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n              Padding(\n                  padding: EdgeInsets.only(\n                      bottom: MediaQuery.of(context).padding.bottom))\n            ],\n          );\n        }\n      },\n    );\n\n    if (popUp) {\n      return body;\n    } else {\n      return Scaffold(\n        appBar: AppBar(\n          title: Text(\"回复\".tl),\n        ),\n        body: body,\n      );\n    }\n  }\n}\n\nvoid showReply(BuildContext context, String id, Comment replyTo) {\n  showSideBar(\n      context,\n      ReplyPage(\n        id,\n        replyTo,\n        popUp: true,\n      ),\n      title: \"回复\".tl,\n      showBarrier: false);\n}\n"
  },
  {
    "path": "lib/pages/pre_search_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/pair.dart';\nimport 'package:pica_comic/foundation/ui_mode.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/pages/search_result_page.dart';\nimport 'package:pica_comic/tools/app_links.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:sliver_tools/sliver_tools.dart';\n\ntypedef FilterChip = FilterChipFixedWidth;\n\nclass _FloatingSearchBar extends StatefulWidget {\n  const _FloatingSearchBar(\n      {Key? key,\n      required this.supportingText,\n      required this.onFinish,\n      required this.controller,\n      this.onChanged,\n      this.focusNode})\n      : super(key: key);\n\n  final void Function(String) onFinish;\n  final String supportingText;\n  final TextEditingController controller;\n  final void Function(String)? onChanged;\n  final FocusNode? focusNode;\n\n  @override\n  State<_FloatingSearchBar> createState() => _FloatingSearchBarState();\n}\n\nclass _FloatingSearchBarState extends State<_FloatingSearchBar> {\n  @override\n  Widget build(BuildContext context) {\n    final ColorScheme colorScheme = Theme.of(context).colorScheme;\n    final TextTheme textTheme = Theme.of(context).textTheme;\n    var padding = 12.0;\n    return Container(\n      padding: EdgeInsets.fromLTRB(padding, 0, padding, 0),\n      margin: const EdgeInsets.symmetric(horizontal: 12) +\n          const EdgeInsets.only(top: 8),\n      width: double.infinity,\n      height: 48,\n      decoration: BoxDecoration(\n        color: colorScheme.primaryContainer,\n        borderRadius: BorderRadius.circular(32),\n      ),\n      child: Row(children: [\n        Tooltip(\n          message: \"返回\".tl,\n          child: IconButton(\n            icon: const Icon(Icons.arrow_back),\n            onPressed: () => context.pop(),\n          ),\n        ),\n        Expanded(\n          child: Center(\n            child: TextField(\n              controller: widget.controller,\n              onChanged: (s) {\n                if (s.length <= 1) {\n                  setState(() {});\n                }\n                widget.onChanged?.call(s);\n              },\n              focusNode: widget.focusNode,\n              decoration: InputDecoration(\n                isCollapsed: true,\n                border: InputBorder.none,\n                hintText: widget.supportingText,\n                hintStyle: textTheme.bodyLarge?.apply(\n                  color: colorScheme.onSurfaceVariant,\n                ),\n              ),\n              textInputAction: TextInputAction.search,\n              onSubmitted: widget.onFinish,\n            ),\n          ),\n        ),\n        if (widget.controller.text.isNotEmpty)\n          Tooltip(\n            message: \"clear\",\n            child: IconButton(\n              icon: const Icon(Icons.clear_rounded),\n              iconSize: 18,\n              onPressed: () {\n                setState(() {\n                  widget.controller.text = \"\";\n                });\n              },\n            ),\n          ),\n        Tooltip(\n          message: \"search\",\n          child: IconButton(\n            icon: const Icon(Icons.search),\n            onPressed: () {\n              widget.onFinish(widget.controller.text);\n            },\n          ),\n        ),\n      ]),\n    );\n  }\n}\n\nclass PreSearchController extends StateController {\n  String target = '';\n\n  SearchPageData get searchPageData =>\n      ComicSource.find(target)!.searchPageData!;\n\n  var options = <String>[];\n\n  var suggestions = <Pair<String, TranslationType>>[];\n\n  String? language;\n\n  bool limitHistory = true;\n\n  void updateOptions() {\n    for (var source in ComicSource.sources) {\n      if (source.key == target &&\n          source.searchPageData?.searchOptions != null) {\n        options = List.generate(\n          source.searchPageData!.searchOptions!.length,\n          (index) => source.searchPageData!.searchOptions![index].defaultValue,\n        );\n      }\n    }\n  }\n\n  void updateTarget(String i) {\n    target = i;\n    updateOptions();\n    update();\n  }\n\n  PreSearchController() {\n    var searchSource = <String>[];\n    for (var source in ComicSource.sources) {\n      searchSource.add(source.key);\n    }\n    if (!searchSource.contains(appdata.appSettings.initialSearchTarget)) {\n      appdata.appSettings.initialSearchTarget = searchSource.first;\n      appdata.updateSettings();\n    }\n    target = appdata.appSettings.initialSearchTarget;\n    updateOptions();\n  }\n}\n\nclass PreSearchPage extends StatelessWidget {\n  PreSearchPage({String initialValue = \"\", super.key})\n      : controller = TextEditingController(text: initialValue);\n\n  final TextEditingController controller;\n\n  final searchController = StateController.put(PreSearchController());\n\n  final comicSources =\n      ComicSource.sources.where((element) => element.searchPageData != null);\n\n  final FocusNode _focusNode = FocusNode();\n\n  void search([String? s, String? type]) {\n    var keyword = (s ?? controller.text).trim();\n    if (searchController.language != null &&\n        searchController.searchPageData.enableLanguageFilter) {\n      keyword += \" language:${searchController.language}\";\n    }\n    var context = App.mainNavigatorKey!.currentContext!;\n    context.to(\n      () => SearchResultPage(\n        keyword: keyword,\n        sourceKey: type ?? searchController.target,\n        options: searchController.options,\n      ),\n    );\n  }\n\n  void findSuggestions() {\n    var text = controller.text.split(\" \").last;\n    var suggestions = searchController.suggestions;\n\n    suggestions.clear();\n\n    if (canHandle(controller.text)) {\n      suggestions.add(Pair(\"**URL**\", TranslationType.other));\n    } else {\n      var text = controller.text;\n\n      for (var comicSource in ComicSource.sources) {\n        if (comicSource.idMatcher?.hasMatch(text) ?? false) {\n          suggestions\n              .add(Pair(\"**${comicSource.key}**\", TranslationType.other));\n        }\n      }\n    }\n\n    if (!searchController.searchPageData.enableTagsSuggestions) return;\n\n    bool check(String text, String key, String value) {\n      if (text.removeAllBlank == \"\") {\n        return false;\n      }\n      if (key.length >= text.length && key.substring(0, text.length) == text ||\n          (key.contains(\" \") &&\n              key.split(\" \").last.length >= text.length &&\n              key.split(\" \").last.substring(0, text.length) == text)) {\n        return true;\n      } else if (value.length >= text.length && value.contains(text)) {\n        return true;\n      }\n      return false;\n    }\n\n    void find(Map<String, String> map, TranslationType type) {\n      for (var element in map.entries) {\n        if (suggestions.length > 200) {\n          break;\n        }\n        if (check(text, element.key, element.value)) {\n          suggestions.add(Pair(element.key, type));\n        }\n      }\n    }\n\n    find(TagsTranslation.femaleTags, TranslationType.female);\n    find(TagsTranslation.maleTags, TranslationType.male);\n    find(TagsTranslation.parodyTags, TranslationType.parody);\n    find(TagsTranslation.characterTranslations, TranslationType.character);\n    find(TagsTranslation.otherTags, TranslationType.other);\n    find(TagsTranslation.mixedTags, TranslationType.mixed);\n    find(TagsTranslation.languageTranslations, TranslationType.language);\n    find(TagsTranslation.artistTags, TranslationType.artist);\n    find(TagsTranslation.groupTags, TranslationType.group);\n    find(TagsTranslation.cosplayerTags, TranslationType.cosplayer);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      floatingActionButton: FloatingActionButton(\n        onPressed: search,\n        child: const Icon(Icons.search),\n      ),\n      body: Column(\n        children: [\n          if (UiMode.m1(context))\n            SizedBox(\n              height: MediaQuery.of(context).padding.top,\n            ),\n          Builder(\n            builder: (context) => _FloatingSearchBar(\n              supportingText: '${'搜索'.tl} / ${'链接'.tl} / ID',\n              onFinish: (s) {\n                if (s == \"\") return;\n                search();\n              },\n              controller: controller,\n              onChanged: (s) {\n                findSuggestions();\n                searchController.update([1, 100]);\n              },\n              focusNode: _focusNode,\n            ),\n          ),\n          const SizedBox(\n            height: 8,\n          ),\n          buildBody(context)\n        ],\n      ),\n    );\n  }\n\n  Widget buildBody(BuildContext context) {\n    var widget = StateBuilder<PreSearchController>(\n      id: 100,\n      builder: (logic) {\n        if (controller.text.removeAllBlank.isEmpty ||\n            controller.text.endsWith(\" \") ||\n            searchController.suggestions.isEmpty) {\n          return buildMainView(context, logic);\n        } else {\n          return buildSuggestions(context);\n        }\n      },\n    );\n    return Expanded(\n      child: widget,\n    );\n  }\n\n  Widget buildMainView(BuildContext context, PreSearchController logic) {\n    final showSideBar = MediaQuery.of(context).size.width > 950;\n    var addWidth = (MediaQuery.of(context).size.width - 950) * 0.25;\n    addWidth = addWidth.clamp(0, 50);\n    return Row(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        if (showSideBar)\n          SizedBox(\n            width: 250 + addWidth,\n            height: double.infinity,\n            child: buildHistorySideBar(),\n          ),\n        if (showSideBar)\n          const VerticalDivider(\n            width: 1,\n          ),\n        Expanded(\n            child: CustomScrollView(\n          slivers: [\n            if (showSideBar)\n              ListTile(\n                leading: const Icon(Icons.select_all),\n                title: Text(\"搜索选项\".tl),\n              ).toSliver(),\n            buildTargetSelector(context).toSliver(),\n            SliverAnimatedPaintExtent(\n              duration: const Duration(milliseconds: 180),\n              child: buildSearchOptions(context).toSliver(),\n            ),\n            if (!showSideBar) ...buildHistoryAndFavoritesForMobile(logic),\n            SliverPadding(\n              padding: EdgeInsets.only(bottom: context.padding.bottom),\n            )\n          ],\n        )),\n        if (showSideBar)\n          const VerticalDivider(\n            width: 1,\n          ),\n        if (showSideBar)\n          SizedBox(\n            width: 250 + addWidth,\n            height: double.infinity,\n            child: buildFavoriteSideBar(),\n          ),\n      ],\n    );\n  }\n\n  Widget buildSuggestions(BuildContext context) {\n    bool check(String text, String key, String value) {\n      if (text.removeAllBlank == \"\") {\n        return false;\n      }\n      if (key.length >= text.length && key.substring(0, text.length) == text ||\n          (key.contains(\" \") &&\n              key.split(\" \").last.length >= text.length &&\n              key.split(\" \").last.substring(0, text.length) == text)) {\n        return true;\n      } else if (value.length >= text.length && value.contains(text)) {\n        return true;\n      }\n      return false;\n    }\n\n    return StateBuilder<PreSearchController>(\n      builder: (logic) {\n        void onSelected(String text, TranslationType? type) {\n          var words = controller.text.split(\" \");\n          if (words.length >= 2 &&\n              check(\"${words[words.length - 2]} ${words[words.length - 1]}\",\n                  text, text.translateTagsToCN)) {\n            controller.text = controller.text.replaceLast(\n                \"${words[words.length - 2]} ${words[words.length - 1]}\", \"\");\n          } else {\n            controller.text =\n                controller.text.replaceLast(words[words.length - 1], \"\");\n          }\n          if (text.contains(\" \")) {\n            if (logic.target == '3' &&\n                [\"male\", \"female\", \"language\"].contains(type?.name)) {\n              text = text.replaceAll(\" \", '_');\n              text = \"${type?.name}:$text\";\n            } else {\n              text = \"\\\"$text\\\"\";\n            }\n          }\n          if (logic.target == '1') {\n            if (type != null) {\n              controller.text += \"${type.name}:$text \";\n            } else {\n              controller.text += \"$text \";\n            }\n          } else {\n            controller.text += \"$text \";\n          }\n          logic.update([1, 100]);\n          _focusNode.requestFocus();\n        }\n\n        Widget widget;\n\n        if (controller.text.removeAllBlank.isEmpty) {\n          widget = buildMainView(context, logic);\n        } else {\n          bool showMethod = MediaQuery.of(context).size.width < 600;\n          bool showTranslation = App.locale.languageCode == \"zh\";\n          Widget buildItem(Pair<String, TranslationType> value) {\n            if (value.left == \"**URL**\") {\n              return ListTile(\n                leading: const Icon(Icons.link),\n                title: Text(\"打开链接\".tl),\n                subtitle: Text(\n                  controller.text,\n                  maxLines: 1,\n                  overflow: TextOverflow.fade,\n                ),\n                trailing: const Icon(Icons.arrow_right),\n                onTap: () {\n                  handleAppLinks(Uri.parse(controller.text));\n                },\n              );\n            }\n\n            if (RegExp(r\"^\\*\\*.*\\*\\*$\").hasMatch(value.left)) {\n              var key = value.left.substring(2, value.left.length - 2);\n              var comicSource = ComicSource.find(key);\n              if (comicSource == null) {\n                return const SizedBox();\n              }\n              return ListTile(\n                leading: const Icon(Icons.link),\n                title: Text(\"${\"打开漫画\".tl}: ${comicSource.name}\"),\n                subtitle: Text(\n                  controller.text,\n                  maxLines: 1,\n                  overflow: TextOverflow.fade,\n                ),\n                trailing: const Icon(Icons.arrow_right),\n                onTap: () {\n                  context.to(\n                    () => ComicPage(\n                      sourceKey: key,\n                      id: controller.text,\n                    ),\n                  );\n                },\n              );\n            }\n\n            var subTitle = TagsTranslation.translationTagWithNamespace(\n                value.left, value.right.name);\n            return ListTile(\n              title: Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Text(value.left),\n                  if (!showMethod)\n                    const SizedBox(\n                      width: 12,\n                    ),\n                  if (!showMethod && showTranslation)\n                    Text(\n                      subTitle,\n                      style: TextStyle(\n                          fontSize: 14,\n                          color: Theme.of(context).colorScheme.outline),\n                    )\n                ],\n              ),\n              subtitle: (showMethod && showTranslation) ? Text(subTitle) : null,\n              trailing: Text(\n                value.right.name,\n                style: const TextStyle(fontSize: 13),\n              ),\n              onTap: () => onSelected(value.left, value.right),\n            );\n          }\n\n          widget = Column(\n            children: [\n              SizedBox(\n                height: 32,\n                child: Row(\n                  children: [\n                    const SizedBox(\n                      width: 32,\n                    ),\n                    Text(\"建议\".tl),\n                    const Spacer(),\n                    InkWell(\n                      borderRadius: BorderRadius.circular(14),\n                      onTap: () {\n                        searchController.suggestions.clear();\n                        logic.update([100]);\n                      },\n                      child: const Padding(\n                        padding: EdgeInsets.all(4),\n                        child: Icon(\n                          Icons.close,\n                          size: 20,\n                        ),\n                      ),\n                    ),\n                    const SizedBox(\n                      width: 36,\n                    ),\n                  ],\n                ),\n              ),\n              Expanded(\n                child: ListView.builder(\n                  padding: const EdgeInsets.symmetric(horizontal: 16),\n                  itemCount: searchController.suggestions.length,\n                  itemBuilder: (context, index) =>\n                      buildItem(searchController.suggestions[index]),\n                ),\n              )\n            ],\n          );\n        }\n        return widget;\n      },\n      id: 1,\n    );\n  }\n\n  Widget buildTargetSelector(BuildContext context) {\n    buildItem(PreSearchController logic, String id, String text) => Padding(\n          padding: const EdgeInsets.all(4),\n          child: FilterChip(\n            label: Text(text),\n            selected: logic.target == id,\n            onSelected: (b) {\n              logic.updateTarget(id);\n            },\n          ),\n        );\n\n    return StateBuilder<PreSearchController>(\n      builder: (logic) {\n        return Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            ListTile(title: Text(\"目标\".tl)),\n            Wrap(\n              children: [\n                for (var source in comicSources)\n                  buildItem(logic, source.key, source.name)\n              ],\n            ).paddingHorizontal(12),\n            const SizedBox(height: 8)\n          ],\n        );\n      },\n    );\n  }\n\n  Widget buildSearchOptions(BuildContext context) {\n    Widget buildLangSelector() {\n      const languages = [\"chinese\", \"japanese\", \"english\"];\n      return Padding(\n        padding: const EdgeInsets.only(top: 8, left: 12, right: 12),\n        child: Row(\n          children: [\n            const SizedBox(\n              width: 8,\n            ),\n            Text(\"语言\".tl),\n            const SizedBox(\n              width: 16,\n            ),\n            Select(\n              initialValue: languages.indexOf(searchController.language ?? \"\"),\n              onChange: (i) => searchController.language = languages[i],\n              values: languages,\n              outline: true,\n            ),\n          ],\n        ),\n      );\n    }\n\n    return StateBuilder<PreSearchController>(\n      id: \"mode\",\n      builder: (logic) {\n        var children = <Widget>[];\n        if (logic.searchPageData.customOptionsBuilder != null) {\n          children.add(\n            logic.searchPageData.customOptionsBuilder!(context, [], (options) {\n              logic.options = options;\n            }),\n          );\n        } else {\n          final searchOptions =\n              logic.searchPageData.searchOptions ?? <SearchOptions>[];\n          for (int i = 0; i < searchOptions.length; i++) {\n            final option = searchOptions[i];\n            children.add(ListTile(\n              title: Text(option.label.tl),\n            ));\n            children.add(Wrap(\n              runSpacing: 8,\n              spacing: 8,\n              children: option.options.entries.map((e) {\n                return OptionChip(\n                  text: e.value.tl,\n                  isSelected: logic.options[i] == e.key,\n                  onTap: () {\n                    logic.options[i] = e.key;\n                    logic.update();\n                  },\n                );\n              }).toList(),\n            ).paddingHorizontal(16));\n          }\n        }\n        if (logic.searchPageData.enableLanguageFilter) {\n          children.add(buildLangSelector());\n        }\n        return Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: children,\n        ).paddingBottom(12);\n      },\n    );\n  }\n\n  Widget buildHistoryItem(String history, PreSearchController logic) {\n    return Flyout(\n      enableLongPress: true,\n      enableSecondaryTap: true,\n      navigator: App.navigatorKey.currentState,\n      flyoutBuilder: (context) {\n        return FlyoutContent(\n          title: \"要删除此项目吗?\".tl,\n          actions: [\n            FilledButton(\n              style: ButtonStyle(\n                backgroundColor: WidgetStateProperty.all(\n                  Theme.of(context).colorScheme.error,\n                ),\n              ),\n              onPressed: () {\n                appdata.searchHistory.remove(history);\n                logic.update([\"history\"]);\n                appdata.writeHistory();\n                App.globalBack();\n              },\n              child: Text(\"确认\".tl),\n            )\n          ],\n        );\n      },\n      child: InkWell(\n        onTap: () => search(history),\n        child: SizedBox(\n          width: double.infinity,\n          child: Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),\n            child: Align(\n              alignment: Alignment.centerLeft,\n              child: Text(\n                history,\n                style: const TextStyle(fontSize: 16),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildFavoriteItem(String tag, PreSearchController logic) {\n    return Flyout(\n      enableLongPress: true,\n      enableSecondaryTap: true,\n      navigator: App.navigatorKey.currentState,\n      flyoutBuilder: (context) {\n        return FlyoutContent(\n          title: \"要删除此项目吗?\".tl,\n          actions: [\n            FilledButton(\n              style: ButtonStyle(\n                backgroundColor: WidgetStateProperty.all(\n                  Theme.of(context).colorScheme.error,\n                ),\n              ),\n              onPressed: () {\n                appdata.favoriteTags.remove(tag);\n                searchController.update();\n                appdata.writeHistory();\n                App.globalBack();\n              },\n              child: Text(\"确认\".tl),\n            )\n          ],\n        );\n      },\n      child: ListTile(\n        title: Text(tag.substring(tag.indexOf(':') + 1)),\n        subtitle: Text(tag.split(':').first),\n        onTap: () {\n          String type = switch (tag.split(':').first) {\n            \"Picacg\" => 'picacg',\n            \"EHentai\" => 'ehentai',\n            \"JMComic\" => 'jm',\n            \"hitomi\" => 'hitomi',\n            \"HtComic\" => 'htmanga',\n            \"Nhentai\" => 'nhentai',\n            _ => tag.split(':').first\n          };\n          final keyword = tag.substring(tag.indexOf(':') + 1);\n          search(keyword, type);\n        },\n      ),\n    );\n  }\n\n  Widget buildClearHistoryButton(PreSearchController logic) {\n    return FlyoutIconButton(\n      navigator: App.navigatorKey.currentState,\n      flyoutBuilder: (context) {\n        return FlyoutContent(\n          title: \"要清空历史记录吗?\".tl,\n          actions: [\n            FilledButton(\n              style: ButtonStyle(\n                backgroundColor: WidgetStateProperty.all(\n                  Theme.of(context).colorScheme.error,\n                ),\n              ),\n              onPressed: () {\n                appdata.searchHistory.clear();\n                appdata.writeHistory();\n                logic.update([\"history\"]);\n                App.globalBack();\n              },\n              child: Text(\"确认\".tl),\n            )\n          ],\n        );\n      },\n      icon: const Icon(Icons.clear_all),\n    );\n  }\n\n  Widget buildClearFavoriteButton(PreSearchController logic) {\n    return FlyoutIconButton(\n      navigator: App.navigatorKey.currentState,\n      flyoutBuilder: (context) {\n        return FlyoutContent(\n          title: \"要清空收藏吗?\".tl,\n          actions: [\n            FilledButton(\n              style: ButtonStyle(\n                backgroundColor: WidgetStateProperty.all(\n                  Theme.of(context).colorScheme.error,\n                ),\n              ),\n              onPressed: () {\n                appdata.favoriteTags.clear();\n                appdata.writeHistory();\n                logic.update();\n                App.globalBack();\n              },\n              child: Text(\"确认\".tl),\n            )\n          ],\n        );\n      },\n      icon: const Icon(Icons.clear_all),\n    );\n  }\n\n  Widget buildHistorySideBar() {\n    return StateBuilder<PreSearchController>(\n      id: \"history\",\n      builder: (logic) {\n        return ListView.builder(\n          padding: EdgeInsets.zero,\n          itemCount: appdata.searchHistory.length + 1,\n          itemBuilder: (context, index) {\n            if (index == 0) {\n              return ListTile(\n                leading: const Icon(Icons.history),\n                title: Text(\"历史搜索\".tl),\n                trailing: buildClearHistoryButton(logic),\n              );\n            } else {\n              var history =\n                  appdata.searchHistory[appdata.searchHistory.length - index];\n              return buildHistoryItem(history, logic);\n            }\n          },\n        );\n      },\n    );\n  }\n\n  Widget buildFavoriteSideBar() {\n    return StateBuilder<PreSearchController>(\n      builder: (logic) => ListView.builder(\n        padding: EdgeInsets.zero,\n        itemCount: appdata.favoriteTags.length + 1,\n        itemBuilder: (context, index) {\n          if (index == 0) {\n            return ListTile(\n              leading: const Icon(Icons.favorite_border),\n              title: Text(\"收藏\".tl),\n              trailing: buildClearFavoriteButton(logic),\n            );\n          } else {\n            final s = appdata.favoriteTags.elementAt(index - 1);\n            return buildFavoriteItem(s, logic);\n          }\n        },\n      ),\n    );\n  }\n\n  Iterable<Widget> buildHistoryAndFavoritesForMobile(\n      PreSearchController logic) sync* {\n    yield const Divider().paddingHorizontal(16).toSliver();\n    yield ListTile(\n      leading: const Icon(Icons.history),\n      title: Text(\"历史搜索\".tl),\n      trailing: buildClearHistoryButton(logic),\n    ).toSliver();\n    yield StateBuilder<PreSearchController>(\n      id: \"history\",\n      builder: (logic) {\n        var length = appdata.searchHistory.length;\n        if (length < 10) {\n          logic.limitHistory = false;\n        }\n        if (logic.limitHistory) {\n          length = length.clamp(0, 10);\n        }\n        return SliverList.builder(\n          itemCount: length,\n          itemBuilder: (context, index) {\n            if (index == length - 1 && logic.limitHistory) {\n              return TextButton(\n                child: Text(\"查看更多\".tl),\n                onPressed: () {\n                  logic.limitHistory = false;\n                  logic.update([\"history\"]);\n                },\n              ).toAlign(Alignment.center);\n            }\n            var history =\n                appdata.searchHistory[appdata.searchHistory.length - index - 1];\n            return buildHistoryItem(history, logic);\n          },\n        );\n      },\n    );\n    yield const Divider().paddingHorizontal(16).toSliver();\n    yield ListTile(\n      leading: const Icon(Icons.favorite_border),\n      title: Text(\"收藏\".tl),\n      trailing: buildClearFavoriteButton(logic),\n    ).toSliver();\n\n    yield StateBuilder<PreSearchController>(\n      builder: (logic) => SliverList.builder(\n        itemCount: appdata.favoriteTags.length,\n        itemBuilder: (context, index) {\n          final s = appdata.favoriteTags.elementAt(index);\n          return buildFavoriteItem(s, logic);\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/ranking_page.dart",
    "content": "import \"package:flutter/material.dart\";\nimport \"package:pica_comic/comic_source/comic_source.dart\";\nimport \"package:pica_comic/components/components.dart\";\nimport \"package:pica_comic/foundation/app.dart\";\nimport \"package:pica_comic/network/res.dart\";\nimport \"package:pica_comic/tools/translations.dart\";\nimport 'package:pica_comic/network/base_comic.dart';\n\nclass RankingPage extends StatefulWidget {\n  const RankingPage({required this.sourceKey, super.key});\n\n  final String sourceKey;\n\n  @override\n  State<RankingPage> createState() => _RankingPageState();\n}\n\nclass _RankingPageState extends State<RankingPage> {\n  late final CategoryComicsData data;\n  late final Map<String, String> options;\n  late String optionValue;\n\n  void findData() {\n    for (final source in ComicSource.sources) {\n      if (source.categoryData?.key == widget.sourceKey) {\n        data = source.categoryComicsData!;\n        options = data.rankingData!.options;\n        optionValue = options.keys.first;\n        return;\n      }\n    }\n    throw \"${widget.sourceKey} Not found\";\n  }\n\n  @override\n  void initState() {\n    findData();\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: Appbar(\n        title: Text(\"排行榜\".tl),\n      ),\n      body: Column(\n        children: [\n          Expanded(\n              child: _CustomCategoryComicsList(\n            key: ValueKey(\"RankingPage with $optionValue\"),\n            loader: data.rankingData!.load,\n            optionValue: optionValue,\n            header: buildOptions(),\n            sourceKey: widget.sourceKey,\n          ))\n        ],\n      ),\n    );\n  }\n\n  Widget buildOptionItem(String text, String value, BuildContext context) {\n    return OptionChip(\n      text: text,\n      isSelected: value == optionValue,\n      onTap: () {\n        if (value == optionValue) return;\n        setState(() {\n          optionValue = value;\n        });\n      },\n    );\n  }\n\n  Widget buildOptions() {\n    List<Widget> children = [];\n    children.add(Wrap(\n      spacing: 8,\n      runSpacing: 8,\n      children: [\n        for (var option in options.entries)\n          buildOptionItem(option.value.tl, option.key, context)\n      ],\n    ));\n    return SliverToBoxAdapter(\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [...children, const Divider()],\n      ).paddingLeft(8).paddingRight(8),\n    );\n  }\n}\n\nclass _CustomCategoryComicsList extends ComicsPage<BaseComic> {\n  const _CustomCategoryComicsList({\n    super.key,\n    required this.loader,\n    required this.optionValue,\n    required this.header,\n    required this.sourceKey,\n  });\n\n  final Future<Res<List<BaseComic>>> Function(String option, int page) loader;\n\n  final String optionValue;\n\n  @override\n  final String sourceKey;\n\n  @override\n  final Widget header;\n\n  @override\n  Future<Res<List<BaseComic>>> getComics(int i) async {\n    return await loader(optionValue, i);\n  }\n\n  @override\n  String? get tag => \"$sourceKey RankingPage with $optionValue\";\n\n  @override\n  String? get title => null;\n}\n"
  },
  {
    "path": "lib/pages/reader/comic_reading_page.dart",
    "content": "library pica_reader;\n\nimport 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';\nimport 'package:photo_view/photo_view.dart';\nimport 'package:photo_view/photo_view_gallery.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/components/custom_slider.dart';\nimport 'package:pica_comic/components/scrollable_list/src/item_positions_listener.dart';\nimport 'package:pica_comic/components/scrollable_list/src/scrollable_positioned_list.dart';\nimport 'package:pica_comic/components/window_frame.dart';\nimport 'package:pica_comic/foundation/image_loader/base_image_provider.dart';\nimport 'package:pica_comic/foundation/image_loader/file_image_loader.dart';\nimport 'package:pica_comic/foundation/image_loader/stream_image_provider.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/network/eh_network/eh_models.dart';\nimport 'package:pica_comic/network/eh_network/get_gallery_id.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/network/htmanga_network/htmanga_main_network.dart';\nimport 'package:pica_comic/network/jm_network/jm_models.dart';\nimport 'package:pica_comic/network/nhentai_network/nhentai_main_network.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/pages/comic_page.dart';\nimport 'package:pica_comic/tools/keep_screen_on.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/tools/save_image.dart';\nimport 'package:pica_comic/tools/time.dart';\nimport 'package:pica_comic/network/jm_network/jm_network.dart';\nimport '../../foundation/app.dart';\nimport '../../foundation/ui_mode.dart';\nimport '../../network/hitomi_network/hitomi_models.dart';\nimport '../../tools/key_down_event.dart';\nimport 'package:pica_comic/network/picacg_network/methods.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nimport '../jm/jm_comments_page.dart';\n\npart 'eps_view.dart';\n\npart 'image_view.dart';\n\npart 'image.dart';\n\npart 'touch_control.dart';\n\npart 'reading_logic.dart';\n\npart 'tool_bar.dart';\n\npart 'reading_type.dart';\n\npart 'reading_settings.dart';\n\npart 'reading_data.dart';\n\n///阅读器\nclass ComicReadingPage extends StatelessWidget {\n  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();\n\n  final ReadingData readingData;\n\n  late final History? history = HistoryManager().findSync(readingData.id);\n\n  final int initialPage;\n\n  final int initialEp;\n\n  ReadingType get type => readingData.type;\n\n  ComicReadingPage(this.readingData, this.initialPage, this.initialEp,\n      {super.key}) {\n    StateController.put(ComicReadingPageLogic(\n        initialEp,\n        readingData,\n        initialPage,\n        () => _updateHistory(\n            StateController.find<ComicReadingPageLogic>(), false)));\n  }\n\n  ComicReadingPage.picacg(\n      String target, this.initialEp, List<String> eps, String title,\n      {super.key, this.initialPage = 1})\n      : readingData = PicacgReadingData(title, target, eps) {\n    StateController.put(ComicReadingPageLogic(\n        initialEp,\n        readingData,\n        initialPage,\n        () => _updateHistory(\n            StateController.find<ComicReadingPageLogic>(), false)));\n  }\n\n  ComicReadingPage.ehentai(Gallery gallery, {super.key, this.initialPage = 1})\n      : initialEp = 1,\n        readingData = EhReadingData(gallery) {\n    StateController.put(ComicReadingPageLogic(\n        1,\n        readingData,\n        initialPage,\n        () => _updateHistory(\n            StateController.find<ComicReadingPageLogic>(), false)));\n  }\n\n  ComicReadingPage.jmComic(JmComicInfo comic, this.initialEp,\n      {super.key, this.initialPage = 1})\n      : readingData = JmReadingData(\n          comic.name,\n          comic.id,\n          comic.series.values.toList(),\n          comic.epNames,\n        ) {\n    StateController.put(ComicReadingPageLogic(\n        initialEp,\n        readingData,\n        initialPage,\n        () => _updateHistory(\n            StateController.find<ComicReadingPageLogic>(), false)));\n  }\n\n  ComicReadingPage.hitomi(HitomiComic comic, String link,\n      {super.key, this.initialPage = 1})\n      : initialEp = 1,\n        readingData = HitomiReadingData(\n          comic.title,\n          comic.target,\n          comic.files,\n          link,\n        ) {\n    StateController.put(ComicReadingPageLogic(\n        initialEp,\n        readingData,\n        initialPage,\n        () => _updateHistory(\n            StateController.find<ComicReadingPageLogic>(), false)));\n  }\n\n  ComicReadingPage.htmanga(String target, String title,\n      {super.key, this.initialPage = 1})\n      : initialEp = 1,\n        readingData = HtReadingData(title, target) {\n    StateController.put(ComicReadingPageLogic(\n        initialEp,\n        readingData,\n        initialPage,\n        () => _updateHistory(\n            StateController.find<ComicReadingPageLogic>(), false)));\n  }\n\n  ComicReadingPage.nhentai(String target, String title,\n      {super.key, this.initialPage = 1})\n      : initialEp = 1,\n        readingData = NhentaiReadingData(title, target) {\n    StateController.put(ComicReadingPageLogic(\n        initialEp,\n        readingData,\n        initialPage,\n        () => _updateHistory(\n            StateController.find<ComicReadingPageLogic>(), false)));\n  }\n\n  _updateHistory(ComicReadingPageLogic? logic, bool updateMePage) {\n    if (readingData.hasEp) {\n      if (logic!.order == 1 && logic.index == 1) {\n        history?.ep = 0;\n        history?.page = 0;\n      } else {\n        if (logic.order == readingData.eps?.length &&\n            logic.index == logic.length) {\n          history?.ep = 0;\n          history?.page = 0;\n        } else {\n          history?.ep = logic.order;\n          history?.page = logic.index;\n        }\n      }\n    } else {\n      if (logic!.index == 1) {\n        history?.ep = 0;\n        history?.page = 0;\n      } else {\n        history?.ep = 1;\n        history?.page = logic.index;\n      }\n    }\n    history!.maxPage = logic.length;\n    HistoryManager().saveReadHistory(history!, updateMePage);\n  }\n\n  bool get useDarkBackground => appdata.appSettings.useDarkBackground;\n\n  @override\n  Widget build(BuildContext context) {\n    return StateBuilder<ComicReadingPageLogic>(initState: (logic) {\n      SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);\n      if (appdata.settings[14] == \"1\") {\n        setKeepScreenOn();\n      }\n      if (appdata.settings[76] == \"1\") {\n        SystemChrome.setPreferredOrientations([\n          DeviceOrientation.landscapeLeft,\n          DeviceOrientation.landscapeRight\n        ]);\n      }\n      //进入阅读器时清除内存中的缓存, 并且增大限制\n      BaseImageProvider.clearCache();\n      BaseImageProvider.setCacheSizeLimit(100 * 1024 * 1024);\n      logic.openEpsView = openEpsDrawer;\n      if (useDarkBackground) {\n        Future.microtask(() =>\n            StateController.findOrNull<WindowFrameController>()\n                ?.setDarkTheme());\n      }\n    }, dispose: (logic) {\n      //清除缓存并减小最大缓存\n      BaseImageProvider.clearCache();\n      BaseImageProvider.setCacheSizeLimit(50 * 1024 * 1024);\n      logic.clearPhotoViewControllers();\n      SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);\n      SystemChrome.setPreferredOrientations(DeviceOrientation.values);\n      if (logic.listenVolume != null) {\n        logic.listenVolume!.stop();\n      }\n      if (appdata.settings[14] == \"1\") {\n        cancelKeepScreenOn();\n      }\n      logic.runningAutoPageTurning = false;\n      ComicImage.clear();\n      StateController.remove<ComicReadingPageLogic>();\n      // 更新本地收藏\n      LocalFavoritesManager().onReadEnd(readingData.favoriteId, readingData.favoriteType);\n      // 保存历史记录\n      if (history != null) {\n        _updateHistory(logic, true);\n      }\n      // 退出全屏\n      if (logic.isFullScreen) {\n        logic.fullscreen();\n      }\n      if (!DownloadManager().isDownloading) {\n        ImageManager.clearTasks();\n      }\n      // 更新漫画详情页面\n      Future.microtask(() {\n        if (BaseComicPage.tagsStack.isNotEmpty) {\n          BaseComicPage.tagsStack.last.updateHistory(history);\n        }\n      });\n      if (appdata.settings[76] == \"1\") {\n        SystemChrome.setPreferredOrientations(DeviceOrientation.values);\n      }\n      if (useDarkBackground) {\n        Future.microtask(() =>\n            StateController.findOrNull<WindowFrameController>()?.resetTheme());\n      }\n    }, builder: (logic) {\n      return DefaultTextStyle.merge(\n        style: TextStyle(\n          color: useDarkBackground ? Colors.white : null,\n          fontSize: 16,\n        ),\n        child: Scaffold(\n          backgroundColor: useDarkBackground ? Colors.black : null,\n          endDrawerEnableOpenDragGesture: false,\n          key: _scaffoldKey,\n          endDrawer: Drawer(\n            child: buildEpsView(),\n          ),\n          floatingActionButton: buildEpChangeButton(logic),\n          body: StateBuilder<ComicReadingPageLogic>(builder: (logic) {\n            if (logic.isLoading) {\n              history?.readEpisode.add(logic.order);\n              loadInfo(logic);\n              return const Center(\n                child: CircularProgressIndicator(),\n              );\n            } else if (logic.urls.isNotEmpty) {\n              if (logic.readingMethod ==\n                      ReadingMethod.topToBottomContinuously &&\n                  !logic.haveUsedInitialPage &&\n                  initialPage != 0) {\n                Future.microtask(() {\n                  logic.jumpToPage(initialPage);\n                  logic.haveUsedInitialPage = true;\n                });\n              }\n              //监听音量键\n              if (appdata.settings[7] == \"1\") {\n                if (logic.listenVolume == null) {\n                  logic.listenVolume = ListenVolumeController(\n                      () => logic.jumpToLastPage(),\n                      () => logic.jumpToNextPage());\n                  logic.listenVolume!.listenVolumeChange();\n                }\n              } else if (logic.listenVolume != null) {\n                logic.listenVolume!.stop();\n                logic.listenVolume = null;\n              }\n\n              if (appdata.settings[9] == \"4\") {\n                logic.scrollManager ??= ScrollManager(logic);\n              }\n\n              var body = Listener(\n                onPointerMove: TapController.onPointerMove,\n                onPointerUp: TapController.onTapUp,\n                onPointerDown: TapController.onTapDown,\n                behavior: HitTestBehavior.translucent,\n                onPointerCancel: TapController.onTapCancel,\n                child: Stack(\n                  children: [\n                    buildComicView(\n                      logic,\n                      context,\n                      readingData.id,\n                    ),\n                    if (MediaQuery.of(context).platformBrightness ==\n                            Brightness.dark &&\n                        appdata.appSettings.reduceBrightnessInDarkMode)\n                      Positioned(\n                        top: 0,\n                        bottom: 0,\n                        left: 0,\n                        right: 0,\n                        child: IgnorePointer(\n                          child: ColoredBox(\n                            color: Colors.black.withOpacity(0.2),\n                          ),\n                        ),\n                      ),\n\n                    if (appdata.appSettings.showPageInfoInReader)\n                      buildPageInfoText(logic, context),\n\n                    //底部工具栏\n                    buildBottomToolBar(logic, context, readingData.hasEp),\n\n                    ...buildButtons(logic, context),\n\n                    //顶部工具栏\n                    buildTopToolBar(logic, context),\n                  ],\n                ),\n              );\n\n              return KeyboardListener(\n                focusNode: logic.focusNode,\n                autofocus: true,\n                onKeyEvent: logic.handleKeyboard,\n                child: body,\n              );\n            } else {\n              return buildErrorView(logic, context);\n            }\n          }),\n        ),\n      );\n    });\n  }\n\n  Widget buildErrorView(ComicReadingPageLogic logic, BuildContext context) {\n    return SafeArea(\n        child: Stack(\n      children: [\n        Positioned(\n          left: 8,\n          top: 12,\n          child: IconButton(\n            icon: const Icon(\n              Icons.arrow_back,\n            ),\n            onPressed: () => App.globalBack(),\n          ),\n        ),\n        Positioned(\n          top: MediaQuery.of(App.globalContext!).size.height / 2 - 80,\n          left: 0,\n          right: 0,\n          child: const Align(\n            alignment: Alignment.topCenter,\n            child: Icon(\n              Icons.error_outline,\n              size: 60,\n            ),\n          ),\n        ),\n        Positioned(\n          left: 0,\n          right: 0,\n          top: MediaQuery.of(App.globalContext!).size.height / 2 - 10,\n          child: Align(\n            alignment: Alignment.topCenter,\n            child: Text(\n              logic.errorMessage ?? \"未知错误\".tl,\n            ),\n          ),\n        ),\n        Positioned(\n          left: 0,\n          right: 0,\n          top: MediaQuery.of(App.globalContext!).size.height / 2 + 30,\n          child: Align(\n            alignment: Alignment.topCenter,\n            child: SizedBox(\n              width: 250,\n              height: 40,\n              child: Row(\n                children: [\n                  Expanded(\n                    child: FilledButton(\n                      onPressed: () {\n                        logic.change();\n                      },\n                      child: Text(\"重试\".tl),\n                    ),\n                  ),\n                  const SizedBox(\n                    width: 8,\n                  ),\n                  Expanded(\n                      child: FilledButton(\n                    onPressed: () {\n                      if (!readingData.hasEp) {\n                        showToast(message: \"没有其它章节\".tl);\n                        return;\n                      }\n                      if (MediaQuery.of(context).size.width > 600) {\n                        showSideBar(\n                          context,\n                          buildEpsView(),\n                          title: null,\n                          useSurfaceTintColor: true,\n                          addTopPadding: true,\n                          width: 400,\n                        );\n                      } else {\n                        showModalBottomSheet(\n                          context: context,\n                          useSafeArea: false,\n                          builder: (context) {\n                            return buildEpsView();\n                          },\n                        );\n                      }\n                    },\n                    child: Text(\"切换章节\".tl),\n                  )),\n                ],\n              ),\n            ),\n          ),\n        ),\n      ],\n    ));\n  }\n\n  void loadInfo(ComicReadingPageLogic logic) async {\n    logic.urls = [];\n    var res = await readingData.loadEp(logic.order);\n    if (res.error) {\n      logic.errorMessage = res.errorMessage;\n    } else {\n      logic.urls = res.data;\n    }\n    logic.isLoading = false;\n    logic.update();\n  }\n\n  Widget buildEpsView() {\n    return EpsView(readingData);\n  }\n\n  void openEpsDrawer() {\n    var context = App.globalContext!;\n    if (MediaQuery.of(context).size.width > 600) {\n      showSideBar(\n        context,\n        buildEpsView(),\n        title: null,\n        useSurfaceTintColor: true,\n        width: 400,\n        addTopPadding: true,\n      );\n    } else {\n      showModalBottomSheet(\n        context: context,\n        useSafeArea: false,\n        builder: (context) {\n          return buildEpsView();\n        },\n      );\n    }\n  }\n\n  /// Used when [ComicReadingPageLogic.readingMethod] is [ReadingMethod.topToBottomContinuously].\n  ///\n  /// Select a image form screen, to share or download\n  Future<int?> selectImage() async {\n    var logic = StateController.find<ComicReadingPageLogic>();\n    var items = logic.itemScrollListener.itemPositions.value.toList();\n    if (items.length == 1) {\n      return items[0].index;\n    }\n    int? res;\n    await showDialog(\n        context: App.globalContext!,\n        builder: (context) {\n          return SimpleDialog(\n            title: Text(\"选择屏幕上的图片\".tl),\n            children: [\n              ConstrainedBox(\n                constraints: const BoxConstraints(\n                  maxWidth: 400,\n                ),\n                child: Column(\n                  children: [\n                    for (var item in items)\n                      ListTile(\n                        title: Text((item.index + 1).toString()),\n                        onTap: () {\n                          res = item.index;\n                          App.globalBack();\n                        },\n                        trailing: const Icon(Icons.arrow_right),\n                      )\n                  ],\n                ),\n              )\n            ],\n          );\n        });\n    return res;\n  }\n\n  String getImageKey(int index) {\n    var logic = StateController.find<ComicReadingPageLogic>();\n    if (type == ComicType.ehentai) {\n      return \"${readingData.id}${index + 1}\";\n    }\n    return type == ReadingType.hitomi\n        ? (readingData as HitomiReadingData).images[index].hash\n        : logic.urls[index];\n  }\n\n  Future<File> _getFileFromStream(Stream<DownloadProgress> stream) async {\n    await for (var event in stream) {\n      if (event.finished) {\n        return event.getFile();\n      }\n    }\n    throw \"failed\";\n  }\n\n  void share() async {\n    var logic = StateController.find<ComicReadingPageLogic>();\n    int? index = logic.index - 1;\n    if (logic.readingMethod == ReadingMethod.topToBottomContinuously) {\n      index = await selectImage();\n    }\n    if (index == null) {\n      return;\n    }\n\n    var file = await _getFileFromStream(\n        readingData.loadImage(logic.order, index, logic.urls[index]));\n\n    shareImage(file);\n  }\n\n  Future<String?> _persistentCurrentImage() async {\n    var logic = StateController.find<ComicReadingPageLogic>();\n    int? index = logic.index - 1;\n    if (logic.readingMethod == ReadingMethod.topToBottomContinuously) {\n      index = await selectImage();\n    }\n    if (index == null) {\n      return null;\n    }\n\n    var file = await _getFileFromStream(\n        readingData.loadImage(logic.order, index, logic.urls[index]));\n\n    return persistentCurrentImage(file);\n  }\n\n  void saveCurrentImage() async {\n    var logic = StateController.find<ComicReadingPageLogic>();\n    int? index = logic.index - 1;\n    if (logic.readingMethod == ReadingMethod.topToBottomContinuously) {\n      index = await selectImage();\n    }\n    if (index == null) {\n      return;\n    }\n\n    var file = await _getFileFromStream(\n        readingData.loadImage(logic.order, index, logic.urls[index]));\n\n    saveImage(file);\n  }\n\n  Widget? buildEpChangeButton(ComicReadingPageLogic logic) {\n    if (!readingData.hasEp) return null;\n    switch (logic.showFloatingButtonValue) {\n      case -1:\n        return FloatingActionButton(\n          onPressed: () => logic.jumpToLastChapter(),\n          child: const Icon(Icons.arrow_back_ios_outlined),\n        );\n      case 0:\n        return null;\n      case 1:\n        return Hero(\n            tag: \"FAB\",\n            child: StateBuilder<ComicReadingPageLogic>(\n              id: \"FAB\",\n              builder: (logic) {\n                return Container(\n                  width: 58,\n                  height: 58,\n                  clipBehavior: Clip.antiAlias,\n                  decoration: BoxDecoration(\n                      color: Theme.of(App.globalContext!)\n                          .colorScheme\n                          .primaryContainer,\n                      borderRadius: BorderRadius.circular(16)),\n                  child: Stack(\n                    children: [\n                      Positioned.fill(\n                          child: Material(\n                        color: Colors.transparent,\n                        child: InkWell(\n                          onTap: () => logic.jumpToNextChapter(),\n                          borderRadius: BorderRadius.circular(16),\n                          child: Center(\n                              child: Icon(\n                            Icons.arrow_forward_ios,\n                            size: 24,\n                            color: Theme.of(App.globalContext!)\n                                .colorScheme\n                                .onPrimaryContainer,\n                          )),\n                        ),\n                      )),\n                      Positioned(\n                        bottom: 0,\n                        left: 0,\n                        right: 0,\n                        height: logic.fABValue,\n                        child: ColoredBox(\n                          color: Theme.of(App.globalContext!)\n                              .colorScheme\n                              .surfaceTint\n                              .withOpacity(0.2),\n                          child: const SizedBox.expand(),\n                        ),\n                      )\n                    ],\n                  ),\n                );\n              },\n            ));\n    }\n    return null;\n  }\n}\n"
  },
  {
    "path": "lib/pages/reader/eps_view.dart",
    "content": "part of pica_reader;\n\nclass EpsView extends StatefulWidget {\n  const EpsView(this.data, {Key? key}) : super(key: key);\n  final ReadingData data;\n\n  @override\n  State<EpsView> createState() => _EpsViewState();\n}\n\nclass _EpsViewState extends State<EpsView> {\n  var controller = ItemScrollController();\n  var logic = StateController.find<ComicReadingPageLogic>();\n  var value = false;\n\n  @override\n  Widget build(BuildContext context) {\n    var type = widget.data.type;\n    var data = widget.data;\n    var epsWidgets = <Widget>[];\n    for(int index = 0; index<data.eps!.length; index++){\n      String title = data.eps!.values.elementAt(index);\n      epsWidgets.add(\n          InkWell(\n            onTap: (){\n              Navigator.pop(App.globalContext!);\n              logic.jumpToChapter(index+1);\n            },\n            child: SizedBox(\n              height: 60,\n              child: Row(\n                children: [\n                  const SizedBox(width: 16,),\n                  Expanded(\n                    child: Text(title, overflow: TextOverflow.clip,),\n                  ),\n                  if(data.downloadedEps.contains(index))\n                    Container(\n                      decoration: BoxDecoration(\n                        color: Theme.of(context).colorScheme.secondaryContainer,\n                        borderRadius: const BorderRadius.all(Radius.circular(5)),\n                      ),\n                      margin: const EdgeInsets.all(5),\n                      padding: const EdgeInsets.fromLTRB(5, 2, 5, 2),\n                      child: Text(\"已下载\".tl, style: const TextStyle(fontSize: 14),),\n                    ),\n                  if(logic.order == index+1)\n                    Container(\n                      decoration: BoxDecoration(\n                        color: Theme.of(context).colorScheme.secondaryContainer,\n                        borderRadius: const BorderRadius.all(Radius.circular(5)),\n                      ),\n                      margin: const EdgeInsets.all(5),\n                      padding: const EdgeInsets.fromLTRB(5, 2, 5, 2),\n                      child: Text(\"当前\".tl, style: const TextStyle(fontSize: 14),),\n                    )\n                ],\n              ),\n            ),\n          )\n      );\n    }\n\n    return SizedBox(\n      height: 500,\n      width: double.infinity,\n      child: Column(\n        children: [\n          SizedBox(\n            height: 60,\n            child: Row(\n              children: [\n                const SizedBox(width: 16,),\n                Icon(Icons.library_books, color: Theme.of(context).colorScheme.secondary,),\n                const SizedBox(width: 8,),\n                Text(\"章节\".tl, style: const TextStyle(fontSize: 18),),\n                const Spacer(),\n                if(type == ReadingType.jm)\n                  IconButton(\n                    icon: Icon(Icons.comment_outlined, color: Theme.of(context).colorScheme.secondary,),\n                    onPressed: (){\n                      showComments(context, data.eps!.keys.elementAt(logic.order-1),\n                          (logic.data as JmReadingData).commentsLength ?? 9999);\n                    },\n                  ),\n                IconButton(\n                  icon: Icon(Icons.my_location_outlined, color: Theme.of(context).colorScheme.secondary,size: 23,),\n                  onPressed: (){\n                    var length = data.eps!.length;\n                    if(!value) {\n                      controller.jumpTo(index: logic.order-1);\n                    } else {\n                      controller.jumpTo(index: length - logic.order);\n                    }\n                  },\n                ),\n                Text(\" 倒序\".tl),\n                Transform.scale(\n                  scale: 0.8,\n                  child: Switch(\n                    value: value,\n                    onChanged: (b)=>setState(() {\n                      value = ! value;\n                    }),\n                  ),\n                ),\n              ],\n            ),\n          ),\n          Expanded(child: ScrollablePositionedList.builder(\n            initialScrollIndex: logic.order-1,\n            itemCount: data.eps!.length,\n            itemBuilder: (context, index){\n              if(value){\n                return epsWidgets[epsWidgets.length - index -1];\n              }else{\n                return epsWidgets[index];\n              }\n            },\n            scrollController: ScrollController(),\n            itemScrollController: controller,\n          )),\n          SizedBox(height: MediaQuery.of(context).padding.bottom,)\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/reader/image.dart",
    "content": "part of pica_reader;\n\nclass ComicImage extends StatefulWidget {\n  /// Modified from flutter Image\n  ComicImage({\n        required ImageProvider image,\n        super.key,\n        double scale = 1.0,\n        this.semanticLabel,\n        this.excludeFromSemantics = false,\n        this.width,\n        this.height,\n        this.color,\n        this.opacity,\n        this.colorBlendMode,\n        this.fit,\n        this.alignment = Alignment.center,\n        this.repeat = ImageRepeat.noRepeat,\n        this.centerSlice,\n        this.matchTextDirection = false,\n        this.gaplessPlayback = false,\n        this.filterQuality = FilterQuality.medium,\n        this.isAntiAlias = false,\n        Map<String, String>? headers,\n        int? cacheWidth,\n        int? cacheHeight,\n      }\n  ): image = ResizeImage.resizeIfNeeded(cacheWidth, cacheHeight, image),\n  assert(cacheWidth == null || cacheWidth > 0),\n  assert(cacheHeight == null || cacheHeight > 0);\n\n  final ImageProvider image;\n\n  final String? semanticLabel;\n\n  final bool excludeFromSemantics;\n\n  final double? width;\n\n  final double? height;\n\n  final bool gaplessPlayback;\n\n  final bool matchTextDirection;\n\n  final Rect? centerSlice;\n\n  final ImageRepeat repeat;\n\n  final AlignmentGeometry alignment;\n\n  final BoxFit? fit;\n\n  final BlendMode? colorBlendMode;\n\n  final FilterQuality filterQuality;\n\n  final Animation<double>? opacity;\n\n  final Color? color;\n\n  final bool isAntiAlias;\n\n  static void clear() => _ComicImageState.clear();\n\n  @override\n  State<ComicImage> createState() => _ComicImageState();\n}\n\nclass _ComicImageState extends State<ComicImage> with WidgetsBindingObserver {\n  ImageStream? _imageStream;\n  ImageInfo? _imageInfo;\n  ImageChunkEvent? _loadingProgress;\n  bool _isListeningToStream = false;\n  late bool _invertColors;\n  int? _frameNumber;\n  bool _wasSynchronouslyLoaded = false;\n  late DisposableBuildContext<State<ComicImage>> _scrollAwareContext;\n  Object? _lastException;\n  ImageStreamCompleterHandle? _completerHandle;\n\n  static final Map<int, Size> _cache = {};\n\n  static clear() => _cache.clear();\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addObserver(this);\n    _scrollAwareContext = DisposableBuildContext<State<ComicImage>>(this);\n  }\n\n  @override\n  void dispose() {\n    assert(_imageStream != null);\n    WidgetsBinding.instance.removeObserver(this);\n    _stopListeningToStream();\n    _completerHandle?.dispose();\n    _scrollAwareContext.dispose();\n    _replaceImage(info: null);\n    super.dispose();\n  }\n\n  @override\n  void didChangeDependencies() {\n    _updateInvertColors();\n    _resolveImage();\n\n    if (TickerMode.of(context)) {\n      _listenToStream();\n    } else {\n      _stopListeningToStream(keepStreamAlive: true);\n    }\n\n    super.didChangeDependencies();\n  }\n\n  @override\n  void didUpdateWidget(ComicImage oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.image != oldWidget.image) {\n      _resolveImage();\n    }\n  }\n\n  @override\n  void didChangeAccessibilityFeatures() {\n    super.didChangeAccessibilityFeatures();\n    setState(() {\n      _updateInvertColors();\n    });\n  }\n\n  @override\n  void reassemble() {\n    _resolveImage(); // in case the image cache was flushed\n    super.reassemble();\n  }\n\n  void _updateInvertColors() {\n    _invertColors = MediaQuery.maybeInvertColorsOf(context)\n        ?? SemanticsBinding.instance.accessibilityFeatures.invertColors;\n  }\n\n  void _resolveImage() {\n    final ScrollAwareImageProvider provider = ScrollAwareImageProvider<Object>(\n      context: _scrollAwareContext,\n      imageProvider: widget.image,\n    );\n    final ImageStream newStream =\n    provider.resolve(createLocalImageConfiguration(\n      context,\n      size: widget.width != null && widget.height != null ? Size(widget.width!, widget.height!) : null,\n    ));\n    _updateSourceStream(newStream);\n  }\n\n  ImageStreamListener? _imageStreamListener;\n  ImageStreamListener _getListener({bool recreateListener = false}) {\n    if(_imageStreamListener == null || recreateListener) {\n      _lastException = null;\n      _imageStreamListener = ImageStreamListener(\n        _handleImageFrame,\n        onChunk: _handleImageChunk,\n        onError: (Object error, StackTrace? stackTrace) {\n          setState(() {\n            _lastException = error;\n          });\n        },\n      );\n    }\n    return _imageStreamListener!;\n  }\n\n  void _handleImageFrame(ImageInfo imageInfo, bool synchronousCall) {\n    setState(() {\n      _replaceImage(info: imageInfo);\n      _loadingProgress = null;\n      _lastException = null;\n      _frameNumber = _frameNumber == null ? 0 : _frameNumber! + 1;\n      _wasSynchronouslyLoaded = _wasSynchronouslyLoaded | synchronousCall;\n    });\n  }\n\n  void _handleImageChunk(ImageChunkEvent event) {\n    setState(() {\n      _loadingProgress = event;\n      _lastException = null;\n    });\n  }\n\n  void _replaceImage({required ImageInfo? info}) {\n    final ImageInfo? oldImageInfo = _imageInfo;\n    SchedulerBinding.instance.addPostFrameCallback((_) => oldImageInfo?.dispose());\n    _imageInfo = info;\n  }\n\n  // Updates _imageStream to newStream, and moves the stream listener\n  // registration from the old stream to the new stream (if a listener was\n  // registered).\n  void _updateSourceStream(ImageStream newStream) {\n    if (_imageStream?.key == newStream.key) {\n      return;\n    }\n\n    if (_isListeningToStream) {\n      _imageStream!.removeListener(_getListener());\n    }\n\n    if (!widget.gaplessPlayback) {\n      setState(() { _replaceImage(info: null); });\n    }\n\n    setState(() {\n      _loadingProgress = null;\n      _frameNumber = null;\n      _wasSynchronouslyLoaded = false;\n    });\n\n    _imageStream = newStream;\n    if (_isListeningToStream) {\n      _imageStream!.addListener(_getListener());\n    }\n  }\n\n  void _listenToStream() {\n    if (_isListeningToStream) {\n      return;\n    }\n\n    _imageStream!.addListener(_getListener());\n    _completerHandle?.dispose();\n    _completerHandle = null;\n\n    _isListeningToStream = true;\n  }\n\n  /// Stops listening to the image stream, if this state object has attached a\n  /// listener.\n  ///\n  /// If the listener from this state is the last listener on the stream, the\n  /// stream will be disposed. To keep the stream alive, set `keepStreamAlive`\n  /// to true, which create [ImageStreamCompleterHandle] to keep the completer\n  /// alive and is compatible with the [TickerMode] being off.\n  void _stopListeningToStream({bool keepStreamAlive = false}) {\n    if (!_isListeningToStream) {\n      return;\n    }\n\n    if (keepStreamAlive && _completerHandle == null && _imageStream?.completer != null) {\n      _completerHandle = _imageStream!.completer!.keepAlive();\n    }\n\n    _imageStream!.removeListener(_getListener());\n    _isListeningToStream = false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (_lastException != null) {\n      // display error and retry button on screen\n      return SizedBox(\n        height: 300,\n        child: Center(\n          child: SizedBox(\n            height: 300,\n            child: Column(\n              children: [\n                Expanded(\n                  child: Center(\n                    child: Text(_lastException.toString(), maxLines: 3,),\n                  ),\n                ),\n                const SizedBox(height: 4,),\n                MouseRegion(\n                  cursor: SystemMouseCursors.click,\n                  child: Listener(\n                    onPointerDown: (details){\n                      TapController.ignoreNextTap = true;\n                      _resolveImage();\n                    },\n                    child: const SizedBox(\n                      width: 84,\n                      height: 36,\n                      child: Center(\n                        child: Text(\"Retry\", style: TextStyle(color: Colors.blue),),\n                      ),\n                    ),\n                  ),\n                ),\n                const SizedBox(height: 16,),\n              ],\n            ),\n          ),\n        ),\n      );\n    }\n\n    var width = widget.width??MediaQuery.of(context).size.width;\n    double? height;\n\n    Size? cacheSize = _cache[widget.image.hashCode];\n    if(cacheSize != null){\n      height = cacheSize.height * (width / cacheSize.width);\n      height = height.ceilToDouble();\n    }\n\n    var brightness = Theme.of(context).brightness;\n    if(appdata.appSettings.useDarkBackground) {\n      brightness = Brightness.dark;\n    }\n\n    if(_imageInfo != null){\n      // Record the height and the width of the image\n      _cache[widget.image.hashCode] = Size(\n          _imageInfo!.image.width.toDouble(),\n          _imageInfo!.image.height.toDouble()\n      );\n      // build image\n      Widget result = RawImage(\n        // Do not clone the image, because RawImage is a stateless wrapper.\n        // The image will be disposed by this state object when it is not needed\n        // anymore, such as when it is unmounted or when the image stream pushes\n        // a new image.\n        image: _imageInfo?.image,\n        debugImageLabel: _imageInfo?.debugLabel,\n        width: width,\n        height: height,\n        scale: _imageInfo?.scale ?? 1.0,\n        color: widget.color,\n        opacity: widget.opacity,\n        colorBlendMode: widget.colorBlendMode,\n        fit: widget.fit,\n        alignment: widget.alignment,\n        repeat: widget.repeat,\n        centerSlice: widget.centerSlice,\n        matchTextDirection: widget.matchTextDirection,\n        invertColors: _invertColors,\n        isAntiAlias: widget.isAntiAlias,\n        filterQuality: widget.filterQuality,\n      );\n\n      if (!widget.excludeFromSemantics) {\n        result = Semantics(\n          container: widget.semanticLabel != null,\n          image: true,\n          label: widget.semanticLabel ?? '',\n          child: result,\n        );\n      }\n      result = SizedBox(\n        width: width,\n        height: height,\n        child: Center(\n          child: result,\n        ),\n      );\n      return result;\n    } else {\n      // build progress\n      return SizedBox(\n        width: width,\n        height: height??300,\n        child: Center(\n          child: SizedBox(\n            width: 24,\n            height: 24,\n            child: CircularProgressIndicator(\n              backgroundColor: brightness == Brightness.dark\n                  ? Colors.white24\n                  : Colors.black12,\n              strokeWidth: 3,\n              value: (_loadingProgress != null &&\n                  _loadingProgress!.expectedTotalBytes!=null &&\n                  _loadingProgress!.expectedTotalBytes! != 0)\n                  ?_loadingProgress!.cumulativeBytesLoaded / _loadingProgress!.expectedTotalBytes!\n                  :0,\n            ),\n          ),\n        ),\n      );\n    }\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder description) {\n    super.debugFillProperties(description);\n    description.add(DiagnosticsProperty<ImageStream>('stream', _imageStream));\n    description.add(DiagnosticsProperty<ImageInfo>('pixels', _imageInfo));\n    description.add(DiagnosticsProperty<ImageChunkEvent>('loadingProgress', _loadingProgress));\n    description.add(DiagnosticsProperty<int>('frameNumber', _frameNumber));\n    description.add(DiagnosticsProperty<bool>('wasSynchronouslyLoaded', _wasSynchronouslyLoaded));\n  }\n}\n"
  },
  {
    "path": "lib/pages/reader/image_view.dart",
    "content": "part of pica_reader;\n\nextension ScrollExtension on ScrollController {\n  static double? futurePosition;\n\n  void smoothTo(double value) {\n    futurePosition ??= position.pixels;\n    futurePosition = futurePosition! + value * 1.2;\n    futurePosition = futurePosition!\n        .clamp(position.minScrollExtent, position.maxScrollExtent);\n    animateTo(futurePosition!,\n        duration: const Duration(milliseconds: 200), curve: Curves.linear);\n  }\n}\n\nconst Set<PointerDeviceKind> _kTouchLikeDeviceTypes = <PointerDeviceKind>{\n  PointerDeviceKind.touch,\n  PointerDeviceKind.mouse,\n  PointerDeviceKind.stylus,\n  PointerDeviceKind.invertedStylus,\n  PointerDeviceKind.unknown\n};\n\n\nextension ImageExt on ComicReadingPage {\n  /// build comic image\n  Widget buildComicView(\n      ComicReadingPageLogic logic, BuildContext context, String target) {\n    ScrollExtension.futurePosition = null;\n    Widget buildType4() {\n      return ScrollablePositionedList.builder(\n        itemScrollController: logic.itemScrollController,\n        itemPositionsListener: logic.itemScrollListener,\n        itemCount: logic.urls.length,\n        addSemanticIndexes: false,\n        scrollController: logic.scrollController,\n        scrollBehavior: const MaterialScrollBehavior()\n            .copyWith(scrollbars: false, dragDevices: _kTouchLikeDeviceTypes),\n        physics: (logic.noScroll || logic.isCtrlPressed || logic.mouseScroll)\n            ? const NeverScrollableScrollPhysics()\n            : const ClampingScrollPhysics(),\n        itemBuilder: (context, index) {\n          double width = MediaQuery.of(context).size.width;\n          double height = MediaQuery.of(context).size.height;\n\n          double imageWidth = width;\n\n          if (height / width < 1.2 && appdata.settings[43] == \"1\") {\n            imageWidth = height / 1.2;\n          }\n\n          precacheComicImage(logic, context, index + 1, target);\n\n          ImageProvider image = createImageProvider(type, logic, index, target);\n          return ComicImage(\n            filterQuality: FilterQuality.medium,\n            image: image,\n            width: imageWidth,\n            height: imageWidth * 1.2,\n            fit: BoxFit.cover,\n          );\n        },\n      );\n    }\n\n    final decoration = BoxDecoration(\n      color: useDarkBackground ? Colors.black : Theme.of(context).colorScheme.surface,\n    );\n\n    Widget buildType123() {\n      return PhotoViewGallery.builder(\n        backgroundDecoration: decoration,\n        key: Key(logic.readingMethod.index.toString()),\n        reverse: appdata.settings[9] == \"2\",\n        scrollDirection:\n            appdata.settings[9] != \"3\" ? Axis.horizontal : Axis.vertical,\n        itemCount: logic.urls.length + 2,\n        builder: (BuildContext context, int index) {\n          ImageProvider? imageProvider;\n          if (index != 0 && index != logic.urls.length + 1) {\n            imageProvider = createImageProvider(type, logic, index - 1, target);\n          } else {\n            return PhotoViewGalleryPageOptions.customChild(\n                scaleStateController: PhotoViewScaleStateController(),\n                child: const SizedBox(),);\n          }\n\n          precacheComicImage(logic, context, index, target);\n\n          BoxFit getFit() {\n            switch (appdata.settings[41]) {\n              case \"1\":\n                return BoxFit.fitWidth;\n              case \"2\":\n                return BoxFit.fitHeight;\n              default:\n                return BoxFit.contain;\n            }\n          }\n\n          logic.photoViewControllers[index] ??= PhotoViewController();\n\n          return PhotoViewGalleryPageOptions(\n            filterQuality: FilterQuality.medium,\n            imageProvider: imageProvider,\n            fit: getFit(),\n            controller: logic.photoViewControllers[index],\n            errorBuilder: (_, error, s, retry) {\n              return Center(\n                child: SizedBox(\n                  height: 300,\n                  width: 400,\n                  child: Column(\n                    children: [\n                      Expanded(\n                        child: Center(\n                          child: Text(\n                            error.toString(),\n                            style: TextStyle(color: appdata.appSettings.useDarkBackground ? Colors.white : null),\n                            maxLines: 3,\n                          ),\n                        ),\n                      ),\n                      const SizedBox(\n                        height: 4,\n                      ),\n                      MouseRegion(\n                        cursor: SystemMouseCursors.click,\n                        child: Listener(\n                          onPointerDown: (details) {\n                            TapController.ignoreNextTap = true;\n                            retry();\n                          },\n                          child: const SizedBox(\n                            width: 84,\n                            height: 36,\n                            child: Center(\n                              child: Text(\n                                \"Retry\",\n                                style: TextStyle(color: Colors.blue),\n                              ),\n                            ),\n                          ),\n                        ),\n                      ),\n                      const SizedBox(\n                        height: 16,\n                      ),\n                    ],\n                  ),\n                ),\n              );\n            },\n            heroAttributes:\n                PhotoViewHeroAttributes(tag: \"$index/${logic.urls.length}\"),\n          );\n        },\n        pageController: logic.pageController,\n        loadingBuilder: (context, event) => Center(\n          child: SizedBox(\n            width: 20.0,\n            height: 20.0,\n            child: CircularProgressIndicator(\n              backgroundColor: context.colorScheme.surfaceContainerHigh,\n              value: event == null || event.expectedTotalBytes == null\n                  ? null\n                  : event.cumulativeBytesLoaded / event.expectedTotalBytes!,\n            ),\n          ),\n        ),\n        onPageChanged: (i) {\n          if (i == 0) {\n            if (!logic.data.hasEp) {\n              logic.jumpByDeviceType(1);\n              return;\n            }\n            logic.jumpToLastChapter();\n          } else if (i == logic.urls.length + 1) {\n            if (!logic.data.hasEp) {\n              logic.jumpByDeviceType(i - 1);\n              return;\n            }\n            logic.jumpToNextChapter();\n          } else {\n            logic.index = i;\n            logic.update();\n          }\n        },\n      );\n    }\n\n    Widget buildComicImageOrEmpty({\n      required int imageIndex,\n      required BoxFit fit,\n      required Alignment alignment\n    }) {\n      if(imageIndex < 0 || imageIndex >= logic.urls.length){\n        return const SizedBox();\n      }\n\n      return ComicImage(\n        key: ValueKey(imageIndex),\n        image: createImageProvider(\n            type, logic, imageIndex, target),\n        fit: fit,\n        alignment: alignment,\n      );\n    }\n\n    Widget buildType56() {\n      int calcItemCount() {\n        int count = logic.urls.length ~/ 2;\n        if(logic.urls.length % 2 != 0) {\n          count++;\n        } else if(logic.singlePageForFirstScreen) {\n          count++;\n        }\n        return count + 2;\n      }\n\n      return PhotoViewGallery.builder(\n        key: Key(logic.readingMethod.index.toString()),\n        backgroundDecoration: decoration,\n        itemCount: calcItemCount(),\n        reverse: logic.readingMethod == ReadingMethod.twoPageReversed,\n        builder: (BuildContext context, int index) {\n          if (index == 0 || index == calcItemCount() - 1) {\n            return PhotoViewGalleryPageOptions.customChild(\n                child: const SizedBox());\n          }\n          precacheComicImage(logic, context, index * 2 + 1, target);\n\n          logic.photoViewControllers[index] ??= PhotoViewController();\n\n          int firstImage = index * 2 - 2;\n          if(firstImage % 2 != 0) {\n            firstImage++;\n          }\n          if(logic.singlePageForFirstScreen) {\n            firstImage--;\n          }\n          var images = <int>[\n            firstImage,\n            firstImage+1\n          ];\n          if(logic.readingMethod == ReadingMethod.twoPageReversed) {\n            images = images.reversed.toList();\n          }\n\n          return PhotoViewGalleryPageOptions.customChild(\n              controller: logic.photoViewControllers[index],\n              child: Row(\n                children: [\n                  Expanded(\n                    child: buildComicImageOrEmpty(\n                      imageIndex: images[0],\n                      fit: BoxFit.contain,\n                      alignment: Alignment.centerRight,\n                    ),\n                  ),\n                  Expanded(\n                    child: buildComicImageOrEmpty(\n                      imageIndex: images[1],\n                      fit: BoxFit.contain,\n                      alignment: Alignment.centerLeft,\n                    ),\n                  ),\n                ],\n              ));\n        },\n        pageController: logic.pageController,\n        onPageChanged: (i) {\n          if (i == 0) {\n            if (!logic.data.hasEp || logic.order == 1) {\n              logic.pageController.jumpByDeviceType(1);\n              return;\n            }\n            logic.jumpToLastChapter();\n          } else if (i == calcItemCount() - 1) {\n            if (!logic.data.hasEp || logic.order == logic.data.eps?.length) {\n              logic.pageController.jumpByDeviceType(logic.pageController.page!.round() - 1);\n              return;\n            }\n            logic.jumpToNextChapter();\n          } else {\n            logic.index = logic.singlePageForFirstScreen\n                ? (i * 2 - 2).clamp(1, logic.urls.length)\n                : i * 2 - 1;\n            logic.update();\n          }\n        },\n      );\n    }\n\n    Widget body;\n\n    if ([\"1\", \"2\", \"3\"].contains(appdata.settings[9])) {\n      body = buildType123();\n    } else if (appdata.settings[9] == \"4\") {\n      logic.photoViewControllers[0] ??= PhotoViewController();\n      body = PhotoView.customChild(\n          backgroundDecoration: decoration,\n          key: Key(logic.order.toString()),\n          minScale: 1.0,\n          maxScale: 2.5,\n          strictScale: true,\n          controller: logic.photoViewControllers[0],\n          onScaleEnd: (context, detail, value) {\n            var prev = logic.currentScale;\n            logic.currentScale = value.scale ?? 1.0;\n            if ((prev <= 1.05 && logic.currentScale > 1.05) ||\n                (prev > 1.05 && logic.currentScale <= 1.05)) {\n              logic.update();\n            }\n            if (appdata.settings[43] != \"1\") {\n              return false;\n            }\n            return updateLocation(context, logic.photoViewController);\n          },\n          child: SizedBox(\n              width: MediaQuery.of(context).size.width,\n              height: MediaQuery.of(context).size.height,\n              child: buildType4()));\n    } else {\n      body = buildType56();\n    }\n\n    void onPointerSignal(PointerSignalEvent pointerSignal) {\n      logic.mouseScroll = pointerSignal.kind == PointerDeviceKind.mouse;\n      if (pointerSignal is PointerScrollEvent && !logic.isCtrlPressed) {\n        if (logic.readingMethod != ReadingMethod.topToBottomContinuously) {\n          pointerSignal.scrollDelta.dy > 0\n              ? logic.jumpToNextPage()\n              : logic.jumpToLastPage();\n        } else {\n          if ((logic.scrollController.position.pixels ==\n                      logic.scrollController.position.minScrollExtent &&\n                  pointerSignal.scrollDelta.dy < 0) ||\n              (logic.scrollController.position.pixels ==\n                      logic.scrollController.position.maxScrollExtent &&\n                  pointerSignal.scrollDelta.dy > 0)) {\n            logic.photoViewController.updateMultiple(\n                position: logic.photoViewController.position -\n                    Offset(0, pointerSignal.scrollDelta.dy));\n          } else if (!App.isMacOS){\n            logic.scrollController.smoothTo(pointerSignal.scrollDelta.dy);\n          }\n        }\n      }\n    }\n\n    return Positioned.fill(\n      top: App.isDesktop ? MediaQuery.of(context).padding.top : 0,\n      child: Listener(\n        onPointerSignal: onPointerSignal,\n        onPointerPanZoomUpdate: (event) {\n          if (event.kind == PointerDeviceKind.trackpad &&\n              logic.readingMethod == ReadingMethod.topToBottomContinuously) {\n            if (event.scale == 1.0) {\n              logic.scrollController.smoothTo(0 - event.panDelta.dy * 1.2);\n            }\n          }\n        },\n        onPointerDown: (details) => logic.mouseScroll = false,\n        child: NotificationListener<ScrollUpdateNotification>(\n          child: body,\n          onNotification: (notification) {\n            TapController.lastScrollTime = DateTime.now();\n            // update floating button\n            var length = logic.data.eps?.length ?? 1;\n            if (!logic.scrollController.hasClients) return false;\n            if (logic.scrollController.position.pixels -\n                        logic.scrollController.position.minScrollExtent <=\n                    0 &&\n                logic.order != 0) {\n              logic.showFloatingButton(-1);\n            } else if (logic.scrollController.position.pixels -\n                        logic.scrollController.position.maxScrollExtent >=\n                    0 &&\n                logic.order < length) {\n              logic.showFloatingButton(1);\n            } else {\n              logic.showFloatingButton(0);\n            }\n\n            return true;\n          },\n        ),\n      ),\n    );\n  }\n\n  /// create a image provider\n  ImageProvider createImageProvider(\n      ReadingType type, ComicReadingPageLogic logic, int index, String target) {\n\n    return logic.data.createImageProvider(logic.order, index, logic.urls[index]);\n  }\n\n  /// check current location of [PageView], update location when it is out of range.\n  bool updateLocation(BuildContext context, PhotoViewController controller) {\n    final width = MediaQuery.of(context).size.width;\n    final height = MediaQuery.of(context).size.height;\n    if (width / height < 1.2) {\n      return false;\n    }\n    final currentLocation = controller.position;\n    final scale = controller.scale ?? 1;\n    final imageWidth = height / 1.2;\n    final showWidth = width / scale;\n    if (showWidth >= imageWidth && currentLocation.dx != 0) {\n      controller.updateMultiple(\n          position: Offset(controller.initial.position.dx, currentLocation.dy));\n      return true;\n    }\n    if (showWidth < imageWidth) {\n      final lEdge = (width - imageWidth) / 2;\n      final rEdge = width - lEdge;\n      final showLEdge =\n          (0 - currentLocation.dx) / scale - showWidth / 2 + width / 2;\n      final showREdge =\n          (0 - currentLocation.dx) / scale + showWidth / 2 + width / 2;\n      final updateValue = (width / 2 - (rEdge - showWidth / 2)) * scale;\n      if (lEdge > showLEdge) {\n        controller.updateMultiple(\n            position: Offset(0 - updateValue, currentLocation.dy));\n        return true;\n      } else if (rEdge < showREdge) {\n        controller.updateMultiple(\n            position: Offset(updateValue, currentLocation.dy));\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /// preload image\n  void precacheComicImage(ComicReadingPageLogic logic, BuildContext context,\n      int index, String target) {\n    if (logic.requestedLoadingItems.length != logic.length) {\n      logic.requestedLoadingItems = List.filled(logic.length + 1, false);\n    }\n    int precacheNum = int.parse(appdata.settings[28]) + index;\n    for (; index < precacheNum; index++) {\n      if (index >= logic.urls.length || logic.requestedLoadingItems[index]) {\n        return;\n      }\n      precacheImage(createImageProvider(type, logic, index, target), context);\n    }\n    if (!ImageManager.haveTask) {\n      precacheNum += 3;\n      for (; index < precacheNum; index++) {\n        if (index >= logic.urls.length || logic.requestedLoadingItems[index]) {\n          return;\n        }\n        precacheImage(createImageProvider(type, logic, index, target), context);\n      }\n    }\n  }\n}"
  },
  {
    "path": "lib/pages/reader/reading_data.dart",
    "content": "part of pica_reader;\n\nabstract class ReadingData {\n  ReadingData();\n\n  String get title;\n\n  String get id;\n\n  String get downloadId;\n\n  ComicType get type;\n\n  String get sourceKey;\n\n  bool get hasEp;\n\n  Map<String, String>? get eps;\n\n  bool get downloaded => DownloadManager().isExists(downloadId);\n\n  List<int> downloadedEps = [];\n\n  String get favoriteId => id;\n\n  FavoriteType get favoriteType;\n\n  bool checkEpDownloaded(int ep) {\n    return !hasEp || downloadedEps.contains(ep-1);\n  }\n\n  Future<Res<List<String>>> loadEp(int ep) async {\n    if(downloaded && downloadedEps.isEmpty){\n      downloadedEps = (await DownloadManager().getComicOrNull(downloadId))!.downloadedEps;\n    }\n    if (downloaded && checkEpDownloaded(ep)){\n      int length;\n      if(hasEp) {\n        length = await DownloadManager().getEpLength(downloadId, ep);\n      } else {\n        length = await DownloadManager().getComicLength(downloadId);\n      }\n      return Res(List.filled(length, \"\"));\n    } else {\n      return await loadEpNetwork(ep);\n    }\n  }\n\n  /// Load image from local or network\n  ///\n  /// [page] starts from 0, [ep] starts from 1\n  Stream<DownloadProgress> loadImage(int ep, int page, String url) async* {\n    if (downloaded && checkEpDownloaded(ep)) {\n      yield DownloadProgress(\n          1, 1, \"\", DownloadManager().getImage(downloadId, hasEp ? ep : 0, page).path);\n    } else {\n      yield* loadImageNetwork(ep, page, url);\n    }\n  }\n\n  ImageProvider createImageProvider(int ep, int page, String url){\n    if (downloaded && checkEpDownloaded(ep)){\n      return FileImageProvider(downloadId, hasEp ? ep : 0, page);\n    } else {\n      return StreamImageProvider(() => loadImage(ep, page, url), buildImageKey(ep, page, url));\n    }\n  }\n\n  String buildImageKey(int ep, int page, String url) => url;\n\n  Future<Res<List<String>>> loadEpNetwork(int ep);\n\n  Stream<DownloadProgress> loadImageNetwork(int ep, int page, String url);\n}\n\nclass PicacgReadingData extends ReadingData {\n  @override\n  final String title;\n\n  @override\n  final String id;\n\n  PicacgReadingData(this.title, this.id, List<String> epsList)\n      : eps = {for (var e in epsList) e: e};\n\n  @override\n  final Map<String, String> eps;\n\n  @override\n  bool get hasEp => true;\n\n  @override\n  String get sourceKey => \"picacg\";\n\n  @override\n  ComicType get type => ComicType.picacg;\n\n  @override\n  String get downloadId => id;\n\n  @override\n  Future<Res<List<String>>> loadEpNetwork(int ep) {\n    return PicacgNetwork().getComicContent(id, ep);\n  }\n\n  @override\n  Stream<DownloadProgress> loadImageNetwork(int ep, int page, String url) {\n    return ImageManager().getImage(url);\n  }\n\n  @override\n  FavoriteType get favoriteType => FavoriteType.picacg;\n}\n\nclass EhReadingData extends ReadingData {\n  final Gallery gallery;\n\n  EhReadingData(this.gallery);\n\n  @override\n  bool get hasEp => eps != null;\n\n  @override\n  String get sourceKey => \"ehentai\";\n\n  @override\n  ComicType get type => ComicType.ehentai;\n\n  @override\n  String get downloadId => getGalleryId(id);\n\n  @override\n  Future<Res<List<String>>> loadEpNetwork(int ep) {\n    return Future.value(Res(List.filled(int.parse(gallery.maxPage), \"\")));\n  }\n\n  @override\n  Stream<DownloadProgress> loadImageNetwork(int ep, int page, String url) {\n    return ImageManager().getEhImageNew(gallery, page+1);\n  }\n\n  @override\n  Map<String, String>? get eps => null;\n\n  @override\n  String get id => gallery.link;\n\n  @override\n  String get title => gallery.title;\n\n  @override\n  String buildImageKey(int ep, int page, String url) => \"${gallery.link}$page\";\n\n  @override\n  FavoriteType get favoriteType => FavoriteType.ehentai;\n}\n\nclass JmReadingData extends ReadingData {\n  @override\n  final String title;\n\n  @override\n  final String id;\n\n  int? commentsLength;\n  \n  static Map<String, String> generateMap(List<String> epIds, List<String> epNames){\n    if(epIds.length == epNames.length){\n      return Map.fromIterables(epIds, epNames);\n    } else {\n      return Map.fromIterables(epIds, List.generate(epIds.length, (index) => \"第${index+1}章\"));\n    }\n  }\n\n  JmReadingData(this.title, this.id, List<String> epIds, List<String> epNames)\n      : eps = generateMap(epIds, epNames);\n\n  @override\n  bool get hasEp => true;\n\n  @override\n  String get sourceKey => \"jm\";\n\n  @override\n  ComicType get type => ComicType.jm;\n\n  @override\n  String get downloadId => \"jm$id\";\n\n  @override\n  Future<Res<List<String>>> loadEpNetwork(int ep) async{\n    var res = await JmNetwork().getChapter(eps.keys.elementAtOrNull(ep-1) ?? id);\n    commentsLength = res.subData;\n    return res;\n  }\n\n  @override\n  Stream<DownloadProgress> loadImageNetwork(int ep, int page, String url) {\n    var bookId = \"\";\n    for (int i = url.length - 1; i >= 0; i--) {\n      if (url[i] == '/') {\n        bookId = url.substring(i + 1, url.length - 5);\n        break;\n      }\n    }\n    return ImageManager().getJmImage(url, null,\n        epsId: eps.keys.elementAtOrNull(ep-1) ?? id,\n        scrambleId: \"220980\",\n        bookId: bookId);\n  }\n\n  @override\n  final Map<String, String> eps;\n\n  @override\n  String buildImageKey(int ep, int page, String url) => url.replaceAll(RegExp(r\"\\?.+\"), \"\");\n\n  @override\n  FavoriteType get favoriteType => FavoriteType.jm;\n}\n\nclass HitomiReadingData extends ReadingData {\n  @override\n  final String title;\n\n  @override\n  final String id;\n\n  final List<HitomiFile> images;\n\n  final String link;\n\n  HitomiReadingData(this.title, this.id, this.images, this.link);\n\n  @override\n  Map<String, String>? get eps => null;\n\n  @override\n  bool get hasEp => false;\n\n  @override\n  String get sourceKey => \"hitomi\";\n\n  @override\n  ComicType get type => ComicType.hitomi;\n\n  @override\n  String get downloadId => \"hitomi$id\";\n\n  @override\n  String get favoriteId => link;\n\n  @override\n  Future<Res<List<String>>> loadEpNetwork(int ep) {\n    return Future.value(Res(List.filled(images.length, \"\")));\n  }\n\n  @override\n  Stream<DownloadProgress> loadImageNetwork(int ep, int page, String url) {\n    return ImageManager().getHitomiImage(images[page], id);\n  }\n\n  @override\n  String buildImageKey(int ep, int page, String url) => images[page].hash;\n\n  @override\n  FavoriteType get favoriteType => FavoriteType.hitomi;\n}\n\nclass HtReadingData extends ReadingData {\n  @override\n  final String title;\n\n  @override\n  final String id;\n\n  HtReadingData(this.title, this.id,);\n\n  @override\n  Map<String, String>? get eps => null;\n\n  @override\n  bool get hasEp => false;\n\n  @override\n  String get sourceKey => \"htManga\";\n\n  @override\n  ComicType get type => ComicType.htManga;\n\n  @override\n  String get downloadId => \"Ht$id\";\n\n  @override\n  Future<Res<List<String>>> loadEpNetwork(int ep) {\n    return HtmangaNetwork().getImages(id);\n  }\n\n  @override\n  Stream<DownloadProgress> loadImageNetwork(int ep, int page, String url) {\n    return ImageManager().getImage(url);\n  }\n\n  @override\n  FavoriteType get favoriteType => FavoriteType.htManga;\n}\n\nclass NhentaiReadingData extends ReadingData {\n  @override\n  final String title;\n\n  @override\n  final String id;\n\n  NhentaiReadingData(this.title, this.id);\n\n  @override\n  Map<String, String>? get eps => null;\n\n  @override\n  bool get hasEp => false;\n\n  @override\n  String get sourceKey => \"nhentai\";\n\n  @override\n  ComicType get type => ComicType.nhentai;\n\n  @override\n  String get downloadId => \"nhentai$id\";\n\n  @override\n  Future<Res<List<String>>> loadEpNetwork(int ep) {\n    return NhentaiNetwork().getImages(id);\n  }\n\n  @override\n  Stream<DownloadProgress> loadImageNetwork(int ep, int page, String url) {\n    return ImageManager().getImage(url);\n  }\n\n  @override\n  FavoriteType get favoriteType => FavoriteType.nhentai;\n}\n\nclass CustomReadingData extends ReadingData{\n  CustomReadingData(this.id, this.title, this.source, this.eps);\n\n  final ComicSource? source;\n\n  @override\n  String get downloadId => DownloadManager().generateId(sourceKey, id);\n\n  @override\n  final Map<String, String>? eps;\n\n  @override\n  bool get hasEp => eps != null;\n\n  @override\n  String id;\n\n  @override\n  final String title;\n\n  @override\n  Future<Res<List<String>>> loadEpNetwork(int ep) {\n    if(source == null) {\n      return Future.value(const Res.error(\"Unknown Comic Source\"));\n    }\n    if(hasEp){\n      return source!.loadComicPages!(id, eps!.keys.elementAtOrNull(ep-1) ?? id);\n    } else {\n      return source!.loadComicPages!(id, null);\n    }\n  }\n\n  @override\n  Stream<DownloadProgress> loadImageNetwork(int ep, int page, String url) {\n    return ImageManager().getCustomImage(\n        url,\n        id,\n        eps?.keys.elementAtOrNull(ep-1) ?? id,\n        sourceKey\n    );\n  }\n\n  @override\n  String get sourceKey => source?.key ?? \"\";\n\n  @override\n  ComicType get type => ComicType.other;\n\n  @override\n  String buildImageKey(int ep, int page, String url) =>\n      \"$sourceKey$id${eps!.keys.elementAtOrNull(ep-1) ?? id}$url\";\n\n  @override\n  FavoriteType get favoriteType => FavoriteType(source!.intKey);\n}\n"
  },
  {
    "path": "lib/pages/reader/reading_logic.dart",
    "content": "part of pica_reader;\n\nextension PageControllerExtension on PageController{\n  void animatedJumpToPage(int page){\n    final current = this.page?.round() ?? 0;\n    if((current - page).abs() > 1){\n      jumpToPage(page > current ? page - 1 : page + 1);\n    }\n    animateToPage(page, duration: const Duration(milliseconds: 300), curve: Curves.ease);\n  }\n\n  void jumpByDeviceType(int page) {\n    if(StateController.find<ComicReadingPageLogic>().mouseScroll) {\n      jumpToPage(page);\n    } else {\n      animatedJumpToPage(page);\n    }\n  }\n}\n\nclass ComicReadingPageLogic extends StateController {\n  ///控制页面, 用于非从上至下(连续)阅读方式\n  late PageController pageController;\n\n  ///用于从上至下(连续)阅读方式, 跳转至指定项目\n  var itemScrollController = ItemScrollController();\n\n  ///用于从上至下(连续)阅读方式, 获取当前滚动到的元素的序号\n  var itemScrollListener = ItemPositionsListener.create();\n\n  ///用于从上至下(连续)阅读方式, 控制滚动\n  var scrollController = ScrollController(keepScrollOffset: true);\n\n  ///用于从上至下(连续)阅读方式, 获取放缩大小\n  PhotoViewController get photoViewController => photoViewControllers[index]\n      ?? photoViewControllers[0]!;\n\n  var photoViewControllers = <int, PhotoViewController>{};\n\n  ListenVolumeController? listenVolume;\n\n  ScrollManager? scrollManager;\n\n  String? errorMessage;\n\n  void clearPhotoViewControllers(){\n    photoViewControllers.forEach((key, value) => value.dispose());\n    photoViewControllers.clear();\n  }\n\n  bool noScroll = false;\n\n  bool mouseScroll = false;\n\n  double currentScale = 1.0;\n\n  bool get isCtrlPressed => HardwareKeyboard.instance.isControlPressed;\n\n  List<bool> requestedLoadingItems = [];\n\n  bool haveUsedInitialPage = false;\n\n  /// 双页模式下是否在第一页时显示单页\n  bool get singlePageForFirstScreen => appdata.implicitData[1] == '1';\n\n  var focusNode = FocusNode();\n\n  static int _getIndex(int initPage) {\n    if (appdata.settings[9] == \"5\" || appdata.settings[9] == \"6\") {\n      return initPage % 2 == 1 ? initPage : initPage - 1;\n    } else {\n      return initPage;\n    }\n  }\n\n  static int _getPage(int initPage) {\n    if (appdata.settings[9] == \"5\" || appdata.settings[9] == \"6\") {\n      return (initPage + 2) ~/ 2;\n    } else {\n      return initPage;\n    }\n  }\n\n  ComicReadingPageLogic(this.order, this.data, int initialPage, this.updateHistory){\n    if(initialPage <= 0){\n      initialPage = 1;\n    }\n    pageController =\n        PageController(initialPage: _getPage(initialPage));\n    _index = _getIndex(initialPage);\n    order <= 0 ? order = 1 : order;\n    itemScrollListener.itemPositions.addListener(() {\n      var newIndex = itemScrollListener.itemPositions.value.first.index + 1;\n      if(newIndex != index) {\n        index = newIndex;\n        update([\"ToolBar\"]);\n      }\n    });\n  }\n\n\n  final void Function() updateHistory;\n\n  ReadingData data;\n\n  bool isLoading = true;\n\n  ///旋转方向: null-跟随系统, false-竖向, true-横向\n  bool? rotation;\n\n  ///是否应该显示悬浮按钮, 为-1表示显示上一章, 为0表示不显示, 为1表示显示下一章\n  int showFloatingButtonValue = 0;\n\n  double fABValue = 0;\n\n  void showFloatingButton(int value) {\n    if (value == 0) {\n      if (showFloatingButtonValue != 0) {\n        showFloatingButtonValue = 0;\n        fABValue = 0;\n        update();\n      }\n    }\n    if (value == 1 && showFloatingButtonValue == 0) {\n      showFloatingButtonValue = 1;\n      update();\n    } else if (value == -1 && showFloatingButtonValue == 0 && order != 1) {\n      showFloatingButtonValue = -1;\n      update();\n    }\n  }\n\n  ///当前的页面, 0和最后一个为空白页, 用于进行章节跳转\n  late int _index;\n\n  ///当前的页面, 0和最后一个为空白页, 用于进行章节跳转\n  int get index => _index;\n\n  ///当前的页面, 0和最后一个为空白页, 用于进行章节跳转\n  set index(int value) {\n    _index = value;\n    for (var element in _indexChangeCallbacks) {\n      element(value);\n    }\n    updateHistory();\n  }\n\n  final _indexChangeCallbacks = <void Function(int)>[];\n\n  void addIndexChangeCallback(void Function(int) callback){\n    _indexChangeCallbacks.add(callback);\n  }\n\n  void removeIndexChangeCallback(void Function(int) callback){\n    _indexChangeCallbacks.remove(callback);\n  }\n\n  ///当前的章节位置, 从1开始\n  int order;\n\n  ///工具栏是否打开\n  bool tools = false;\n\n  ///是否显示设置窗口\n  bool showSettings = false;\n\n  ///所有的图片链接\n  var urls = <String>[];\n\n  void reload() {\n    index = 1;\n    pageController = PageController(initialPage: 1);\n    isLoading = true;\n    update();\n  }\n\n  void change() {\n    isLoading = !isLoading;\n    update();\n  }\n\n  ReadingMethod get readingMethod =>\n      ReadingMethod.values[int.parse(appdata.settings[9]) - 1];\n\n  void jumpToNextPage() {\n    if (readingMethod.index < 3) {\n      pageController.jumpToPage(index + 1);\n    } else if (readingMethod == ReadingMethod.topToBottomContinuously) {\n      scrollController.jumpTo(scrollController.position.pixels + 600);\n    } else {\n      pageController.jumpToPage(pageController.page!.round() + 1);\n    }\n  }\n\n  void jumpToLastPage() {\n    if (readingMethod.index < 3) {\n      pageController.jumpToPage(index - 1);\n    } else if (readingMethod == ReadingMethod.topToBottomContinuously) {\n      scrollController.jumpTo(scrollController.position.pixels - 600);\n    } else {\n      pageController.jumpToPage(pageController.page!.round() - 1);\n    }\n  }\n\n  void jumpToPage(int i, [bool updateWidget = false]) {\n    i = i.clamp(1, length);\n    if (readingMethod == ReadingMethod.topToBottomContinuously) {\n      itemScrollController.jumpTo(index: i - 1);\n    } else if(!readingMethod.isTwoPage){\n      pageController.jumpToPage(i);\n    } else {\n      var index = singlePageForFirstScreen ? i ~/ 2 + 1 : (i + 1) ~/ 2;\n      pageController.jumpToPage(index);\n    }\n    if(index != i){\n      index = i;\n    }\n    if(updateWidget){\n      update([\"ToolBar\"]);\n    }\n  }\n\n  void jumpByDeviceType(int page){\n    Future.microtask(() {\n      if(mouseScroll){\n        pageController.jumpToPage(page);\n      } else {\n        pageController.animatedJumpToPage(page);\n      }\n    });\n  }\n\n  void jumpToNextChapter() {\n    var eps = data.eps;\n    showFloatingButtonValue = 0;\n    if (!data.hasEp || order == eps?.length) {\n      if(readingMethod != ReadingMethod.topToBottomContinuously){\n        if (readingMethod.index < 3) {\n          jumpByDeviceType(urls.length);\n        } else if (readingMethod == ReadingMethod.twoPage) {\n          jumpByDeviceType((urls.length % 2 + urls.length) ~/ 2);\n        }\n      } else {\n        jumpToPage(urls.length);\n        index = urls.length;\n        update([\"ToolBar\"]);\n      }\n      return;\n    }\n    order += 1;\n    urls = [];\n    isLoading = true;\n    tools = false;\n    index = 1;\n    pageController = PageController(initialPage: 1);\n    clearPhotoViewControllers();\n    update();\n  }\n\n  void jumpToChapter(int index){\n    order = index;\n    urls = [];\n    isLoading = true;\n    tools = false;\n    this.index = 1;\n    pageController = PageController(initialPage: 1);\n    clearPhotoViewControllers();\n    update();\n  }\n\n  void jumpToLastChapter() {\n    showFloatingButtonValue = 0;\n    if(order == 1 || !data.hasEp){\n      if(readingMethod != ReadingMethod.topToBottomContinuously){\n        jumpByDeviceType(1);\n      } else {\n        jumpToPage(1);\n        index = 1;\n        update([\"ToolBar\"]);\n      }\n      return;\n    }\n\n    order -= 1;\n    urls = [];\n    isLoading = true;\n    tools = false;\n    pageController = PageController(initialPage: 1);\n    index = 1;\n    clearPhotoViewControllers();\n    update();\n  }\n\n  ///当前章节的长度\n  int get length => urls.length;\n\n  /// 是否处于自动翻页状态\n  bool runningAutoPageTurning = false;\n\n  /// 自动翻页\n  void autoPageTurning() async {\n    if (index == urls.length - 1) {\n      runningAutoPageTurning = false;\n      update();\n      return;\n    }\n    int sec = int.parse(appdata.settings[33]);\n    for (int i = 0; i < sec * 10; i++) {\n      await Future.delayed(const Duration(milliseconds: 100));\n      if (!runningAutoPageTurning) {\n        return;\n      }\n    }\n    jumpToNextPage();\n    autoPageTurning();\n  }\n\n  void refresh_() {\n    pageController = PageController(initialPage: 1);\n    itemScrollController = ItemScrollController();\n    itemScrollListener = ItemPositionsListener.create();\n    scrollController = ScrollController(keepScrollOffset: true);\n    clearPhotoViewControllers();\n    noScroll = false;\n    currentScale = 1.0;\n    showFloatingButtonValue = 0;\n    index = 1;\n    urls.clear();\n    isLoading = true;\n    tools = false;\n    showSettings = false;\n    update();\n  }\n\n  bool isFullScreen = false;\n\n  void fullscreen(){\n    const channel = MethodChannel(\"pica_comic/full_screen\");\n    channel.invokeMethod(\"set\", !isFullScreen);\n    isFullScreen = !isFullScreen;\n    focusNode.requestFocus();\n\n    if(isFullScreen){\n      StateController.find<WindowFrameController>().hideWindowFrame();\n    } else {\n      StateController.find<WindowFrameController>().showWindowFrame();\n    }\n  }\n\n  void handleKeyboard(KeyEvent event) {\n    if(event is KeyDownEvent || event is KeyRepeatEvent){\n      switch (event.logicalKey) {\n        case LogicalKeyboardKey.arrowDown:\n        case LogicalKeyboardKey.arrowRight:\n          jumpToNextPage();\n        case LogicalKeyboardKey.arrowUp:\n        case LogicalKeyboardKey.arrowLeft:\n          jumpToLastPage();\n        case LogicalKeyboardKey.f12:\n          fullscreen();\n      }\n    }\n  }\n\n  late final void Function() openEpsView;\n}\n"
  },
  {
    "path": "lib/pages/reader/reading_settings.dart",
    "content": "part of pica_reader;\n\nvoid showSettings(BuildContext context) {\n  if (UiMode.m1(context)) {\n    showModalBottomSheet(\n        context: context,\n        builder: (context) => AnimatedContainer(\n              duration: const Duration(milliseconds: 200),\n              child: const ReadingSettings(),\n            ));\n  } else {\n    showSideBar(\n        context,\n        const SingleChildScrollView(\n          child: ReadingSettings(),\n        ),\n        useSurfaceTintColor: true,\n        width: 450);\n  }\n}\n\nclass ReadingSettings extends StatefulWidget {\n  const ReadingSettings({Key? key}) : super(key: key);\n\n  @override\n  State<ReadingSettings> createState() => _ReadingSettingsState();\n}\n\nclass _ReadingSettingsState extends State<ReadingSettings> {\n  bool pageChangeValue = appdata.settings[0] == \"1\";\n  bool useVolumeKeyChangePage = appdata.settings[7] == \"1\";\n  bool keepScreenOn = appdata.settings[14] == \"1\";\n  bool lowBrightness = appdata.settings[18] == \"1\";\n  var value = int.parse(appdata.settings[9]);\n  int i = 0;\n  double opacityLevel = 1.0;\n\n  @override\n  Widget build(BuildContext context) {\n    var logic = StateController.find<ComicReadingPageLogic>();\n    var pages = <Widget>[\n      Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Padding(\n            padding: const EdgeInsets.fromLTRB(20, 10, 0, 5),\n            child: Text(\n              \"阅读设置\".tl,\n              style: const TextStyle(fontSize: 18),\n            ),\n          ),\n          ListTile(\n            leading: const Icon(Icons.auto_awesome_motion),\n            title: Text(\"首页显示单张图片\".tl),\n            trailing: Switch(\n              value: appdata.implicitData[1] == '1',\n              onChanged: (b) {\n                appdata.implicitData[1] = b ? '1' : '0';\n                appdata.writeData();\n                setState(() {});\n                logic.update();\n              },\n            ),\n            onTap: () {},\n          ),\n          ListTile(\n            leading: const Icon(Icons.touch_app_outlined),\n            title: Text(\"点按翻页\".tl),\n            trailing: Switch(\n              value: pageChangeValue,\n              onChanged: (b) {\n                b ? appdata.settings[0] = \"1\" : appdata.settings[0] = \"0\";\n                setState(() {\n                  pageChangeValue = b;\n                });\n                appdata.writeData();\n              },\n            ),\n            onTap: () {},\n          ),\n          ListTile(\n            leading: const SizedBox(),\n            title: Text(\"点按翻页识别范围\".tl),\n            subtitle: SizedBox(\n              height: 25,\n              child: Stack(\n                clipBehavior: Clip.none,\n                children: [\n                  Positioned(\n                      top: 0,\n                      bottom: 0,\n                      left: -20,\n                      right: 0,\n                      child: Slider(\n                        max: 40,\n                        min: 0,\n                        divisions: 40,\n                        value: int.parse(appdata.settings[40]).toDouble(),\n                        overlayColor: WidgetStateColor.resolveWith(\n                            (states) => Colors.transparent),\n                        onChanged: (v) {\n                          if (v == 0) return;\n                          appdata.settings[40] = v.toInt().toString();\n                          appdata.updateSettings();\n                          setState(() {});\n                        },\n                      ))\n                ],\n              ),\n            ),\n            trailing: SizedBox(\n              width: 40,\n              child: Text(\n                \"${appdata.settings[40]}%\",\n                style: const TextStyle(fontSize: 14),\n              ),\n            ),\n          ),\n          ListTile(\n            leading: const Icon(Icons.touch_app),\n            title: Text(\"反转点按翻页\".tl),\n            trailing: Switch(\n              value: appdata.settings[70] == \"1\",\n              onChanged: (b) => setState(() {\n                appdata.settings[70] = b ? \"1\" : \"0\";\n                appdata.updateSettings();\n              }),\n            ),\n          ),\n          ListTile(\n            leading: const Icon(Icons.volume_mute),\n            title: Text(\"使用音量键翻页\".tl),\n            trailing: Switch(\n              value: useVolumeKeyChangePage,\n              onChanged: (b) {\n                b ? appdata.settings[7] = \"1\" : appdata.settings[7] = \"0\";\n                setState(() {\n                  useVolumeKeyChangePage = b;\n                });\n                appdata.writeData();\n                logic.update();\n              },\n            ),\n            onTap: () {},\n          ),\n          if (App.isAndroid)\n            ListTile(\n              leading: const Icon(Icons.screenshot_outlined),\n              title: Text(\"保持屏幕常亮\".tl),\n              onTap: () {},\n              trailing: Switch(\n                value: keepScreenOn,\n                onChanged: (b) {\n                  b ? setKeepScreenOn() : cancelKeepScreenOn();\n                  b ? appdata.settings[14] = \"1\" : appdata.settings[14] = \"0\";\n                  setState(() {\n                    keepScreenOn = b;\n                  });\n                  appdata.writeData();\n                },\n              ),\n            ),\n          ListTile(\n            leading: const Icon(Icons.brightness_4),\n            title: Text(\"深色模式下降低图片亮度\".tl),\n            onTap: () {},\n            trailing: Switch(\n              value: lowBrightness,\n              onChanged: (b) {\n                b ? appdata.settings[18] = \"1\" : appdata.settings[18] = \"0\";\n                setState(() {\n                  lowBrightness = b;\n                });\n                appdata.writeData();\n                logic.update();\n              },\n            ),\n          ),\n          if (logic.readingMethod != ReadingMethod.topToBottomContinuously)\n            ListTile(\n              leading: const Icon(Icons.fit_screen_outlined),\n              title: Text(\"图片缩放\".tl),\n              onTap: () {},\n              trailing: Select(\n                initialValue: int.parse(appdata.settings[41]),\n                values: [\"容纳\".tl, \"适应宽度\".tl, \"适应高度\".tl],\n                onChange: (int i) {\n                  appdata.settings[41] = i.toString();\n                  appdata.updateSettings();\n                  logic.photoViewController.resetWithNewBoxFit(switch(i){\n                    0 => BoxFit.contain,\n                    1 => BoxFit.fitWidth,\n                    2 => BoxFit.fitHeight,\n                    _ => BoxFit.contain,\n                  });\n                },\n              ),\n            ),\n          ListTile(\n            leading: const Icon(Icons.zoom_out_map),\n            title: Text(\"双击缩放\".tl),\n            onTap: () {},\n            trailing: Switch(\n              value: appdata.settings[49] == \"1\",\n              onChanged: (value) {\n                appdata.settings[49] = value ? \"1\" : \"0\";\n                logic.update();\n                appdata.updateSettings();\n                setState(() {});\n              },\n            ),\n          ),\n          ListTile(\n            leading: const Icon(Icons.timer_sharp),\n            subtitle: SizedBox(\n              height: 25,\n              child: Stack(\n                clipBehavior: Clip.none,\n                children: [\n                  Positioned(\n                      top: 0,\n                      bottom: 0,\n                      left: -20,\n                      right: 0,\n                      child: Slider(\n                        max: 20,\n                        min: 0,\n                        divisions: 20,\n                        value: int.parse(appdata.settings[33]).toDouble(),\n                        overlayColor: WidgetStateColor.resolveWith(\n                            (states) => Colors.transparent),\n                        onChanged: (v) {\n                          if (v == 0) return;\n                          appdata.settings[33] = v.toInt().toString();\n                          appdata.updateSettings();\n                          setState(() {});\n                        },\n                      ))\n                ],\n              ),\n            ),\n            trailing: SizedBox(\n              width: 40,\n              child: Text(\n                \"${appdata.settings[33]}秒\",\n                style: const TextStyle(fontSize: 14),\n              ),\n            ),\n            title: Text(\"自动翻页时间间隔\".tl),\n          ),\n          if (logic.readingMethod == ReadingMethod.topToBottomContinuously)\n            ListTile(\n              leading: const Icon(Icons.width_normal_sharp),\n              title: Text(\"限制图片最大显示宽度\".tl),\n              trailing: Switch(\n                value: appdata.settings[43] == \"1\",\n                onChanged: (b) => setState(() {\n                  appdata.settings[43] = b ? \"1\" : \"0\";\n                  appdata.updateSettings();\n                  Future.microtask(() => logic.update());\n                }),\n              ),\n            ),\n          ListTile(\n            leading: const Icon(Icons.zoom_in),\n            title: Text(\"长按缩放\".tl),\n            trailing: Switch(\n              value: appdata.settings[55] == \"1\",\n              onChanged: (b) => setState(() {\n                appdata.settings[55] = b ? \"1\" : \"0\";\n                appdata.updateSettings();\n                Future.microtask(() => logic.update());\n              }),\n            ),\n          ),\n          ListTile(\n            leading: const Icon(Icons.insert_drive_file_outlined),\n            title: Text(\"显示页面信息\".tl),\n            trailing: Switch(\n              value: appdata.settings[57] == \"1\",\n              onChanged: (b) => setState(() {\n                appdata.settings[57] = b ? \"1\" : \"0\";\n                appdata.updateSettings();\n                Future.microtask(() => logic.update());\n              }),\n            ),\n          ),\n          ListTile(\n            leading: const Icon(Icons.chrome_reader_mode),\n            title: Text(\"选择阅读模式\".tl),\n            trailing: const Icon(Icons.arrow_right),\n            onTap: () => setState(() {\n              i = 1;\n            }),\n          ),\n          if (!logic.data.downloaded &&\n              (logic.data.type == ReadingType.picacg ||\n                  logic.data.type == ReadingType.jm))\n            ListTile(\n              leading: const Icon(Icons.account_tree_sharp),\n              title: Text(\"设置分流\".tl),\n              trailing: const Icon(Icons.arrow_right),\n              onTap: () => setState(() {\n                i = 2;\n              }),\n            ),\n        ],\n      ),\n      buildReadingMethodSetting(),\n      Column(\n        children: [\n          SizedBox(\n            height: 60,\n            child: Row(\n              children: [\n                const SizedBox(\n                  width: 6,\n                ),\n                IconButton(\n                  icon: Icon(\n                    Icons.arrow_back_outlined,\n                    color: Theme.of(context).colorScheme.onSurface,\n                  ),\n                  onPressed: () => setState(() {\n                    i = 0;\n                  }),\n                ),\n                Text(\n                  \"设置分流\".tl,\n                  style: const TextStyle(fontSize: 18),\n                ),\n              ],\n            ),\n          ),\n          const SizedBox(\n            height: 40,\n          ),\n          Center(\n            child: FilledButton(\n              child: const Text(\"重启阅读器\"),\n              onPressed: () {\n                App.globalBack();\n                logic.refresh_();\n              },\n            ),\n          ),\n          const SizedBox(\n            height: 20,\n          ),\n        ],\n      ),\n    ];\n\n    return ClipRect(\n      clipBehavior: Clip.antiAlias,\n      child: AnimatedSwitcher(\n        duration: const Duration(milliseconds: 200),\n        reverseDuration: const Duration(milliseconds: 0),\n        switchInCurve: Curves.ease,\n        transitionBuilder: (Widget child, Animation<double> animation) {\n          Tween<Offset> tween;\n          if (i == 0) {\n            tween = Tween<Offset>(\n                begin: const Offset(-0.1, 0), end: const Offset(0, 0));\n          } else {\n            tween = Tween<Offset>(\n                begin: const Offset(0.1, 0), end: const Offset(0, 0));\n          }\n          return SlideTransition(\n            position: tween.animate(animation),\n            child: child,\n          );\n        },\n        child: SingleChildScrollView(\n          primary: false,\n          key: Key(i.toString()),\n          padding:\n              EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom),\n          child: pages[i],\n        ),\n      ),\n    );\n  }\n\n  void setValue(int i) {\n    App.globalBack();\n    value = i;\n    appdata.settings[9] = value.toString();\n    appdata.writeData();\n    var logic = StateController.find<ComicReadingPageLogic>();\n    logic.tools = false;\n    logic.showSettings = false;\n    logic.index = 1;\n    logic.pageController = PageController(initialPage: 1);\n    logic.clearPhotoViewControllers();\n    logic.update();\n  }\n\n  Widget buildReadingMethodSetting() {\n    var options = [\n      \"从左至右\".tl,\n      \"从右至左\".tl,\n      \"从上至下\".tl,\n      \"从上至下(连续)\".tl,\n      \"双页\".tl,\n      \"双页(反向)\".tl\n    ];\n    return Column(\n      children: [\n        SizedBox(\n          height: 60,\n          child: Row(\n            children: [\n              const SizedBox(\n                width: 6,\n              ),\n              IconButton(\n                icon: Icon(\n                  Icons.arrow_back_outlined,\n                  color: Theme.of(context).colorScheme.onSurface,\n                ),\n                onPressed: () => setState(() {\n                  i = 0;\n                }),\n              ),\n              Text(\n                \"选择阅读模式\".tl,\n                style: const TextStyle(fontSize: 18),\n              ),\n            ],\n          ),\n        ),\n        ...List.generate(\n            6,\n            (index) => ListTile(\n                  trailing: Radio<int>(\n                    value: index + 1,\n                    groupValue: value,\n                    onChanged: (i) {\n                      setValue(i!);\n                    },\n                  ),\n                  title: Text(options[index]),\n                  onTap: () {\n                    setValue(index + 1);\n                  },\n                ))\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/reader/reading_type.dart",
    "content": "part of pica_reader;\n\ntypedef ReadingType = ComicType;\n\nenum ReadingMethod {\n  leftToRight,\n  rightToLeft,\n  topToBottom,\n  topToBottomContinuously,\n  twoPage,\n  twoPageReversed;\n\n  bool get isTwoPage => this == ReadingMethod.twoPage\n      || this == ReadingMethod.twoPageReversed;\n\n  bool get useComicImage => this == ReadingMethod.topToBottomContinuously ||\n      this == ReadingMethod.twoPage || this == ReadingMethod.twoPageReversed;\n}"
  },
  {
    "path": "lib/pages/reader/tool_bar.dart",
    "content": "part of pica_reader;\n\nextension ToolBar on ComicReadingPage {\n  ///构建底部工具栏\n  Widget buildBottomToolBar(\n      ComicReadingPageLogic logic, BuildContext context, bool showEps) {\n    return Positioned(\n      bottom: 0,\n      left: 0,\n      right: 0,\n      child: StateBuilder<ComicReadingPageLogic>(\n        id: \"ToolBar\",\n        builder: (logic) {\n          var text = \"E${logic.order} : P${logic.index}\";\n          if (logic.order == 0) {\n            text = \"P${logic.index}\";\n          }\n\n          Widget child = SizedBox(\n            height: 105 + MediaQuery.of(context).padding.bottom,\n            child: Column(\n              children: [\n                const SizedBox(\n                  height: 8,\n                ),\n                Row(\n                  children: [\n                    const SizedBox(\n                      width: 8,\n                    ),\n                    IconButton.filledTonal(\n                        onPressed: () => logic.jumpToLastChapter(),\n                        icon: const Icon(Icons.first_page)),\n                    Expanded(\n                      child: buildSlider(logic),\n                    ),\n                    IconButton.filledTonal(\n                        onPressed: () => logic.jumpToNextChapter(),\n                        icon: const Icon(Icons.last_page)),\n                    const SizedBox(\n                      width: 8,\n                    ),\n                  ],\n                ),\n                Row(\n                  children: [\n                    const SizedBox(\n                      width: 16,\n                    ),\n                    Container(\n                      height: 24,\n                      padding: const EdgeInsets.fromLTRB(6, 2, 6, 0),\n                      decoration: BoxDecoration(\n                        color: Theme.of(context).colorScheme.tertiaryContainer,\n                        borderRadius: BorderRadius.circular(8),\n                      ),\n                      child: Text(text),\n                    ),\n                    const Spacer(),\n                    if (App.isWindows)\n                      Tooltip(\n                        message: \"${\"全屏\".tl}(F12)\",\n                        child: IconButton(\n                          icon: const Icon(Icons.fullscreen),\n                          onPressed: () {\n                            logic.fullscreen();\n                          },\n                        ),\n                      ),\n                    if (App.isAndroid && appdata.settings[76] != \"1\")\n                      Tooltip(\n                        message: \"屏幕方向\".tl,\n                        child: IconButton(\n                          icon: () {\n                            if (logic.rotation == null) {\n                              return const Icon(Icons.screen_rotation);\n                            } else if (logic.rotation == false) {\n                              return const Icon(Icons.screen_lock_portrait);\n                            } else {\n                              return const Icon(Icons.screen_lock_landscape);\n                            }\n                          }.call(),\n                          onPressed: () {\n                            if (logic.rotation == null) {\n                              logic.rotation = false;\n                              logic.update();\n                              SystemChrome.setPreferredOrientations([\n                                DeviceOrientation.portraitUp,\n                                DeviceOrientation.portraitDown,\n                              ]);\n                            } else if (logic.rotation == false) {\n                              logic.rotation = true;\n                              logic.update();\n                              SystemChrome.setPreferredOrientations([\n                                DeviceOrientation.landscapeLeft,\n                                DeviceOrientation.landscapeRight\n                              ]);\n                            } else {\n                              logic.rotation = null;\n                              logic.update();\n                              SystemChrome.setPreferredOrientations(\n                                  DeviceOrientation.values);\n                            }\n                          },\n                        ),\n                      ),\n                    Tooltip(\n                      message: \"收藏图片\".tl,\n                      child: IconButton(\n                        icon: const Icon(Icons.favorite),\n                        onPressed: () async {\n                          try {\n                            final id =\n                                \"${logic.data.sourceKey}-${logic.data.id}\";\n                            var image = await _persistentCurrentImage();\n                            if (image != null) {\n                              image = image.split(\"/\").last;\n                              var otherInfo = <String, dynamic>{};\n                              if (logic.data.type == ReadingType.ehentai) {\n                                otherInfo[\"gallery\"] =\n                                    (logic.data as EhReadingData)\n                                        .gallery\n                                        .toJson();\n                              } else if (logic.data.type ==\n                                  ReadingType.hitomi) {\n                                otherInfo[\"hitomi\"] =\n                                    (readingData as HitomiReadingData)\n                                        .images\n                                        .map((e) => e.toMap())\n                                        .toList();\n                                otherInfo[\"galleryId\"] = readingData.id;\n                              } else if (logic.data.type == ReadingType.jm) {\n                                otherInfo[\"jmEpNames\"] =\n                                    readingData.eps!.values.toList();\n                                otherInfo[\"epsId\"] = readingData.eps!.keys\n                                    .elementAt(logic.index - 1);\n                                otherInfo[\"bookId\"] = readingData.id;\n                              }\n                              if (logic.data.type != ComicType.other) {\n                                otherInfo[\"eps\"] =\n                                    readingData.eps?.keys.toList() ?? [];\n                              } else {\n                                otherInfo[\"eps\"] = readingData.eps;\n                              }\n                              otherInfo[\"url\"] = logic.urls[logic.index - 1];\n                              ImageFavoriteManager.add(ImageFavorite(\n                                  id,\n                                  image,\n                                  readingData.title,\n                                  logic.order,\n                                  logic.index,\n                                  otherInfo));\n                              showToast(message: \"成功收藏图片\".tl);\n                            }\n                          } catch (e) {\n                            showToast(message: e.toString());\n                          }\n                        },\n                      ),\n                    ),\n                    Tooltip(\n                      message: \"自动翻页\".tl,\n                      child: IconButton(\n                        icon: logic.runningAutoPageTurning\n                            ? const Icon(Icons.timer)\n                            : const Icon(Icons.timer_sharp),\n                        onPressed: () {\n                          logic.runningAutoPageTurning =\n                              !logic.runningAutoPageTurning;\n                          logic.update();\n                          logic.autoPageTurning();\n                        },\n                      ),\n                    ),\n                    if (showEps)\n                      Tooltip(\n                        message: \"章节\".tl,\n                        child: IconButton(\n                          icon: const Icon(Icons.library_books),\n                          onPressed: openEpsDrawer,\n                        ),\n                      ),\n                    Tooltip(\n                      message: \"保存图片\".tl,\n                      child: IconButton(\n                        icon: const Icon(Icons.download),\n                        onPressed: saveCurrentImage,\n                      ),\n                    ),\n                    Tooltip(\n                      message: \"分享\".tl,\n                      child: IconButton(\n                        icon: const Icon(Icons.share),\n                        onPressed: share,\n                      ),\n                    ),\n                    const SizedBox(\n                      width: 5,\n                    )\n                  ],\n                )\n              ],\n            ),\n          );\n\n          child = Material(\n            borderRadius: const BorderRadius.only(\n                topLeft: Radius.circular(16), topRight: Radius.circular(16)),\n            surfaceTintColor: Theme.of(context).colorScheme.surfaceTint,\n            elevation: 3,\n            child: child,\n          );\n\n          return AnimatedSwitcher(\n            duration: const Duration(milliseconds: 150),\n            reverseDuration: const Duration(milliseconds: 150),\n            switchInCurve: Curves.fastOutSlowIn,\n            transitionBuilder: (Widget child, Animation<double> animation) {\n              var tween = Tween<Offset>(\n                  begin: const Offset(0, 1), end: const Offset(0, 0));\n              return SlideTransition(\n                position: tween.animate(animation),\n                child: child,\n              );\n            },\n            child: logic.tools\n                ? child\n                : const SizedBox(\n                    width: 0,\n                    height: 0,\n                  ),\n          );\n        },\n      ),\n    );\n  }\n\n  Widget buildSlider(ComicReadingPageLogic logic) {\n    if (logic.tools &&\n        logic.index != 0 &&\n        logic.index != logic.urls.length + 1) {\n      return CustomSlider(\n        value: logic.index.toDouble(),\n        min: 1,\n        reversed: appdata.settings[9] == \"2\" || appdata.settings[9] == \"6\",\n        max: logic.urls.length.toDouble(),\n        divisions: logic.urls.length - 1,\n        onChanged: (i) {\n          if (logic.readingMethod == ReadingMethod.topToBottomContinuously) {\n            logic.jumpToPage(i.toInt());\n            logic.index = i.toInt();\n            logic.update();\n          } else {\n            logic.index = i.toInt();\n            logic.jumpToPage(i.toInt());\n            logic.update();\n          }\n        },\n      );\n    } else {\n      return const SizedBox(\n        height: 0,\n      );\n    }\n  }\n\n  Iterable<Widget> buildButtons(\n      ComicReadingPageLogic logic, BuildContext context) sync* {\n    if (context.width > context.height &&\n        appdata.appSettings.showButtonsInReader) {\n      if (appdata.settings[9] != \"4\" &&\n          logic.readingMethod != ReadingMethod.topToBottom) {\n        yield Positioned(\n          left: 12,\n          top: MediaQuery.of(context).size.height / 2 - 25,\n          child: Button.icon(\n            icon: const Icon(Icons.keyboard_arrow_left),\n            onPressed: () {\n              if (appdata.appSettings.flipPageWithClick) {\n                return;\n              }\n              switch (logic.readingMethod) {\n                case ReadingMethod.rightToLeft:\n                case ReadingMethod.twoPageReversed:\n                  logic.jumpToNextPage();\n                default:\n                  logic.jumpToLastPage();\n              }\n            },\n            size: 24,\n          ),\n        );\n      }\n      if (appdata.settings[9] != \"4\" &&\n          logic.readingMethod != ReadingMethod.topToBottom) {\n        yield Positioned(\n          right: 12,\n          top: MediaQuery.of(context).size.height / 2 - 25,\n          child: Button.icon(\n            icon: const Icon(Icons.keyboard_arrow_right),\n            onPressed: () {\n              if (appdata.settings[0] == \"1\") {\n                return;\n              }\n              switch (logic.readingMethod) {\n                case ReadingMethod.rightToLeft:\n                case ReadingMethod.twoPageReversed:\n                  logic.jumpToLastPage();\n                default:\n                  logic.jumpToNextPage();\n              }\n            },\n            size: 24,\n          ),\n        );\n      }\n      yield Positioned(\n        left: 4,\n        top: 4 + MediaQuery.of(context).padding.top,\n        child: IconButton(\n          iconSize: 24,\n          icon: const Icon(Icons.close),\n          onPressed: () => App.globalBack(),\n        ),\n      );\n    }\n  }\n\n  ///构建顶部工具栏\n  Widget buildTopToolBar(\n      ComicReadingPageLogic comicReadingPageLogic, BuildContext context) {\n    return Positioned(\n      top: 0,\n      child: StateBuilder<ComicReadingPageLogic>(\n        id: \"ToolBar\",\n        builder: (logic) => AnimatedSwitcher(\n          duration: const Duration(milliseconds: 150),\n          reverseDuration: const Duration(milliseconds: 150),\n          switchInCurve: Curves.fastOutSlowIn,\n          child: comicReadingPageLogic.tools\n              ? Material(\n                  surfaceTintColor: Theme.of(context).colorScheme.surfaceTint,\n                  elevation: 3,\n                  shadowColor:\n                      Theme.of(context).colorScheme.shadow.withOpacity(0.3),\n                  child: SizedBox(\n                    width: MediaQuery.of(context).size.width,\n                    child: Row(\n                      children: [\n                        Padding(\n                          padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),\n                          child: Tooltip(\n                            message: \"返回\".tl,\n                            child: IconButton(\n                              iconSize: 25,\n                              icon: const Icon(Icons.arrow_back_outlined),\n                              onPressed: () => App.globalBack(),\n                            ),\n                          ),\n                        ),\n                        Expanded(\n                          child: Container(\n                            height: 50,\n                            constraints: BoxConstraints(\n                                maxWidth:\n                                    MediaQuery.of(context).size.width - 75),\n                            child: Padding(\n                              padding: const EdgeInsets.only(top: 10),\n                              child: Text(\n                                readingData.title,\n                                overflow: TextOverflow.ellipsis,\n                                style: const TextStyle(fontSize: 20),\n                              ),\n                            ),\n                          ),\n                        ),\n                        //const Spacer(),\n                        Padding(\n                          padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),\n                          child: Tooltip(\n                            message: \"阅读设置\".tl,\n                            child: IconButton(\n                              iconSize: 25,\n                              icon: const Icon(Icons.settings),\n                              onPressed: () => showSettings(context),\n                            ),\n                          ),\n                        ),\n                      ],\n                    ),\n                  ).paddingTop(MediaQuery.of(context).padding.top),\n                )\n              : const SizedBox(\n                  width: 0,\n                  height: 0,\n                ),\n          transitionBuilder: (Widget child, Animation<double> animation) {\n            var tween = Tween<Offset>(\n                begin: const Offset(0, -1), end: const Offset(0, 0));\n            return SlideTransition(\n              position: tween.animate(animation),\n              child: child,\n            );\n          },\n        ),\n      ),\n    );\n  }\n\n  ///显示当前的章节和页面位置\n  Widget buildPageInfoText(\n      ComicReadingPageLogic comicReadingPageLogic, BuildContext context) {\n    return Positioned(\n      bottom: 13,\n      left: 25,\n      child: StateBuilder<ComicReadingPageLogic>(\n        id: \"ToolBar\",\n        builder: (logic) {\n          var epName = readingData.eps?.values\n                  .elementAtOrNull(comicReadingPageLogic.order - 1) ??\n              \"E1\";\n          if (epName.length > 8) {\n            epName = \"${epName.substring(0, 8)}...\";\n          }\n          var text = readingData.hasEp\n              ? \"$epName : ${comicReadingPageLogic.index}/${comicReadingPageLogic.urls.length}\"\n              : \"${comicReadingPageLogic.index}/${comicReadingPageLogic.urls.length}\";\n          return Stack(\n            children: [\n              Text(\n                text,\n                style: TextStyle(\n                  fontSize: 14,\n                  foreground: Paint()\n                    ..style = PaintingStyle.stroke\n                    ..strokeWidth = 1.4\n                    ..color = (useDarkBackground ||\n                            Theme.of(context).brightness == Brightness.dark)\n                        ? Colors.black\n                        : Colors.white,\n                ),\n              ),\n              Text(\n                text,\n                style: TextStyle(\n                  fontSize: 14,\n                  color: useDarkBackground ? Colors.white : null,\n                ),\n              ),\n            ],\n          );\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/reader/touch_control.dart",
    "content": "part of pica_reader;\n\nconst _kMaxTapOffset = 4.0;\n\n/// Control scroll when readingMethod is [ReadingMethod.topToBottomContinuously]\n/// and the image has been enlarge\nclass ScrollManager {\n  ComicReadingPageLogic logic;\n\n  ScrollManager(this.logic);\n\n  Offset? tapLocation;\n\n  int? startTime;\n\n  Offset? moveOffset;\n\n  int get fingers => TapController.fingers;\n\n  void tapDown(PointerDownEvent details) {\n    moveOffset = Offset.zero;\n    startTime = DateTime.now().millisecondsSinceEpoch;\n    var logic = StateController.find<ComicReadingPageLogic>();\n    var temp = logic.noScroll;\n    logic.noScroll = fingers >= 2;\n    if (temp != logic.noScroll) {\n      logic.update();\n    }\n  }\n\n  void tapUp(PointerUpEvent details) {\n    var logic = StateController.find<ComicReadingPageLogic>();\n    var temp = logic.noScroll;\n    logic.noScroll = fingers >= 2;\n    if (temp != logic.noScroll) {\n      logic.update();\n    }\n    tapLocation = null;\n\n    if (moveOffset != null && moveOffset != Offset.zero) {\n      if (moveOffset!.dx * moveOffset!.dx + moveOffset!.dy * moveOffset!.dy >\n          400) {\n        final offset = moveOffset! /\n            (DateTime.now().millisecondsSinceEpoch - startTime!).toDouble() *\n            100;\n        logic.photoViewController.animatePosition?.call(\n            logic.photoViewController.position,\n            logic.photoViewController.position + offset);\n      }\n    }\n    moveOffset = null;\n    startTime = null;\n    if (logic.fABValue < 58) {\n      logic.fABValue = 0;\n      logic.update([\"FAB\"]);\n    } else if (logic.fABValue >= 58) {\n      logic.fABValue = 0;\n      logic.jumpToNextChapter();\n    }\n  }\n\n  /// handle pointer move event\n  void addOffset(Offset value) {\n    if (logic.scrollController.offset ==\n            logic.scrollController.position.maxScrollExtent &&\n        logic.photoViewController.scale == 1 &&\n        logic.showFloatingButtonValue == 1) {\n      logic.fABValue -= value.dy / 3;\n      logic.update([\"FAB\"]);\n      return;\n    }\n    if (logic.photoViewController.scale == 1) {\n      return;\n    }\n    if (moveOffset != null) {\n      moveOffset = moveOffset! + value;\n    }\n    if (logic.scrollController.offset !=\n            logic.scrollController.position.maxScrollExtent &&\n        logic.scrollController.offset !=\n            logic.scrollController.position.minScrollExtent) {\n      value = Offset(value.dx, 0);\n    }\n    logic.photoViewController\n        .updateMultiple(position: logic.photoViewController.position + value);\n    return;\n  }\n}\n\nclass _TapDownPointer{\n  int id;\n  Offset offset;\n\n  double getDistance(){\n    return offset.dx * offset.dx + offset.dy * offset.dy;\n  }\n\n  _TapDownPointer(this.id): offset = const Offset(0, 0);\n}\n\nclass TapController {\n  static Offset? _tapOffset;\n\n  static DateTime lastScrollTime = DateTime(2023);\n\n  static bool ignoreNextTap = false;\n\n  static bool longTimePressScale = false;\n\n  static _TapDownPointer? _tapDownPointer;\n\n  static void Function(PointerUpEvent event)? onTapUpReplacement;\n\n  static int fingers = 0;\n\n  static void onTapCancel(PointerCancelEvent event){\n    fingers--;\n  }\n\n  static void onTapDown(PointerDownEvent event) {\n    if(event.buttons == kSecondaryMouseButton){\n      handleSecondaryTapUp(event);\n      return;\n    }\n    fingers++;\n    if(ignoreNextTap){\n      ignoreNextTap = false;\n      return;\n    }\n    var logic = StateController.find<ComicReadingPageLogic>();\n\n    if(appdata.settings[55] == \"1\") {\n      _tapDownPointer = _TapDownPointer(event.pointer);\n      Future.delayed(const Duration(milliseconds: 300), () {\n        if (event.pointer == _tapDownPointer?.id) {\n          onTapUpReplacement = _handleLongPressEnd;\n          _handleLongPressStart(event.position);\n        }\n      });\n    }\n\n    if (appdata.settings[9] == \"4\") {\n      logic.scrollManager!.tapDown(event);\n    }\n\n    if (logic.tools &&\n        (event.position.dy <\n                MediaQuery.of(App.globalContext!).padding.top + 50 ||\n            MediaQuery.of(App.globalContext!).size.height - event.position.dy <\n                105 + MediaQuery.of(App.globalContext!).padding.bottom)) {\n      return;\n    }\n\n    if (event.buttons == kSecondaryMouseButton) {\n      if (logic.showSettings) {\n        logic.showSettings = false;\n        logic.update();\n        return;\n      }\n      logic.tools = !logic.tools;\n      logic.update();\n      if (logic.tools) {\n        SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);\n      } else {\n        SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);\n      }\n      return;\n    }\n\n    if (!logic.scrollController.hasClients) {\n      _tapOffset = event.position;\n    } else if (logic.scrollController.hasClients &&\n        (DateTime.now() - lastScrollTime).inMilliseconds > 50) {\n      _tapOffset = event.position;\n    }\n  }\n\n  static void Function(PointerUpEvent detail)? _doubleClickRecognizer;\n\n  static void handleSecondaryTapUp(PointerDownEvent detail){\n    var logic = StateController.find<ComicReadingPageLogic>();\n    showMenu(\n      context: App.globalContext!,\n      position: RelativeRect.fromLTRB(\n        detail.position.dx, detail.position.dy, detail.position.dx, detail.position.dy),\n      items: [\n        PopupMenuItem(\n          child: Text(\"设置\".tl),\n          onTap: () => showSettings(App.globalContext!),\n        ),\n        if(App.isWindows)\n          PopupMenuItem(\n            onTap: logic.fullscreen,\n            child: Text(\"全屏\".tl),\n          ),\n        PopupMenuItem(\n          child: Text(\"退出\".tl),\n          onTap: () => App.globalBack(),\n        ),\n        if(logic.data.hasEp)\n          PopupMenuItem(\n            onTap: logic.openEpsView,\n            child: Text(\"章节\".tl),\n          ),\n      ]\n    );\n  }\n\n  static void onTapUp(PointerUpEvent detail) async {\n    fingers--;\n    if(onTapUpReplacement != null){\n      onTapUpReplacement!(detail);\n      onTapUpReplacement = null;\n      return;\n    }\n\n    var logic = StateController.find<ComicReadingPageLogic>();\n\n    _tapDownPointer = null;\n\n    if (appdata.settings[9] == \"4\") {\n      logic.scrollManager!.tapUp(detail);\n    }\n\n    if (_tapOffset != null) {\n      var distance = (detail.position - _tapOffset!).distanceSquared;\n      if (distance > _kMaxTapOffset || distance < -_kMaxTapOffset) {\n        return;\n      }\n      _tapOffset = null;\n    } else {\n      return;\n    }\n\n    if (appdata.settings[49] == \"1\") {\n      if (_doubleClickRecognizer == null) {\n        bool flag = false;\n        _doubleClickRecognizer = (another) {\n          var d = detail.delta - another.delta;\n          if (d.dx.abs() < 30 && d.dy.abs() < 30) {\n            flag = true;\n          }\n        };\n        await Future.delayed(const Duration(milliseconds: 200));\n        _doubleClickRecognizer = null;\n        if (flag) {\n          _handleDoubleClick(detail.position);\n          return;\n        }\n      } else {\n        _doubleClickRecognizer!.call(detail);\n        return;\n      }\n    }\n\n    _handleClick(detail, logic, App.globalContext!);\n  }\n\n  static void onPointerMove(PointerMoveEvent event){\n    final logic = StateController.find<ComicReadingPageLogic>();\n    if(event.pointer == _tapDownPointer?.id){\n      _tapDownPointer!.offset += event.delta;\n      if(_tapDownPointer!.getDistance() > 1){\n        _tapDownPointer = null;\n      }\n    }\n    if (appdata.settings[9] == \"4\" &&\n        logic.scrollManager!.fingers != 2) {\n      logic.scrollManager!.addOffset(event.delta);\n    }\n  }\n\n  static void _handleClick(PointerUpEvent detail, ComicReadingPageLogic logic,\n      BuildContext context) {\n    bool flag = false;\n    bool flag2 = false;\n    final range = int.parse(appdata.settings[40]) / 100;\n    if (appdata.settings[0] == \"1\" && !logic.tools) {\n      void updatePageWithSetting(bool next){\n        if(appdata.settings[70] == \"1\"){\n          next = !next;\n        }\n        next ? logic.jumpToNextPage() : logic.jumpToLastPage();\n      }\n      switch (appdata.settings[9]) {\n        case \"1\":\n        case \"5\":\n          detail.position.dx > MediaQuery.of(context).size.width * (1 - range)\n              ? updatePageWithSetting(true)\n              : flag = true;\n          detail.position.dx < MediaQuery.of(context).size.width * range\n              ? updatePageWithSetting(false)\n              : flag2 = true;\n          break;\n        case \"2\":\n        case \"6\":\n          detail.position.dx > MediaQuery.of(context).size.width * (1 - range)\n              ? updatePageWithSetting(false)\n              : flag = true;\n          detail.position.dx < MediaQuery.of(context).size.width * range\n              ? updatePageWithSetting(true)\n              : flag2 = true;\n          break;\n        case \"3\":\n          detail.position.dy > MediaQuery.of(context).size.height * (1 - range)\n              ? updatePageWithSetting(true)\n              : flag = true;\n          detail.position.dy < MediaQuery.of(context).size.height * range\n              ? updatePageWithSetting(false)\n              : flag2 = true;\n          break;\n        case \"4\":\n          detail.position.dy > MediaQuery.of(context).size.height * (1 - range)\n              ? logic.jumpToNextPage()\n              : flag = true;\n          detail.position.dy < MediaQuery.of(context).size.height * range\n              ? logic.jumpToLastPage()\n              : flag2 = true;\n          break;\n      }\n    } else {\n      flag = flag2 = true;\n    }\n    if (flag && flag2) {\n      logic.tools = !logic.tools;\n      logic.update([\"ToolBar\"]);\n      if (logic.tools) {\n        SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);\n        StateController.findOrNull<WindowFrameController>()?.resetTheme();\n      } else {\n        SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);\n        if(appdata.settings[81] == \"1\") {\n          StateController.findOrNull<WindowFrameController>()?.setDarkTheme();\n        }\n      }\n    }\n  }\n\n  static void _handleDoubleClick(Offset position) async {\n    var logic = StateController.find<ComicReadingPageLogic>();\n    var controller = logic.photoViewController;\n    double target;\n    if (controller.scale == null || controller.getInitialScale?.call() == null) {\n      return;\n    }\n    if(!logic.readingMethod.useComicImage){\n      controller.onDoubleClick?.call();\n      return;\n    }\n    if(controller.scale != controller.getInitialScale?.call()){\n      target = controller.getInitialScale!.call()!;\n    } else {\n      target = controller.getInitialScale!.call()! * 1.75;\n    }\n    var size = MediaQuery.of(App.globalContext!).size;\n    controller.animateScale?.call(target, Offset(size.width/2 - position.dx, size.height/2 - position.dy));\n  }\n\n  static void _handleLongPressStart(Offset position){\n    var logic = StateController.find<ComicReadingPageLogic>();\n    var controller = logic.photoViewController;\n    if(controller.scale != controller.getInitialScale?.call() || controller.scale == null\n        || controller.getInitialScale?.call() == null){\n      return;\n    }\n    final target = controller.getInitialScale!.call()! * 1.75;\n    var size = MediaQuery.of(App.globalContext!).size;\n    controller.animateScale?.call(target, Offset(size.width/2 - position.dx, size.height/2 - position.dy));\n    controller.updateState?.call(null);\n  }\n\n  static void _handleLongPressEnd(PointerUpEvent event){\n    var logic = StateController.find<ComicReadingPageLogic>();\n    var controller = logic.photoViewController;\n    if(controller.scale == controller.getInitialScale?.call() || controller.scale == null){\n      return;\n    }\n    final target = controller.getInitialScale?.call();\n    controller.animateScale?.call(target ?? 1);\n    controller.updateState?.call(null);\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_result_page.dart",
    "content": "import 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/pair.dart';\nimport 'package:pica_comic/network/base_comic.dart';\nimport 'package:pica_comic/network/res.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/tags_translation.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nclass _SearchPageComicList extends ComicsPage<BaseComic> {\n  const _SearchPageComicList({\n    super.key,\n    required this.keyword,\n    required this.options,\n    required this.header,\n    required this.sourceKey,\n  });\n\n  final String keyword;\n\n  final List<String> options;\n\n  @override\n  final String sourceKey;\n\n  @override\n  final Widget header;\n\n  @override\n  Future<Res<List<BaseComic>>> getComics(int i) async {\n    var loader = ComicSource.find(sourceKey)!.searchPageData!.loadPage!;\n    return await loader(keyword, i, options);\n  }\n\n  @override\n  String? get tag => \"$sourceKey search page with $keyword\";\n\n  @override\n  String? get title => null;\n}\n\nclass SearchResultPage extends StatelessWidget {\n  const SearchResultPage({\n    super.key,\n    required this.keyword,\n    this.options = const [],\n    required this.sourceKey,\n  });\n\n  final String keyword;\n\n  final List<String> options;\n\n  final String sourceKey;\n\n  @override\n  Widget build(BuildContext context) {\n    var comicSource = ComicSource.find(sourceKey) ?? (throw \"source $sourceKey not found\");\n    var options = this.options;\n    if (comicSource.searchPageData?.searchOptions != null) {\n      var searchOptions = comicSource.searchPageData!.searchOptions!;\n      if (searchOptions.length != options.length) {\n        options = searchOptions.map((e) => e.defaultValue).toList();\n      }\n    }\n    if (comicSource.searchPageData?.overrideSearchResultBuilder != null) {\n      return comicSource.searchPageData!.overrideSearchResultBuilder!(\n        keyword,\n        options,\n      );\n    } else {\n      return _SearchResultPage(\n        keyword: keyword,\n        options: options,\n        sourceKey: sourceKey,\n      );\n    }\n  }\n}\n\nclass _SearchResultPage extends StatefulWidget {\n  const _SearchResultPage({\n    required this.keyword,\n    required this.options,\n    required this.sourceKey,\n  });\n\n  final String keyword;\n\n  final List<String> options;\n\n  final String sourceKey;\n\n  @override\n  State<_SearchResultPage> createState() => _SearchResultPageState();\n}\n\nclass _SearchResultPageState extends State<_SearchResultPage> {\n  var controller = TextEditingController();\n  bool _showFab = true;\n  late String keyword = widget.keyword;\n\n  OverlayEntry? get suggestionOverlay => suggestionsController.entry;\n  late _SuggestionsController suggestionsController;\n  late var sourceKey = widget.sourceKey;\n  late var options = widget.options;\n\n  @override\n  void initState() {\n    controller.text = keyword.trim();\n    if(!keyword.contains('language') && ComicSource.find(sourceKey)?.searchPageData?.enableLanguageFilter == true) {\n      var lang = int.tryParse(appdata.settings[69]) ?? 0;\n      if(lang != 0) {\n        keyword += \" language:${[\"chinese\", \"english\", \"japanese\"][lang-1]}\";\n      }\n    }\n    suggestionsController = _SuggestionsController(controller);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    if(suggestionOverlay != null) {\n      suggestionsController.remove();\n    }\n    super.dispose();\n  }\n\n  void onChanged(String s) {\n    suggestionsController.findSuggestions();\n    if (suggestionOverlay != null) {\n      if (suggestionsController.suggestions.isEmpty) {\n        suggestionsController.remove();\n      } else {\n        suggestionsController.updateWidget();\n      }\n    } else if (suggestionsController.suggestions.isNotEmpty) {\n      suggestionsController.entry = OverlayEntry(\n        builder: (context) {\n          return Positioned(\n            top: context.padding.top + 56 + 16,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            child: Material(\n              child: _Suggestions(\n                controller: suggestionsController,\n              ),\n            ),\n          );\n        },\n      );\n      Overlay.of(context).insert(suggestionOverlay!);\n    }\n  }\n\n  void update() {\n    if (controller.text != keyword) {\n      setState(() {\n        keyword = controller.text;\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget trailing;\n    if(context.width < 400) {\n      trailing = Button.icon(\n        icon: const Icon(Icons.more_horiz),\n        onPressed: more,\n      );\n    } else {\n      trailing = Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Button.icon(\n            icon: const Icon(Icons.dataset_outlined),\n            onPressed: changeSource,\n          ),\n          const SizedBox(\n            width: 4,\n          ),\n          Button.icon(\n            icon: const Icon(Icons.tune),\n            onPressed: showSearchOptions,\n          ),\n        ],\n      );\n    }\n\n    return Scaffold(\n      floatingActionButton: _showFab\n          ? FloatingActionButton(\n              child: const Icon(Icons.search),\n              onPressed: () {\n                var s = controller.text;\n                setState(() {\n                  keyword = s;\n                });\n              },\n            )\n          : null,\n      body: NotificationListener<ScrollUpdateNotification>(\n        onNotification: (notification) {\n          if (suggestionsController.entry != null) {\n            suggestionsController.remove();\n          }\n          final ScrollDirection direction = notification.scrollDelta! < 0\n              ? ScrollDirection.forward\n              : ScrollDirection.reverse;\n          var showFab = _showFab;\n          if (direction == ScrollDirection.reverse) {\n            _showFab = false;\n          } else if (direction == ScrollDirection.forward) {\n            _showFab = true;\n          }\n          if (_showFab == showFab) return true;\n          setState(() {});\n          return false;\n        },\n        child: _SearchPageComicList(\n          keyword: keyword,\n          sourceKey: sourceKey,\n          key: Key(keyword + options.toString() + sourceKey),\n          header: SliverPersistentHeader(\n            pinned: _showFab && SmoothScrollProvider.isMouseScroll,\n            floating: !SmoothScrollProvider.isMouseScroll,\n            delegate: _SliverAppBarDelegate(\n              minHeight: 60,\n              maxHeight: 60,\n              child: FloatingSearchBar(\n                onSearch: (s) {\n                  if (s == keyword) return;\n                  setState(() {\n                    keyword = s;\n                  });\n                },\n                controller: controller,\n                onChanged: onChanged,\n                trailing: trailing,\n              ),\n            ),\n          ),\n          options: options,\n        ),\n      ),\n    );\n  }\n\n  void more() {\n    showMenu(\n      context: context,\n      elevation: 2,\n      color: context.colorScheme.surface,\n      position: RelativeRect.fromLTRB(\n        MediaQuery.of(context).size.width - 48,\n        56,\n        0,\n        0,\n      ),\n      items: [\n        PopupMenuItem(\n          value: 0,\n          child: Text(\"切换源\".tl),\n        ),\n        PopupMenuItem(\n          value: 1,\n          child: Text(\"搜索选项\".tl),\n        ),\n      ],\n    ).then((value) {\n      if (value == 0) {\n        changeSource();\n      } else if (value == 1) {\n        showSearchOptions();\n      }\n    });\n  }\n\n  void changeSource() {\n    var sources = ComicSource.sources.where((e) => e.searchPageData != null);\n    String? sourceKey = this.sourceKey;\n    showDialog(\n      useSafeArea: false,\n      context: context,\n      builder: (context) {\n        return StatefulBuilder(builder: (context, setState) {\n          return ContentDialog(\n            title: \"切换源\".tl,\n            content: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                for (var source in sources)\n                  RadioListTile<String>(\n                    title: Text(source.name),\n                    value: source.key,\n                    groupValue: sourceKey,\n                    onChanged: (value) {\n                      setState(() {\n                        sourceKey = value;\n                      });\n                    },\n                  )\n              ],\n            ),\n            actions: [\n              Button.filled(\n                child: Text(\"确认\".tl),\n                onPressed: () {\n                  if (sourceKey != null) {\n                    context.pop();\n                    var searchData = ComicSource.find(sourceKey!)!.searchPageData!;\n                    options = (searchData.searchOptions ?? [])\n                        .map((e) => e.defaultValue)\n                        .toList();\n                    if (searchData.overrideSearchResultBuilder != null) {\n                      this.context.off(() {\n                        return SearchResultPage(\n                          keyword: keyword,\n                          options: options,\n                          sourceKey: sourceKey!,\n                        );\n                      });\n                    } else {\n                      this.setState(() {\n                        this.sourceKey = sourceKey!;\n                      });\n                    }\n                  }\n                },\n              )\n            ],\n          );\n        });\n      },\n    );\n  }\n\n  void showSearchOptions() {\n    showDialog(\n      context: context,\n      useSafeArea: false,\n      builder: (context) => _SearchOptions(\n        current: options,\n        sourceKey: sourceKey,\n        onChanged: (options) {\n          setState(() {\n            this.options = options;\n          });\n        },\n      ),\n    );\n  }\n}\n\nclass _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {\n  _SliverAppBarDelegate(\n      {required this.child, required this.maxHeight, required this.minHeight});\n\n  final double minHeight;\n  final double maxHeight;\n  final Widget child;\n\n  @override\n  Widget build(\n      BuildContext context, double shrinkOffset, bool overlapsContent) {\n    return SizedBox.expand(\n      child: child,\n    );\n  }\n\n  @override\n  double get maxExtent => minHeight;\n\n  @override\n  double get minExtent => max(maxHeight, minHeight);\n\n  @override\n  bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {\n    return maxHeight != oldDelegate.maxExtent ||\n        minHeight != oldDelegate.minExtent;\n  }\n}\n\nclass _SuggestionsController {\n  _SuggestionsState? _state;\n\n  final TextEditingController controller;\n\n  OverlayEntry? entry;\n\n  void updateWidget() {\n    _state?.update();\n  }\n\n  void remove() {\n    entry?.remove();\n    entry = null;\n  }\n\n  var suggestions = <Pair<String, TranslationType>>[];\n\n  void findSuggestions() {\n    var text = controller.text.split(\" \").last;\n    var suggestions = this.suggestions;\n\n    suggestions.clear();\n\n    bool check(String text, String key, String value) {\n      if (text.removeAllBlank == \"\") {\n        return false;\n      }\n      if (key.length >= text.length && key.substring(0, text.length) == text ||\n          (key.contains(\" \") &&\n              key.split(\" \").last.length >= text.length &&\n              key.split(\" \").last.substring(0, text.length) == text)) {\n        return true;\n      } else if (value.length >= text.length && value.contains(text)) {\n        return true;\n      }\n      return false;\n    }\n\n    void find(Map<String, String> map, TranslationType type) {\n      for (var element in map.entries) {\n        if (suggestions.length > 200) {\n          break;\n        }\n        if (check(text, element.key, element.value)) {\n          suggestions.add(Pair(element.key, type));\n        }\n      }\n    }\n\n    find(TagsTranslation.femaleTags, TranslationType.female);\n    find(TagsTranslation.maleTags, TranslationType.male);\n    find(TagsTranslation.parodyTags, TranslationType.parody);\n    find(TagsTranslation.characterTranslations, TranslationType.character);\n    find(TagsTranslation.otherTags, TranslationType.other);\n    find(TagsTranslation.mixedTags, TranslationType.mixed);\n    find(TagsTranslation.languageTranslations, TranslationType.language);\n    find(TagsTranslation.artistTags, TranslationType.artist);\n    find(TagsTranslation.groupTags, TranslationType.group);\n    find(TagsTranslation.cosplayerTags, TranslationType.cosplayer);\n  }\n\n  _SuggestionsController(this.controller);\n}\n\nclass _Suggestions extends StatefulWidget {\n  const _Suggestions({required this.controller});\n\n  final _SuggestionsController controller;\n\n  @override\n  State<_Suggestions> createState() => _SuggestionsState();\n}\n\nclass _SuggestionsState extends State<_Suggestions> {\n  void update() {\n    setState(() {});\n  }\n\n  @override\n  void initState() {\n    widget.controller._state = this;\n    super.initState();\n  }\n\n  @override\n  void didUpdateWidget(covariant _Suggestions oldWidget) {\n    if (oldWidget.controller != widget.controller) {\n      oldWidget.controller._state = null;\n      widget.controller._state = this;\n    }\n    super.didUpdateWidget(oldWidget);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return buildSuggestions(context);\n  }\n\n  Widget buildSuggestions(BuildContext context) {\n    bool showMethod = MediaQuery.of(context).size.width < 600;\n    bool showTranslation = App.locale.languageCode == \"zh\";\n\n    Widget buildItem(Pair<String, TranslationType> value) {\n      var subTitle = TagsTranslation.translationTagWithNamespace(\n          value.left, value.right.name);\n      return ListTile(\n        title: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            Expanded(\n              child: Text(\n                value.left,\n                maxLines: 2,\n              ),\n            ),\n            if (!showMethod)\n              const SizedBox(\n                width: 12,\n              ),\n            if (!showMethod && showTranslation)\n              Text(\n                subTitle,\n                style: TextStyle(\n                    fontSize: 14, color: Theme.of(context).colorScheme.outline),\n              )\n          ],\n        ),\n        subtitle: (showMethod && showTranslation) ? Text(subTitle) : null,\n        trailing: Text(\n          value.right.name,\n          style: const TextStyle(fontSize: 13),\n        ),\n        onTap: () => onSelected(value.left, value.right),\n      );\n    }\n\n    return Column(\n      children: [\n        SizedBox(\n          height: 32,\n          child: Row(\n            children: [\n              const SizedBox(\n                width: 32,\n              ),\n              Text(\"建议\".tl),\n              const Spacer(),\n              InkWell(\n                borderRadius: BorderRadius.circular(14),\n                onTap: () {\n                  widget.controller.suggestions.clear();\n                  widget.controller.remove();\n                },\n                child: const Padding(\n                  padding: EdgeInsets.all(4),\n                  child: Icon(\n                    Icons.close,\n                    size: 20,\n                  ),\n                ),\n              ),\n              const SizedBox(\n                width: 36,\n              ),\n            ],\n          ),\n        ),\n        Expanded(\n          child: ListView.builder(\n            padding: const EdgeInsets.symmetric(horizontal: 16),\n            itemCount: widget.controller.suggestions.length,\n            itemBuilder: (context, index) =>\n                buildItem(widget.controller.suggestions[index]),\n          ),\n        )\n      ],\n    );\n  }\n\n  bool check(String text, String key, String value) {\n    if (text.removeAllBlank == \"\") {\n      return false;\n    }\n    if (key.length >= text.length && key.substring(0, text.length) == text ||\n        (key.contains(\" \") &&\n            key.split(\" \").last.length >= text.length &&\n            key.split(\" \").last.substring(0, text.length) == text)) {\n      return true;\n    } else if (value.length >= text.length && value.contains(text)) {\n      return true;\n    }\n    return false;\n  }\n\n  void onSelected(String text, TranslationType? type) {\n    var controller = widget.controller.controller;\n    var words = controller.text.split(\" \");\n    if (words.length >= 2 &&\n        check(\"${words[words.length - 2]} ${words[words.length - 1]}\", text,\n            text.translateTagsToCN)) {\n      controller.text = controller.text.replaceLast(\n          \"${words[words.length - 2]} ${words[words.length - 1]}\", \"\");\n    } else {\n      controller.text =\n          controller.text.replaceLast(words[words.length - 1], \"\");\n    }\n    if (type != null) {\n      controller.text += \"${type.name}:$text \";\n    } else {\n      controller.text += \"$text \";\n    }\n    widget.controller.suggestions.clear();\n    widget.controller.remove();\n  }\n}\n\nclass _SearchOptions extends StatefulWidget {\n  const _SearchOptions({\n    required this.current,\n    required this.sourceKey,\n    required this.onChanged,\n  });\n\n  final List<String> current;\n\n  final String sourceKey;\n\n  final void Function(List<String>) onChanged;\n\n  @override\n  State<_SearchOptions> createState() => _SearchOptionsState();\n}\n\nclass _SearchOptionsState extends State<_SearchOptions> {\n  late SearchPageData data;\n\n  var options = <String>[];\n\n  @override\n  void initState() {\n    data = ComicSource.find(widget.sourceKey)!.searchPageData!;\n    options = widget.current;\n    if (data.searchOptions != null &&\n        options.length != data.searchOptions!.length) {\n      options = data.searchOptions!.map((e) => e.defaultValue).toList();\n    }\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ContentDialog(\n      title: \"搜索选项\".tl,\n      content: buildSearchOptions(context),\n      actions: [\n        Button.filled(\n          child: Text(\"确认\".tl),\n          onPressed: () {\n            context.pop();\n            widget.onChanged(options);\n          },\n        )\n      ],\n    );\n  }\n\n  Widget buildSearchOptions(BuildContext context) {\n    var children = <Widget>[];\n    if (data.customOptionsBuilder != null) {\n      children.add(\n        data.customOptionsBuilder!(context, options, (options) {\n          this.options = options;\n        }),\n      );\n    } else {\n      final searchOptions = data.searchOptions ?? <SearchOptions>[];\n      for (int i = 0; i < searchOptions.length; i++) {\n        final option = searchOptions[i];\n        children.add(ListTile(\n          title: Text(option.label),\n        ));\n        children.add(Wrap(\n          runSpacing: 8,\n          spacing: 8,\n          children: option.options.entries.map((e) {\n            return InkWell(\n              onTap: () {\n                setState(() {\n                  options[i] = e.key;\n                });\n              },\n              borderRadius: BorderRadius.circular(8),\n              child: AnimatedContainer(\n                duration: const Duration(milliseconds: 180),\n                decoration: BoxDecoration(\n                  color: options[i] == e.key\n                      ? context.colorScheme.primaryContainer\n                      : context.colorScheme.primaryContainer.withOpacity(0.2),\n                  borderRadius: BorderRadius.circular(8),\n                ),\n                child: Padding(\n                  padding:\n                      const EdgeInsets.symmetric(horizontal: 16, vertical: 8),\n                  child: Text(e.value.tl),\n                ),\n              ),\n            );\n          }).toList(),\n        ).paddingHorizontal(16));\n      }\n    }\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: children,\n    ).paddingBottom(12);\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/app_settings.dart",
    "content": "part of pica_settings;\n\nvoid findUpdate(BuildContext context) {\n  context.showMessage(message: \"正在检查更新\".tl);\n  checkUpdate().then((b) {\n    if (!context.mounted) return;\n    if (b == null) {\n      context.showMessage(message: \"网络错误\".tl);\n    } else if (b) {\n      getUpdatesInfo().then((s) {\n        if (!context.mounted) return;\n        if (s != null) {\n          showDialog(\n              context: context,\n              builder: (context) {\n                return AlertDialog(\n                  title: Text(\"有可用更新\".tl),\n                  content: Text(s),\n                  actions: [\n                    TextButton(\n                        onPressed: () => App.globalBack(),\n                        child: Text(\"取消\".tl)),\n                    TextButton(\n                        onPressed: () {\n                          getDownloadUrl().then((s) {\n                            launchUrlString(s,\n                                mode: LaunchMode.externalApplication);\n                          });\n                        },\n                        child: Text(\"下载\".tl))\n                  ],\n                );\n              });\n        } else {\n          context.showMessage(message: \"网络错误\".tl);\n        }\n      });\n    } else {\n      context.showMessage(message: \"已是最新版本\".tl);\n    }\n  });\n}\n\nclass ProxyController extends StateController {\n  bool value = appdata.settings[8] == \"0\";\n  late var controller =\n      TextEditingController(text: value ? \"\" : appdata.settings[8]);\n}\n\nvoid setProxy(BuildContext context) {\n  showDialog(\n      context: context,\n      builder: (dialogContext) {\n        return StateBuilder(\n            init: ProxyController(),\n            builder: (controller) {\n              return SimpleDialog(\n                title: Text(\"设置代理\".tl),\n                children: [\n                  const SizedBox(\n                    width: 400,\n                  ),\n                  ListTile(\n                    title: Text(\"使用系统代理\".tl),\n                    trailing: Switch(\n                      value: controller.value,\n                      onChanged: (value) {\n                        if (value == true) {\n                          controller.controller.text = \"\";\n                        }\n                        controller.value = !controller.value;\n                        controller.update();\n                      },\n                    ),\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.fromLTRB(15, 10, 15, 10),\n                    child: TextField(\n                      readOnly: controller.value,\n                      controller: controller.controller,\n                      decoration: InputDecoration(\n                          border: const OutlineInputBorder(),\n                          hintText: controller.value\n                              ? \"使用系统代理时无法手动设置\".tl\n                              : \"设置代理, 例如127.0.0.1:7890\".tl),\n                    ),\n                  ),\n                  if (!controller.value)\n                    Padding(\n                      padding: const EdgeInsets.fromLTRB(18, 10, 15, 10),\n                      child: Row(\n                        children: [\n                          const Icon(\n                            Icons.info_outline,\n                            size: 20,\n                          ),\n                          Text(\"  ${\"留空表示禁用网络代理\".tl}\")\n                        ],\n                      ),\n                    ),\n                  Center(\n                    child: FilledButton(\n                        onPressed: () {\n                          if (controller.value) {\n                            appdata.settings[8] = \"0\";\n                            appdata.writeData();\n                            setNetworkProxy();\n                            App.globalBack();\n                          } else {\n                            appdata.settings[8] = controller.controller.text;\n                            appdata.writeData();\n                            setNetworkProxy();\n                            App.globalBack();\n                          }\n                        },\n                        child: Text(\"确认\".tl)),\n                  )\n                ],\n              );\n            });\n      });\n}\n\nvoid setDownloadFolder() async {\n  if (DownloadManager().downloading.isNotEmpty) {\n    showToast(message: \"请在下载任务完成后进行操作\".tl);\n    return;\n  }\n\n  if (App.isAndroid) {\n    var directories = await getExternalStorageDirectories();\n    var paths = List<String>.generate(\n        directories?.length ?? 0, (index) => directories?[index].path ?? \"\");\n    var havePermission = await const MethodChannel(\"pica_comic/settings\")\n        .invokeMethod(\"files_check\");\n    showDialog(\n        context: App.globalContext!,\n        builder: (context) => SetDownloadFolderDialog(\n              paths: paths,\n              haveManageFilesPermission: havePermission,\n            ));\n  } else {\n    showDialog(\n        context: App.globalContext!,\n        builder: (context) => const SetDownloadFolderDialog());\n  }\n}\n\nclass SetDownloadFolderDialog extends StatefulWidget {\n  const SetDownloadFolderDialog(\n      {this.paths, this.haveManageFilesPermission = false, Key? key})\n      : super(key: key);\n  final List<String>? paths;\n  final bool haveManageFilesPermission;\n\n  @override\n  State<SetDownloadFolderDialog> createState() =>\n      _SetDownloadFolderDialogState();\n}\n\nclass _SetDownloadFolderDialogState extends State<SetDownloadFolderDialog> {\n  final controller = TextEditingController();\n  String current = appdata.settings[22];\n  bool transform = true;\n\n  @override\n  Widget build(BuildContext context) {\n    return SimpleDialog(\n      title: Text(\"设置下载目录\".tl),\n      children: [\n        if (App.isDesktop || widget.haveManageFilesPermission)\n          SizedBox(\n            width: 400,\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Padding(\n                  padding: const EdgeInsets.fromLTRB(16, 16, 16, 8),\n                  child: TextField(\n                    controller: controller,\n                    decoration: InputDecoration(\n                        border: const OutlineInputBorder(),\n                        labelText: \"路径\".tl,\n                        hintText: \"为空表示使用App数据目录\".tl),\n                  ),\n                ),\n                Padding(\n                  padding: const EdgeInsets.fromLTRB(16, 0, 16, 8),\n                  child: CheckboxListTile(\n                    value: transform,\n                    onChanged: (b) => setState(() {\n                      transform = b!;\n                    }),\n                    title: Text(\"转移数据\".tl),\n                  ),\n                ),\n                Padding(\n                  padding: const EdgeInsets.fromLTRB(16, 8, 16, 8),\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      const Icon(\n                        Icons.info_outline,\n                        size: 18,\n                      ),\n                      const SizedBox(\n                        width: 4,\n                      ),\n                      Expanded(\n                        child: SizedBox(\n                          child: Text(\"如需还原之前的下载, 将路径填写为下载数据的位置, 并取消勾选转移数据\".tl),\n                        ),\n                      )\n                    ],\n                  ),\n                ),\n                Center(\n                  child: FilledButton(\n                    onPressed: () async {\n                      if (controller.text == appdata.settings[22]) return;\n                      var directory = Directory(controller.text);\n                      if (directory.existsSync() || controller.text == \"\") {\n                        var oldPath = appdata.settings[22];\n                        appdata.settings[22] = controller.text;\n                        if (transform) {\n                          showToast(message: \"正在复制文件\".tl);\n                          await Future.delayed(\n                              const Duration(milliseconds: 200));\n                        }\n                        var res = await downloadManager\n                            .updatePath(controller.text, transform: transform);\n                        if (res == \"ok\") {\n                          hideAllMessages();\n                          if (context.mounted) {\n                            context.pop();\n                          }\n                          showToast(message: \"更新成功\".tl);\n                          appdata.updateSettings();\n                        } else {\n                          appdata.settings[22] = oldPath;\n                          showToast(message: res);\n                        }\n                      } else {\n                        showToast(message: \"目录不存在\".tl);\n                      }\n                    },\n                    child: Text(\"提交\".tl),\n                  ),\n                ),\n                const SizedBox(\n                  height: 8,\n                ),\n                Padding(\n                  padding: const EdgeInsets.fromLTRB(8, 0, 8, 0),\n                  child: Text(\"${\"现在的路径为\".tl}: ${DownloadManager().path}\"),\n                )\n              ],\n            ),\n          )\n        else\n          SizedBox(\n            width: 400,\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                RadioListTile<String>(\n                    title: Text(\"App数据目录\".tl),\n                    value: \"\",\n                    groupValue: current,\n                    onChanged: (value) => setState(() {\n                          current = value!;\n                        })),\n                for (int i = 0; i < widget.paths!.length; i++)\n                  RadioListTile<String>(\n                      title: Text(widget.paths![i]),\n                      value: widget.paths![i],\n                      groupValue: current,\n                      onChanged: (value) => setState(() {\n                            current = value!;\n                          })),\n                Padding(\n                  padding: const EdgeInsets.fromLTRB(16, 0, 16, 8),\n                  child: ListTile(\n                    title: Text(\"允许储存权限\".tl),\n                    subtitle: Text(\"需要储存权限以选取任意目录\".tl),\n                    onTap: () {\n                      const MethodChannel(\"pica_comic/settings\")\n                          .invokeMethod(\"files\");\n                      App.globalBack();\n                    },\n                  ),\n                ),\n                Padding(\n                  padding: const EdgeInsets.fromLTRB(16, 0, 16, 8),\n                  child: CheckboxListTile(\n                    value: transform,\n                    onChanged: (b) => setState(() {\n                      transform = b!;\n                    }),\n                    title: Text(\"转移数据\".tl),\n                  ),\n                ),\n                Padding(\n                  padding: const EdgeInsets.fromLTRB(16, 8, 16, 8),\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      const Icon(\n                        Icons.info_outline,\n                        size: 18,\n                      ),\n                      const SizedBox(\n                        width: 2,\n                      ),\n                      Expanded(\n                        child: SizedBox(\n                          child: Text(\"如需还原之前的下载, 将路径填写为下载数据的位置, 并取消勾选转移数据\".tl),\n                        ),\n                      )\n                    ],\n                  ),\n                ),\n                SizedBox(\n                  height: 60,\n                  child: Center(\n                    child: FilledButton(\n                      child: const Text(\"确认\"),\n                      onPressed: () async {\n                        if (appdata.settings[22] != current) {\n                          var oldPath = appdata.settings[22];\n                          appdata.settings[22] = current;\n                          if (transform) {\n                            showToast(message: \"正在复制文件\".tl);\n                            await Future.delayed(\n                                const Duration(milliseconds: 200));\n                          }\n                          var res = await downloadManager.updatePath(current,\n                              transform: transform);\n                          if (res == \"ok\") {\n                            App.globalBack();\n                            showToast(message: \"更新成功\".tl);\n                            appdata.updateSettings();\n                          } else {\n                            appdata.settings[22] = oldPath;\n                            showToast(message: res);\n                          }\n                        } else {\n                          App.globalBack();\n                        }\n                      },\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          )\n      ],\n    );\n  }\n}\n\nvoid setExplorePages(BuildContext context) {\n  showPopUpWidget(App.globalContext!, const SetExplorePages());\n}\n\nclass SetExplorePages extends StatefulWidget {\n  const SetExplorePages({Key? key}) : super(key: key);\n\n  @override\n  State<SetExplorePages> createState() => _SetExplorePagesState();\n}\n\nclass _SetExplorePagesState extends State<SetExplorePages> {\n  @override\n  void dispose() {\n    appdata.updateSettings();\n    Future.microtask(() {\n      MyApp.updater?.call();\n    });\n    super.dispose();\n  }\n\n  Widget buildItem(String i) {\n    Widget removeButton = Padding(\n      padding: const EdgeInsets.only(right: 8),\n      child: IconButton(\n          onPressed: () {\n            setState(() {\n              var config = appdata.appSettings.explorePages;\n              config.remove(i);\n              appdata.appSettings.explorePages = config;\n            });\n          },\n          icon: const Icon(Icons.delete)),\n    );\n\n    return ListTile(\n      title: Text(i.tl),\n      key: Key(i),\n      trailing: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          removeButton,\n          const Icon(Icons.drag_handle),\n        ],\n      ),\n    );\n  }\n\n  Widget buildNotShowPageSelector(String i, BuildContext context) {\n    var widget = ListTile(title: Text(i.tl), key: Key(i));\n    return InkWell(\n      child: widget,\n      onTap: () {\n        App.back(context);\n        setState(() {\n          appdata.appSettings.explorePages = appdata.appSettings.explorePages\n            ..add(i);\n        });\n      },\n    );\n  }\n\n  var reorderWidgetKey = UniqueKey();\n  var scrollController = ScrollController();\n  final _key = GlobalKey();\n\n  @override\n  Widget build(BuildContext context) {\n    var notShowPages = <String>[];\n    var allPages = <String>[];\n    for (var source in ComicSource.sources) {\n      for (var page in source.explorePages) {\n        allPages.add(page.title);\n      }\n    }\n    for (var i in allPages) {\n      if (!appdata.appSettings.explorePages.contains(i)) {\n        notShowPages.add(i);\n      }\n    }\n\n    var tiles =\n        appdata.appSettings.explorePages.map((e) => buildItem(e)).toList();\n\n    var view = ReorderableBuilder(\n      key: reorderWidgetKey,\n      scrollController: scrollController,\n      longPressDelay: App.isDesktop\n          ? const Duration(milliseconds: 100)\n          : const Duration(milliseconds: 500),\n      dragChildBoxDecoration: BoxDecoration(\n        color: Theme.of(context).colorScheme.surfaceContainer,\n        boxShadow: const [\n          BoxShadow(\n              color: Colors.black12,\n              blurRadius: 5,\n              offset: Offset(0, 2),\n              spreadRadius: 2)\n        ],\n      ),\n      onReorder: (reorderFunc) {\n        setState(() {\n          appdata.appSettings.explorePages =\n              List.from(reorderFunc(appdata.appSettings.explorePages));\n        });\n      },\n      children: tiles,\n      builder: (children) {\n        return GridView(\n          key: _key,\n          controller: scrollController,\n          gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(\n            crossAxisCount: 1,\n            mainAxisExtent: 48,\n          ),\n          children: children,\n        );\n      },\n    );\n    return PopUpWidgetScaffold(\n      title: \"探索页面\".tl,\n      tailing: [\n        if (notShowPages.isNotEmpty)\n          IconButton(\n            onPressed: () {\n              showDialog(\n                context: context,\n                builder: (context) {\n                  return SimpleDialog(\n                    title: const Text(\"Add\"),\n                    children: notShowPages\n                        .map((e) => buildNotShowPageSelector(e, context))\n                        .toList(),\n                  );\n                },\n              );\n            },\n            icon: const Icon(Icons.add),\n          )\n      ],\n      body: view,\n    );\n  }\n}\n\nvoid clearUserData(BuildContext context) {\n  showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n            title: Text(\"警告\".tl),\n            content: Text(\"此操作无法撤销, 是否继续\".tl),\n            actions: [\n              TextButton(\n                  onPressed: () => App.globalBack(), child: Text(\"取消\".tl)),\n              TextButton(\n                  onPressed: () async {\n                    await clearAppdata();\n                    App.offAll(() => const WelcomePage());\n                    MyApp.updater?.call();\n                  },\n                  child: Text(\"继续\".tl)),\n            ],\n          ));\n}\n\nvoid exportDataSetting(BuildContext context) {\n  void export(bool includeDownloads) async {\n    var dialog = showLoadingDialog(context, allowCancel: false);\n    var res = await runExportData(includeDownloads);\n    if (context.mounted) {\n      if (res) {\n        dialog.close();\n        showToast(message: \"成功导出\".tl);\n      } else {\n        dialog.close();\n        showToast(message: \"导出失败\".tl);\n      }\n    }\n  }\n\n  showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n            title: Text(\"导出用户数据\".tl),\n            content: Text(\"将导出设置, 账号, 历史记录, 下载内容, 本地收藏等数据\".tl),\n            actions: [\n              TextButton(\n                  onPressed: () => App.globalBack(), child: Text(\"取消\".tl)),\n              TextButton(\n                  onPressed: () {\n                    App.globalBack();\n                    export(false);\n                  },\n                  child: Text(\"导出不含下载的数据\".tl)),\n              TextButton(\n                  onPressed: () {\n                    App.globalBack();\n                    export(true);\n                  },\n                  child: Text(\"导出所有数据\".tl))\n            ],\n          ));\n}\n\nvoid importDataSetting(BuildContext context) {\n  showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n            title: Text(\"导入用户数据\".tl),\n            content: Text(\"${\"将导入设置, 账号, 历史记录, 下载内容, 本地收藏等数据, 现在的所有数据将会被覆盖\".tl}\"\n                \"\\n${\"如果导入的数据中包含下载数据, 则当前的下载数据也将被覆盖\".tl}\"),\n            actions: [\n              TextButton(\n                  onPressed: () => App.globalBack(), child: Text(\"取消\".tl)),\n              TextButton(\n                  onPressed: () {\n                    App.globalBack();\n                    var dialog = showLoadingDialog(context, allowCancel: false);\n                    importData().then((v) {\n                      dialog.close();\n                      if (v) {\n                        showToast(message: \"成功导入\".tl);\n                      } else {\n                        showToast(message: \"导入失败\".tl);\n                      }\n                    });\n                  },\n                  child: Text(\"继续\".tl))\n            ],\n          ));\n}\n\nvoid syncDataSettings(BuildContext context) {\n  var configs = [\"\", \"\", \"\", \"\"];\n  if (appdata.settings[45] != \"\") {\n    configs = appdata.settings[45].split(';');\n  }\n  String url = configs[0];\n  String username = configs[1];\n  String pwd = configs[2];\n  String path = configs[3];\n  int value = 0;\n  showDialog(\n    context: context,\n    useSafeArea: false,\n    builder: (context) => ContentDialog(\n      title: \"Webdav\",\n      content: Column(\n        children: [\n          TextField(\n              onChanged: (s) => url = s,\n              controller: TextEditingController(text: url),\n              decoration: const InputDecoration(\n                  border: OutlineInputBorder(),\n                  label: Text(\"URL\"),\n                  hintText: \"https://example.com:4433/webdav\")),\n          const SizedBox(\n            height: 8,\n          ),\n          TextField(\n              onChanged: (s) => username = s,\n              controller: TextEditingController(text: username),\n              decoration: InputDecoration(\n                border: const OutlineInputBorder(),\n                label: Text(\"用户名\".tl),\n              )),\n          const SizedBox(\n            height: 8,\n          ),\n          TextField(\n              onChanged: (s) => pwd = s,\n              controller: TextEditingController(text: pwd),\n              obscureText: true,\n              decoration: InputDecoration(\n                border: const OutlineInputBorder(),\n                label: Text(\"密码\".tl),\n              )),\n          const SizedBox(\n            height: 8,\n          ),\n          TextField(\n              onChanged: (s) => path = s,\n              controller: TextEditingController(text: path),\n              decoration: InputDecoration(\n                  border: const OutlineInputBorder(),\n                  label: Text(\"储存路径\".tl),\n                  hintText: \"请确保路径存在\".tl)),\n          const SizedBox(\n            height: 8,\n          ),\n          StatefulBuilder(builder: (context, stateSetter) {\n            return Row(\n              children: [\n                Text(\"立即执行:\".tl),\n                Radio<int>(\n                    value: 0,\n                    groupValue: value,\n                    onChanged: (i) => stateSetter(() => value = 0)),\n                Text(\"上传数据\".tl),\n                Radio<int>(\n                    value: 1,\n                    groupValue: value,\n                    onChanged: (i) => stateSetter(() => value = 1)),\n                Text(\"下载数据\".tl),\n              ],\n            );\n          }),\n          const SizedBox(\n            height: 8,\n          ),\n          Center(\n            child: FilledButton(\n              child: Text(\"提交\".tl),\n              onPressed: () async {\n                if (url.isEmpty) {\n                  appdata.settings[45] = \"$url;$username;$pwd;$path\";\n                  appdata.updateSettings();\n                  App.globalBack();\n                  return;\n                }\n                var dialog = showLoadingDialog(context,\n                    allowCancel: false, barrierDismissible: false);\n                var res = value == 0\n                    ? await Webdav.uploadData(\"$url;$username;$pwd;$path\")\n                    : await Webdav.downloadData(\"$url;$username;$pwd;$path\");\n                if (!res) {\n                  dialog.close();\n                  showToast(message: \"Failed to sync data\");\n                } else {\n                  appdata.settings[45] = \"$url;$username;$pwd;$path\";\n                  appdata.updateSettings();\n                  dialog.close();\n                  App.globalBack();\n                }\n              },\n            ),\n          ),\n          Padding(\n            padding: const EdgeInsets.fromLTRB(0, 10, 0, 10),\n            child: Row(\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: [\n                const Icon(\n                  Icons.info_outline,\n                  size: 20,\n                ),\n                const SizedBox(\n                  width: 4,\n                ),\n                if (configs.length == 4)\n                  Text(\"将URL留空以禁用同步\".tl)\n                else\n                  Text(\"已禁用\".tl)\n              ],\n            ),\n          )\n        ],\n      ).paddingHorizontal(12),\n    ),\n  );\n}\n\nvoid setCacheLimit() {\n  int size = appdata.appSettings.cacheLimit;\n  showDialog(\n    context: App.globalContext!,\n    useSafeArea: false,\n    builder: (context) => ContentDialog(\n      title: \"设置缓存限制\".tl,\n      content: TextField(\n        controller: TextEditingController(text: size.toString()),\n        keyboardType: TextInputType.number,\n        onChanged: (s) {\n          size = int.tryParse(s) ?? 500;\n        },\n        decoration: const InputDecoration(\n          border: OutlineInputBorder(),\n          suffix: Text(\"MB\"),\n        ),\n      ).paddingHorizontal(16),\n      actions: [\n        Button.filled(\n            child: Text(\"确认\".tl),\n            onPressed: () {\n              appdata.appSettings.cacheLimit = size;\n              appdata.writeData();\n              CacheManager().setLimitSize(size);\n              App.globalBack();\n            }),\n      ],\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/settings/blocking_keyword_page.dart",
    "content": "part of pica_settings;\n\nclass BlockingKeywordPageLogic extends StateController {\n  var keywords = appdata.blockingKeyword;\n  bool down = true;\n  final controller = TextEditingController();\n}\n\nclass BlockingKeywordPage extends StatelessWidget {\n  BlockingKeywordPage({this.popUp = false, Key? key}) : super(key: key) {\n    StateController.put(BlockingKeywordPageLogic());\n  }\n\n  final bool popUp;\n\n  @override\n  Widget build(BuildContext context) {\n    var addButton = Tooltip(\n      message: \"添加\".tl,\n      child: IconButton(\n        icon: const Icon(Icons.add),\n        onPressed: () {\n          showDialog(\n            context: context,\n            builder: (dialogContext) => StateBuilder<BlockingKeywordPageLogic>(\n              builder: (logic) => SimpleDialog(\n                title: Text(\"添加屏蔽关键词\".tl),\n                children: [\n                  const SizedBox(\n                    width: 300,\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.symmetric(\n                        vertical: 12, horizontal: 16),\n                    child: TextField(\n                      controller: logic.controller,\n                      decoration: InputDecoration(\n                          border: const OutlineInputBorder(),\n                          hintText: \"添加关键词\".tl),\n                      onEditingComplete: () {\n                        if (logic.controller.text == \"\") return;\n                        appdata.blockingKeyword.add(logic.controller.text);\n                        logic.update();\n                        App.globalBack();\n                        logic.controller.text = \"\";\n                        appdata.writeData();\n                      },\n                    ),\n                  ),\n                  const SizedBox(\n                    height: 8,\n                  ),\n                  Center(\n                    child: FilledButton(\n                      child: Text(\"提交\".tl),\n                      onPressed: () {\n                        if (logic.controller.text == \"\") return;\n                        appdata.blockingKeyword.add(logic.controller.text);\n                        logic.update();\n                        App.globalBack();\n                        logic.controller.text = \"\";\n                        appdata.writeData();\n                      },\n                    ),\n                  )\n                ],\n              ),\n            ),\n          );\n        },\n      ),\n    );\n\n    var orderButton = StateBuilder<BlockingKeywordPageLogic>(\n      builder: (logic) {\n        return Tooltip(\n          message: \"显示顺序\",\n          child: IconButton(\n            icon: logic.down\n                ? const Icon(Icons.arrow_downward)\n                : const Icon(Icons.arrow_upward),\n            onPressed: () {\n              logic.down = !logic.down;\n              logic.update();\n            },\n          ),\n        );\n      },\n    );\n\n    var widget = StateBuilder<BlockingKeywordPageLogic>(builder: (logic) {\n      var keywords = logic.down\n          ? appdata.blockingKeyword\n          : appdata.blockingKeyword.reversed.toList();\n      return ListView.builder(\n        itemCount: keywords.length + 1,\n        padding: EdgeInsets.zero,\n        itemBuilder: (context, index) {\n          if (index == 0) {\n            return appdata.firstUse[0] == \"1\"\n                ? MaterialBanner(\n                    forceActionsBelow: true,\n                    padding: const EdgeInsets.all(15),\n                    leading: Icon(\n                      Icons.info_outline,\n                      color: Theme.of(context).colorScheme.primary,\n                      size: 30,\n                    ),\n                    content:\n                        Text(\"关键词屏蔽不会生效于收藏夹和历史记录, 屏蔽的依据仅限加载漫画列表时能够获取到的信息\".tl),\n                    actions: [\n                        TextButton(\n                            onPressed: () {\n                              appdata.firstUse[0] = \"0\";\n                              appdata.writeData();\n                              logic.update();\n                            },\n                            child: const Text(\"关闭\"))\n                      ])\n                : const SizedBox(\n                    height: 0,\n                  );\n          } else {\n            return ListTile(\n              title: Text(keywords[index - 1]),\n              trailing: IconButton(\n                icon: Icon(\n                  Icons.close,\n                  color: Theme.of(context).colorScheme.secondary,\n                ),\n                onPressed: () {\n                  logic.keywords.remove(keywords[index - 1]);\n                  logic.update();\n                  appdata.writeData();\n                },\n              ),\n            );\n          }\n        },\n      );\n    });\n\n    return PopUpWidgetScaffold(\n      title: \"关键词屏蔽\".tl,\n      body: widget,\n      tailing: [addButton, orderButton],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/comic_source_settings.dart",
    "content": "part of pica_settings;\n\nclass ComicSourceSettings extends StatefulWidget {\n  const ComicSourceSettings({super.key});\n\n  @override\n  State<ComicSourceSettings> createState() => _ComicSourceSettingsState();\n\n  static void checkCustomComicSourceUpdate([bool showLoading = false]) async {\n    if (ComicSource.sources.isEmpty) {\n      return;\n    }\n    var controller = showLoading ? showLoadingDialog(App.globalContext!) : null;\n    var dio = logDio();\n    var res = await dio.get<String>(\n        \"https://raw.githubusercontent.com/wgh136/pica_configs/master/index.json\");\n    if (res.statusCode != 200) {\n      showToast(message: \"网络错误\".tl);\n      return;\n    }\n    var list = jsonDecode(res.data!) as List;\n    var versions = <String, String>{};\n    for (var source in list) {\n      versions[source['key']] = source['version'];\n    }\n    var shouldUpdate = <String>[];\n    for (var source in ComicSource.sources) {\n      if (versions.containsKey(source.key) &&\n          versions[source.key] != source.version) {\n        shouldUpdate.add(source.key);\n      }\n    }\n    controller?.close();\n    if (shouldUpdate.isEmpty) {\n      return;\n    }\n    var msg = \"\";\n    for (var key in shouldUpdate) {\n      msg += \"${ComicSource.find(key)?.name}: v${versions[key]}\\n\";\n    }\n    msg = msg.trim();\n    showConfirmDialog(App.globalContext!, \"有可用更新\".tl, msg, () {\n      for (var key in shouldUpdate) {\n        var source = ComicSource.find(key);\n        _ComicSourceSettingsState.update(source!);\n      }\n    });\n  }\n}\n\nextension _WidgetExt on Widget {\n  Widget withDivider() {\n    return Column(\n      children: [\n        this,\n        const Divider(),\n      ],\n    );\n  }\n}\n\nclass _ComicSourceSettingsState extends State<ComicSourceSettings> {\n  var url = \"\";\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        buildCard(context),\n        const _BuiltInSources(),\n        if(appdata.appSettings.isComicSourceEnabled(\"picacg\"))\n          const PicacgSettings(false).withDivider(),\n        if(appdata.appSettings.isComicSourceEnabled(\"ehentai\"))\n          const EhSettings(false).withDivider(),\n        if(appdata.appSettings.isComicSourceEnabled(\"jm\"))\n          const JmSettings(false).withDivider(),\n        if(appdata.appSettings.isComicSourceEnabled(\"htmanga\"))\n          const HtSettings(false).withDivider(),\n        buildCustomSettings(),\n        for (var source in ComicSource.sources.where((e) => !e.isBuiltIn))\n          buildCustom(context, source),\n        Padding(\n            padding:\n                EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom))\n      ],\n    );\n  }\n\n  Widget buildCustomSettings() {\n    return Column(\n      children: [\n        ListTile(\n          title: Text(\"自定义漫画源\".tl),\n        ),\n        ListTile(\n          leading: const Icon(Icons.update_outlined),\n          title: Text(\"检查更新\".tl),\n          onTap: () => ComicSourceSettings.checkCustomComicSourceUpdate(true),\n          trailing: const Icon(Icons.arrow_right),\n        ),\n        SwitchSetting(\n          title: \"启动时检查更新\".tl,\n          icon: const Icon(Icons.security_update),\n          settingsIndex: 80,\n        )\n      ],\n    );\n  }\n\n  Widget buildCustom(BuildContext context, ComicSource source) {\n    return Column(\n      children: [\n        const Divider(),\n        ListTile(\n          title: Text(source.name),\n          trailing: Row(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              if (App.isDesktop)\n                Tooltip(\n                  message: \"Edit\",\n                  child: IconButton(\n                      onPressed: () => edit(source),\n                      icon: const Icon(Icons.edit_note)),\n                ),\n              Tooltip(\n                message: \"Update\",\n                child: IconButton(\n                    onPressed: () => update(source),\n                    icon: const Icon(Icons.update)),\n              ),\n              Tooltip(\n                message: \"Delete\",\n                child: IconButton(\n                    onPressed: () => delete(source),\n                    icon: const Icon(Icons.delete)),\n              ),\n            ],\n          ),\n        ),\n        ListTile(\n          title: const Text(\"Version\"),\n          subtitle: Text(source.version),\n        )\n      ],\n    );\n  }\n\n  void delete(ComicSource source) {\n    showConfirmDialog(App.globalContext!, \"删除\".tl, \"要删除此漫画源吗?\".tl, () {\n      var file = File(source.filePath);\n      file.delete();\n      ComicSource.sources.remove(source);\n      _validatePages();\n      MyApp.updater?.call();\n    });\n  }\n\n  void edit(ComicSource source) async {\n    try {\n      await Process.run(\"code\", [source.filePath], runInShell: true);\n      await showDialog(\n          context: App.globalContext!,\n          builder: (context) => AlertDialog(\n                title: const Text(\"Reload Configs\"),\n                actions: [\n                  TextButton(\n                      onPressed: () => Navigator.pop(context),\n                      child: const Text(\"cancel\")),\n                  TextButton(\n                      onPressed: () async {\n                        await ComicSource.reload();\n                        MyApp.updater?.call();\n                      },\n                      child: const Text(\"continue\")),\n                ],\n              ));\n    } catch (e) {\n      showToast(message: \"Failed to launch vscode\");\n    }\n  }\n\n  static void update(ComicSource source) async {\n    ComicSource.sources.remove(source);\n    if (!source.url.isURL) {\n      showToast(message: \"Invalid url config\");\n    }\n    bool cancel = false;\n    var controller = showLoadingDialog(App.globalContext!,\n        onCancel: () => cancel = true, barrierDismissible: false);\n    try {\n      var res = await logDio().get<String>(source.url,\n          options: Options(responseType: ResponseType.plain));\n      if (cancel) return;\n      controller.close();\n      await ComicSourceParser().parse(res.data!, source.filePath);\n      await File(source.filePath).writeAsString(res.data!);\n    } catch (e) {\n      if (cancel) return;\n      showToast(message: e.toString());\n    }\n    await ComicSource.reload();\n    MyApp.updater?.call();\n  }\n\n  Widget buildCard(BuildContext context) {\n    return Card.outlined(\n      child: SizedBox(\n        width: double.infinity,\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            ListTile(\n              title: Text(\"添加漫画源\".tl),\n              leading: const Icon(Icons.dashboard_customize),\n            ),\n            TextField(\n                    decoration: InputDecoration(\n                        hintText: \"URL\",\n                        border: const UnderlineInputBorder(),\n                        contentPadding:\n                            const EdgeInsets.symmetric(horizontal: 12),\n                        suffix: IconButton(\n                            onPressed: () => handleAddSource(url),\n                            icon: const Icon(Icons.check))),\n                    onChanged: (value) {\n                      url = value;\n                    },\n                    onSubmitted: handleAddSource)\n                .paddingHorizontal(16)\n                .paddingBottom(32),\n            Row(\n              children: [\n                TextButton(onPressed: chooseFile, child: Text(\"选择文件\".tl))\n                    .paddingLeft(8),\n                const Spacer(),\n                TextButton(\n                    onPressed: () {\n                      showPopUpWidget(\n                          context, _ComicSourceList(handleAddSource));\n                    },\n                    child: Text(\"浏览列表\".tl)),\n                const Spacer(),\n                TextButton(onPressed: help, child: Text(\"查看帮助\".tl))\n                    .paddingRight(8),\n              ],\n            ),\n            const SizedBox(height: 8),\n          ],\n        ),\n      ),\n    ).paddingHorizontal(12);\n  }\n\n  void chooseFile() async {\n    const XTypeGroup typeGroup = XTypeGroup(\n      extensions: <String>['js'],\n    );\n    final XFile? file =\n        await openFile(acceptedTypeGroups: <XTypeGroup>[typeGroup]);\n    if (file == null) return;\n    try {\n      var fileName = file.name;\n      // file.readAsString 会导致中文乱码\n      var bytes = await file.readAsBytes();\n      var content = utf8.decode(bytes);\n      await addSource(content, fileName);\n    } catch (e) {\n      showToast(message: e.toString());\n    }\n  }\n\n  void help() {\n    launchUrlString(\n        \"https://github.com/wgh136/PicaComic/blob/master/doc/comic_source.md\");\n  }\n\n  Future<void> handleAddSource(String url) async {\n    if (url.isEmpty) {\n      return;\n    }\n    var splits = url.split(\"/\");\n    splits.removeWhere((element) => element == \"\");\n    var fileName = splits.last;\n    bool cancel = false;\n    var controller = showLoadingDialog(App.globalContext!,\n        onCancel: () => cancel = true, barrierDismissible: false);\n    try {\n      var res = await logDio()\n          .get<String>(url, options: Options(responseType: ResponseType.plain));\n      if (cancel) return;\n      controller.close();\n      await addSource(res.data!, fileName);\n    } catch (e) {\n      if (cancel) return;\n      showToast(message: e.toString());\n    }\n  }\n\n  Future<void> addSource(String js, String fileName) async {\n    var comicSource = await ComicSourceParser().createAndParse(js, fileName);\n    ComicSource.sources.add(comicSource);\n    _addAllPagesWithComicSource(comicSource);\n    appdata.updateSettings();\n    MyApp.updater?.call();\n  }\n}\n\nclass _ComicSourceList extends StatefulWidget {\n  const _ComicSourceList(this.onAdd);\n\n  final Future<void> Function(String) onAdd;\n\n  @override\n  State<_ComicSourceList> createState() => _ComicSourceListState();\n}\n\nclass _ComicSourceListState extends State<_ComicSourceList> {\n  bool loading = true;\n  List? json;\n\n  void load() async {\n    var dio = logDio();\n    var res = await dio.get<String>(\n        \"https://raw.githubusercontent.com/wgh136/pica_configs/master/index.json\");\n    if (res.statusCode != 200) {\n      showToast(message: \"网络错误\".tl);\n      return;\n    }\n    setState(() {\n      json = jsonDecode(res.data!);\n      loading = false;\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text(\"漫画源\".tl),\n        actions: const [\n          IconButton(onPressed: App.globalBack, icon: Icon(Icons.close)),\n        ],\n      ),\n      body: buildBody(),\n    );\n  }\n\n  Widget buildBody() {\n    if (loading) {\n      load();\n      return const Center(child: CircularProgressIndicator());\n    } else {\n      var currentKey = ComicSource.sources.map((e) => e.key).toList();\n      return ListView.builder(\n        itemCount: json!.length,\n        itemBuilder: (context, index) {\n          var key = json![index][\"key\"];\n          var action = currentKey.contains(key)\n              ? const Icon(Icons.check)\n              : Tooltip(\n                  message: \"Add\",\n                  child: IconButton(\n                    icon: const Icon(Icons.add),\n                    onPressed: () async {\n                      await widget.onAdd(\n                          \"https://raw.githubusercontent.com/wgh136/pica_configs/master/${json![index][\"fileName\"]}\");\n                      setState(() {});\n                    },\n                  ),\n                );\n\n          return ListTile(\n            title: Text(json![index][\"name\"]),\n            subtitle: Text(json![index][\"version\"]),\n            trailing: action,\n          );\n        },\n      );\n    }\n  }\n}\n\nclass _BuiltInSources extends StatefulWidget {\n  const _BuiltInSources();\n\n  @override\n  State<_BuiltInSources> createState() => _BuiltInSourcesState();\n}\n\nclass _BuiltInSourcesState extends State<_BuiltInSources> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        const Divider(),\n        ListTile(\n          title: Text(\"内置漫画源\".tl),\n        ),\n        for(int index = 0; index < builtInSources.length; index++)\n          buildTile(index),\n        const Divider(),\n      ],\n    );\n  }\n\n  bool isLoading = false;\n\n  Widget buildTile(int index) {\n    var key = builtInSources[index];\n    return ListTile(\n      title: Text(\n          ComicSource.builtIn.firstWhere((e) => e.key == key).name),\n      trailing: Switch(\n        value: appdata.appSettings.isComicSourceEnabled(key),\n        onChanged: (v) async {\n          if (isLoading) return;\n          isLoading = true;\n          appdata.appSettings.setComicSourceEnabled(key, v);\n          await appdata.updateSettings();\n          if(!v) {\n            ComicSource.sources.removeWhere((e) => e.key == key);\n            _validatePages();\n          } else {\n            var source = ComicSource.builtIn.firstWhere((e) => e.key == key);\n            ComicSource.sources.add(source);\n            source.loadData();\n            _addAllPagesWithComicSource(source);\n          }\n          isLoading = false;\n          if (mounted) {\n            setState(() {});\n            context.findAncestorStateOfType<_ComicSourceSettingsState>()\n                ?.setState(() {});\n          }\n        },\n      ),\n    );\n  }\n}\n\nvoid _validatePages() {\n  var explorePages = appdata.appSettings.explorePages;\n  var categoryPages = appdata.appSettings.categoryPages;\n  var networkFavorites = appdata.appSettings.networkFavorites;\n\n  var totalExplorePages = ComicSource.sources\n      .map((e) => e.explorePages.map((e) => e.title))\n      .expand((element) => element)\n      .toList();\n  var totalCategoryPages = ComicSource.sources\n      .map((e) => e.categoryData?.key)\n      .where((element) => element != null)\n      .map((e) => e!)\n      .toList();\n  var totalNetworkFavorites = ComicSource.sources\n      .map((e) => e.favoriteData?.key)\n      .where((element) => element != null)\n      .map((e) => e!)\n      .toList();\n\n  for (var page in List.from(explorePages)) {\n    if (!totalExplorePages.contains(page)) {\n      explorePages.remove(page);\n    }\n  }\n  for (var page in List.from(categoryPages)) {\n    if (!totalCategoryPages.contains(page)) {\n      categoryPages.remove(page);\n    }\n  }\n  for (var page in List.from(networkFavorites)) {\n    if (!totalNetworkFavorites.contains(page)) {\n      networkFavorites.remove(page);\n    }\n  }\n\n  appdata.appSettings.explorePages = explorePages;\n  appdata.appSettings.categoryPages = categoryPages;\n  appdata.appSettings.networkFavorites = networkFavorites;\n\n  appdata.updateSettings();\n}\n\nvoid _addAllPagesWithComicSource(ComicSource source) {\n  var explorePages = appdata.appSettings.explorePages;\n  var categoryPages = appdata.appSettings.categoryPages;\n  var networkFavorites = appdata.appSettings.networkFavorites;\n\n  if (source.explorePages.isNotEmpty) {\n    for (var page in source.explorePages) {\n      if (!explorePages.contains(page.title)) {\n        explorePages.add(page.title);\n      }\n    }\n  }\n  if (source.categoryData != null &&\n      !categoryPages.contains(source.categoryData!.key)) {\n    categoryPages.add(source.categoryData!.key);\n  }\n  if (source.favoriteData != null &&\n      !networkFavorites.contains(source.favoriteData!.key)) {\n    networkFavorites.add(source.favoriteData!.key);\n  }\n\n  appdata.appSettings.explorePages = explorePages.toSet().toList();\n  appdata.appSettings.categoryPages = categoryPages.toSet().toList();\n  appdata.appSettings.networkFavorites = networkFavorites.toSet().toList();\n\n  appdata.updateSettings();\n}"
  },
  {
    "path": "lib/pages/settings/components.dart",
    "content": "part of pica_settings;\n\nclass SwitchSetting extends StatefulWidget {\n  const SwitchSetting(\n      {required this.title,\n      this.subTitle,\n      required this.icon,\n      required this.settingsIndex,\n      super.key});\n\n  final String title;\n\n  final String? subTitle;\n\n  final Widget icon;\n\n  final int settingsIndex;\n\n  @override\n  State<SwitchSetting> createState() => _SwitchSettingState();\n}\n\nclass _SwitchSettingState extends State<SwitchSetting> {\n  @override\n  Widget build(BuildContext context) {\n    return ListTile(\n      title: Text(widget.title),\n      subtitle: widget.subTitle == null ? null : Text(widget.subTitle!),\n      leading: widget.icon,\n      trailing: Switch(\n        value: appdata.settings[widget.settingsIndex] == '1',\n        onChanged: (value) {\n          setState(() {\n            appdata.settings[widget.settingsIndex] = value ? '1' : '0';\n            appdata.updateSettings();\n          });\n        },\n      ),\n    );\n  }\n}\n\nclass SettingsTitle extends StatelessWidget {\n  const SettingsTitle(this.text, {super.key});\n\n  final String text;\n\n  @override\n  Widget build(BuildContext context) {\n    return ListTile(\n      title: Text(text),\n    );\n  }\n}\n\nclass NewPageSetting extends StatelessWidget {\n  const NewPageSetting(\n      {required this.title,\n      required this.onTap,\n      required this.icon,\n      super.key});\n\n  final String title;\n\n  final VoidCallback onTap;\n\n  final Widget icon;\n\n  @override\n  Widget build(BuildContext context) {\n    return ListTile(\n      leading: icon,\n      title: Text(title),\n      onTap: onTap,\n      trailing: const Icon(Icons.arrow_right),\n    );\n  }\n}\n\nclass SelectSettingWithAppdata extends StatelessWidget {\n  const SelectSettingWithAppdata({\n    super.key,\n    required this.icon,\n    required this.title,\n    required this.settingsIndex,\n    required this.options,\n    this.onChanged,\n  });\n\n  final Widget icon;\n\n  final String title;\n\n  final int settingsIndex;\n\n  final List<String> options;\n\n  final void Function()? onChanged;\n\n  @override\n  Widget build(BuildContext context) {\n    return SelectSetting(\n      leading: icon,\n      title: title,\n      values: options,\n      onChanged: (i) {\n        appdata.settings[settingsIndex] = i.toString();\n        appdata.updateSettings();\n        onChanged?.call();\n      },\n      initialValue: int.parse(appdata.settings[settingsIndex]),\n    );\n  }\n}\n\nclass SelectSetting extends StatelessWidget {\n  const SelectSetting({\n    super.key,\n    required this.leading,\n    required this.title,\n    required this.values,\n    required this.onChanged,\n    required this.initialValue,\n  });\n\n  final Widget leading;\n\n  final String title;\n\n  final List<String> values;\n\n  final void Function(int i) onChanged;\n\n  final int initialValue;\n\n  @override\n  Widget build(BuildContext context) {\n    return LayoutBuilder(\n      builder: (context, constrains) {\n        bool small = constrains.maxWidth < 400;\n        if (small) {\n          return _SelectTile(\n            icon: leading,\n            title: title,\n            options: values,\n            onChange: onChanged,\n            initialValue: initialValue,\n          );\n        }\n        return ListTile(\n          leading: leading,\n          title: Text(title),\n          trailing: Select(\n            width: 136,\n            initialValue: initialValue,\n            onChange: onChanged,\n            values: values,\n          ),\n        );\n      },\n    );\n  }\n}\n\nclass _SelectTile extends StatefulWidget {\n  const _SelectTile({\n    required this.icon,\n    required this.title,\n    required this.initialValue,\n    required this.options,\n    this.onChange,\n  });\n\n  final Widget icon;\n\n  final String title;\n\n  final int initialValue;\n\n  final List<String> options;\n\n  final void Function(int i)? onChange;\n\n  @override\n  State<_SelectTile> createState() => _SelectTileState();\n}\n\nclass _SelectTileState extends State<_SelectTile> {\n  var value = -1;\n\n  @override\n  void initState() {\n    value = widget.initialValue;\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ListTile(\n      leading: widget.icon,\n      title: Text(widget.title),\n      subtitle: Text(value == -1 ? \"无\".tl : widget.options[value]),\n      onTap: showOptions,\n      trailing: const Icon(Icons.arrow_drop_down),\n    );\n  }\n\n  void showOptions() {\n    final renderBox = context.findRenderObject() as RenderBox;\n    var offset = renderBox.localToGlobal(Offset.zero);\n    showMenu<int>(\n      context: App.globalContext!,\n      initialValue: value == -1 ? null : value,\n      position: RelativeRect.fromLTRB(\n        offset.dx + renderBox.size.width,\n        offset.dy,\n        offset.dx + renderBox.size.width,\n        offset.dy,\n      ),\n      color: context.colorScheme.surfaceContainerLowest,\n      items: [\n        for (int i = 0; i < widget.options.length; i++)\n          PopupMenuItem(\n            value: i,\n            height: 42,\n            onTap: () {\n              setState(() {\n                value = i;\n              });\n              widget.onChange?.call(i);\n            },\n            child: Text(widget.options[i]),\n          )\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/eh_settings.dart",
    "content": "part of pica_settings;\n\nclass EhSettings extends StatefulWidget {\n  const EhSettings(this.popUp, {Key? key}) : super(key: key);\n  final bool popUp;\n\n  @override\n  State<EhSettings> createState() => _EhSettingsState();\n}\n\nclass _EhSettingsState extends State<EhSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        const ListTile(\n          title: Text(\"E-Hentai\"),\n        ),\n        ListTile(\n          leading: const Icon(Icons.domain),\n          title: Text(\"画廊站点\".tl),\n          trailing: Select(\n            initialValue: int.parse(appdata.settings[20]),\n            width: 150,\n            values: const [\n              \"e-hentai.org\",\n              \"exhentai.org\",\n            ],\n            onChange: (i) {\n              appdata.settings[20] = i.toString();\n              appdata.updateSettings();\n            },\n          ),\n          //onTap: () => setEhDomain(context),\n        ),\n        ListTile(\n          leading: const Icon(Icons.image),\n          title: Text(\"优先加载原图\".tl),\n          subtitle: Text(\"可能导致加载失败\".tl),\n          trailing: Switch(\n            value: appdata.settings[29] == \"1\",\n            onChanged: (b) {\n              setState(() {\n                appdata.settings[29] = b ? \"1\" : \"0\";\n              });\n              appdata.updateSettings();\n            },\n          ),\n        ),\n        ListTile(\n          leading: const Icon(Icons.notifications_off_outlined),\n          title: Text(\"忽略警告\".tl),\n          trailing: Switch(\n            value: appdata.settings[47] == \"1\",\n            onChanged: (b) {\n              setState(() {\n                appdata.settings[47] = b ? \"1\" : \"0\";\n              });\n              appdata.updateSettings();\n            },\n          ),\n        ),\n        ListTile(\n          leading: const Icon(Icons.notes),\n          title: Text(\"优先显示副标题\".tl),\n          subtitle: Text(\"适用于已下载的画廊\".tl),\n          trailing: Switch(\n            value: appdata.settings[78] == \"1\",\n            onChanged: (b) {\n              setState(() {\n                appdata.settings[78] = b ? \"1\" : \"0\";\n              });\n              appdata.updateSettings();\n            },\n          ),\n        ),\n        ListTile(\n          leading: const Icon(Icons.request_page_rounded),\n          title: Text(\"配置文件\".tl),\n          trailing: const Icon(Icons.chevron_right),\n          onTap: () => App.to(context, () => const EhProfileSelectPage()),\n        )\n      ],\n    );\n  }\n}\n\nclass EhProfileSelectPage extends StatefulWidget {\n  const EhProfileSelectPage({super.key});\n\n  @override\n  State<EhProfileSelectPage> createState() => _EhProfileSelectPageState();\n}\n\nclass _EhProfileSelectPageState extends State<EhProfileSelectPage> {\n  bool loading = true;\n\n  Map<String, String>? profiles;\n\n  String? error;\n\n  void loadData() async {\n    var res = await EhNetwork().getProfiles();\n    loading = false;\n    if (res.error) {\n      setState(() {\n        error = res.errorMessageWithoutNull;\n      });\n    } else {\n      setState(() {\n        profiles = res.data;\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (loading) {\n      loadData();\n    }\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"Profile\"),\n      ),\n      body: loading\n          ? const Center(\n              child: CircularProgressIndicator(),\n            )\n          : error != null\n              ? Center(child: Text(error!))\n              : profiles == null\n                  ? const Center(child: Text(\"Unknown Error\"))\n                  : buildBody(),\n    );\n  }\n\n  Widget buildBody(){\n    profiles?[\"\"] = \"Do not modify\";\n    var keys = profiles?.keys.toList();\n    if(keys != null){\n      keys.sort();\n    }\n    return ListView.builder(\n      itemCount: profiles!.length,\n      itemBuilder: (context, index) {\n        var key = keys!.elementAt(index);\n        var value = profiles![key]!;\n        return RadioListTile<String>(\n          title: Text(value),\n          value: key,\n          groupValue: appdata.settings[75],\n          onChanged: (value) async {\n            setState(() {\n              appdata.settings[75] = key;\n            });\n            appdata.updateSettings();\n          },\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/explore_settings.dart",
    "content": "part of pica_settings;\n\nWidget buildExploreSettings(BuildContext context, bool popUp) {\n  var searchSource = <String>[];\n  for(var source in ComicSource.sources){\n    searchSource.add(source.key);\n  }\n\n  return Column(\n    children: [\n      SettingsTitle(\"显示\".tl),\n      NewPageSetting(\n        title: \"关键词屏蔽\".tl,\n        onTap: () => showPopUpWidget(context,\n            BlockingKeywordPage(popUp: MediaQuery.of(context).size.width>600,)),\n        icon: const Icon(Icons.block)\n      ),\n      SelectSettingWithAppdata(\n        icon: const Icon(Icons.article_outlined),\n        title: \"初始页面\".tl,\n        options: [\"我\".tl, \"收藏\".tl, \"探索\".tl, \"分类\".tl],\n        settingsIndex: 23,\n      ),\n      NewPageSetting(\n          title: \"探索页面\".tl,\n          onTap: () => setExplorePages(context),\n          icon:  const Icon(Icons.pages)\n      ),\n      NewPageSetting(\n          title: \"分类页面\".tl,\n          onTap: () => showPopUpWidget(App.globalContext!,\n              MultiPagesFilter(\"分类页面\".tl, 67, categoryPages())),\n          icon:  const Icon(Icons.account_tree)\n      ),\n      NewPageSetting(\n          title: \"网络收藏页面\".tl,\n          onTap: () => showPopUpWidget(App.globalContext!,\n              MultiPagesFilter(\"网络收藏页面\".tl, 68, networkFavorites())),\n          icon: const Icon(Icons.favorite),\n      ),\n      SelectSettingWithAppdata(\n        icon: const Icon(Icons.list),\n        title: \"漫画列表显示方式\".tl,\n        options: [\"连续模式\".tl, \"分页模式\".tl],\n        settingsIndex: 25,\n      ),\n      SwitchSetting(\n        title: \"完全隐藏屏蔽的作品\".tl,\n        settingsIndex: 83,\n        icon: const Icon(Icons.visibility_off),\n      ),\n      SettingsTitle(\"工具\".tl),\n      SwitchSetting(\n        title: \"检查剪切板中的链接\".tl,\n        settingsIndex: 61,\n        icon: const Icon(Icons.image),\n      ),\n      SelectSetting(\n        leading: const Icon(Icons.search),\n        title: \"默认搜索源\".tl,\n        values: searchSource,\n        initialValue: searchSource.indexOf(appdata.appSettings.initialSearchTarget),\n        onChanged: (i) {\n          appdata.appSettings.initialSearchTarget = searchSource[i];\n          appdata.updateSettings();\n        },\n      ),\n      SwitchSetting(\n        title: \"启用侧边翻页栏\".tl,\n        icon: const Icon(Icons.border_right),\n        settingsIndex: 64,\n      ),\n      SelectSettingWithAppdata(\n        title: \"自动添加语言筛选\".tl,\n        settingsIndex: 69,\n        options: [\"无\".tl, \"chinese\", \"english\", \"japanese\"],\n        icon: const Icon(Icons.language),\n      ),\n      SettingsTitle(\"漫画块\".tl),\n      SelectSetting(\n        leading: const Icon(Icons.crop_square),\n        title: \"漫画块显示模式\".tl,\n        initialValue: int.parse(appdata.settings[44].split(',').first),\n        onChanged: (i) {\n          var settings = appdata.settings[44].split(',');\n          settings[0] = i.toString();\n          if(settings.length == 1){\n            settings.add(\"1.0\");\n          }\n          appdata.settings[44] = settings.join(',');\n          appdata.updateSettings();\n          MyApp.updater?.call();\n        },\n        values: [\"详细\".tl, \"简略\".tl],\n      ),\n      StatefulBuilder(builder: (context, setState){\n        return Padding(\n          padding: const EdgeInsets.symmetric(vertical: 8),\n          child: SizedBox(\n            width: double.infinity,\n            height: 64,\n            child: Row(\n              children: [\n                const SizedBox(width: 16,),\n                const Icon(Icons.crop_free),\n                Expanded(\n                  child: Stack(\n                    children: [\n                      Positioned(\n                        top: 0,\n                        left: 12,\n                        right: 0,\n                        child: Text(\"漫画块大小\".tl, style: const TextStyle(\n                            fontSize: 16\n                        ),),\n                      ),\n                      Positioned(\n                        left: -8,\n                        right: 0,\n                        bottom: 0,\n                        child: Slider(\n                          max: 1.25,\n                          min: 0.75,\n                          divisions: 10,\n                          value: double.parse(appdata.settings[44].split(',').elementAtOrNull(1) ?? \"1.00\"),\n                          overlayColor: WidgetStateColor.resolveWith(\n                                  (states) => Colors.transparent),\n                          onChangeEnd: (v){\n                            appdata.updateSettings();\n                          },\n                          onChanged: (v) {\n                            var settings = appdata.settings[44].split(',');\n                            if(settings.length == 1){\n                              settings.add(v.toStringAsFixed(2));\n                            } else {\n                              settings[1] = v.toStringAsFixed(2);\n                            }\n                            setState((){\n                              appdata.settings[44] = settings.join(',');\n                            });\n                          },\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                Text(appdata.settings[44].split(',').elementAtOrNull(1) ?? \"1.00\"),\n                const SizedBox(width: 32,),\n              ],\n            ),\n          ),\n        );\n      }),\n      SelectSettingWithAppdata(\n        title: \"漫画块缩略图布局\".tl,\n        settingsIndex: 66,\n        options: [\"覆盖\".tl, \"容纳\".tl],\n        icon: const Icon(Icons.image),\n      ),\n      SwitchSetting(\n        title: \"显示收藏状态\".tl,\n        settingsIndex: 72,\n        icon: const Icon(Icons.bookmark),\n      ),\n      SwitchSetting(\n        title: \"显示阅读位置\".tl,\n        settingsIndex: 73,\n        icon: const Icon(Icons.history_toggle_off),\n      ),\n      StatefulBuilder(builder: (context, setState){\n        return Padding(\n          padding: const EdgeInsets.symmetric(vertical: 8),\n          child: SizedBox(\n            width: double.infinity,\n            height: 64,\n            child: Row(\n              children: [\n                const SizedBox(width: 16,),\n                const Icon(Icons.crop_free),\n                Expanded(\n                  child: Stack(\n                    children: [\n                      Positioned(\n                        top: 0,\n                        left: 12,\n                        right: 0,\n                        child: Text(\"图片收藏大小\".tl, style: const TextStyle(\n                            fontSize: 16\n                        ),),\n                      ),\n                      Positioned(\n                        left: -8,\n                        right: 0,\n                        bottom: 0,\n                        child: Slider(\n                          max: 1.25,\n                          min: 0.75,\n                          divisions: 10,\n                          value: double.parse(appdata.settings[74]),\n                          overlayColor: WidgetStateColor.resolveWith(\n                                  (states) => Colors.transparent),\n                          onChangeEnd: (v){\n                            appdata.updateSettings();\n                          },\n                          onChanged: (v) {\n                            setState((){\n                              appdata.settings[74] = v.toStringAsFixed(2);\n                            });\n                          },\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                Text(appdata.settings[74]),\n                const SizedBox(width: 32,),\n              ],\n            ),\n          ),\n        );\n      }),\n      Padding(padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom))\n    ],\n  );\n}\n\nMap<String, String> categoryPages(){\n  return {\n    for(var source in ComicSource.sources)\n      if(source.categoryData != null)\n        source.categoryData!.key: source.categoryData!.title\n  };\n}\n\nMap<String, String> networkFavorites(){\n  return {\n    for(var source in ComicSource.sources)\n      if(source.favoriteData != null)\n        source.key: source.favoriteData!.title\n  };\n}"
  },
  {
    "path": "lib/pages/settings/ht_settings.dart",
    "content": "part of pica_settings;\n\nclass HtSettings extends StatefulWidget {\n  const HtSettings(this.popUp, {super.key});\n\n  final bool popUp;\n\n  @override\n  State<HtSettings> createState() => _HtSettingsState();\n}\n\nclass _HtSettingsState extends State<HtSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        ListTile(\n          title: Text(\"绅士漫画\".tl),\n        ),\n        ListTile(\n          leading: const Icon(Icons.domain_rounded),\n          title: Text(\"Domain: ${appdata.settings[31].replaceFirst(\"https://\", \"\")}\"),\n          trailing: IconButton(onPressed: () => changeDomain(context), icon: const Icon(Icons.edit)),\n        )\n      ],\n    );\n  }\n\n  void changeDomain(BuildContext context){\n    var controller = TextEditingController();\n\n    void onFinished() {\n      var text = controller.text;\n      if(!text.contains(\"https://\")){\n        text = \"https://$text\";\n      }\n      App.globalBack();\n      if(!text.isURL){\n        showToast(message: \"Invalid URL\");\n      }else {\n        appdata.settings[31] = text;\n        appdata.updateSettings();\n        setState(() {});\n      }\n    }\n\n    showDialog(context: context, builder: (context){\n      return SimpleDialog(\n        title: const Text(\"Change Domain\"),\n        children: [\n          Container(\n            padding: const EdgeInsets.fromLTRB(16, 8, 16, 24),\n            width: 400,\n            child: TextField(\n              decoration: const InputDecoration(\n                border: OutlineInputBorder(),\n                label: Text(\"Domain\")\n              ),\n              controller: controller,\n              onEditingComplete: onFinished,\n            ),\n          ),\n          Row(\n            mainAxisAlignment: MainAxisAlignment.end,\n            children: [\n              TextButton(onPressed: onFinished, child: Text(\"完成\".tl)),\n              const SizedBox(width: 16,),\n            ],\n          )\n        ],\n      );\n    });\n  }\n}"
  },
  {
    "path": "lib/pages/settings/jm_settings.dart",
    "content": "part of pica_settings;\n\nclass SetJmComicsOrderController extends StateController{\n  int settingsOrder;\n  SetJmComicsOrderController(this.settingsOrder);\n  late String value = appdata.settings[settingsOrder];\n\n  void set(String v){\n    value = v;\n    appdata.settings[settingsOrder] = v;\n    appdata.writeData();\n    App.globalBack();\n  }\n}\n\n\nclass JmSettings extends StatefulWidget {\n  const JmSettings(this.popUp, {Key? key}) : super(key: key);\n  final bool popUp;\n\n  @override\n  State<JmSettings> createState() => _JmSettingsState();\n}\n\nclass _JmSettingsState extends State<JmSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        ListTile(\n          title: Text(\"禁漫天堂\".tl),\n        ),\n        ListTile(\n          leading: const Icon(Icons.favorite_border),\n          title: Text(\"收藏夹中漫画排序模式\".tl),\n          trailing: Select(\n            initialValue: int.parse(appdata.settings[42]),\n            values: [\n              \"最新收藏\".tl, \"最新更新\".tl\n            ],\n            onChange: (i){\n              appdata.settings[42] = i.toString();\n              appdata.updateSettings();\n            },\n          ),\n        ),\n        SelectSettingWithAppdata(\n          icon: const Icon(Icons.domain),\n          settingsIndex: 17,\n          title: \"Api Domain\",\n          options: [\"分流1\".tl, \"分流2\".tl, \"分流3\".tl, \"分流4\".tl],\n          onChanged: () => JmNetwork().loginFromAppdata(),\n        ),\n        ListTile(\n          leading: const Icon(Icons.image),\n          title: Text(\"图片分流\".tl),\n          trailing: Select(\n            initialValue: int.parse(appdata.settings[37]),\n            values: [\n              \"分流1\".tl,\"分流2\".tl,\"分流3\".tl,\"分流4\".tl, \"分流5\".tl, \"分流6\".tl\n            ],\n            onChange: (i){\n              appdata.settings[37] = i.toString();\n              appdata.updateSettings();\n            },\n          ),\n        ),\n      ],\n    );\n  }\n\n  void changeDomain(BuildContext context){\n    var controller = TextEditingController();\n\n    void onFinished() {\n      var text = controller.text;\n      if(!text.contains(\"https://\")){\n        text = \"https://$text\";\n      }\n      App.globalBack();\n      if(!text.isURL){\n        showToast(message: \"Invalid URL\");\n      }else {\n        appdata.settings[56] = text;\n        appdata.updateSettings();\n        setState(() {});\n        JmNetwork().loginFromAppdata();\n      }\n    }\n\n    showDialog(context: context, builder: (context){\n      return SimpleDialog(\n        title: const Text(\"Change Domain\"),\n        children: [\n          Container(\n            padding: const EdgeInsets.fromLTRB(16, 8, 16, 24),\n            width: 400,\n            child: TextField(\n              decoration: const InputDecoration(\n                  border: OutlineInputBorder(),\n                  label: Text(\"Domain\")\n              ),\n              controller: controller,\n              onEditingComplete: onFinished,\n            ),\n          ),\n          Row(\n            mainAxisAlignment: MainAxisAlignment.end,\n            children: [\n              TextButton(onPressed: onFinished, child: Text(\"完成\".tl)),\n              const SizedBox(width: 16,),\n            ],\n          )\n        ],\n      );\n    });\n  }\n}"
  },
  {
    "path": "lib/pages/settings/local_favorite_settings.dart",
    "content": "part of pica_settings;\n\nclass LocalFavoritesSettings extends StatefulWidget {\n  const LocalFavoritesSettings({super.key});\n\n  @override\n  State<LocalFavoritesSettings> createState() => _LocalFavoritesSettingsState();\n}\n\nclass _LocalFavoritesSettingsState extends State<LocalFavoritesSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        ListTile(\n          leading: const Icon(Icons.book),\n          title: Text(\"快速收藏\".tl),\n          subtitle: Text(\"长按收藏按钮执行快速收藏\".tl),\n          trailing: Select(\n            initialValue: LocalFavoritesManager()\n                .folderNames\n                .indexOf(appdata.settings[51]),\n            onChange: (i) {\n              appdata.settings[51] =\n              LocalFavoritesManager().folderNames[i];\n              appdata.updateSettings();\n            },\n            values: LocalFavoritesManager().folderNames,\n          ),\n        ),\n        SelectSettingWithAppdata(\n          icon: const Icon(Icons.bookmark_add),\n          title: \"新收藏添加至\".tl,\n          options: [\"最后\".tl, \"最前\".tl],\n          settingsIndex: 53,\n        ),\n        SelectSettingWithAppdata(\n          icon: const Icon(Icons.move_up),\n          title: \"阅读后移动本地收藏至\".tl,\n          options: [\"无操作\".tl, \"最后\".tl, \"最前\".tl],\n          settingsIndex: 54,\n        ),\n        SelectSettingWithAppdata(\n          icon: const Icon(Icons.touch_app),\n          title: \"点击漫画时\".tl,\n          options: [\"查看信息\".tl, \"阅读\".tl],\n          settingsIndex: 60,\n        ),\n        ListTile(\n          leading: const Icon(Icons.sync),\n          title: Text(\"下拉更新拉取页数\".tl),\n          trailing: Select(\n            initialValue: [\"1\", \"2\", \"3\", \"4\", \"5\", \"10\", \"99\"]\n                .indexOf(appdata.settings[71]),\n            values: const [\"1\", \"2\", \"3\", \"4\", \"5\", \"10\", \"99\"],\n            onChange: (i) {\n              appdata.settings[71] = [\"1\", \"2\", \"3\", \"4\", \"5\", \"10\", \"99\"][i];\n              appdata.updateSettings();\n            },\n            width: 140,\n          ),\n        ),\n        Padding(\n            padding:\n                EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom))\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/multi_pages_filter.dart",
    "content": "part of pica_settings;\n\nclass MultiPagesFilter extends StatefulWidget {\n  const MultiPagesFilter(this.title, this.settingsIndex, this.pages,\n      {super.key});\n\n  final String title;\n\n  final int settingsIndex;\n\n  // key - showName\n  final Map<String, String> pages;\n\n  @override\n  State<MultiPagesFilter> createState() => _MultiPagesFilterState();\n}\n\nclass _MultiPagesFilterState extends State<MultiPagesFilter> {\n  late List<String> keys;\n\n  @override\n  void initState() {\n    keys = appdata.settings[widget.settingsIndex].split(\",\");\n    keys.remove(\"\");\n    super.initState();\n  }\n\n  var reorderWidgetKey = UniqueKey();\n  var scrollController = ScrollController();\n  final _key = GlobalKey();\n\n  @override\n  Widget build(BuildContext context) {\n    var tiles = keys.map((e) => buildItem(e)).toList();\n\n    var view = ReorderableBuilder(\n      key: reorderWidgetKey,\n      scrollController: scrollController,\n      longPressDelay: App.isDesktop\n          ? const Duration(milliseconds: 100)\n          : const Duration(milliseconds: 500),\n      dragChildBoxDecoration: BoxDecoration(\n        color: Theme.of(context).colorScheme.surfaceContainer,\n        boxShadow: const [\n          BoxShadow(\n              color: Colors.black12,\n              blurRadius: 5,\n              offset: Offset(0, 2),\n              spreadRadius: 2)\n        ],\n      ),\n      onReorder: (reorderFunc) {\n        setState(() {\n          keys = List.from(reorderFunc(keys));\n        });\n        updateSetting();\n      },\n      children: tiles,\n      builder: (children) {\n        return GridView(\n          key: _key,\n          controller: scrollController,\n          gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(\n            crossAxisCount: 1,\n            mainAxisExtent: 48,\n          ),\n          children: children,\n        );\n      },\n    );\n\n    return PopUpWidgetScaffold(\n      title: widget.title,\n      tailing: [\n        if (keys.length < widget.pages.length)\n          IconButton(onPressed: showAddDialog, icon: const Icon(Icons.add))\n      ],\n      body: view,\n    );\n  }\n\n  Widget buildItem(String key) {\n    Widget removeButton = Padding(\n      padding: const EdgeInsets.only(right: 8),\n      child: IconButton(\n          onPressed: () {\n            setState(() {\n              keys.remove(key);\n            });\n            updateSetting();\n          },\n          icon: const Icon(Icons.delete)),\n    );\n\n    return ListTile(\n      title: Text(widget.pages[key] ?? \"(Invalid) $key\"),\n      key: Key(key),\n      trailing: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          removeButton,\n          const Icon(Icons.drag_handle),\n        ],\n      ),\n    );\n  }\n\n  void showAddDialog() {\n    var canAdd = <String, String>{};\n    widget.pages.forEach((key, value) {\n      if (!keys.contains(key)) {\n        canAdd[key] = value;\n      }\n    });\n    showDialog(\n        context: context,\n        builder: (context) {\n          return SimpleDialog(\n            title: const Text(\"Add\"),\n            children: canAdd.entries\n                .map((e) => InkWell(\n                      child: ListTile(title: Text(e.value), key: Key(e.key)),\n                      onTap: () {\n                        App.back(context);\n                        setState(() {\n                          keys.add(e.key);\n                        });\n                        updateSetting();\n                      },\n                    ))\n                .toList(),\n          );\n        });\n  }\n\n  void updateSetting() {\n    appdata.settings[widget.settingsIndex] = keys.join(\",\");\n    appdata.updateSettings();\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/network_setting.dart",
    "content": "part of pica_settings;\n\nclass NetworkSettings extends StatefulWidget {\n  const NetworkSettings({super.key});\n\n  @override\n  State<NetworkSettings> createState() => _NetworkSettingsState();\n}\n\nclass _NetworkSettingsState extends State<NetworkSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        const ListTile(\n          title: Text(\"Http Proxy\"),\n        ),\n        ListTile(\n          leading: const Icon(Icons.network_ping),\n          title: Text(\"设置代理\".tl),\n          trailing: const Icon(\n            Icons.arrow_right,\n          ),\n          onTap: () {\n            setProxy(context);\n          },\n        ),\n        const ListTile(\n          title: Text(\"hosts\"),\n        ),\n        ListTile(\n          leading: const Icon(Icons.dns),\n          title: Text(\"启用\".tl),\n          trailing: Switch(\n            value: appdata.settings[58] == \"1\",\n            onChanged: (value){\n              setState(() {\n                appdata.settings[58] = value ? \"1\" : \"0\";\n              });\n              appdata.updateSettings();\n              if(value){\n                HttpProxyServer.reload();\n              }\n            },\n          ),\n        ),\n        ListTile(\n          leading: const Icon(Icons.rule),\n          title: Text(\"规则\".tl),\n          trailing: const Icon(Icons.arrow_right),\n          onTap: (){\n            App.globalTo(() => const EditRuleView());\n          },\n        ),\n        ListTile(\n          leading: const Icon(Icons.help),\n          title: Text(\"帮助\".tl),\n          trailing: const Icon(Icons.arrow_right),\n          onTap: (){\n            launchUrlString(\"https://github.com/wgh136/PicaComic/blob/master/doc/hosts.md\");\n          },\n        ),\n        Padding(padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom))\n      ],\n    );\n  }\n}\n\nclass EditRuleView extends StatefulWidget {\n  const EditRuleView({super.key});\n\n  @override\n  State<EditRuleView> createState() => _EditRuleViewState();\n}\n\nclass _EditRuleViewState extends State<EditRuleView> {\n  final file = File(\"${App.dataPath}/rule.json\");\n\n  late TextEditingController controller;\n\n  @override\n  void initState() {\n    HttpProxyServer.createConfigFile();\n    controller = TextEditingController(text: file.readAsStringSync());\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    file.writeAsStringSync(controller.text, mode: FileMode.writeOnly);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"rule.json\"),\n      ),\n      body: SingleChildScrollView(\n        child: Padding(\n          padding: EdgeInsets.fromLTRB(8, 0, 8, MediaQuery.of(context).padding.bottom),\n          child: TextField(\n            keyboardType: TextInputType.multiline,\n            maxLines: null,\n            decoration: const InputDecoration(\n                border: InputBorder.none\n            ),\n            controller: controller,\n          ),\n        )\n      )\n    );\n  }\n}\n\n"
  },
  {
    "path": "lib/pages/settings/picacg_settings.dart",
    "content": "part of pica_settings;\n\nclass PicacgSettings extends StatefulWidget {\n  const PicacgSettings(this.popUp, {Key? key}) : super(key: key);\n  final bool popUp;\n\n  @override\n  State<PicacgSettings> createState() => _PicacgSettingsState();\n}\n\nclass _PicacgSettingsState extends State<PicacgSettings> {\n  bool showFrame = appdata.settings[5] == \"1\";\n  bool punchIn = appdata.settings[6] == \"1\";\n  bool useMyServer = appdata.settings[3] == \"1\";\n\n  static const _imageQualityValues = [\"low\", \"middle\", \"high\", \"original\"];\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        ListTile(\n          title: Text(\"哔咔漫画\".tl),\n        ),\n        ListTile(\n          leading: const Icon(Icons.hub_outlined),\n          title: Text(\"设置分流\".tl),\n          trailing: Select(\n            initialValue: int.parse(picacg.data['appChannel']) - 1,\n            values: [\"分流1\".tl, \"分流2\".tl, \"分流3\".tl],\n            onChange: (i) {\n              picacg.data['appChannel'] = (i + 1).toString();\n              picacg.saveData();\n            },\n          ),\n        ),\n        ListTile(\n          leading: const Icon(Icons.image),\n          title: Text(\"设置图片质量\".tl),\n          trailing: Select(\n            initialValue:\n                _imageQualityValues.indexOf(picacg.data['imageQuality']),\n            values: [\"低\".tl, \"中\".tl, \"高\".tl, \"原图\".tl],\n            onChange: (i) {\n              picacg.data['imageQuality'] = _imageQualityValues[i];\n              picacg.saveData();\n            },\n          ),\n        ),\n        ListTile(\n          leading: const Icon(Icons.manage_search_outlined),\n          trailing: Select(\n            initialValue: appdata.getSearchMode(),\n            values: [\"新到书\".tl, \"旧到新\".tl, \"最多喜欢\".tl, \"最多指名\".tl],\n            onChange: (i) {\n              appdata.setSearchMode(i);\n            },\n          ),\n          title: Text(\"设置搜索及分类排序模式\".tl),\n        ),\n        ListTile(\n          leading: const Icon(Icons.circle_outlined),\n          title: Text(\"显示头像框\".tl),\n          trailing: Switch(\n            value: showFrame,\n            onChanged: (b) {\n              b ? appdata.settings[5] = \"1\" : appdata.settings[5] = \"0\";\n              setState(() {\n                showFrame = b;\n              });\n              appdata.writeData();\n            },\n          ),\n          onTap: () {},\n        ),\n        ListTile(\n          leading: const Icon(Icons.today),\n          title: Text(\"自动打卡\".tl),\n          subtitle:\n              App.isMobile ? Text(\"APP启动或是距离上次打卡间隔一天时执行\".tl) : Text(\"启动时执行\".tl),\n          onTap: () {},\n          trailing: Switch(\n            value: punchIn,\n            onChanged: (b) {\n              b ? appdata.settings[6] = \"1\" : appdata.settings[6] = \"0\";\n              if (App.isMobile) {\n                b ? runBackgroundService() : cancelBackgroundService();\n              }\n              setState(() {\n                punchIn = b;\n              });\n              appdata.writeData();\n            },\n          ),\n        ),\n        ListTile(\n          leading: const Icon(Icons.collections_bookmark_outlined),\n          trailing: Select(\n            initialValue: int.parse(appdata.settings[30]),\n            values: [\"旧到新\".tl, \"新到书\".tl],\n            onChange: (i) {\n              appdata.settings[30] = i.toString();\n              appdata.updateSettings();\n            },\n          ),\n          title: Text(\"收藏夹漫画排序模式\".tl),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/reading_settings.dart",
    "content": "part of pica_settings;\n\nclass ReadingSettings extends StatefulWidget {\n  const ReadingSettings(this.popUp, {super.key});\n\n  final bool popUp;\n\n  @override\n  State<ReadingSettings> createState() => _ReadingSettingsState();\n}\n\nclass _ReadingSettingsState extends State<ReadingSettings> {\n  bool keepScreenOn = appdata.settings[14] == \"1\";\n  bool lowBrightness = appdata.settings[18] == \"1\";\n  bool pageChangeValue = appdata.settings[0] == \"1\";\n  bool showThreeButton = appdata.settings[4] == \"1\";\n  bool useVolumeKeyChangePage = appdata.settings[7] == \"1\";\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        SwitchSetting(\n          title: \"点按翻页\".tl,\n          settingsIndex: 0,\n          icon: const Icon(Icons.touch_app_outlined),\n        ),\n        SwitchSetting(\n          title: \"反转点按翻页\".tl,\n          settingsIndex: 70,\n          icon: const Icon(Icons.touch_app),\n        ),\n        if (App.isAndroid)\n          SwitchSetting(\n            title: \"使用音量键翻页\".tl,\n            settingsIndex: 7,\n            icon: const Icon(Icons.volume_mute),\n          ),\n        SwitchSetting(\n          title: \"宽屏时显示控制按钮\".tl,\n          settingsIndex: 4,\n          icon: const Icon(Icons.control_camera),\n        ),\n        if (App.isAndroid)\n          SwitchSetting(\n            title: \"保持屏幕常亮\".tl,\n            settingsIndex: 14,\n            icon: const Icon(Icons.screenshot_outlined),\n          ),\n        SwitchSetting(\n          title: \"深色模式下降低图片亮度\".tl,\n          settingsIndex: 18,\n          icon: const Icon(Icons.brightness_4),\n        ),\n        SelectSetting(\n          leading: const Icon(Icons.chrome_reader_mode),\n          title: \"选择阅读模式\".tl,\n          initialValue: int.parse(appdata.settings[9]) - 1,\n          values: [\n            \"从左至右\".tl,\n            \"从右至左\".tl,\n            \"从上至下\".tl,\n            \"从上至下(连续)\".tl,\n            \"双页\".tl,\n            \"双页(反向)\".tl\n          ],\n          onChanged: (i) {\n            appdata.settings[9] = (i + 1).toString();\n            appdata.updateSettings();\n          },\n        ),\n        SelectSetting(\n          leading: const Icon(Icons.image_outlined),\n          title: \"图片预加载\".tl,\n          initialValue: [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"10\", \"15\"].indexOf(appdata.settings[28]),\n          values: const [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"10\", \"15\"],\n          onChanged: (i) {\n            appdata.settings[28] = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"10\", \"15\"][i];\n            appdata.updateSettings();\n          },\n        ),\n        ListTile(\n          leading: const Icon(Icons.timer_sharp),\n          subtitle: SizedBox(\n            height: 25,\n            child: Stack(\n              children: [\n                Positioned(\n                    top: 0,\n                    bottom: 0,\n                    left: -20,\n                    right: 0,\n                    child: Slider(\n                      max: 20,\n                      min: 0,\n                      divisions: 20,\n                      value: int.parse(appdata.settings[33]).toDouble(),\n                      overlayColor: WidgetStateColor.resolveWith(\n                          (states) => Colors.transparent),\n                      onChanged: (v) {\n                        if (v == 0) return;\n                        appdata.settings[33] = v.toInt().toString();\n                        appdata.updateSettings();\n                        setState(() {});\n                      },\n                    ))\n              ],\n            ),\n          ),\n          trailing: SizedBox(\n            width: 40,\n            child: Text(\n              \"${appdata.settings[33]}s\",\n              style: const TextStyle(fontSize: 14),\n            ),\n          ),\n          title: Text(\"自动翻页时间间隔\".tl),\n        ),\n        SwitchSetting(\n          title: \"双击缩放\".tl,\n          settingsIndex: 49,\n          icon: const Icon(Icons.zoom_out_map),\n        ),\n        SwitchSetting(\n          title: \"长按缩放\".tl,\n          settingsIndex: 55,\n          icon: const Icon(Icons.zoom_in),\n        ),\n        SwitchSetting(\n          title: \"显示页面信息\".tl,\n          settingsIndex: 57,\n          icon: const Icon(Icons.insert_drive_file_outlined),\n        ),\n        if(App.isAndroid)\n          SwitchSetting(\n            title: \"固定横屏\".tl,\n            settingsIndex: 76,\n            icon: const Icon(Icons.screen_lock_landscape),\n          ),\n        SwitchSetting(\n          title: \"使用深色背景\".tl,\n          settingsIndex: 81,\n          icon: const Icon(Icons.dark_mode),\n        ),\n        Padding(padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom))\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/settings_page.dart",
    "content": "library pica_settings;\n\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:dio/dio.dart';\nimport 'package:file_selector/file_selector.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_displaymode/flutter_displaymode.dart';\nimport 'package:flutter_reorderable_grid_view/widgets/reorderable_builder.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/built_in/picacg.dart';\nimport 'package:pica_comic/foundation/cache_manager.dart';\nimport 'package:pica_comic/foundation/ui_mode.dart';\nimport 'package:pica_comic/main.dart';\nimport 'package:pica_comic/network/app_dio.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/pages/logs_page.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/io_tools.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\nimport '../../comic_source/comic_source.dart';\nimport '../../foundation/app.dart';\nimport '../../foundation/local_favorites.dart';\nimport '../../network/download.dart';\nimport '../../network/eh_network/eh_main_network.dart';\nimport '../../network/http_client.dart';\nimport '../../network/http_proxy.dart';\nimport '../../network/jm_network/jm_network.dart';\nimport '../../network/update.dart';\nimport '../../network/webdav.dart';\nimport '../../tools/background_service.dart';\nimport '../../tools/debug.dart';\nimport '../welcome_page.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\npart \"reading_settings.dart\";\npart \"picacg_settings.dart\";\npart \"network_setting.dart\";\npart \"multi_pages_filter.dart\";\npart \"local_favorite_settings.dart\";\npart \"jm_settings.dart\";\npart \"ht_settings.dart\";\npart \"explore_settings.dart\";\npart \"eh_settings.dart\";\npart \"comic_source_settings.dart\";\npart \"blocking_keyword_page.dart\";\npart \"app_settings.dart\";\npart 'components.dart';\n\nclass SettingsPage extends StatefulWidget {\n  static void open([int initialPage = -1]) {\n    App.globalTo(() => SettingsPage(initialPage: initialPage));\n  }\n\n  const SettingsPage({this.initialPage = -1, super.key});\n\n  final int initialPage;\n\n  @override\n  State<SettingsPage> createState() => _SettingsPageState();\n}\n\nclass _SettingsPageState extends State<SettingsPage> implements PopEntry{\n  int currentPage = -1;\n\n  ColorScheme get colors => Theme.of(context).colorScheme;\n\n  bool get enableTwoViews => !UiMode.m1(context);\n\n  final categories = <String>[\"浏览\", \"漫画源\", \"阅读\", \"外观\", \"本地收藏\", \"APP\", \"网络\", \"关于\"];\n\n  final icons = <IconData>[\n    Icons.explore,\n    Icons.source,\n    Icons.book,\n    Icons.color_lens,\n    Icons.collections_bookmark_rounded,\n    Icons.apps,\n    Icons.public,\n    Icons.info\n  ];\n\n  double offset = 0;\n\n  late final HorizontalDragGestureRecognizer gestureRecognizer;\n\n  ModalRoute? _route;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    final ModalRoute<dynamic>? nextRoute = ModalRoute.of(context);\n    if (nextRoute != _route) {\n      _route?.unregisterPopEntry(this);\n      _route = nextRoute;\n      _route?.registerPopEntry(this);\n    }\n  }\n\n  @override\n  void initState() {\n    currentPage = widget.initialPage;\n    gestureRecognizer = HorizontalDragGestureRecognizer(debugOwner: this)\n      ..onUpdate = ((details) => setState(() => offset += details.delta.dx))\n      ..onEnd = (details) async {\n        if (details.velocity.pixelsPerSecond.dx.abs() > 1 &&\n            details.velocity.pixelsPerSecond.dx >= 0) {\n          setState(() {\n            Future.delayed(const Duration(milliseconds: 300), () => offset = 0);\n            currentPage = -1;\n          });\n        } else if (offset > MediaQuery.of(context).size.width / 2) {\n          setState(() {\n            Future.delayed(const Duration(milliseconds: 300), () => offset = 0);\n            currentPage = -1;\n          });\n        } else {\n          int i = 10;\n          while (offset != 0) {\n            setState(() {\n              offset -= i;\n              i *= 10;\n              if (offset < 0) {\n                offset = 0;\n              }\n            });\n            await Future.delayed(const Duration(milliseconds: 10));\n          }\n        }\n      }\n      ..onCancel = () async {\n        int i = 10;\n        while (offset != 0) {\n          setState(() {\n            offset -= i;\n            i *= 10;\n            if (offset < 0) {\n              offset = 0;\n            }\n          });\n          await Future.delayed(const Duration(milliseconds: 10));\n        }\n      };\n    super.initState();\n  }\n\n  @override\n  dispose() {\n    super.dispose();\n    gestureRecognizer.dispose();\n    App.temporaryDisablePopGesture = false;\n    _route?.unregisterPopEntry(this);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (currentPage != -1 && !enableTwoViews) {\n      canPop.value = false;\n      App.temporaryDisablePopGesture = true;\n    } else {\n      canPop.value = true;\n      App.temporaryDisablePopGesture = false;\n    }\n    return Material(\n      child: buildBody(),\n    );\n  }\n\n  Widget buildBody() {\n    if (enableTwoViews) {\n      return Row(\n        children: [\n          SizedBox(\n            width: 320,\n            height: double.infinity,\n            child: buildLeft(),\n          ),\n          Container(\n            height: double.infinity,\n            decoration: BoxDecoration(\n              border: Border(\n                left: BorderSide(\n                  color: context.colorScheme.outlineVariant,\n                  width: 0.6,\n                ),\n              ),\n            ),\n          ),\n          Expanded(child: buildRight())\n        ],\n      );\n    } else {\n      return Stack(\n        children: [\n          Positioned.fill(child: buildLeft()),\n          Positioned(\n            left: offset,\n            width: MediaQuery.of(context).size.width,\n            height: MediaQuery.of(context).size.height,\n            child: Listener(\n              onPointerDown: handlePointerDown,\n              child: AnimatedSwitcher(\n                duration: const Duration(milliseconds: 300),\n                reverseDuration: const Duration(milliseconds: 300),\n                switchInCurve: Curves.fastOutSlowIn,\n                switchOutCurve: Curves.fastOutSlowIn,\n                transitionBuilder: (child, animation) {\n                  var tween = Tween<Offset>(\n                      begin: const Offset(1, 0), end: const Offset(0, 0));\n\n                  return SlideTransition(\n                    position: tween.animate(animation),\n                    child: child,\n                  );\n                },\n                child: currentPage == -1\n                    ? const SizedBox(\n                        key: Key(\"1\"),\n                      )\n                    : buildRight(),\n              ),\n            ),\n          )\n        ],\n      );\n    }\n  }\n\n  void handlePointerDown(PointerDownEvent event) {\n    if (event.position.dx < 20) {\n      gestureRecognizer.addPointer(event);\n    }\n  }\n\n  Widget buildLeft() {\n    return Material(\n      child: Column(\n        children: [\n          SizedBox(\n            height: MediaQuery.of(context).padding.top,\n          ),\n          SizedBox(\n            height: 56,\n            child: Row(children: [\n              const SizedBox(\n                width: 8,\n              ),\n              Tooltip(\n                message: \"Back\",\n                child: IconButton(\n                  icon: const Icon(Icons.arrow_back),\n                  onPressed: () => App.globalBack(),\n                ),\n              ),\n              const SizedBox(\n                width: 24,\n              ),\n              Text(\n                \"设置\".tl,\n                style: Theme.of(context).textTheme.headlineSmall,\n              )\n            ]),\n          ),\n          const SizedBox(\n            height: 4,\n          ),\n          Expanded(\n            child: buildCategories(),\n          )\n        ],\n      ),\n    );\n  }\n\n  Widget buildCategories() {\n    Widget buildItem(String name, int id) {\n      final bool selected = id == currentPage;\n\n      Widget content = AnimatedContainer(\n        key: ValueKey(id),\n        duration: const Duration(milliseconds: 300),\n        width: double.infinity,\n        height: 48,\n        padding: const EdgeInsets.fromLTRB(16, 0, 16, 0),\n        decoration: BoxDecoration(\n            color: selected ? colors.primaryContainer : null,\n            borderRadius: BorderRadius.circular(16)\n        ),\n        child: Row(children: [\n          Icon(icons[id]),\n          const SizedBox(\n            width: 16,\n          ),\n          Text(\n            name,\n            style: Theme.of(context).textTheme.titleMedium,\n          ),\n          const Spacer(),\n          if (selected) const Icon(Icons.arrow_right)\n        ]),\n      );\n\n      return Padding(\n        padding: enableTwoViews\n            ? const EdgeInsets.fromLTRB(16, 0, 16, 0)\n            : EdgeInsets.zero,\n        child: InkWell(\n          onTap: () => setState(() => currentPage = id),\n          borderRadius: BorderRadius.circular(16),\n          child: content,\n        ).paddingVertical(4),\n      );\n    }\n\n    return ListView.builder(\n      padding: EdgeInsets.zero,\n      itemCount: categories.length,\n      itemBuilder: (context, index) => buildItem(categories[index].tl, index),\n    );\n  }\n\n  Widget buildReadingSettings() {\n    return const Placeholder();\n  }\n\n  Widget buildAppearanceSettings() => Column(\n        children: [\n          ListTile(\n            leading: const Icon(Icons.color_lens),\n            title: Text(\"主题选择\".tl),\n            trailing: Select(\n              initialValue: int.parse(appdata.settings[27]),\n              values: const [\n                \"dynamic\",\n                \"red\",\n                \"pink\",\n                \"purple\",\n                \"indigo\",\n                \"blue\",\n                \"cyan\",\n                \"teal\",\n                \"green\",\n                \"lime\",\n                \"yellow\",\n                \"amber\",\n                \"orange\",\n              ],\n              onChange: (i) {\n                appdata.settings[27] = i.toString();\n                appdata.updateSettings();\n                MyApp.updater?.call();\n              },\n              width: 140,\n            ),\n          ),\n          ListTile(\n            leading: const Icon(Icons.dark_mode),\n            title: Text(\"深色模式\".tl),\n            trailing: Select(\n              initialValue: int.parse(appdata.settings[32]),\n              values: [\"跟随系统\".tl, \"禁用\".tl, \"启用\".tl],\n              onChange: (i) {\n                appdata.settings[32] = i.toString();\n                appdata.updateSettings();\n                MyApp.updater?.call();\n              },\n              width: 140,\n            ),\n          ),\n          if (App.isAndroid)\n            ListTile(\n              leading: const Icon(Icons.smart_screen_outlined),\n              title: Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Text(\"高刷新率模式\".tl),\n                  const SizedBox(\n                    width: 2,\n                  ),\n                  InkWell(\n                    borderRadius: const BorderRadius.all(Radius.circular(18)),\n                    onTap: () => showDialogMessage(\n                        context,\n                        \"高刷新率模式\".tl,\n                        \"启用后, APP将尝试设置高刷新率\\n\"\n                        \"如果OS没有限制APP的刷新率, 无需启用此项\\n\"\n                        \"OS可能不会响应更改\"),\n                    child: const Icon(\n                      Icons.info_outline,\n                      size: 18,\n                    ),\n                  )\n                ],\n              ),\n              trailing: Switch(\n                value: appdata.settings[38] == \"1\",\n                onChanged: (b) {\n                  setState(() {\n                    appdata.settings[38] = b ? \"1\" : \"0\";\n                  });\n                  appdata.updateSettings();\n                  if (b) {\n                    try {\n                      FlutterDisplayMode.setHighRefreshRate();\n                    } catch (e) {\n                      // ignore\n                    }\n                  } else {\n                    try {\n                      FlutterDisplayMode.setLowRefreshRate();\n                    } catch (e) {\n                      // ignore\n                    }\n                  }\n                },\n              ),\n            )\n        ],\n      );\n\n  Widget buildAppSettings() {\n    return Column(\n      children: [\n        ListTile(\n          title: Text(\"日志\".tl),\n        ),\n        ListTile(\n          leading: const Icon(Icons.bug_report),\n          title: const Text(\"Logs\"),\n          trailing: const Icon(Icons.arrow_right),\n          onTap: () => context.to(() => const LogsPage()),\n        ),\n        ListTile(\n          title: Text(\"更新\".tl),\n        ),\n        ListTile(\n          leading: const Icon(Icons.update),\n          title: Text(\"检查更新\".tl),\n          subtitle: Text(\"${\"当前:\".tl} $appVersion\"),\n          onTap: () {\n            findUpdate(context);\n          },\n        ),\n        SwitchSetting(\n          title: \"启动时检查更新\".tl,\n          settingsIndex: 2,\n          icon: const Icon(Icons.security_update),\n        ),\n        ListTile(\n          title: Text(\"数据\".tl),\n        ),\n        if (App.isDesktop || App.isAndroid)\n          ListTile(\n            leading: const Icon(Icons.folder),\n            title: Text(\"设置下载目录\".tl),\n            trailing: const Icon(Icons.arrow_right),\n            onTap: () => setDownloadFolder(),\n          ),\n        ListTile(\n          leading: const Icon(Icons.storage),\n          title: Text(\"缓存大小\".tl),\n          subtitle: Text(bytesLengthToReadableSize(CacheManager().currentSize)),\n          onTap: () {},\n        ),\n        ListTile(\n          leading: const Icon(Icons.sd_storage_outlined),\n          title: Text(\"设置缓存限制\".tl),\n          onTap: setCacheLimit,\n          trailing: const Icon(Icons.arrow_right),\n        ),\n        ListTile(\n          leading: const Icon(Icons.delete),\n          title: Text(\"清除缓存\".tl),\n          onTap: () {\n            CacheManager().clear().then((value) {\n              if(mounted) {\n                setState(() {});\n              }\n            });\n          },\n        ),\n        ListTile(\n          leading: const Icon(Icons.delete),\n          title: Text(\"清除所有数据\".tl),\n          trailing: const Icon(Icons.arrow_right),\n          onTap: () => clearUserData(context),\n        ),\n        ListTile(\n          leading: const Icon(Icons.sim_card_download),\n          title: Text(\"导出用户数据\".tl),\n          trailing: const Icon(Icons.arrow_right),\n          onTap: () => exportDataSetting(context),\n        ),\n        ListTile(\n          leading: const Icon(Icons.data_object),\n          title: Text(\"导入用户数据\".tl),\n          trailing: const Icon(Icons.arrow_right),\n          onTap: () => importDataSetting(context),\n        ),\n        ListTile(\n          leading: const Icon(Icons.sync),\n          title: Text(\"数据同步\".tl),\n          trailing: const Icon(Icons.arrow_right),\n          onTap: () => syncDataSettings(context),\n        ),\n        ListTile(\n          title: Text(\"隐私\".tl),\n        ),\n        if (App.isAndroid)\n          ListTile(\n            leading: const Icon(Icons.screenshot),\n            title: Text(\"阻止屏幕截图\".tl),\n            subtitle: Text(\"需要重启App以应用更改\".tl),\n            trailing: Switch(\n              value: appdata.settings[12] == \"1\",\n              onChanged: (b) {\n                b ? appdata.settings[12] = \"1\" : appdata.settings[12] = \"0\";\n                setState(() {});\n                appdata.writeData();\n              },\n            ),\n          ),\n        SwitchSetting(\n          title: \"需要身份验证\".tl,\n          subTitle: \"如果系统中未设置任何认证方法请勿开启\".tl,\n          settingsIndex: 13,\n          icon: const Icon(Icons.security),\n        ),\n        ListTile(\n          title: Text(\"其它\".tl),\n        ),\n        ListTile(\n          title: Text(\"语言\".tl),\n          leading: const Icon(Icons.language),\n          trailing: Select(\n            initialValue: [\"\", \"cn\", \"tw\", \"en\"].indexOf(appdata.settings[50]),\n            values: const [\"System\", \"中文(简体)\", \"中文(繁體)\", \"English\"],\n            onChange: (value) {\n              appdata.settings[50] = [\"\", \"cn\", \"tw\", \"en\"][value];\n              appdata.updateSettings();\n              MyApp.updater?.call();\n            },\n          ),\n        ),\n        ListTile(\n          title: Text(\"下载并行\".tl),\n          leading: const Icon(Icons.download),\n          trailing: Select(\n            initialValue: [\"1\", \"2\", \"4\", \"6\", \"8\", \"16\"].indexOf(appdata.settings[79]),\n            values: const [\"1\", \"2\", \"4\", \"6\", \"8\", \"16\"],\n            onChange: (value) {\n              appdata.settings[79] = [\"1\", \"2\", \"4\", \"6\", \"8\", \"16\"][value];\n              appdata.updateSettings();\n            },\n          ),\n        ),\n        if(App.isAndroid)\n          ListTile(\n            title: Text(\"应用链接\".tl),\n            subtitle: Text(\"在系统设置中管理APP支持的链接\".tl),\n            leading: const Icon(Icons.link),\n            trailing: const Icon(Icons.arrow_right),\n            onTap: (){\n              const MethodChannel(\"pica_comic/settings\").invokeMethod(\"link\");\n            },\n          ),\n        if(kDebugMode)\n          const ListTile(\n            title: Text(\"Debug\"),\n            onTap: debug,\n          ),\n        Padding(padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom))\n      ],\n    );\n  }\n\n  Widget buildAbout() {\n    return Column(\n      children: [\n        SizedBox(\n          height: 130,\n          width: double.infinity,\n          child: Center(\n            child: Container(\n              width: 156,\n              height: 156,\n              decoration: BoxDecoration(\n                  borderRadius: BorderRadius.circular(20)),\n              child: const Image(\n                image: AssetImage(\"images/app_icon_no_bg.png\"),\n                filterQuality: FilterQuality.medium,\n              ),\n            ),\n          ),\n        ),\n        const Text(\n          \"V$appVersion\",\n          style: TextStyle(fontSize: 16),\n        ),\n        Text(\"Pica Comic是一个完全免费的漫画阅读APP\".tl),\n        Text(\"仅用于学习交流\".tl),\n        const SizedBox(\n          height: 16,\n        ),\n        ListTile(\n          leading: const Icon(Icons.code),\n          title: Text(\"项目地址\".tl),\n          onTap: () => launchUrlString(\"https://github.com/wgh136/PicaComic\",\n              mode: LaunchMode.externalApplication),\n          trailing: const Icon(Icons.arrow_right),\n        ),\n        ListTile(\n          leading: const Icon(Icons.comment_outlined),\n          title: Text(\"提出建议(Github)\".tl),\n          onTap: () => launchUrlString(\n              \"https://github.com/wgh136/PicaComic/issues\",\n              mode: LaunchMode.externalApplication),\n          trailing: const Icon(Icons.arrow_right),\n        ),\n        ListTile(\n          leading: const Icon(Icons.email),\n          title: Text(\"通过电子邮件联系我\".tl),\n          onTap: () => launchUrlString(\"mailto://nyne19710@proton.me\",\n              mode: LaunchMode.externalApplication),\n          trailing: const Icon(Icons.arrow_right),\n        ),\n        ListTile(\n          leading: const Icon(Icons.telegram),\n          title: Text(\"加入Telegram群\".tl),\n          onTap: () => launchUrlString(\"https://t.me/pica_group\",\n              mode: LaunchMode.externalApplication),\n          trailing: const Icon(Icons.arrow_right),\n        ),\n        Padding(padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom))\n      ],\n    );\n  }\n\n  Widget buildRight() {\n    final Widget body = switch (currentPage) {\n      -1 => const SizedBox(),\n      0 => buildExploreSettings(context, false),\n      1 => const ComicSourceSettings(),\n      2 => const ReadingSettings(false),\n      3 => buildAppearanceSettings(),\n      4 => const LocalFavoritesSettings(),\n      5 => buildAppSettings(),\n      6 => const NetworkSettings(),\n      7 => buildAbout(),\n      _ => throw UnimplementedError()\n    };\n\n    if (currentPage != -1) {\n      return Material(\n        child: CustomScrollView(\n          primary: false,\n          slivers: [\n            SliverAppBar(\n                title: Text(categories[currentPage].tl),\n                automaticallyImplyLeading: false,\n                scrolledUnderElevation: enableTwoViews ? 0 : null,\n                leading: enableTwoViews\n                    ? null\n                    : IconButton(\n                        icon: const Icon(Icons.arrow_back),\n                        onPressed: () => setState(() => currentPage = -1),\n                      )),\n            SliverToBoxAdapter(\n              child: body,\n            )\n          ],\n        ),\n      );\n    }\n\n    return body;\n  }\n\n  var canPop = ValueNotifier(true);\n\n  @override\n  ValueListenable<bool> get canPopNotifier => canPop;\n\n  @override\n  void onPopInvokedWithResult(bool didPop, result) {\n    if (currentPage != -1) {\n      setState(() {\n        currentPage = -1;\n      });\n    }\n  }\n\n  @override\n  void onPopInvoked(bool didPop) {\n    if (currentPage != -1) {\n      setState(() {\n        currentPage = -1;\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/show_image_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:photo_view/photo_view.dart';\nimport 'package:pica_comic/foundation/image_loader/cached_image.dart';\nimport 'package:pica_comic/foundation/image_manager.dart';\nimport 'package:pica_comic/tools/save_image.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nclass ShowImagePage extends StatelessWidget {\n  const ShowImagePage(this.url, {super.key});\n\n  final String url;\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text(\"图片\".tl),\n      ),\n      body: PhotoView(\n        minScale: PhotoViewComputedScale.contained * 0.9,\n        imageProvider: CachedImageProvider(url),\n        loadingBuilder: (context, event) {\n          return Container(\n            decoration: const BoxDecoration(color: Colors.black),\n            child: const Center(\n              child: CircularProgressIndicator(),\n            ),\n          );\n        },\n      ),\n    );\n  }\n}\n\nclass ShowImagePageWithHero extends StatelessWidget {\n  const ShowImagePageWithHero(this.url, this.tag, {super.key});\n\n  final String url;\n\n  final String tag;\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text(\"图片\".tl),\n        actions: [\n          Tooltip(\n            message: \"保存\".tl,\n            child: IconButton(\n              icon: const Icon(Icons.download),\n              onPressed: () async{\n                var file = await ImageManager().getFile(url);\n                if(file != null){\n                  saveImage(file);\n                }\n              }\n          ))\n        ],\n      ),\n      body: Hero(\n        tag: tag,\n        child: PhotoView(\n          minScale: PhotoViewComputedScale.contained * 0.9,\n          imageProvider: CachedImageProvider(url),\n          loadingBuilder: (context, event) {\n            return Container(\n              decoration: const BoxDecoration(color: Colors.black),\n              child: const Center(\n                child: CircularProgressIndicator(),\n              ),\n            );\n          },\n        ),\n      ),\n    );\n  }\n}\n\n"
  },
  {
    "path": "lib/pages/tools.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/tools/app_links.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nimport 'ehentai/subscription.dart';\nimport 'jm/jm_comic_page.dart';\nimport 'webview.dart';\n\nvoid openTool() {\n  showModalBottomSheet(\n    context: App.globalContext!,\n    builder: (context) => Column(\n      children: [\n        ListTile(\n          title: Text(\"工具\".tl),\n        ),\n        ListTile(\n          leading: const Icon(Icons.subscriptions),\n          title: Text(\"EH订阅\".tl),\n          onTap: () {\n            App.globalBack();\n            App.mainNavigatorKey?.currentContext?.to(() => const SubscriptionPage());\n          },\n        ),\n        ListTile(\n          leading: const Icon(Icons.image_search_outlined),\n          title: Text(\"图片搜索 [搜图bot酱]\".tl),\n          onTap: () async {\n            App.globalBack();\n            if (App.isMobile) {\n              App.mainNavigatorKey?.currentContext?.to(\n                () => AppWebview(\n                  initialUrl: \"https://soutubot.moe/\",\n                  onNavigation: (uri) {\n                    return handleAppLinks(Uri.parse(uri),\n                        showMessageWhenError: false);\n                  },\n                ),\n              );\n            } else {\n              var webview = DesktopWebview(\n                initialUrl: \"https://soutubot.moe/\",\n                onNavigation: (s, webview) {\n                  if (handleAppLinks(Uri.parse(s),\n                      showMessageWhenError: false)) {\n                    Future.microtask(() => webview.close());\n                  }\n                },\n              );\n              webview.open();\n            }\n          },\n        ),\n        ListTile(\n          leading: const Icon(Icons.image_search),\n          title: Text(\"图片搜索 [SauceNAO]\".tl),\n          onTap: () async {\n            App.globalBack();\n            if (App.isMobile || App.isMacOS) {\n              App.mainNavigatorKey?.currentContext?.to(\n                () => AppWebview(\n                  initialUrl: \"https://saucenao.com/\",\n                  onNavigation: (uri) {\n                    return handleAppLinks(Uri.parse(uri),\n                        showMessageWhenError: false);\n                  },\n                ),\n              );\n            } else {\n              var webview = DesktopWebview(\n                initialUrl: \"https://saucenao.com/\",\n                onNavigation: (s, webview) {\n                  if (handleAppLinks(Uri.parse(s),\n                      showMessageWhenError: false)) {\n                    Future.microtask(() => webview.close());\n                  }\n                },\n              );\n              webview.open();\n            }\n          },\n        ),\n        ListTile(\n          leading: const Icon(Icons.web),\n          title: Text(\"打开链接\".tl),\n          onTap: () {\n            App.globalBack();\n            showDialog(\n              context: App.globalContext!,\n              builder: (context) {\n                final controller = TextEditingController();\n\n                validateText() {\n                  var text = controller.text;\n                  if (text == \"\") {\n                    return null;\n                  }\n\n                  if (!text.contains(\"http://\") && !text.contains(\"https://\")) {\n                    text = \"https://$text\";\n                  }\n\n                  if (!text.isURL) {\n                    return \"不支持的链接\".tl;\n                  }\n                  var uri = Uri.parse(text);\n                  if (![\n                    \"exhentai.org\",\n                    \"e-hentai.org\",\n                    \"hitomi.la\",\n                    \"nhentai.net\",\n                    \"nhentai.xxx\"\n                  ].contains(uri.host)) {\n                    return \"不支持的链接\".tl;\n                  }\n                  return null;\n                }\n\n                void Function(void Function())? stateSetter;\n\n                onFinish() {\n                  if (validateText() != null) {\n                    stateSetter?.call(() {});\n                  } else {\n                    App.globalBack();\n                    var text = controller.text;\n                    if (!text.contains(\"http://\") &&\n                        !text.contains(\"https://\")) {\n                      text = \"https://$text\";\n                    }\n                    handleAppLinks(Uri.parse(text));\n                  }\n                }\n\n                return AlertDialog(\n                  title: Text(\"输入链接\".tl),\n                  content: StatefulBuilder(\n                    builder: (BuildContext context,\n                        void Function(void Function()) setState) {\n                      stateSetter = setState;\n                      return TextField(\n                        controller: controller,\n                        decoration: InputDecoration(\n                          errorText: validateText(),\n                        ),\n                        onSubmitted: (s) => onFinish(),\n                      );\n                    },\n                  ),\n                  actions: [\n                    TextButton(onPressed: onFinish, child: Text(\"打开\".tl)),\n                  ],\n                );\n              },\n            );\n          },\n        ),\n        ListTile(\n          leading: const Icon(Icons.insert_drive_file),\n          title: Text(\"禁漫漫画ID\".tl),\n          onTap: () {\n            App.globalBack();\n            var controller = TextEditingController();\n            showDialog(\n              context: context,\n              builder: (context) {\n                return AlertDialog(\n                  title: Text(\"输入禁漫漫画ID\".tl),\n                  content: Padding(\n                    padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),\n                    child: TextField(\n                      keyboardType: TextInputType.number,\n                      controller: controller,\n                      onEditingComplete: () {\n                        App.globalBack();\n                        if (controller.text.isNum) {\n                          context.to(() => JmComicPage(controller.text));\n                        } else {\n                          showToast(message: \"输入的ID不是数字\".tl);\n                        }\n                      },\n                      inputFormatters: [\n                        FilteringTextInputFormatter.allow(RegExp(\"[0-9]\"))\n                      ],\n                      decoration: const InputDecoration(\n                          border: OutlineInputBorder(),\n                          labelText: \"ID\",\n                          prefix: Text(\"JM\")),\n                    ),\n                  ),\n                  actions: [\n                    TextButton(\n                        onPressed: () {\n                          App.globalBack();\n                          if (controller.text.isNum) {\n                            App.mainNavigatorKey?.currentContext\n                                ?.to(() => JmComicPage(controller.text));\n                          } else {\n                            showToast(message: \"输入的ID不是数字\".tl);\n                          }\n                        },\n                        child: Text(\"提交\".tl))\n                  ],\n                );\n              },\n            );\n          },\n        )\n      ],\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/webview.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:desktop_webview_window/desktop_webview_window.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/foundation/ui_mode.dart';\nimport 'package:pica_comic/network/http_client.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\n\nexport 'package:flutter_inappwebview/flutter_inappwebview.dart' show WebUri, URLRequest;\n\nextension WebviewExtension on InAppWebViewController{\n  Future<Map<String, String>?> getCookies(String url) async{\n    if(url.contains(\"https://\")){\n      url.replaceAll(\"https://\", \"\");\n    }\n    if(url[url.length-1] == '/'){\n      url = url.substring(0, url.length-1);\n    }\n    CookieManager cookieManager = CookieManager.instance();\n    final cookies = await cookieManager.getCookies(url: WebUri(url));\n    Map<String, String> res = {};\n    for(var cookie in cookies){\n      res[cookie.name] = cookie.value;\n    }\n    return res;\n  }\n\n  Future<String?> getUA() async{\n    var res = await evaluateJavascript(source: \"navigator.userAgent\");\n    if(res is String){\n      if(res[0] == \"'\" || res[0] == \"\\\"\") {\n        res = res.substring(1, res.length-1);\n      }\n    }\n    return res is String ? res : null;\n  }\n}\n\nclass AppWebview extends StatefulWidget {\n  const AppWebview({required this.initialUrl, this.onTitleChange,\n    this.onNavigation, this.singlePage = false, this.onStarted, super.key});\n\n  final String initialUrl;\n\n  final void Function(String title, InAppWebViewController controller)? onTitleChange;\n\n  final bool Function(String url)? onNavigation;\n\n  final void Function(InAppWebViewController controller)? onStarted;\n\n  final bool singlePage;\n\n  @override\n  State<AppWebview> createState() => _AppWebviewState();\n}\n\nclass _AppWebviewState extends State<AppWebview> {\n  InAppWebViewController? controller;\n\n  String title = \"Webview\";\n\n  double _progress = 0;\n\n  @override\n  Widget build(BuildContext context) {\n    bool useCustomAppBar = !UiMode.m1(context) && !widget.singlePage;\n\n    final actions = [\n      Tooltip(\n        message: \"More\",\n        child: IconButton(\n          icon: const Icon(Icons.more_horiz),\n          onPressed: (){\n            showMenu(context: context, position: RelativeRect.fromLTRB(\n                MediaQuery.of(context).size.width,\n                0,\n                MediaQuery.of(context).size.width,\n                0\n            ), items: [\n              PopupMenuItem(\n                child: Text(\"在浏览器中打开\".tl),\n                onTap: () async => launchUrlString((await controller?.getUrl())!.path),\n              ),\n              PopupMenuItem(\n                child: Text(\"复制链接\".tl),\n                onTap: () async => Clipboard.setData(ClipboardData(text: (await controller?.getUrl())!.path)),\n              ),\n              PopupMenuItem(\n                child: Text(\"重新加载\".tl),\n                onTap: () => controller?.reload(),\n              ),\n            ]);\n          },\n        ),\n      )\n    ];\n\n    Widget body = InAppWebView(\n      initialUrlRequest: URLRequest(url: WebUri(widget.initialUrl)),\n      onTitleChanged: (c, t){\n        if(mounted){\n          setState(() {\n            title = t ?? \"Webview\";\n          });\n        }\n        widget.onTitleChange?.call(title, controller!);\n      },\n      shouldOverrideUrlLoading: (c, r) async {\n        var res = widget.onNavigation?.call(r.request.url?.toString() ?? \"\") ?? false;\n        if(res) {\n          return NavigationActionPolicy.CANCEL;\n        } else {\n          return NavigationActionPolicy.ALLOW;\n        }\n      },\n      onWebViewCreated: (c){\n        controller = c;\n        widget.onStarted?.call(c);\n      },\n      onProgressChanged: (c, p){\n        if(mounted){\n          setState(() {\n            _progress = p / 100;\n          });\n        }\n      },\n    );\n\n    body = Stack(\n      children: [\n        Positioned.fill(child: body),\n        if(_progress < 1.0)\n          const Positioned.fill(child: Center(\n              child: CircularProgressIndicator()))\n      ],\n    );\n\n    if(useCustomAppBar){\n      body = Column(\n        children: [\n          Appbar(\n            title: Text(title, maxLines: 1, overflow: TextOverflow.ellipsis,),\n            actions: actions,\n          ),\n          Expanded(child: body)\n        ],\n      );\n    }\n\n    return Scaffold(\n      appBar: !useCustomAppBar ? AppBar(\n        title: Text(title, maxLines: 1, overflow: TextOverflow.ellipsis,),\n        actions: actions,\n      ) : null,\n      body: body\n    );\n  }\n}\n\nclass DesktopWebview {\n  static Future<bool> isAvailable() => WebviewWindow.isWebviewAvailable();\n\n  final String initialUrl;\n\n  final void Function(String title, DesktopWebview controller)? onTitleChange;\n\n  final void Function(String url, DesktopWebview webview)? onNavigation;\n\n  final void Function(DesktopWebview controller)? onStarted;\n\n  final void Function()? onClose;\n\n  DesktopWebview({\n    required this.initialUrl,\n    this.onTitleChange,\n    this.onNavigation,\n    this.onStarted,\n    this.onClose\n  });\n\n  Webview? _webview;\n\n  String? _ua;\n\n  String? title;\n\n  void onMessage(String message) {\n    var json = jsonDecode(message);\n    if(json is Map){\n      if(json[\"id\"] == \"document_created\"){\n        title = json[\"data\"][\"title\"];\n        _ua = json[\"data\"][\"ua\"];\n        onTitleChange?.call(title!, this);\n      }\n    }\n  }\n\n  String? get userAgent => _ua;\n\n  Timer? timer;\n\n  void _runTimer() {\n    timer ??= Timer.periodic(const Duration(seconds: 2), (t) async {\n      const js = '''\n        function collect() {\n          if(document.readyState === 'loading') {\n            return '';\n          }\n          let data = {\n            id: \"document_created\",\n            data: {\n              title: document.title,\n              url: location.href,\n              ua: navigator.userAgent\n            }\n          };\n          return data;\n        }\n        collect();\n      ''';\n      if(_webview != null) {\n        onMessage(await evaluateJavascript(js) ?? '');\n      }\n    });\n  }\n\n  void open() async {\n    _webview = await WebviewWindow.create(configuration: CreateConfiguration(\n      useWindowPositionAndSize: true,\n      userDataFolderWindows: \"${App.dataPath}\\\\webview\",\n      title: \"webview\",\n      proxy: proxyHttpOverrides?.proxyStr,\n    ));\n    _webview!.addOnWebMessageReceivedCallback(onMessage);\n    _webview!.setOnNavigation((s) => onNavigation?.call(s, this));\n    _webview!.launch(initialUrl, triggerOnUrlRequestEvent: false);\n    _runTimer();\n    _webview!.onClose.then((value) {\n      _webview = null;\n      timer?.cancel();\n      timer = null;\n      onClose?.call();\n    });\n    Future.delayed(const Duration(milliseconds: 200), () {\n      onStarted?.call(this);\n    });\n  }\n\n  Future<String?> evaluateJavascript(String source) {\n    return _webview!.evaluateJavaScript(source);\n  }\n\n  Future<Map<String, String>> getCookies(String url) async{\n    var allCookies = await _webview!.getAllCookies();\n    var res = <String, String>{};\n    for(var c in allCookies) {\n      if(_cookieMatch(url, c.domain)){\n        res[_removeCode0(c.name)] = _removeCode0(c.value);\n      }\n    }\n    return res;\n  }\n\n  String _removeCode0(String s) {\n    var codeUints = List<int>.from(s.codeUnits);\n    codeUints.removeWhere((e) => e == 0);\n    return String.fromCharCodes(codeUints);\n  }\n\n  bool _cookieMatch(String url, String domain) {\n    domain = _removeCode0(domain);\n    var host = Uri.parse(url).host;\n    var acceptedHost = _getAcceptedDomains(host);\n    return acceptedHost.contains(domain.removeAllBlank);\n  }\n\n  List<String> _getAcceptedDomains(String host) {\n    var acceptedDomains = <String>[host];\n    var hostParts = host.split(\".\");\n    for (var i = 0; i < hostParts.length - 1; i++) {\n      acceptedDomains.add(\".${hostParts.sublist(i).join(\".\")}\");\n    }\n    return acceptedDomains;\n  }\n\n  void close() {\n    _webview?.close();\n    _webview = null;\n  }\n}"
  },
  {
    "path": "lib/pages/welcome_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/pages/main_page.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'settings/settings_page.dart';\n\nimport '../main.dart';\nimport 'accounts_page.dart';\n\nclass WelcomePage extends StatefulWidget {\n  const WelcomePage({super.key});\n\n  @override\n  State<WelcomePage> createState() => _WelcomePageState();\n}\n\nclass _WelcomePageState extends State<WelcomePage> {\n  var controller = PageController();\n\n  int page = 0;\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      color: context.colorScheme.surfaceContainerLow,\n      child: SafeArea(\n          child: Padding(\n        padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 24),\n        child: ConstrainedBox(\n          constraints: const BoxConstraints(maxWidth: 900, maxHeight: 500),\n          child: Material(\n            color: context.brightness == Brightness.light\n                ? Colors.white\n                : Colors.black,\n            elevation: 1,\n            borderRadius: BorderRadius.circular(16),\n            child: SizedBox.expand(\n              child: PageView(\n                controller: controller,\n                onPageChanged: (i) {\n                  page = i;\n                },\n                physics: const NeverScrollableScrollPhysics(),\n                children: const [\n                  _AppIcon(),\n                  _AppInfo(),\n                  _AppAppearance(),\n                  _ComicsDisplaySettings(),\n                  _ReadingSettings(),\n                  _ComicSource(),\n                  _More(),\n                ],\n              ),\n            ),\n          ),\n        ).toCenter(),\n      )),\n    );\n  }\n\n  void next() {\n    controller.animateToPage((controller.page! + 1).round(),\n        duration: const Duration(milliseconds: 200), curve: Curves.ease);\n  }\n\n  void back() {\n    controller.animateToPage((controller.page! - 1).round(),\n        duration: const Duration(milliseconds: 200), curve: Curves.ease);\n  }\n}\n\nmixin class _WelcomePageComponents {\n  Widget buildTitle(String title) {\n    return Text(title, style: ts.s28).paddingVertical(16);\n  }\n\n  Widget buildBottom(BuildContext context, int page, [bool canNext = true]) {\n    var state = context.findAncestorStateOfType<_WelcomePageState>()!;\n    return Row(\n      children: [\n        if (page != 0)\n          Button.text(\n              padding: const EdgeInsets.fromLTRB(12, 6, 24, 6),\n              onPressed: state.back,\n              child: Row(\n                children: [\n                  const Icon(Icons.arrow_left),\n                  const SizedBox(\n                    width: 4,\n                  ),\n                  Text(\"返回\".tl)\n                ],\n              )),\n        const Spacer(),\n        if (page != 6)\n          Button.filled(\n              padding: const EdgeInsets.fromLTRB(24, 6, 12, 6),\n              onPressed: state.next,\n              disabled: !canNext,\n              child: Row(\n                children: [\n                  Text(\"继续\".tl),\n                  const SizedBox(\n                    width: 4,\n                  ),\n                  const Icon(Icons.arrow_right),\n                ],\n              ))\n        else\n          Button.filled(\n              padding: const EdgeInsets.fromLTRB(24, 6, 12, 6),\n              onPressed: () async {\n                await ComicSource.reload();\n                if (context.mounted) {\n                  context.to(() => const MainPage());\n                }\n              },\n              disabled: !canNext,\n              child: Row(\n                children: [\n                  Text(\"完成\".tl),\n                  const SizedBox(\n                    width: 4,\n                  ),\n                  const Icon(Icons.check),\n                ],\n              ))\n      ],\n    ).paddingVertical(12);\n  }\n\n  Widget buildView({required List<Widget> children}) {\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: children,\n    ).paddingHorizontal(24);\n  }\n}\n\nclass _AppIcon extends StatelessWidget with _WelcomePageComponents {\n  const _AppIcon();\n\n  @override\n  Widget build(BuildContext context) {\n    return buildView(\n      children: [\n        buildTitle(\"欢迎\".tl),\n        Expanded(\n          child: Center(\n            child: Container(\n              width: 256,\n              height: 256,\n              decoration: BoxDecoration(\n                  borderRadius: BorderRadius.circular(50),\n                  image: const DecorationImage(\n                      image: AssetImage(\"images/app_icon_no_bg.png\"),\n                      filterQuality: FilterQuality.medium)),\n            ),\n          ),\n        ),\n        buildBottom(context, 0)\n      ],\n    );\n  }\n}\n\nclass _AppInfo extends StatefulWidget {\n  const _AppInfo();\n\n  @override\n  State<_AppInfo> createState() => _AppInfoState();\n}\n\nclass _AppInfoState extends State<_AppInfo> with _WelcomePageComponents {\n  bool agree = false;\n\n  @override\n  Widget build(BuildContext context) {\n    var style = context.width > 500\n        ? ts.s16.withHeight(2)\n        : ts.s14.withHeight(1.6);\n    return buildView(\n      children: [\n        buildTitle(\"使用须知\".tl),\n        Text(\n          buildInfo(),\n          style: style,\n        ),\n        const SizedBox(\n          height: 16,\n        ),\n        Row(\n          mainAxisAlignment: MainAxisAlignment.end,\n          children: [\n            Text(\n              \"我已阅读并知晓\".tl,\n              style: ts.withColor(context.colorScheme.primary),\n            ),\n            Checkbox(\n                value: agree,\n                onChanged: (b) {\n                  setState(() {\n                    agree = b ?? false;\n                  });\n                })\n          ],\n        ),\n        const Spacer(),\n        buildBottom(context, 1, agree)\n      ],\n    );\n  }\n\n  String buildInfo() {\n    var content = '';\n    content += \"感谢使用本软件, 请注意:\".tl;\n    content += '\\n';\n    content += \"本App的开发目的仅为学习交流与个人兴趣, 显示的任何内容均来自网络, 与开发者无关\".tl;\n    content += '\\n';\n    content += \"如果在使用中发现问题, 请先确认是否为自己的设备问题, 然后再进行反馈\".tl;\n    content += '\\n';\n    content += \"开发者不对能否解决问题负责\".tl;\n    return content;\n  }\n}\n\nclass _AppAppearance extends StatefulWidget {\n  const _AppAppearance();\n\n  @override\n  State<_AppAppearance> createState() => _AppAppearanceState();\n}\n\nclass _AppAppearanceState extends State<_AppAppearance>\n    with _WelcomePageComponents {\n  @override\n  Widget build(BuildContext context) {\n    return buildView(\n      children: [\n        buildTitle(\"设置App外观\".tl),\n        SelectSettingWithAppdata(\n          icon: const Icon(Icons.color_lens),\n          title: \"主题选择\".tl,\n          options: const [\n            \"dynamic\",\n            \"red\",\n            \"pink\",\n            \"purple\",\n            \"indigo\",\n            \"blue\",\n            \"cyan\",\n            \"teal\",\n            \"green\",\n            \"lime\",\n            \"yellow\",\n            \"amber\",\n            \"orange\",\n          ],\n          settingsIndex: 27,\n          onChanged: () {\n            MyApp.updater?.call();\n          },\n        ),\n        SelectSettingWithAppdata(\n          icon: const Icon(Icons.dark_mode),\n          title: \"深色模式\".tl,\n          options: [\"跟随系统\".tl, \"禁用\".tl, \"启用\".tl],\n          settingsIndex: 32,\n          onChanged: () {\n            MyApp.updater?.call();\n          },\n        ),\n        SelectSetting(\n          leading: const Icon(Icons.crop_square),\n          title: \"漫画块显示模式\".tl,\n          values: [\"详细\".tl, \"简略\".tl],\n          initialValue: appdata.appSettings.comicTileDisplayType,\n          onChanged: (i) {\n            appdata.appSettings.comicTileDisplayType = i;\n            appdata.updateSettings();\n            MyApp.updater?.call();\n          },\n        ),\n        const Spacer(),\n        buildBottom(context, 2)\n      ],\n    );\n  }\n}\n\nclass _ComicsDisplaySettings extends StatefulWidget {\n  const _ComicsDisplaySettings();\n\n  @override\n  State<_ComicsDisplaySettings> createState() => _ComicsDisplaySettingsState();\n}\n\nclass _ComicsDisplaySettingsState extends State<_ComicsDisplaySettings>\n    with _WelcomePageComponents {\n  @override\n  Widget build(BuildContext context) {\n    return buildView(\n      children: [\n        buildTitle(\"漫画列表显示方式\".tl),\n        RadioListTile<int>(\n            title: Text(\"连续模式\".tl),\n            value: 0,\n            groupValue: appdata.appSettings.comicsListDisplayType,\n            onChanged: (s) {\n              setState(() {\n                appdata.appSettings.comicsListDisplayType = s!;\n              });\n              appdata.updateSettings();\n            }),\n        Text(\"滑动到底部时自动加载下一页并追加到页面末尾\".tl).paddingHorizontal(16),\n        const SizedBox(\n          height: 16,\n        ),\n        RadioListTile<int>(\n            title: Text(\"分页模式\".tl),\n            value: 1,\n            groupValue: appdata.appSettings.comicsListDisplayType,\n            onChanged: (s) {\n              setState(() {\n                appdata.appSettings.comicsListDisplayType = s!;\n              });\n              appdata.updateSettings();\n            }),\n        Text(\"需要手动切换页面\".tl).paddingHorizontal(16),\n        const Spacer(),\n        buildBottom(context, 3)\n      ],\n    );\n  }\n}\n\nclass _ReadingSettings extends StatelessWidget with _WelcomePageComponents {\n  const _ReadingSettings();\n\n  @override\n  Widget build(BuildContext context) {\n    return buildView(\n      children: [\n        buildTitle(\"阅读设置\".tl),\n        const Expanded(\n          child: SingleChildScrollView(\n            child: ReadingSettings(false),\n          ),\n        ),\n        buildBottom(context, 4)\n      ],\n    );\n  }\n}\n\nclass _ComicSource extends StatefulWidget {\n  const _ComicSource();\n\n  @override\n  State<_ComicSource> createState() => _ComicSourceState();\n}\n\nclass _ComicSourceState extends State<_ComicSource>\n    with _WelcomePageComponents {\n  @override\n  Widget build(BuildContext context) {\n    return buildView(\n      children: [\n        buildTitle(\"漫画源\".tl),\n        Expanded(\n          child: ListView.builder(\n            itemCount: builtInSources.length,\n            itemBuilder: (context, index) {\n              var key = builtInSources[index];\n              return ListTile(\n                title: Text(\n                    ComicSource.builtIn.firstWhere((e) => e.key == key).name),\n                trailing: Switch(\n                  value: appdata.appSettings.isComicSourceEnabled(key),\n                  onChanged: (v) {\n                    appdata.appSettings.setComicSourceEnabled(key, v);\n                    appdata.updateSettings();\n                    setState(() {});\n                  },\n                ),\n              );\n            },\n          ),\n        ),\n        buildBottom(context, 5)\n      ],\n    );\n  }\n}\n\nclass _More extends StatelessWidget with _WelcomePageComponents {\n  const _More();\n\n  @override\n  Widget build(BuildContext context) {\n    return buildView(\n      children: [\n        buildTitle(\"更多\".tl),\n        ListTile(\n          leading: const Icon(\n            Icons.account_circle,\n          ),\n          title: Text(\"登录账号\".tl),\n          onTap: () => showPopUpWidget(context, const AccountsPage()),\n          trailing: const Icon(Icons.arrow_right),\n        ),\n        ListTile(\n          leading: const Icon(\n            Icons.settings,\n          ),\n          title: Text(\"更多设置\".tl),\n          onTap: SettingsPage.open,\n          trailing: const Icon(Icons.arrow_right),\n        ),\n        const Spacer(),\n        buildBottom(context, 6)\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/tools/app_links.dart",
    "content": "import 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/tools/extensions.dart';\nimport '../foundation/app.dart';\nimport '../pages/ehentai/eh_gallery_page.dart';\nimport '../pages/hitomi/hitomi_comic_page.dart';\nimport '../pages/nhentai/comic_page.dart';\n\nbool canHandle(String text){\n  if(!text.isURL){\n    return false;\n  }\n  var uri = Uri.parse(text);\n\n  const acceptedHosts = [\"e-hentai.org\", \"exhentai.org\", \"nhentai.net\", \"hitomi.la\"];\n\n  return acceptedHosts.contains(uri.host);\n}\n\nbool handleAppLinks(Uri uri, {bool showMessageWhenError = true}){\n  LogManager.addLog(LogLevel.info, \"App Link\", \"Open Link $uri\");\n  var context = App.mainNavigatorKey!.currentContext!;\n  switch(uri.host){\n    case \"e-hentai.org\":\n    case \"exhentai.org\":\n      if(uri.path.contains(\"/g/\")){\n        context.to(() => EhGalleryPage.fromLink(\"https://${uri.host}${uri.path}\"));\n      }\n    case \"nhentai.net\":\n      if(uri.path.contains(\"/g/\")){\n        context.to(() => NhentaiComicPage(uri.pathSegments.firstWhere((element) => element.isNum)));\n      }\n    case \"hitomi.la\":\n      if([\"doujinshi\", \"cg\", \"manga\"].contains(uri.pathSegments[0])){\n        context.to(() => HitomiComicPage.fromLink(\"https://${uri.host}${uri.path}\"));\n      }else{\n        showToast(message: \"Unknown Link\");\n        return false;\n      }\n    default:\n      return false;\n  }\n  return true;\n}"
  },
  {
    "path": "lib/tools/background_service.dart",
    "content": "import 'dart:ui';\nimport 'package:flutter/cupertino.dart';\nimport 'package:pica_comic/comic_source/built_in/picacg.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:workmanager/workmanager.dart';\nimport '../base.dart';\nimport '../network/picacg_network/methods.dart';\nimport 'notification.dart';\n\n@pragma('vm:entry-point')\nvoid onStart() {\n  WidgetsFlutterBinding.ensureInitialized();\n  DartPluginRegistrant.ensureInitialized();\n  Workmanager().executeTask((taskName, inputData) async{\n    await App.init();\n    appdata = Appdata();\n    await appdata.readData();\n    var notifications = Notifications();\n    await notifications.init();\n    if (picacg.data['token'] != \"\") {\n      var userInfo = await network.getProfile(false);\n      if (userInfo.error) {\n        return true;\n      }\n      if (userInfo.data.isPunched == false) {\n        var res = await network.punchIn();\n        if (res) {\n          notifications.sendUnimportantNotification(\"自动打卡\", \"成功签到\");\n          return true;\n        }\n      } else {\n        return true;\n      }\n    }\n    return true;\n  });\n}\n\nvoid runBackgroundService() async{\n  await Workmanager().cancelAll();\n  await Workmanager().registerPeriodicTask(\n    \"Piacg PunchIn\",\n    \"打卡\",\n    frequency: const Duration(minutes: 1440),\n    constraints: Constraints(networkType: NetworkType.connected),\n  );\n}\n\nvoid cancelBackgroundService() async{\n  await Workmanager().cancelAll();\n}"
  },
  {
    "path": "lib/tools/block_screenshot.dart",
    "content": "import 'package:flutter/services.dart';\n\nvoid blockScreenshot(){\n  const MethodChannel(\"com.kokoiro.xyz.pica_comic/screenshot\").invokeMethod(\"blockScreenshot\");\n}"
  },
  {
    "path": "lib/tools/cache_auto_clear.dart",
    "content": "import 'dart:io';\nimport 'package:flutter/foundation.dart';\nimport 'package:path_provider/path_provider.dart';\n\n/// 清除长期未使用的缓存\nFuture<void> _autoClearCache(String cachePath) async{\n  var imageCachePath = Directory(\"$cachePath${Platform.pathSeparator}imageCache\");\n  var networkCachePath = Directory(\"$cachePath${Platform.pathSeparator}cachedNetwork\");\n  var time = DateTime.now();\n  if(imageCachePath.existsSync()){\n    for(var file in imageCachePath.listSync()){\n      if(file is File){\n        if(time.millisecondsSinceEpoch - file.lastAccessedSync().millisecondsSinceEpoch > 604800000){\n          file.deleteSync();\n        }\n      }\n    }\n  }\n  if(networkCachePath.existsSync()){\n    for(var file in networkCachePath.listSync()){\n      if(file is File){\n        if(time.millisecondsSinceEpoch - file.lastAccessedSync().millisecondsSinceEpoch > 604800000){\n          file.deleteSync();\n        }\n      }\n    }\n  }\n}\n\n/// 清除长期未使用的缓存\nFuture<void> startClearCache() async{\n  var cachePath = await getTemporaryDirectory();\n  return await compute(_autoClearCache, cachePath.path);\n}"
  },
  {
    "path": "lib/tools/debug.dart",
    "content": "///用于测试函数\nvoid debug() async {\n\n}\n"
  },
  {
    "path": "lib/tools/extensions.dart",
    "content": "extension ListExtension<T> on List<T>{\n  /// Remove all blank value and return the list.\n  List<T> getNoBlankList(){\n    List<T> newList = [];\n    for(var value in this){\n      if(value.toString() != \"\"){\n        newList.add(value);\n      }\n    }\n    return newList;\n  }\n\n  T? firstWhereOrNull(bool Function(T element) test){\n    for(var element in this){\n      if(test(element)){\n        return element;\n      }\n    }\n    return null;\n  }\n\n  void addIfNotNull(T? value){\n    if(value != null){\n      add(value);\n    }\n  }\n}\n\nextension StringExtension on String{\n  ///Remove all value that would display blank on the screen.\n  String get removeAllBlank => replaceAll(\"\\n\", \"\").replaceAll(\" \", \"\").replaceAll(\"\\t\", \"\");\n\n  /// convert this to a one-element list.\n  List<String> toList() => [this];\n\n  String _nums(){\n    String res = \"\";\n    for(int i=0; i<length; i++){\n      res += this[i].isNum?this[i]:\"\";\n    }\n    return res;\n  }\n\n  String get nums => _nums();\n\n  String setValueAt(String value, int index){\n    return replaceRange(index, index+1, value);\n  }\n\n  String? subStringOrNull(int start, [int? end]){\n    if(start < 0 || (end != null && end > length)){\n      return null;\n    }\n    return substring(start, end);\n  }\n\n  String replaceLast(String from, String to) {\n    if (isEmpty || from.isEmpty) {\n      return this;\n    }\n\n    final lastIndex = lastIndexOf(from);\n    if (lastIndex == -1) {\n      return this;\n    }\n\n    final before = substring(0, lastIndex);\n    final after = substring(lastIndex + from.length);\n    return '$before$to$after';\n  }\n\n  static bool hasMatch(String? value, String pattern) {\n    return (value == null) ? false : RegExp(pattern).hasMatch(value);\n  }\n\n  bool _isURL(){\n    final regex = RegExp(\n        r'^((http|https|ftp)://)?[\\w-]+(\\.[\\w-]+)+([\\w.,@?^=%&:/~+#-|]*[\\w@?^=%&/~+#-])?$',\n        caseSensitive: false);\n    return regex.hasMatch(this);\n  }\n\n  bool get isURL => _isURL();\n\n  bool get isNum => double.tryParse(this) != null;\n}\n\nextension MapExtension<S, T> on Map<S, List<T>>{\n  int _getTotalLength(){\n    int res = 0;\n    for(var l in values.toList()){\n      res += l.length;\n    }\n    return res;\n  }\n\n  int get totalLength => _getTotalLength();\n}\n\nclass ListOrNull{\n  static List<T>? from<T>(Iterable<dynamic>? i){\n    return i == null ? null : List.from(i);\n  }\n}\n"
  },
  {
    "path": "lib/tools/file_type.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:mime/mime.dart';\n\nclass FileType {\n  final String ext;\n  final String mime;\n\n  const FileType(this.ext, this.mime);\n}\n\nFileType detectFileType(List<int> data) {\n  var mime = lookupMimeType('no-file', headerBytes: data);\n  var ext = mime == null ? '' : extensionFromMime(mime);\n  if(ext == 'jpe') {\n    ext = 'jpg';\n  }\n  return FileType(\".$ext\", mime ?? 'application/octet-stream');\n}"
  },
  {
    "path": "lib/tools/io_extensions.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:pica_comic/tools/extensions.dart';\n\nextension FileSystemEntityExt on FileSystemEntity{\n  String get name {\n    var path = this.path;\n    if(path.endsWith('/') || path.endsWith('\\\\')){\n      path = path.substring(0, path.length-1);\n    }\n\n    int i = path.length - 1;\n\n    while(i >= 0 && path[i] != '\\\\' && path[i] != '/'){\n      i--;\n    }\n\n    return path.substring(i+1);\n  }\n\n  Future<void> deleteIgnoreError({bool recursive = false}) async{\n    try{\n      await delete(recursive: recursive);\n    }catch(e){\n      // ignore\n    }\n  }\n}\n\nextension FileExtension on File{\n  /// Get file size information in MB\n  double getMBSizeSync(){\n    var bytes = lengthSync();\n    return bytes/1024/1024;\n  }\n\n  String get extension => path.split('.').last;\n}\n\nextension DirectoryExtension on Directory{\n  /// Get directory size information in MB\n  ///\n  /// if directory is not exist, return 0;\n  double getMBSizeSync(){\n    if(!existsSync()) return 0;\n    double total = 0;\n    for(var f in listSync(recursive: true)){\n      if(FileSystemEntity.typeSync(f.path)==FileSystemEntityType.file){\n        total += File(f.path).lengthSync()/1024/1024;\n      }\n    }\n    return total;\n  }\n\n  Future<int> get size async{\n    if(!existsSync()) return 0;\n    int total = 0;\n    for(var f in listSync(recursive: true)){\n      if(FileSystemEntity.typeSync(f.path)==FileSystemEntityType.file){\n        total += await File(f.path).length();\n      }\n    }\n    return total;\n  }\n\n  Directory renameX(String newName){\n    newName = sanitizeFileName(newName);\n    return renameSync(path.replaceLast(name, newName));\n  }\n}\n\nString sanitizeFileName(String fileName) {\n  const maxLength = 255;\n  final invalidChars = RegExp(r'[<>:\"/\\\\|?*]');\n  final sanitizedFileName = fileName.replaceAll(invalidChars, ' ');\n  var trimmedFileName = sanitizedFileName.trim();\n  if (trimmedFileName.isEmpty) {\n    throw Exception('Invalid File Name: Empty length.');\n  }\n  while(true){\n    final bytes = utf8.encode(trimmedFileName);\n    if (bytes.length > maxLength) {\n      trimmedFileName = trimmedFileName.substring(0, trimmedFileName.length-1);\n    }else{\n      break;\n    }\n  }\n  return trimmedFileName;\n}\n\nString findValidDirectoryName(String path, String directory) {\n  var name = sanitizeFileName(directory);\n  var dir = Directory(\"$path/$name\");\n  var i = 1;\n  while(dir.existsSync()){\n    name = sanitizeFileName(\"$directory($i)\");\n    dir = Directory(\"$path/$name\");\n    i++;\n  }\n  return name;\n}"
  },
  {
    "path": "lib/tools/io_tools.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:isolate';\n\nimport 'package:file_selector/file_selector.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter_file_dialog/flutter_file_dialog.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:pica_comic/base.dart';\nimport 'package:pica_comic/comic_source/comic_source.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/cache_manager.dart';\nimport 'package:pica_comic/foundation/history.dart';\nimport 'package:pica_comic/foundation/local_favorites.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/network/cookie_jar.dart';\nimport 'package:pica_comic/network/download.dart';\nimport 'package:pica_comic/network/download_model.dart';\nimport 'package:pica_comic/tools/io_extensions.dart';\nimport 'package:zip_flutter/zip_flutter.dart';\n\nimport '../foundation/app.dart';\n\nFuture<double> getFolderSize(Directory path) async {\n  double total = 0;\n  for (var f in path.listSync(recursive: true)) {\n    if (FileSystemEntity.typeSync(f.path) == FileSystemEntityType.file) {\n      total += File(f.path).lengthSync() / 1024 / 1024;\n    }\n  }\n  return total;\n}\n\nFuture<bool> exportComic(String id, String name,\n    [List<String>? epNames]) async {\n  try {\n    name = sanitizeFileName(name);\n    var data = ExportComicData(\n      id,\n      downloadManager.path!,\n      name,\n      epNames,\n      downloadManager.getDirectory(id),\n    );\n    var res = await compute(runningExportComic, data);\n    if (!res) {\n      return false;\n    }\n\n    if (App.isMobile) {\n      var params =\n          SaveFileDialogParams(sourceFilePath: '${data.path}$pathSep$name.zip');\n      await FlutterFileDialog.saveFile(params: params);\n    } else {\n      final FileSaveLocation? result =\n          await getSaveLocation(suggestedName: '$name.zip');\n\n      if (result != null) {\n        const String mimeType = 'application/zip';\n        final XFile textFile =\n            XFile('${data.path}$pathSep$name.zip', mimeType: mimeType);\n        await textFile.saveTo(result.path);\n      }\n    }\n\n    var file = File('${data.path}$pathSep$name.zip');\n    file.delete();\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nFuture<bool> exportComics(List<DownloadedItem> comics) async {\n  try {\n    var exportDatas = <ExportComicData>[];\n    for (var comic in comics) {\n      var id = comic.id;\n      var name = sanitizeFileName(comic.name);\n      var path = downloadManager.path;\n      var epNames = comic.eps;\n      exportDatas.add(ExportComicData(\n        id,\n        path!,\n        name,\n        epNames,\n        downloadManager.getDirectory(id),\n      ));\n    }\n    await Isolate.run(() => runningExportComics(exportDatas));\n    if (App.isMobile) {\n      var params = SaveFileDialogParams(\n          sourceFilePath: '${downloadManager.path}/comics.zip');\n      await FlutterFileDialog.saveFile(params: params);\n    } else {\n      final FileSaveLocation? result =\n          await getSaveLocation(suggestedName: 'comics.zip');\n\n      if (result != null) {\n        const String mimeType = 'application/zip';\n        final XFile textFile =\n            XFile('${downloadManager.path}/comics.zip', mimeType: mimeType);\n        await textFile.saveTo(result.path);\n      }\n    }\n    var file = File('${downloadManager.path}/comics.zip');\n    if (file.existsSync()) {\n      file.delete();\n    }\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nFuture<bool> exportPdf(String pdfPath) async {\n  try {\n    if (App.isMobile) {\n      var params = SaveFileDialogParams(sourceFilePath: pdfPath);\n      await FlutterFileDialog.saveFile(params: params);\n    } else {\n      final FileSaveLocation? result = await getSaveLocation(\n        suggestedName: File(pdfPath).name,\n        acceptedTypeGroups: [const XTypeGroup(label: 'pdf', extensions: ['pdf'])],\n      );\n\n      if (result != null) {\n        const String mimeType = 'application/pdf';\n        final XFile textFile = XFile(pdfPath, mimeType: mimeType);\n        await textFile.saveTo(result.path);\n      }\n    }\n    if (File(pdfPath).existsSync()) {\n      File(pdfPath).delete();\n    }\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nclass ExportComicData {\n  String id;\n  String path;\n  String name;\n  String directory;\n  List<String>? epNames;\n\n  ExportComicData(this.id, this.path, this.name, this.epNames, this.directory);\n}\n\nFuture<bool> runningExportComic(ExportComicData data) async {\n  final fileName = '${data.path}/${data.name}.zip';\n  try {\n    final path = Directory(\"${data.path}/${data.directory}\");\n    var zipFile = ZipFile.open(fileName);\n    String? currentDirName;\n\n    void walk(String path) {\n      for (var entry in Directory(path).listSync()) {\n        if (entry is Directory) {\n          var index = int.parse(entry.name) - 1;\n          currentDirName = sanitizeFileName(\n              data.epNames?.elementAtOrNull(index) ?? \"Chapter ${index + 1}\");\n          walk(entry.path);\n        } else {\n          var filePathInZip = sanitizeFileName(data.name);\n          if (currentDirName != null) {\n            filePathInZip += \"/$currentDirName\";\n          }\n          filePathInZip += \"/${entry.name}\";\n          zipFile.addFile(filePathInZip, entry.path);\n        }\n      }\n    }\n\n    walk(path.path);\n    zipFile.close();\n    return true;\n  } catch (e, s) {\n    LogManager.addLog(LogLevel.error, \"IO\", \"$e\\n$s\");\n    return false;\n  }\n}\n\nFuture<bool> runningExportComics(List<ExportComicData> datas) async {\n  try {\n    var result = \"${datas.first.path}/comics.zip\";\n    if (File(result).existsSync()) {\n      File(result).deleteSync();\n    }\n    var zipFile = ZipFile.open(result);\n    for (var data in datas) {\n      final directory = Directory('${data.path}/${data.directory}');\n\n      String? currentDirName;\n\n      void walk(String path) {\n        for (var entry in Directory(path).listSync()) {\n          if (entry is Directory) {\n            var index = int.parse(entry.name) - 1;\n            currentDirName = sanitizeFileName(\n                data.epNames?.elementAtOrNull(index) ?? \"Chapter ${index + 1}\");\n            walk(entry.path);\n          } else {\n            var filePathInZip = sanitizeFileName(data.name);\n            if (currentDirName != null) {\n              filePathInZip += \"/$currentDirName\";\n            }\n            filePathInZip += \"/${entry.name}\";\n            zipFile.addFile(filePathInZip, entry.path);\n          }\n        }\n      }\n\n      walk(directory.path);\n    }\n    zipFile.close();\n    return true;\n  } catch (e, s) {\n    LogManager.addLog(LogLevel.error, \"IO\", \"$e\\n$s\");\n    return false;\n  }\n}\n\nFuture<void> eraseCache() async {\n  return CacheManager().clear();\n}\n\nFuture<void> copyDirectory(Directory source, Directory destination) async {\n  try {\n    List<FileSystemEntity> contents = source.listSync();\n    for (FileSystemEntity content in contents) {\n      String newPath = destination.path +\n          Platform.pathSeparator +\n          content.path.split(Platform.pathSeparator).last;\n\n      if (content is File) {\n        content.copySync(newPath);\n      } else if (content is Directory) {\n        Directory newDirectory = Directory(newPath);\n        newDirectory.createSync();\n        copyDirectory(content.absolute, newDirectory.absolute);\n      }\n    }\n  } catch (e, s) {\n    LogManager.addLog(LogLevel.error, \"IO\", \"$e\\n$s\");\n    rethrow;\n  }\n}\n\n/// move all files and directories from source to destination\nFuture<void> moveDirectory(Directory source, Directory destination) async {\n  try {\n    source = source.absolute;\n    destination = destination.absolute;\n    List<FileSystemEntity> contents = source.listSync();\n    for (FileSystemEntity content in contents) {\n      if (content is File) {\n        await content\n            .rename(destination.path + Platform.pathSeparator + content.name);\n      } else if (content is Directory) {\n        Directory newDirectory =\n            Directory(destination.path + Platform.pathSeparator + content.name);\n        newDirectory.createSync(recursive: true);\n        await moveDirectory(content, newDirectory);\n      }\n    }\n    await source.deleteIgnoreError(recursive: true);\n  } catch (e, s) {\n    LogManager.addLog(LogLevel.error, \"IO\", \"$e\\n$s\");\n    rethrow;\n  }\n}\n\n///检查下载目录是否可用, 不可用则重置\nFuture<void> checkDownloadPath() async {\n  var path = appdata.settings[22];\n  if (path != \"\") {\n    var directory = Directory(path);\n    if (!directory.existsSync()) {\n      appdata.settings[22] = \"\";\n      appdata.updateSettings();\n    }\n  }\n}\n\nFuture<String?> _exportData(String path, String appdataString,\n    String? downloadPath, String outPath) async {\n  var encode = ZipFile.open(outPath);\n  try {\n    var filePath = \"$path${pathSep}appdata\";\n    var file = File(filePath);\n    if (file.existsSync()) {\n      file.deleteSync();\n    }\n    file.createSync();\n    file.writeAsStringSync(appdataString);\n    encode.addFile(file.uri.pathSegments.last, file.path);\n    var localFavorite = File(\"$path${pathSep}local_favorite.db\");\n    var history = File(\"$path${pathSep}history.db\");\n    if (!localFavorite.existsSync()) {\n      localFavorite.createSync();\n    }\n    if (!history.existsSync()) {\n      history.createSync();\n    }\n    encode.addFile(\n        localFavorite.name, localFavorite.path.replaceAll(\"\\\\\", \"/\"));\n    encode.addFile(history.name, history.path);\n    encode.addFile('cookies.db', \"$path/cookies.db\");\n    await for (var entry in Directory(\"$path/comic_source\").list()) {\n      if (entry is File) {\n        encode.addFile('comic_source/${entry.name}', entry.path);\n      }\n    }\n    if (downloadPath != null) {\n      downloadPath = downloadPath.replaceAll('\\\\', '/');\n      var sourceFolder =\n          downloadPath.substring(0, downloadPath.lastIndexOf('/'));\n      void walk(String path) {\n        for (var entry in Directory(path).listSync()) {\n          if (entry is Directory) {\n            walk(entry.path);\n          } else {\n            var filePathInZip = entry.path.replaceFirst(sourceFolder, \"\");\n            if (filePathInZip.startsWith('/') ||\n                filePathInZip.startsWith('\\\\')) {\n              filePathInZip = filePathInZip.substring(1);\n            }\n            encode.addFile(filePathInZip, entry.path);\n          }\n        }\n      }\n\n      walk(downloadPath);\n    }\n    return null;\n  } catch (e) {\n    return e.toString();\n  } finally {\n    encode.close();\n  }\n}\n\nFuture<String> exportDataToFile(bool includeDownload, String outPath) async {\n  var path = App.dataPath;\n  try {\n    var appdataString = const JsonEncoder().convert(appdata.toJson());\n    var downloadPath = includeDownload ? DownloadManager().path : null;\n    var res = await compute<List<String?>, String?>(\n        (message) =>\n            _exportData(message[0]!, message[1]!, message[2], message[3]!),\n        [path, appdataString, downloadPath, outPath]);\n\n    if (res != null) {\n      throw Exception(res);\n    }\n  } catch (e, s) {\n    LogManager.addLog(LogLevel.error, \"IO\", \"$e\\n$s\");\n    rethrow;\n  }\n  return outPath;\n}\n\nFuture<bool> runExportData(bool includeDownload) async {\n  try {\n    var outPath = '${App.cachePath}/userdata.picadata';\n    if (App.isDesktop) {\n      final FileSaveLocation? result =\n          await getSaveLocation(suggestedName: 'userData.picadata');\n      if (result == null) {\n        return true;\n      }\n      outPath = result.path;\n    }\n    if (await File(outPath).exists()) {\n      await File(outPath).delete();\n    }\n    await exportDataToFile(includeDownload, outPath);\n\n    var dialog = showLoadingDialog(\n      App.globalContext!,\n      barrierDismissible: false,\n      allowCancel: false,\n    );\n\n    if (App.isMobile) {\n      var params = SaveFileDialogParams(sourceFilePath: outPath);\n      await FlutterFileDialog.saveFile(params: params);\n      File(outPath).delete();\n    }\n\n    dialog.close();\n  } catch (e, s) {\n    LogManager.addLog(LogLevel.error, \"IO\", \"$e\\n$s\");\n    return false;\n  }\n  return true;\n}\n\n/// import data, filePath is used for webdav\nFuture<bool> importData([String? filePath]) async {\n  final enableCheck = filePath != null;\n  var path = (await getApplicationSupportDirectory()).path;\n  if (filePath == null) {\n    if (App.isMobile) {\n      var params = const OpenFileDialogParams();\n      filePath = await FlutterFileDialog.pickFile(params: params);\n    } else {\n      const XTypeGroup typeGroup = XTypeGroup(\n        label: 'data',\n      );\n      final XFile? file =\n          await openFile(acceptedTypeGroups: <XTypeGroup>[typeGroup]);\n      filePath = file?.path;\n    }\n    if (filePath == null) {\n      LogManager.addLog(LogLevel.error, \"importData\", \"filePath is null\");\n      return false;\n    }\n  }\n  SingleInstanceCookieJar.instance?.dispose();\n  DownloadManager().dispose();\n  String data = '';\n  try {\n    data = await compute<List<String>, String>((data) async {\n      var path = data[0];\n      ZipFile.openAndExtract(data[1], \"$path/dataTemp\");\n      var downloadPath = Directory(data[2]);\n      List<FileSystemEntity> contents = Directory(\"$path/dataTemp\").listSync();\n      for (FileSystemEntity item in contents) {\n        if (item is Directory) {\n          if (item.name != \"comic_source\" && item.name != \"download\") {\n            item.renameSync('$path/dataTemp/download');\n          }\n        }\n      }\n      final json = File(\"$path/dataTemp/appdata\").readAsStringSync();\n      int fileVersion = int.parse(\n          ((const JsonDecoder().convert(json))[\"settings\"] as List)\n                  .elementAtOrNull(46) ??\n              \"1\");\n      if (fileVersion <= int.parse(data[3]) && data[4] == \"1\") {\n        return json;\n      }\n      var localFavorite = File('$path/dataTemp/localFavorite');\n      if (localFavorite.existsSync()) {\n        localFavorite.copySync('$path/localFavorite');\n      } else {\n        var localFavorite2 = File('$path/dataTemp/local_favorite.db');\n        localFavorite2.copySync('$path/local_favorite_temp.db');\n      }\n      var history = File('$path/dataTemp/history.db');\n      if (history.existsSync()) {\n        history.copySync('$path/history_temp.db');\n      }\n      var comicSource = Directory('$path/dataTemp/comic_source');\n      if (comicSource.existsSync()) {\n        Directory(\"$path/comic_source\").deleteSync(recursive: true);\n        comicSource.renameSync('$path/comic_source');\n      }\n      var cookies = File('$path/dataTemp/cookies.db');\n      if (cookies.existsSync()) {\n        cookies.copySync('$path/cookies.db');\n      }\n      var downloadData = Directory(\"$path/dataTemp/download\");\n      if (downloadData.existsSync()) {\n        downloadPath.deleteSync(recursive: true);\n        downloadPath.createSync();\n        await moveDirectory(downloadData, downloadPath);\n      }\n      return json;\n    }, [\n      path,\n      filePath,\n      DownloadManager().path!,\n      appdata.settings[46],\n      (enableCheck ? \"1\" : \"0\")\n    ]);\n  } catch (e, s) {\n    Log.error(\"importData\", \"$e\\n$s\");\n    return false;\n  } finally {\n    await ComicSource.reload();\n    SingleInstanceCookieJar.instance?.init();\n    await DownloadManager().init();\n    Directory(\"$path/dataTemp\").deleteSync(recursive: true);\n  }\n  var json = const JsonDecoder().convert(data);\n  int fileVersion =\n      int.parse((json[\"settings\"] as List).elementAtOrNull(46) ?? \"1\");\n  int appVersion = int.parse(appdata.settings[46]);\n  if (fileVersion <= appVersion && enableCheck) {\n    LogManager.addLog(\n        LogLevel.info,\n        \"Appdata\",\n        \"The data file version is $fileVersion, while the app data version is \"\n            \"$appVersion\\nStop importing data\");\n  }\n  var dataReadRes = appdata.readDataFromJson(json);\n  if (!dataReadRes) {\n    LogManager.addLog(\n        LogLevel.error, \"Appdata\", \"appdata.readDataFromJson(json) failed\");\n    return false;\n  }\n  await LocalFavoritesManager().readData();\n  LocalFavoritesManager().updateUI();\n  await HistoryManager().tryUpdateDb();\n  return true;\n}\n\nvoid saveLog(String log) async {\n  var path = (await getTemporaryDirectory()).path;\n  var file = File(\"$path${pathSep}logs.txt\");\n  file.writeAsStringSync(log);\n  if (App.isMobile) {\n    var params =\n        SaveFileDialogParams(sourceFilePath: \"$path${pathSep}logs.txt\");\n    await FlutterFileDialog.saveFile(params: params);\n  } else {\n    final String? directoryPath = await getDirectoryPath();\n    if (directoryPath != null) {\n      await file.copy(\"$directoryPath${pathSep}logs.txt\");\n    }\n  }\n}\n\nFuture<void> exportStringDataAsFile(String data, String fileName) async {\n  if (App.isMobile) {\n    var cachePath = (await getApplicationCacheDirectory()).path;\n    var file = File(\"$cachePath$pathSep$fileName\");\n    if (!file.existsSync()) {\n      file.createSync();\n    }\n    file.writeAsStringSync(data);\n    var params = SaveFileDialogParams(sourceFilePath: file.path);\n    await FlutterFileDialog.saveFile(params: params);\n  } else {\n    final FileSaveLocation? result =\n        await getSaveLocation(suggestedName: fileName);\n    if (result == null) {\n      return;\n    }\n\n    final Uint8List fileData =\n        Uint8List.fromList(const Utf8Encoder().convert(data));\n    const String mimeType = 'text/plain';\n    final XFile textFile =\n        XFile.fromData(fileData, mimeType: mimeType, name: fileName);\n    await textFile.saveTo(result.path);\n  }\n}\n\nFuture<String?> getDataFromUserSelectedFile(List<String> extensions) async {\n  String? filePath;\n  if (App.isMobile) {\n    var params = const OpenFileDialogParams();\n    filePath = await FlutterFileDialog.pickFile(params: params);\n  } else {\n    XTypeGroup typeGroup = XTypeGroup(\n      label: 'data',\n      extensions: extensions,\n    );\n    final XFile? file =\n        await openFile(acceptedTypeGroups: <XTypeGroup>[typeGroup]);\n    filePath = file?.path;\n  }\n  if (filePath == null) {\n    return null;\n  }\n  return File(filePath).readAsStringSync();\n}\n\nextension FileExtension on File {\n  String get name => uri.pathSegments.last;\n}\n\nString bytesLengthToReadableSize(int size) {\n  if (size < 1024) {\n    return \"$size B\";\n  } else if (size < 1024 * 1024) {\n    return \"${(size / 1024).toStringAsFixed(2)} KB\";\n  } else if (size < 1024 * 1024 * 1024) {\n    return \"${(size / 1024 / 1024).toStringAsFixed(2)} MB\";\n  } else {\n    return \"${(size / 1024 / 1024 / 1024).toStringAsFixed(2)} GB\";\n  }\n}\n"
  },
  {
    "path": "lib/tools/js.dart",
    "content": "///解析JS代码, 返回定义的变量, Js代码必须合法\nMap<String, String> getVariablesFromJsCode(String html){\n  Map<String, String> variables = {};\n\n  RegExp variableRegex = RegExp(r\"var\\s+(\\w+)\\s*=\\s*(.*?);\");\n  var matches = variableRegex.allMatches(html);\n\n  for (Match match in matches) {\n    if(match.group(2)![0]==\"\\\"\" || match.group(2)![0]==\"'\"){\n      variables[match.group(1)!] = match.group(2)!.substring(1,match.group(2)!.length-1);\n    }else {\n      variables[match.group(1)!] = match.group(2)!;\n    }\n  }\n  return variables;\n}"
  },
  {
    "path": "lib/tools/keep_screen_on.dart",
    "content": "import 'package:flutter/services.dart';\nimport 'package:pica_comic/foundation/app.dart';\n\n\nvoid setKeepScreenOn() async{\n  if(!App.isMobile)  return;\n  var channel = const MethodChannel(\"com.kokoiro.xyz.pica_comic/keepScreenOn\");\n  await channel.invokeMethod(\"set\");\n}\n\nvoid cancelKeepScreenOn() async{\n  if(!App.isMobile)  return;\n  var channel = const MethodChannel(\"com.kokoiro.xyz.pica_comic/keepScreenOn\");\n  await channel.invokeMethod(\"cancel\");\n}"
  },
  {
    "path": "lib/tools/key_down_event.dart",
    "content": "import 'dart:async';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/foundation/app.dart';\n\nclass ListenVolumeController{\n  void Function() whenUp;\n  void Function() whenDown;\n  static const channel = EventChannel(\"com.kokoiro.xyz.pica_comic/volume\");\n  StreamSubscription? _streamSubscription;\n\n  ListenVolumeController(this.whenUp,this.whenDown);\n\n  void listenVolumeChange(){\n    if(!App.isMobile)  return;\n    _streamSubscription = channel.receiveBroadcastStream().listen((event) {\n      if(event == 1){\n        whenUp();\n      }else if(event==2){\n        whenDown();\n      }\n    });\n  }\n\n  void stop(){\n    if(!App.isMobile)  return;\n    _streamSubscription?.cancel();\n  }\n}\n\n"
  },
  {
    "path": "lib/tools/mouse_listener.dart",
    "content": "import 'package:flutter/services.dart';\nimport '../foundation/app.dart';\n\nvoid mouseSideButtonCallback(){\n  if(App.canPop){\n    App.globalBack();\n  } else if(App.mainNavigatorKey!.currentState!.canPop()){\n    App.mainNavigatorKey!.currentState!.pop();\n  }\n}\n\n///监听鼠标侧键, 若为下键, 则调用返回\nvoid listenMouseSideButtonToBack() async{\n  if(!App.isWindows){\n    return;\n  }\n  const channel = EventChannel(\"kokoiro.xyz.pica_comic/mouse\");\n  await for(var res in channel.receiveBroadcastStream()){\n    if(res == 0){\n      mouseSideButtonCallback();\n    }\n  }\n}"
  },
  {
    "path": "lib/tools/notification.dart",
    "content": "import 'package:flutter_local_notifications/flutter_local_notifications.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:pica_comic/pages/downloading_page.dart';\nimport '../foundation/app.dart';\n\nclass Notifications {\n  FlutterLocalNotificationsPlugin? flutterLocalNotificationsPlugin;\n  final progressId = 72382;\n\n  Future<bool?> requestPermission() async {\n    try {\n      if (App.isAndroid) {\n        return await flutterLocalNotificationsPlugin!\n            .resolvePlatformSpecificImplementation<\n                AndroidFlutterLocalNotificationsPlugin>()!\n            .requestNotificationsPermission();\n      } else if (App.isIOS) {\n        return await flutterLocalNotificationsPlugin\n            ?.resolvePlatformSpecificImplementation<\n                IOSFlutterLocalNotificationsPlugin>()\n            ?.requestPermissions(\n              alert: true,\n              badge: true,\n              sound: true,\n            );\n      }\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  Future<void> init() async {\n    if (!(App.isAndroid || App.isIOS)) return;\n    flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();\n    const AndroidInitializationSettings initializationSettingsAndroid =\n        AndroidInitializationSettings('@drawable/notification');\n    final DarwinInitializationSettings initializationSettingsDarwin =\n        DarwinInitializationSettings(\n            onDidReceiveLocalNotification: onDidReceiveLocalNotification);\n    InitializationSettings initializationSettings = InitializationSettings(\n      android: initializationSettingsAndroid,\n      iOS: initializationSettingsDarwin,\n    );\n    await flutterLocalNotificationsPlugin!.initialize(initializationSettings,\n        onDidReceiveNotificationResponse: onDidReceiveNotificationResponse);\n  }\n\n  void onDidReceiveNotificationResponse(\n      NotificationResponse notificationResponse) async {\n    if (!(App.isAndroid || App.isIOS)) return;\n    final String? payload = notificationResponse.payload;\n    if (payload != \"item y\") {\n      App.globalTo(() => const DownloadingPage());\n    }\n  }\n\n  void onDidReceiveLocalNotification(\n      int id, String? title, String? body, String? payload) async {\n    if (payload != \"item y\") {\n      App.globalTo(() => const DownloadingPage());\n    }\n  }\n\n  void sendProgressNotification(\n      int progress, int total, String title, String content) async {\n    if (!(App.isAndroid || App.isIOS)) return;\n    AndroidNotificationDetails androidNotificationDetails =\n        AndroidNotificationDetails('download', '下载漫画'.tl,\n            channelDescription: '显示下载进度'.tl,\n            importance: Importance.low,\n            priority: Priority.low,\n            showProgress: true,\n            maxProgress: total,\n            progress: progress,\n            ongoing: true,\n            onlyAlertOnce: true,\n            autoCancel: false);\n    DarwinNotificationDetails ios = const DarwinNotificationDetails(\n        presentSound: false, presentAlert: false, presentBadge: false,\n        presentBanner: false);\n    NotificationDetails notificationDetails =\n        NotificationDetails(android: androidNotificationDetails, iOS: ios);\n    await flutterLocalNotificationsPlugin!.show(\n        progressId, title, content, notificationDetails,\n        payload: 'item x');\n  }\n\n  void endProgress() async {\n    if (!(App.isAndroid || App.isIOS)) return;\n    await flutterLocalNotificationsPlugin!.cancel(progressId);\n  }\n\n  void cancelAll() async {\n    if (!(App.isAndroid || App.isIOS)) return;\n    try {\n      await flutterLocalNotificationsPlugin!.cancelAll();\n    } catch (e) {\n      // ignore\n    }\n  }\n\n  void sendNotification(String title, String content) async {\n    if (!(App.isAndroid || App.isIOS)) return;\n    AndroidNotificationDetails androidNotificationDetails =\n        const AndroidNotificationDetails(\n      'PicaComic',\n      'notification',\n      channelDescription: 'notification',\n      importance: Importance.max,\n      priority: Priority.max,\n    );\n    DarwinNotificationDetails ios = const DarwinNotificationDetails();\n    NotificationDetails notificationDetails =\n        NotificationDetails(android: androidNotificationDetails, iOS: ios);\n    await flutterLocalNotificationsPlugin!\n        .show(1145140, title, content, notificationDetails, payload: 'item x');\n  }\n\n  void sendUnimportantNotification(String title, String content) async {\n    if (!(App.isAndroid || App.isIOS)) return;\n    AndroidNotificationDetails androidNotificationDetails =\n        const AndroidNotificationDetails(\n      'punchIN',\n      '打卡',\n      channelDescription: '打卡',\n      importance: Importance.low,\n      priority: Priority.low,\n    );\n\n    DarwinNotificationDetails ios = const DarwinNotificationDetails(\n        presentAlert: false, presentSound: false, presentBadge: false);\n\n    NotificationDetails notificationDetails =\n        NotificationDetails(android: androidNotificationDetails, iOS: ios);\n    await flutterLocalNotificationsPlugin!\n        .show(51515568, title, content, notificationDetails, payload: 'item y');\n  }\n}\n"
  },
  {
    "path": "lib/tools/pdf.dart",
    "content": "import 'dart:io';\nimport 'dart:isolate';\n\nimport 'package:flutter/services.dart';\nimport 'package:pdf/widgets.dart';\nimport 'package:pica_comic/foundation/app.dart';\n\nFuture<void> createPdfFromComic({\n  required String title,\n  required String comicPath,\n  required String savePath,\n  required ByteData font,\n  List<String>? chapters,\n  List<int>? chapterIndexes,\n}) async{\n  final pdf = Document(\n    theme: ThemeData(\n      defaultTextStyle: TextStyle(\n        font: Font.ttf(font)\n      )\n    )\n  );\n\n  // add cover\n  var imageData = File(\"$comicPath/cover.jpg\").readAsBytesSync();\n  pdf.addPage(Page(\n    build: (Context context) {\n      return Column(\n        children: [\n          SizedBox(\n            width: double.infinity,\n            height: 100,\n            child: Center(\n              child: Text(title, style: const TextStyle(fontSize: 20)),\n            )\n          ),\n          Expanded(\n            child: Image(MemoryImage(imageData), fit: BoxFit.contain)\n          )\n        ]\n      );\n    },\n  ));\n\n  bool multiChapters = !(File(\"$comicPath/0.jpg\").existsSync()\n      || File(\"$comicPath/0.png\").existsSync()\n      || File(\"$comicPath/0.webp\").existsSync()\n      || File(\"$comicPath/0.jpeg\").existsSync()\n      || File(\"$comicPath/0.gif\").existsSync());\n\n  void reorderFiles(List<FileSystemEntity> files) {\n    files.removeWhere((element) =>\n    element is! File ||\n        element.path.contains('info.json') ||\n        element.path.contains('cover.jpg') ||\n        element.path.contains('cover.png') ||\n        element.path.contains('cover.webp') ||\n        element.path.contains('cover.jpeg'));\n    files.sort((a, b) {\n      var aName = (a as File).path.replaceAll('\\\\', '/').split(\"/\").last;\n      var bName = (b as File).path.replaceAll('\\\\', '/').split(\"/\").last;\n      var aIndex = int.parse(aName.split(\".\").first);\n      var bIndex = int.parse(bName.split(\".\").first);\n      return aIndex.compareTo(bIndex);\n    });\n  }\n\n  if(!multiChapters){\n    var files = Directory(comicPath).listSync();\n    reorderFiles(files);\n\n    for (var file in files){\n      var imageData = (file as File).readAsBytesSync();\n      pdf.addPage(Page(\n        build: (Context context) {\n          return Image(MemoryImage(imageData), fit: BoxFit.contain);\n        },\n      ));\n    }\n  } else {\n    for (int current = 0; current < chapterIndexes!.length; current++){\n      var directory = Directory(\"$comicPath/${chapterIndexes[current]+1}\");\n      // add chapter title\n      pdf.addPage(Page(\n        build: (Context context) {\n          return Center(\n            child: Text(chapters![chapterIndexes[current]],\n                style: const TextStyle(fontSize: 20)),\n          );\n        },\n      ));\n\n      var files = directory.listSync();\n      reorderFiles(files);\n\n      for (var file in files){\n        var imageData = (file as File).readAsBytesSync();\n        pdf.addPage(Page(\n          build: (Context context) {\n            return Image(MemoryImage(imageData), fit: BoxFit.contain);\n          },\n        ));\n      }\n    }\n  }\n\n  final file = File(savePath);\n  file.writeAsBytesSync(await pdf.save());\n}\n\nFuture<void> createPdfFromComicWithIsolate({\n  required String title,\n  required String comicPath,\n  required String savePath,\n  List<String>? chapters,\n  List<int>? chapterIndexes,\n}) async{\n  var fontData = await _loadFont();\n\n  return Isolate.run(() => createPdfFromComic(\n    title: title,\n    comicPath: comicPath,\n    savePath: savePath,\n    font: fontData,\n    chapters: chapters,\n    chapterIndexes: chapterIndexes\n  ));\n}\n\nFuture<ByteData> _loadFont() async{\n  if(Platform.isWindows) {\n    return await rootBundle.load(\"fonts/NotoSansSC-Regular.ttf\");\n  }\n  var fontFile = File(\"${App.dataPath}/font.ttf\");\n  if(!fontFile.existsSync()){\n    throw Exception(\"Font file not found\");\n  }\n  return fontFile.readAsBytes().then((value) => ByteData.sublistView(value));\n}"
  },
  {
    "path": "lib/tools/save_image.dart",
    "content": "import 'dart:io';\nimport 'package:file_selector/file_selector.dart';\nimport 'package:image_gallery_saver/image_gallery_saver.dart';\nimport 'package:pica_comic/components/components.dart';\nimport 'package:pica_comic/foundation/log.dart';\nimport 'package:pica_comic/tools/file_type.dart';\nimport 'package:pica_comic/tools/io_tools.dart';\nimport 'package:pica_comic/tools/translations.dart';\nimport 'package:share_plus/share_plus.dart';\n\nimport '../foundation/app.dart';\n\n///保存图片\nvoid saveImage(File file) async {\n  var data = await file.readAsBytes();\n  var type = detectFileType(data);\n  var fileName = file.name;\n  if(!fileName.contains('.')) {\n    fileName += type.ext;\n  }\n  if (App.isAndroid || App.isIOS) {\n    await ImageGallerySaver.saveImage(\n      data,\n      quality: 100,\n      name: fileName,\n    );\n    showToast(message: \"已保存\".tl);\n  } else if (App.isDesktop) {\n    try {\n      final String? path =\n          (await getSaveLocation(suggestedName: fileName))?.path;\n      if (path != null) {\n        final mimeType = type.mime;\n        final XFile xFile =\n            XFile.fromData(data, mimeType: mimeType, name: fileName);\n        await xFile.saveTo(path);\n      }\n    } catch (e, s) {\n      LogManager.addLog(LogLevel.error, \"Save Image\", \"$e\\n$s\");\n    }\n  }\n}\n\nFuture<String> persistentCurrentImage(File file) async {\n  var newFile = File(\"${App.dataPath}/images/${file.path.split('/').last})}\");\n  if (!(await newFile.exists())) {\n    newFile.createSync(recursive: true);\n    newFile.writeAsBytesSync(await file.readAsBytes());\n  }\n  return newFile.path;\n}\n\nvoid shareImage(File file) {\n  Share.shareXFiles([XFile(file.path)]);\n}\n"
  },
  {
    "path": "lib/tools/tags_translation.dart",
    "content": "// The purpose of this file is to translate tags\n\n// Thanks:\n// https://github.com/scooderic/exhentai-tags-chinese-translation\n// https://www.wikipedia.org/\n// https://ehwiki.org/\n// https://hitomi.la/alltags-a.html\n// https://translate.google.com/\n// https://poe.com/\n// https://nhentai.net/tags/\n// https://github.com/EhTagTranslation/Database/tree/master/database\n\nimport 'dart:convert';\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/foundation/app.dart';\nimport 'package:pica_comic/tools/extensions.dart';\n\nextension TagsTranslation on String{\n  static final Map<String, Map<String, String>> _data = {};\n\n  static Future<void> readData() async{\n    var fileName = App.locale.countryCode == 'TW'\n        ? \"assets/tags_tw.json\"\n        : \"assets/tags.json\";\n    var data = await rootBundle.load(fileName);\n    List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);\n    const JsonDecoder().convert(const Utf8Decoder().convert(bytes)).forEach((key, value){\n      _data[key] = {};\n      value.forEach((key1, value1){\n        _data[key]?[key1] = value1;\n      });\n    });\n  }\n\n  static bool _haveNamespace(String key) {\n    return _data.containsKey(key);\n  }\n\n  /// 对tag进行处理后进行翻译: 代表'或'的分割符'|', namespace.\n  static String _translateTags(String tag){\n    if (tag.contains('|')) {\n      var splits = tag.split(' | ');\n      return enTagsTranslations[splits[0]]??enTagsTranslations[splits[1]]??tag;\n    } else if(tag.contains(':')) {\n      var splits = tag.split(':');\n      if(_haveNamespace(splits[0])) {\n        return translationTagWithNamespace(splits[1], splits[0]);\n      } else {\n        return tag;\n      }\n    } else {\n      return enTagsTranslations[tag]??tag;\n    }\n  }\n\n  /// translate tag's text to chinese\n  String get translateTagsToCN => _translateTags(this);\n\n  static String translationTagWithNamespace(String text, String namespace){\n    text = text.toLowerCase();\n    if(text != \"reclass\" && text.endsWith('s')){\n      text.replaceLast('s', '');\n    }\n    return switch(namespace){\n      \"male\" => maleTags[text] ?? text,\n      \"female\" => femaleTags[text] ?? text,\n      \"mixed\" => mixedTags[text] ?? text,\n      \"other\" => otherTags[text] ?? text,\n      \"parody\" => parodyTags[text] ?? text,\n      \"character\" => characterTranslations[text] ?? text,\n      \"group\" => groupTags[text] ?? text,\n      \"cosplayer\" => cosplayerTags[text] ?? text,\n      \"reclass\" => reclassTags[text] ?? text,\n      \"language\" => languageTranslations[text] ?? text,\n      \"artist\" => artistTags[text] ?? text,\n      _ => text.translateTagsToCN\n    };\n  }\n\n  String _categoryTextDynamic(String c){\n    if(App.locale.languageCode == \"zh\"){\n      return translateTagsCategoryToCN;\n    }else{\n      return this;\n    }\n  }\n\n  String get categoryTextDynamic => _categoryTextDynamic(this);\n\n  String get translateTagsCategoryToCN => tagsCategoryTranslations[this]??this;\n\n  get tagsCategoryTranslations => switch(App.locale.countryCode){\n    \"CN\" => tagsCategoryTranslationsCN,\n    \"TW\" => tagsCategoryTranslationsTW,\n    _ => tagsCategoryTranslationsCN\n  };\n\n  static const tagsCategoryTranslationsCN = {\n    \"language\": \"语言\",\n    \"artist\": \"画师\",\n    \"male\": \"男性\",\n    \"female\": \"女性\",\n    \"mixed\": \"混合\",\n    \"other\": \"其它\",\n    \"parody\": \"原作\",\n    \"character\": \"角色\",\n    \"group\": \"团队\",\n    \"cosplayer\": \"Coser\",\n    \"reclass\": \"重新分类\",\n    \"Languages\": \"语言\",\n    \"Artists\": \"画师\",\n    \"Characters\": \"角色\",\n    \"Groups\": \"团队\",\n    \"Tags\": \"标签\",\n    \"Parodies\": \"原作\",\n    \"Categories\": \"分类\",\n    \"Time\": \"时间\"\n  };\n\n  static const tagsCategoryTranslationsTW = {\n    \"language\": \"語言\",\n    \"artist\": \"畫師\",\n    \"male\": \"男性\",\n    \"female\": \"女性\",\n    \"mixed\": \"混合\",\n    \"other\": \"其他\",\n    \"parody\": \"原作\",\n    \"character\": \"角色\",\n    \"group\": \"團隊\",\n    \"cosplayer\": \"Coser\",\n    \"reclass\": \"重新分類\",\n    \"Languages\": \"語言\",\n    \"Artists\": \"畫師\",\n    \"Characters\": \"角色\",\n    \"Groups\": \"團隊\",\n    \"Tags\": \"標籤\",\n    \"Parodies\": \"原作\",\n    \"Categories\": \"分類\",\n    \"Time\": \"時間\"\n  };\n\n  static Map<String, String> get maleTags => _data[\"male\"] ?? const {};\n\n  static Map<String, String> get femaleTags => _data[\"female\"] ?? const {};\n\n  static Map<String, String> get languageTranslations => _data[\"language\"] ?? const {};\n\n  static Map<String, String> get parodyTags => _data[\"parody\"] ?? const {};\n\n  static Map<String, String> get characterTranslations => _data[\"character\"] ?? const {};\n\n  static Map<String, String> get otherTags => _data[\"other\"] ?? const {};\n\n  static Map<String, String> get mixedTags => _data[\"mixed\"] ?? const {};\n\n  static Map<String, String> get characterTags => _data[\"character\"] ?? const {};\n\n  static Map<String, String> get artistTags => _data[\"artist\"] ?? const {};\n\n  static Map<String, String> get groupTags => _data[\"group\"] ?? const {};\n\n  static Map<String, String> get cosplayerTags => _data[\"cosplayer\"] ?? const {};\n\n  static Map<String, String> get reclassTags => _data[\"reclass\"] ?? const {};\n\n  /// English to chinese translations\n  ///\n  /// Not include artists and group\n  static MultipleMap<String, String> get enTagsTranslations => MultipleMap([\n    maleTags, femaleTags, languageTranslations, parodyTags, characterTranslations,\n    otherTags, mixedTags\n  ]);\n}\n\nextension MapExtensions<S,T> on Map<S,T>{\n\n}\n\nenum TranslationType{\n  female, male, mixed, language, other, group, artist, cosplayer, parody,\n  character, reclass\n}\n\nclass MultipleMap<S, T>{\n  final List<Map<S, T>> maps;\n\n  MultipleMap(this.maps);\n\n  T? operator[](S key) {\n    for (var map in maps){\n      var value = map[key];\n      if(value != null){\n        return value;\n      }\n    }\n    return null;\n  }\n}"
  },
  {
    "path": "lib/tools/time.dart",
    "content": "import 'package:intl/intl.dart';\nimport 'package:pica_comic/tools/translations.dart';\n\nString timeToString(DateTime time){\n  var current = DateTime.now();\n  if(current.millisecondsSinceEpoch < time.millisecondsSinceEpoch){\n    return \"Error\";\n  }\n  if(current.difference(time).inDays > 360){\n    return \"@year 年前\".tlParams({\"year\": (current.difference(time).inDays ~/ 360).toString()});\n  }else if(current.difference(time).inDays > 30){\n    return \"@month 个月前\".tlParams({\"month\": (current.difference(time).inDays ~/ 30).toString()});\n  }else if(current.difference(time).inHours > 24){\n    return \"@day 天前\".tlParams({\"day\": (current.difference(time).inDays).toString()});\n  }else if(current.difference(time).inMinutes > 60){\n    return \"@hour 小时前\".tlParams({\"hour\": (current.difference(time).inHours).toString()});\n  }else if(current.difference(time).inSeconds > 60){\n    return \"@minute 分钟前\".tlParams({\"minute\": (current.difference(time).inMinutes).toString()});\n  }else{\n    return \"刚刚\".tl;\n  }\n}\n\nextension TimeExtension on DateTime{\n  Duration operator-(DateTime other){\n    return Duration(microseconds: microsecondsSinceEpoch - other.microsecondsSinceEpoch);\n  }\n  static DateTime parseEhTime(String dateString){\n    final format = DateFormat('d MMMM yyyy, HH:mm', 'en_US');\n    final dateTime = format.parse(dateString);\n    return dateTime;\n  }\n\n  String get toCompareString => timeToString(this);\n}"
  },
  {
    "path": "lib/tools/translations.dart",
    "content": "import 'dart:convert';\n\nimport 'package:flutter/services.dart';\nimport 'package:pica_comic/foundation/app.dart';\n\nextension AppTranslation on String {\n  String _translate() {\n    var locale = App.locale;\n    var key = \"${locale.languageCode}_${locale.countryCode}\";\n    if (locale.languageCode == \"en\") {\n      key = \"en_US\";\n    }\n    return (translations[key]?[this]) ?? this;\n  }\n\n  String get tl => _translate();\n\n  String get tlEN => translations[\"en_US\"]![this] ?? this;\n\n  String tlParams(Map<String, String> values) {\n    var res = _translate();\n    for (var entry in values.entries) {\n      res = res.replaceFirst(\"@${entry.key}\", entry.value);\n    }\n    return res;\n  }\n\n  static late final Map<String, Map<String, String>> translations;\n\n  static Future<void> init() async{\n    var data = await rootBundle.load(\"assets/translation.json\");\n    var json = jsonDecode(utf8.decode(data.buffer.asUint8List()));\n    translations = { for (var e in json.entries) e.key : Map<String, String>.from(e.value) };\n  }\n}\n\nextension ListTranslation on List<String> {\n  List<String> _translate() {\n    return List.generate(length, (index) => this[index].tl);\n  }\n\n  List<String> get tl => _translate();\n}\n"
  },
  {
    "path": "linux/.gitignore",
    "content": "flutter/ephemeral\nflutter/generated_plugin_registrant.cc\nflutter/generated_plugin_registrant.h"
  },
  {
    "path": "linux/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.10)\nproject(runner LANGUAGES CXX)\n\n# The name of the executable created for the application. Change this to change\n# the on-disk name of your application.\nset(BINARY_NAME \"pica_comic\")\n# The unique GTK application identifier for this application. See:\n# https://wiki.gnome.org/HowDoI/ChooseApplicationID\nset(APPLICATION_ID \"com.kokoiro.xyz.pica_comic\")\n\n# Explicitly opt in to modern CMake behaviors to avoid warnings with recent\n# versions of CMake.\ncmake_policy(SET CMP0063 NEW)\n\n# Load bundled libraries from the lib/ directory relative to the binary.\nset(CMAKE_INSTALL_RPATH \"$ORIGIN/lib\")\n\n# Root filesystem for cross-building.\nif(FLUTTER_TARGET_PLATFORM_SYSROOT)\n  set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})\n  set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})\n  set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n  set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)\n  set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\n  set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nendif()\n\n# Define build configuration options.\nif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)\n  set(CMAKE_BUILD_TYPE \"Debug\" CACHE\n    STRING \"Flutter build mode\" FORCE)\n  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS\n    \"Debug\" \"Profile\" \"Release\")\nendif()\n\n# Compilation settings that should be applied to most targets.\n#\n# Be cautious about adding new options here, as plugins use this function by\n# default. In most cases, you should add new options to specific targets instead\n# of modifying this function.\nfunction(APPLY_STANDARD_SETTINGS TARGET)\n  target_compile_features(${TARGET} PUBLIC cxx_std_14)\n  target_compile_options(${TARGET} PRIVATE -Wall -Werror)\n  target_compile_options(${TARGET} PRIVATE \"$<$<NOT:$<CONFIG:Debug>>:-O3>\")\n  target_compile_definitions(${TARGET} PRIVATE \"$<$<NOT:$<CONFIG:Debug>>:NDEBUG>\")\nendfunction()\n\n# Flutter library and tool build rules.\nset(FLUTTER_MANAGED_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/flutter\")\nadd_subdirectory(${FLUTTER_MANAGED_DIR})\n\n# System-level dependencies.\nfind_package(PkgConfig REQUIRED)\npkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)\n\nadd_definitions(-DAPPLICATION_ID=\"${APPLICATION_ID}\")\n\n# Define the application target. To change its name, change BINARY_NAME above,\n# not the value here, or `flutter run` will no longer work.\n#\n# Any new source files that you add to the application should be added here.\nadd_executable(${BINARY_NAME}\n  \"main.cc\"\n  \"my_application.cc\"\n  \"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc\"\n)\n\n# Apply the standard set of build settings. This can be removed for applications\n# that need different build settings.\napply_standard_settings(${BINARY_NAME})\n\n# Add dependency libraries. Add any application-specific dependencies here.\ntarget_link_libraries(${BINARY_NAME} PRIVATE flutter)\ntarget_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)\n\n# Run the Flutter tool portions of the build. This must not be removed.\nadd_dependencies(${BINARY_NAME} flutter_assemble)\n\n# Only the install-generated bundle's copy of the executable will launch\n# correctly, since the resources must in the right relative locations. To avoid\n# people trying to run the unbundled copy, put it in a subdirectory instead of\n# the default top-level location.\nset_target_properties(${BINARY_NAME}\n  PROPERTIES\n  RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/intermediates_do_not_run\"\n)\n\n# Generated plugin build rules, which manage building the plugins and adding\n# them to the application.\ninclude(flutter/generated_plugins.cmake)\n\n\n# === Installation ===\n# By default, \"installing\" just makes a relocatable bundle in the build\n# directory.\nset(BUILD_BUNDLE_DIR \"${PROJECT_BINARY_DIR}/bundle\")\nif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)\n  set(CMAKE_INSTALL_PREFIX \"${BUILD_BUNDLE_DIR}\" CACHE PATH \"...\" FORCE)\nendif()\n\n# Start with a clean build bundle directory every time.\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${BUILD_BUNDLE_DIR}/\\\")\n  \" COMPONENT Runtime)\n\nset(INSTALL_BUNDLE_DATA_DIR \"${CMAKE_INSTALL_PREFIX}/data\")\nset(INSTALL_BUNDLE_LIB_DIR \"${CMAKE_INSTALL_PREFIX}/lib\")\n\ninstall(TARGETS ${BINARY_NAME} RUNTIME DESTINATION \"${CMAKE_INSTALL_PREFIX}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_ICU_DATA_FILE}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n  COMPONENT Runtime)\n\nforeach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})\n  install(FILES \"${bundled_library}\"\n    DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendforeach(bundled_library)\n\n# Fully re-copy the assets directory on each build to avoid having stale files\n# from a previous install.\nset(FLUTTER_ASSET_DIR_NAME \"flutter_assets\")\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\\\")\n  \" COMPONENT Runtime)\ninstall(DIRECTORY \"${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}\"\n  DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\" COMPONENT Runtime)\n\n# Install the AOT library on non-Debug builds only.\nif(NOT CMAKE_BUILD_TYPE MATCHES \"Debug\")\n  install(FILES \"${AOT_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendif()\n"
  },
  {
    "path": "linux/flutter/CMakeLists.txt",
    "content": "# This file controls Flutter-level build steps. It should not be edited.\ncmake_minimum_required(VERSION 3.10)\n\nset(EPHEMERAL_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ephemeral\")\n\n# Configuration provided via flutter tool.\ninclude(${EPHEMERAL_DIR}/generated_config.cmake)\n\n# TODO: Move the rest of this into files in ephemeral. See\n# https://github.com/flutter/flutter/issues/57146.\n\n# Serves the same purpose as list(TRANSFORM ... PREPEND ...),\n# which isn't available in 3.10.\nfunction(list_prepend LIST_NAME PREFIX)\n    set(NEW_LIST \"\")\n    foreach(element ${${LIST_NAME}})\n        list(APPEND NEW_LIST \"${PREFIX}${element}\")\n    endforeach(element)\n    set(${LIST_NAME} \"${NEW_LIST}\" PARENT_SCOPE)\nendfunction()\n\n# === Flutter Library ===\n# System-level dependencies.\nfind_package(PkgConfig REQUIRED)\npkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)\npkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)\npkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)\n\nset(FLUTTER_LIBRARY \"${EPHEMERAL_DIR}/libflutter_linux_gtk.so\")\n\n# Published to parent scope for install step.\nset(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)\nset(FLUTTER_ICU_DATA_FILE \"${EPHEMERAL_DIR}/icudtl.dat\" PARENT_SCOPE)\nset(PROJECT_BUILD_DIR \"${PROJECT_DIR}/build/\" PARENT_SCOPE)\nset(AOT_LIBRARY \"${PROJECT_DIR}/build/lib/libapp.so\" PARENT_SCOPE)\n\nlist(APPEND FLUTTER_LIBRARY_HEADERS\n  \"fl_basic_message_channel.h\"\n  \"fl_binary_codec.h\"\n  \"fl_binary_messenger.h\"\n  \"fl_dart_project.h\"\n  \"fl_engine.h\"\n  \"fl_json_message_codec.h\"\n  \"fl_json_method_codec.h\"\n  \"fl_message_codec.h\"\n  \"fl_method_call.h\"\n  \"fl_method_channel.h\"\n  \"fl_method_codec.h\"\n  \"fl_method_response.h\"\n  \"fl_plugin_registrar.h\"\n  \"fl_plugin_registry.h\"\n  \"fl_standard_message_codec.h\"\n  \"fl_standard_method_codec.h\"\n  \"fl_string_codec.h\"\n  \"fl_value.h\"\n  \"fl_view.h\"\n  \"flutter_linux.h\"\n)\nlist_prepend(FLUTTER_LIBRARY_HEADERS \"${EPHEMERAL_DIR}/flutter_linux/\")\nadd_library(flutter INTERFACE)\ntarget_include_directories(flutter INTERFACE\n  \"${EPHEMERAL_DIR}\"\n)\ntarget_link_libraries(flutter INTERFACE \"${FLUTTER_LIBRARY}\")\ntarget_link_libraries(flutter INTERFACE\n  PkgConfig::GTK\n  PkgConfig::GLIB\n  PkgConfig::GIO\n)\nadd_dependencies(flutter flutter_assemble)\n\n# === Flutter tool backend ===\n# _phony_ is a non-existent file to force this command to run every time,\n# since currently there's no way to get a full input/output list from the\n# flutter tool.\nadd_custom_command(\n  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}\n    ${CMAKE_CURRENT_BINARY_DIR}/_phony_\n  COMMAND ${CMAKE_COMMAND} -E env\n    ${FLUTTER_TOOL_ENVIRONMENT}\n    \"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh\"\n      ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}\n  VERBATIM\n)\nadd_custom_target(flutter_assemble DEPENDS\n  \"${FLUTTER_LIBRARY}\"\n  ${FLUTTER_LIBRARY_HEADERS}\n)\n"
  },
  {
    "path": "linux/flutter/generated_plugin_registrant.cc",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#include \"generated_plugin_registrant.h\"\n\n#include <desktop_webview_window/desktop_webview_window_plugin.h>\n#include <dynamic_color/dynamic_color_plugin.h>\n#include <file_selector_linux/file_selector_plugin.h>\n#include <flutter_qjs/flutter_qjs_plugin.h>\n#include <screen_retriever/screen_retriever_plugin.h>\n#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>\n#include <url_launcher_linux/url_launcher_plugin.h>\n#include <window_manager/window_manager_plugin.h>\n\nvoid fl_register_plugins(FlPluginRegistry* registry) {\n  g_autoptr(FlPluginRegistrar) desktop_webview_window_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"DesktopWebviewWindowPlugin\");\n  desktop_webview_window_plugin_register_with_registrar(desktop_webview_window_registrar);\n  g_autoptr(FlPluginRegistrar) dynamic_color_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"DynamicColorPlugin\");\n  dynamic_color_plugin_register_with_registrar(dynamic_color_registrar);\n  g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"FileSelectorPlugin\");\n  file_selector_plugin_register_with_registrar(file_selector_linux_registrar);\n  g_autoptr(FlPluginRegistrar) flutter_qjs_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"FlutterQjsPlugin\");\n  flutter_qjs_plugin_register_with_registrar(flutter_qjs_registrar);\n  g_autoptr(FlPluginRegistrar) screen_retriever_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"ScreenRetrieverPlugin\");\n  screen_retriever_plugin_register_with_registrar(screen_retriever_registrar);\n  g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"Sqlite3FlutterLibsPlugin\");\n  sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar);\n  g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"UrlLauncherPlugin\");\n  url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);\n  g_autoptr(FlPluginRegistrar) window_manager_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"WindowManagerPlugin\");\n  window_manager_plugin_register_with_registrar(window_manager_registrar);\n}\n"
  },
  {
    "path": "linux/flutter/generated_plugin_registrant.h",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#ifndef GENERATED_PLUGIN_REGISTRANT_\n#define GENERATED_PLUGIN_REGISTRANT_\n\n#include <flutter_linux/flutter_linux.h>\n\n// Registers Flutter plugins.\nvoid fl_register_plugins(FlPluginRegistry* registry);\n\n#endif  // GENERATED_PLUGIN_REGISTRANT_\n"
  },
  {
    "path": "linux/flutter/generated_plugins.cmake",
    "content": "#\n# Generated file, do not edit.\n#\n\nlist(APPEND FLUTTER_PLUGIN_LIST\n  desktop_webview_window\n  dynamic_color\n  file_selector_linux\n  flutter_qjs\n  screen_retriever\n  sqlite3_flutter_libs\n  url_launcher_linux\n  window_manager\n)\n\nlist(APPEND FLUTTER_FFI_PLUGIN_LIST\n  zip_flutter\n)\n\nset(PLUGIN_BUNDLED_LIBRARIES)\n\nforeach(plugin ${FLUTTER_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})\n  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})\nendforeach(plugin)\n\nforeach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})\nendforeach(ffi_plugin)\n"
  },
  {
    "path": "linux/main.cc",
    "content": "#include \"my_application.h\"\n\nint main(int argc, char** argv) {\n  g_autoptr(MyApplication) app = my_application_new();\n  return g_application_run(G_APPLICATION(app), argc, argv);\n}\n"
  },
  {
    "path": "linux/my_application.cc",
    "content": "#include \"my_application.h\"\n\n#include <flutter_linux/flutter_linux.h>\n#ifdef GDK_WINDOWING_X11\n#include <gdk/gdkx.h>\n#endif\n\n#include \"flutter/generated_plugin_registrant.h\"\n\nstruct _MyApplication {\n  GtkApplication parent_instance;\n  char** dart_entrypoint_arguments;\n};\n\nG_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)\n\n// Implements GApplication::activate.\nstatic void my_application_activate(GApplication* application) {\n  MyApplication* self = MY_APPLICATION(application);\n  GtkWindow* window =\n      GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));\n\n  // Use a header bar when running in GNOME as this is the common style used\n  // by applications and is the setup most users will be using (e.g. Ubuntu\n  // desktop).\n  // If running on X and not using GNOME then just use a traditional title bar\n  // in case the window manager does more exotic layout, e.g. tiling.\n  // If running on Wayland assume the header bar will work (may need changing\n  // if future cases occur).\n  gboolean use_header_bar = TRUE;\n#ifdef GDK_WINDOWING_X11\n  GdkScreen* screen = gtk_window_get_screen(window);\n  if (GDK_IS_X11_SCREEN(screen)) {\n    const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);\n    if (g_strcmp0(wm_name, \"GNOME Shell\") != 0) {\n      use_header_bar = FALSE;\n    }\n  }\n#endif\n  if (use_header_bar) {\n    GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());\n    gtk_widget_show(GTK_WIDGET(header_bar));\n    gtk_header_bar_set_title(header_bar, \"pica_comic\");\n    gtk_header_bar_set_show_close_button(header_bar, TRUE);\n    gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));\n  } else {\n    gtk_window_set_title(window, \"pica_comic\");\n  }\n\n  gtk_window_set_default_size(window, 1280, 720);\n  gtk_widget_show(GTK_WIDGET(window));\n\n  g_autoptr(FlDartProject) project = fl_dart_project_new();\n  fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);\n\n  FlView* view = fl_view_new(project);\n  gtk_widget_show(GTK_WIDGET(view));\n  gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));\n\n  fl_register_plugins(FL_PLUGIN_REGISTRY(view));\n\n  gtk_widget_grab_focus(GTK_WIDGET(view));\n}\n\n// Implements GApplication::local_command_line.\nstatic gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {\n  MyApplication* self = MY_APPLICATION(application);\n  // Strip out the first argument as it is the binary name.\n  self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);\n\n  g_autoptr(GError) error = nullptr;\n  if (!g_application_register(application, nullptr, &error)) {\n     g_warning(\"Failed to register: %s\", error->message);\n     *exit_status = 1;\n     return TRUE;\n  }\n\n  g_application_activate(application);\n  *exit_status = 0;\n\n  return TRUE;\n}\n\n// Implements GApplication::startup.\nstatic void my_application_startup(GApplication* application) {\n  //MyApplication* self = MY_APPLICATION(object);\n\n  // Perform any actions required at application startup.\n\n  G_APPLICATION_CLASS(my_application_parent_class)->startup(application);\n}\n\n// Implements GApplication::shutdown.\nstatic void my_application_shutdown(GApplication* application) {\n  //MyApplication* self = MY_APPLICATION(object);\n\n  // Perform any actions required at application shutdown.\n\n  G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application);\n}\n\n// Implements GObject::dispose.\nstatic void my_application_dispose(GObject* object) {\n  MyApplication* self = MY_APPLICATION(object);\n  g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);\n  G_OBJECT_CLASS(my_application_parent_class)->dispose(object);\n}\n\nstatic void my_application_class_init(MyApplicationClass* klass) {\n  G_APPLICATION_CLASS(klass)->activate = my_application_activate;\n  G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;\n  G_APPLICATION_CLASS(klass)->startup = my_application_startup;\n  G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown;\n  G_OBJECT_CLASS(klass)->dispose = my_application_dispose;\n}\n\nstatic void my_application_init(MyApplication* self) {}\n\nMyApplication* my_application_new() {\n  return MY_APPLICATION(g_object_new(my_application_get_type(),\n                                     \"application-id\", APPLICATION_ID,\n                                     \"flags\", G_APPLICATION_NON_UNIQUE,\n                                     nullptr));\n}\n"
  },
  {
    "path": "linux/my_application.h",
    "content": "#ifndef FLUTTER_MY_APPLICATION_H_\n#define FLUTTER_MY_APPLICATION_H_\n\n#include <gtk/gtk.h>\n\nG_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,\n                     GtkApplication)\n\n/**\n * my_application_new:\n *\n * Creates a new Flutter-based application.\n *\n * Returns: a new #MyApplication.\n */\nMyApplication* my_application_new();\n\n#endif  // FLUTTER_MY_APPLICATION_H_\n"
  },
  {
    "path": "macos/.gitignore",
    "content": "# Flutter-related\n**/Flutter/ephemeral/\n**/Flutter/GeneratedPluginRegistrant.swift\n**/Pods/\n\n# Xcode-related\n**/dgph\n**/xcuserdata/\n"
  },
  {
    "path": "macos/Flutter/Flutter-Debug.xcconfig",
    "content": "#include \"ephemeral/Flutter-Generated.xcconfig\"\n"
  },
  {
    "path": "macos/Flutter/Flutter-Release.xcconfig",
    "content": "#include \"ephemeral/Flutter-Generated.xcconfig\"\n"
  },
  {
    "path": "macos/Podfile",
    "content": "platform :osx, '10.14'\n\n# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] = 'true'\n\nproject 'Runner', {\n  'Debug' => :debug,\n  'Profile' => :release,\n  'Release' => :release,\n}\n\ndef flutter_root\n  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)\n  unless File.exist?(generated_xcode_build_settings_path)\n    raise \"#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \\\"flutter pub get\\\" is executed first\"\n  end\n\n  File.foreach(generated_xcode_build_settings_path) do |line|\n    matches = line.match(/FLUTTER_ROOT\\=(.*)/)\n    return matches[1].strip if matches\n  end\n  raise \"FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \\\"flutter pub get\\\"\"\nend\n\nrequire File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)\n\nflutter_macos_podfile_setup\n\ntarget 'Runner' do\n  use_frameworks!\n  use_modular_headers!\n\n  flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))\n#  target 'RunnerTests' do\n#    inherit! :search_paths\n#  end\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_macos_build_settings(target)\n  end\nend\n"
  },
  {
    "path": "macos/Runner/AppDelegate.swift",
    "content": "import Cocoa\nimport FlutterMacOS\n\n@NSApplicationMain\nclass AppDelegate: FlutterAppDelegate {\n  override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {\n    return true\n  }\n}\n"
  },
  {
    "path": "macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"16x16\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_16.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"16x16\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_32.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"32x32\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_32.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"32x32\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_64.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"128x128\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_128.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"128x128\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_256.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"256x256\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_256.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"256x256\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_512.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"512x512\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_512.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"512x512\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_1024.png\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "macos/Runner/Base.lproj/MainMenu.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14490.70\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSApplication\">\n            <connections>\n                <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"GzC-gU-4Uq\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"Runner\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"applicationMenu\" destination=\"uQy-DD-JDr\" id=\"XBo-yE-nKs\"/>\n                <outlet property=\"mainFlutterWindow\" destination=\"QvC-M9-y7g\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n        <menu title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n            <items>\n                <menuItem title=\"APP_NAME\" id=\"1Xt-HY-uBw\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"APP_NAME\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                        <items>\n                            <menuItem title=\"About APP_NAME\" id=\"5kV-Vb-QxS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"orderFrontStandardAboutPanel:\" target=\"-1\" id=\"Exp-CZ-Vem\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                            <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                            <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                            <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                            <menuItem title=\"Hide APP_NAME\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                <connections>\n                                    <action selector=\"hide:\" target=\"-1\" id=\"PnN-Uc-m68\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"hideOtherApplications:\" target=\"-1\" id=\"VT4-aY-XCT\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"unhideAllApplications:\" target=\"-1\" id=\"Dhg-Le-xox\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                            <menuItem title=\"Quit APP_NAME\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                <connections>\n                                    <action selector=\"terminate:\" target=\"-1\" id=\"Te7-pn-YzF\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                        <items>\n                            <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                <connections>\n                                    <action selector=\"undo:\" target=\"-1\" id=\"M6e-cu-g7V\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                <connections>\n                                    <action selector=\"redo:\" target=\"-1\" id=\"oIA-Rs-6OD\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                            <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                <connections>\n                                    <action selector=\"cut:\" target=\"-1\" id=\"YJe-68-I9s\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                <connections>\n                                    <action selector=\"copy:\" target=\"-1\" id=\"G1f-GL-Joy\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                <connections>\n                                    <action selector=\"paste:\" target=\"-1\" id=\"UvS-8e-Qdg\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"pasteAsPlainText:\" target=\"-1\" id=\"cEh-KX-wJQ\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"delete:\" target=\"-1\" id=\"0Mk-Ml-PaM\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                <connections>\n                                    <action selector=\"selectAll:\" target=\"-1\" id=\"VNm-Mi-diN\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                            <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                    <items>\n                                        <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"cD7-Qs-BN4\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"WD3-Gg-5AJ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"NDo-RZ-v9R\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"HOh-sY-3ay\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"U76-nv-p5D\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                            <connections>\n                                                <action selector=\"centerSelectionInVisibleArea:\" target=\"-1\" id=\"IOG-6D-g5B\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                    <items>\n                                        <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                            <connections>\n                                                <action selector=\"showGuessPanel:\" target=\"-1\" id=\"vFj-Ks-hy3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                            <connections>\n                                                <action selector=\"checkSpelling:\" target=\"-1\" id=\"fz7-VC-reM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                        <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleContinuousSpellChecking:\" target=\"-1\" id=\"7w6-Qz-0kB\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleGrammarChecking:\" target=\"-1\" id=\"muD-Qn-j4w\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"-1\" id=\"2lM-Qi-WAP\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                    <items>\n                                        <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontSubstitutionsPanel:\" target=\"-1\" id=\"oku-mr-iSq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                        <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleSmartInsertDelete:\" target=\"-1\" id=\"3IJ-Se-DZD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"-1\" id=\"ptq-xd-QOA\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDashSubstitution:\" target=\"-1\" id=\"oCt-pO-9gS\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticLinkDetection:\" target=\"-1\" id=\"Gip-E3-Fov\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDataDetection:\" target=\"-1\" id=\"R1I-Nq-Kbl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticTextReplacement:\" target=\"-1\" id=\"DvP-Fe-Py6\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                    <items>\n                                        <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"uppercaseWord:\" target=\"-1\" id=\"sPh-Tk-edu\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"lowercaseWord:\" target=\"-1\" id=\"iUZ-b5-hil\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"capitalizeWord:\" target=\"-1\" id=\"26H-TL-nsh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                    <items>\n                                        <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"startSpeaking:\" target=\"-1\" id=\"654-Ng-kyl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"stopSpeaking:\" target=\"-1\" id=\"dX8-6p-jy9\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                        <items>\n                            <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleFullScreen:\" target=\"-1\" id=\"dU3-MA-1Rq\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                        <items>\n                            <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                <connections>\n                                    <action selector=\"performMiniaturize:\" target=\"-1\" id=\"VwT-WD-YPe\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"performZoom:\" target=\"-1\" id=\"DIl-cC-cCs\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                            <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"arrangeInFront:\" target=\"-1\" id=\"DRN-fu-gQh\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Help\" id=\"EPT-qC-fAb\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"rJ0-wn-3NY\"/>\n                </menuItem>\n            </items>\n            <point key=\"canvasLocation\" x=\"142\" y=\"-258\"/>\n        </menu>\n        <window title=\"APP_NAME\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"QvC-M9-y7g\" customClass=\"MainFlutterWindow\" customModule=\"Runner\" customModuleProvider=\"target\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n            <rect key=\"contentRect\" x=\"335\" y=\"390\" width=\"800\" height=\"600\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"2560\" height=\"1577\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"EiT-Mj-1SZ\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"800\" height=\"600\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n            </view>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "macos/Runner/Configs/AppInfo.xcconfig",
    "content": "// Application-level settings for the Runner target.\n//\n// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the\n// future. If not, the values below would default to using the project name when this becomes a\n// 'flutter create' template.\n\n// The application's name. By default this is also the title of the Flutter window.\nPRODUCT_NAME = pica_comic\n\n// The application's bundle identifier\nPRODUCT_BUNDLE_IDENTIFIER = com.kokoiro.xyz.picaComic\n\n// The copyright displayed in application information\nPRODUCT_COPYRIGHT = Copyright © 2023 com.kokoiro.xyz. All rights reserved.\n"
  },
  {
    "path": "macos/Runner/Configs/Debug.xcconfig",
    "content": "#include \"../../Flutter/Flutter-Debug.xcconfig\"\n#include \"Warnings.xcconfig\"\n"
  },
  {
    "path": "macos/Runner/Configs/Release.xcconfig",
    "content": "#include \"../../Flutter/Flutter-Release.xcconfig\"\n#include \"Warnings.xcconfig\"\n"
  },
  {
    "path": "macos/Runner/Configs/Warnings.xcconfig",
    "content": "WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings\nGCC_WARN_UNDECLARED_SELECTOR = YES\nCLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES\nCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE\nCLANG_WARN__DUPLICATE_METHOD_MATCH = YES\nCLANG_WARN_PRAGMA_PACK = YES\nCLANG_WARN_STRICT_PROTOTYPES = YES\nCLANG_WARN_COMMA = YES\nGCC_WARN_STRICT_SELECTOR_MATCH = YES\nCLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES\nCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES\nGCC_WARN_SHADOW = YES\nCLANG_WARN_UNREACHABLE_CODE = YES\n"
  },
  {
    "path": "macos/Runner/DebugProfile.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n\t<key>com.apple.security.cs.allow-jit</key>\n\t<true/>\n\t<key>com.apple.security.network.server</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>$(PRODUCT_COPYRIGHT)</string>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/Runner/MainFlutterWindow.swift",
    "content": "import Cocoa\nimport FlutterMacOS\nimport window_manager\n\nclass MainFlutterWindow: NSWindow  {\n  override func awakeFromNib() {\n    let flutterViewController = FlutterViewController.init()\n    let windowFrame = self.frame\n    self.contentViewController = flutterViewController\n    self.setFrame(windowFrame, display: true)\n\n    RegisterGeneratedPlugins(registry: flutterViewController)\n\n    super.awakeFromNib()\n  }\n\n  override public func order(_ place: NSWindow.OrderingMode, relativeTo otherWin: Int) {\n    super.order(place, relativeTo: otherWin)\n    hiddenWindowAtLaunch()\n  }\n}\n"
  },
  {
    "path": "macos/Runner/Release.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n    <key>com.apple.security.files.user-selected.read-write</key>\n    <true/>\n\t<key>com.apple.security.network.client</key>\n    <true/>\n    <key>com.apple.security.network.server</key>\n    <true/>\n    <key>com.apple.security.files.user-selected.read-write</key>\n    <true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXAggregateTarget section */\n\t\t33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget \"Flutter Assemble\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t33CC111E2044C6BF0003C045 /* ShellScript */,\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Flutter Assemble\";\n\t\t\tproductName = FLX;\n\t\t};\n/* End PBXAggregateTarget section */\n\n/* Begin PBXBuildFile section */\n\t\t335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };\n\t\t33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };\n\t\t33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };\n\t\t33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };\n\t\t33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 33CC10E52044A3C60003C045 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 33CC111A2044C6BA0003C045;\n\t\t\tremoteInfo = FLX;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t33CC110E2044A8840003C045 /* Bundle Framework */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Bundle Framework\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = \"<group>\"; };\n\t\t335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = \"<group>\"; };\n\t\t33CC10ED2044A3C60003C045 /* pica_comic.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"pica_comic.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = \"<group>\"; };\n\t\t33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = \"<group>\"; };\n\t\t33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = \"Flutter-Debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = \"Flutter-Release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = \"Flutter-Generated.xcconfig\"; path = \"ephemeral/Flutter-Generated.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = \"<group>\"; };\n\t\t33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = \"<group>\"; };\n\t\t33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t33CC10EA2044A3C60003C045 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t33BA886A226E78AF003329D5 /* Configs */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33E5194F232828860026EE4D /* AppInfo.xcconfig */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t333000ED22D3DE5D00554162 /* Warnings.xcconfig */,\n\t\t\t);\n\t\t\tpath = Configs;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CC10E42044A3C60003C045 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33FAB671232836740065AC1E /* Runner */,\n\t\t\t\t33CEB47122A05771004F2AC0 /* Flutter */,\n\t\t\t\t33CC10EE2044A3C60003C045 /* Products */,\n\t\t\t\tD73912EC22F37F3D000D13A0 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CC10EE2044A3C60003C045 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10ED2044A3C60003C045 /* pica_comic.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CC11242044D66E0003C045 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10F22044A3C60003C045 /* Assets.xcassets */,\n\t\t\t\t33CC10F42044A3C60003C045 /* MainMenu.xib */,\n\t\t\t\t33CC10F72044A3C60003C045 /* Info.plist */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tpath = ..;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CEB47122A05771004F2AC0 /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,\n\t\t\t\t33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,\n\t\t\t\t33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,\n\t\t\t\t33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,\n\t\t\t);\n\t\t\tpath = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33FAB671232836740065AC1E /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10F02044A3C60003C045 /* AppDelegate.swift */,\n\t\t\t\t33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,\n\t\t\t\t33E51913231747F40026EE4D /* DebugProfile.entitlements */,\n\t\t\t\t33E51914231749380026EE4D /* Release.entitlements */,\n\t\t\t\t33CC11242044D66E0003C045 /* Resources */,\n\t\t\t\t33BA886A226E78AF003329D5 /* Configs */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD73912EC22F37F3D000D13A0 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t33CC10EC2044A3C60003C045 /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t33CC10E92044A3C60003C045 /* Sources */,\n\t\t\t\t33CC10EA2044A3C60003C045 /* Frameworks */,\n\t\t\t\t33CC10EB2044A3C60003C045 /* Resources */,\n\t\t\t\t33CC110E2044A8840003C045 /* Bundle Framework */,\n\t\t\t\t3399D490228B24CF009A79C7 /* ShellScript */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t33CC11202044C79F0003C045 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 33CC10ED2044A3C60003C045 /* pica_comic.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t33CC10E52044A3C60003C045 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0920;\n\t\t\t\tLastUpgradeCheck = 1300;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t33CC10EC2044A3C60003C045 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.2;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tSystemCapabilities = {\n\t\t\t\t\t\t\tcom.apple.Sandbox = {\n\t\t\t\t\t\t\t\tenabled = 1;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t\t33CC111A2044C6BA0003C045 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.2;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 33CC10E42044A3C60003C045;\n\t\t\tproductRefGroup = 33CC10EE2044A3C60003C045 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t33CC10EC2044A3C60003C045 /* Runner */,\n\t\t\t\t33CC111A2044C6BA0003C045 /* Flutter Assemble */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t33CC10EB2044A3C60003C045 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,\n\t\t\t\t33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3399D490228B24CF009A79C7 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"echo \\\"$PRODUCT_NAME.app\\\" > \\\"$PROJECT_DIR\\\"/Flutter/ephemeral/.app_filename && \\\"$FLUTTER_ROOT\\\"/packages/flutter_tools/bin/macos_assemble.sh embed\\n\";\n\t\t};\n\t\t33CC111E2044C6BF0003C045 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\tFlutter/ephemeral/FlutterInputs.xcfilelist,\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\tFlutter/ephemeral/tripwire,\n\t\t\t);\n\t\t\toutputFileListPaths = (\n\t\t\t\tFlutter/ephemeral/FlutterOutputs.xcfilelist,\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"$FLUTTER_ROOT\\\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t33CC10E92044A3C60003C045 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,\n\t\t\t\t33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,\n\t\t\t\t335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t33CC11202044C79F0003C045 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;\n\t\t\ttargetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t33CC10F42044A3C60003C045 /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10F52044A3C60003C045 /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t338D0CE9231458BD00FA5F75 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t338D0CEA231458BD00FA5F75 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t338D0CEB231458BD00FA5F75 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t33CC10F92044A3C60003C045 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t33CC10FA2044A3C60003C045 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t33CC10FC2044A3C60003C045 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t33CC10FD2044A3C60003C045 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t33CC111C2044C6BA0003C045 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t33CC111D2044C6BA0003C045 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t33CC10E82044A3C60003C045 /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t33CC10F92044A3C60003C045 /* Debug */,\n\t\t\t\t33CC10FA2044A3C60003C045 /* Release */,\n\t\t\t\t338D0CE9231458BD00FA5F75 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t33CC10FC2044A3C60003C045 /* Debug */,\n\t\t\t\t33CC10FD2044A3C60003C045 /* Release */,\n\t\t\t\t338D0CEA231458BD00FA5F75 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget \"Flutter Assemble\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t33CC111C2044C6BA0003C045 /* Debug */,\n\t\t\t\t33CC111D2044C6BA0003C045 /* Release */,\n\t\t\t\t338D0CEB231458BD00FA5F75 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 33CC10E52044A3C60003C045 /* Project object */;\n}\n"
  },
  {
    "path": "macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1300\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"33CC10EC2044A3C60003C045\"\n               BuildableName = \"pica_comic.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"33CC10EC2044A3C60003C045\"\n            BuildableName = \"pica_comic.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"33CC10EC2044A3C60003C045\"\n            BuildableName = \"pica_comic.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"33CC10EC2044A3C60003C045\"\n            BuildableName = \"pica_comic.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "macos/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "pubspec.yaml",
    "content": "name: pica_comic\ndescription: A comic app.\n# The following line prevents the package from being accidentally published to\n# pub.dev using `flutter pub publish`. This is preferred for private packages.\npublish_to: 'none' # Remove this line if you wish to publish to pub.dev\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and  --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\n# In Windows, build-name is used as the major, minor, and patch parts\n# of the product and file versions while build-number is used as the build suffix.\nversion: 4.0.4+404\nenvironment:\n  sdk: '>=3.3.0'\n\n# Dependencies specify other packages that your package needs in order to work.\n# To automatically upgrade your package dependencies to the latest versions\n# consider running `flutter pub upgrade --major-versions`. Alternatively,\n# dependencies can be manually updated by changing the version numbers below to\n# the latest version available on pub.dev. To see which dependencies have newer\n# versions available, run `flutter pub outdated`.\ndependencies:\n  flutter:\n    sdk: flutter\n  dio: 5.4.1\n  shared_preferences: ^2.0.16\n  dynamic_color: ^1.6.9\n  crypto: any\n  pointycastle: ^3.7.3\n  uuid: ^3.0.7\n  photo_view:\n    git:\n      url: https://github.com/wgh136/photo_view\n      ref: 94724a0b\n  url_launcher: ^6.1.8\n  path_provider: ^2.0.12\n  file_selector: ^1.0.1\n  image_picker: ^1.0.2\n  image_gallery_saver:\n    git:\n      url: https://github.com/wgh136/image_gallery_saver\n      ref: master\n  flutter_file_dialog: 3.0.1\n  flutter_local_notifications: ^17.2.2\n  share_plus: ^7.0.0\n  local_auth: ^2.3.0\n  html: any\n  dio_cookie_manager: any\n  image: 4.1.0\n  shimmer_animation: ^2.1.0\n  cookie_jar: any\n  workmanager:\n    git:\n      url: https://github.com/wgh136/flutter_workmanager\n      ref: main\n  flutter_localizations:\n    sdk: flutter\n  intl: any\n  flutter_displaymode: 0.6.0\n  app_links: 3.4.3\n  flutter_reorderable_grid_view: 5.0.1\n  webdav_client:\n    git:\n      url: https://github.com/wgh136/webdav_client\n      ref: main\n  dio_http2_adapter: 2.3.1+1\n  sqlite3: 2.1.0\n  sqlite3_flutter_libs: any\n  zip_flutter:\n    git:\n      url: https://github.com/wgh136/zip_flutter\n      ref: 92b7309e\n  collection: ^1.18.0\n  window_manager:\n  flutter_inappwebview: 6.0.0\n  pdf: ^3.10.8\n  flutter_qjs:\n    git:\n      url: https://github.com/wgh136/flutter_qjs\n      ref: ade0b9d\n  sliver_tools: ^0.2.12\n  mime: ^1.0.5\n  desktop_webview_window:\n    git:\n      url: https://github.com/wgh136/flutter_desktop_webview\n      path: packages/desktop_webview_window\n\ndependency_overrides:\n  flutter_inappwebview_android:\n    git:\n      url: https://github.com/holzgeist/flutter_inappwebview\n      path: flutter_inappwebview_android\n      ref: d89b1d32638b49dfc58c4b7c84153be0c269d057\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n  # The \"flutter_lints\" package below contains a set of recommended lints to\n  # encourage good coding practices. The lint set provided by the package is\n  # activated in the `analysis_options.yaml` file located at the root of your\n  # package. See that file for information about deactivating specific lint\n  # rules and activating additional ones.\n  flutter_lints: ^2.0.0\n  flutter_to_arch:\n    git: https://github.com/wgh136/flutter_to_arch\n\nflutter_to_arch:\n  name: Pica Comic\n  icon: debian/gui/pica-comic.png\n  categories: Utility\n  keywords: Flutter;comic;images;\n  url: https://github.com/wgh136/PicaComic\n  depends:\n    - gtk3\n    - webkit2gtk-4.1\n\n# For information on the generic Dart part of this file, see the\n# following page: https://dart.dev/tools/pub/pubspec\n# The following section is specific to Flutter packages.\nflutter:\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n\n  # To add assets to your application, add an assets section, like this:\n  # assets:\n  #   - images/a_dot_burr.jpeg\n  #   - images/a_dot_ham.jpeg\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.dev/assets-and-images/#resolution-aware\n  assets:\n    - images/app_icon.png\n    - images/avatar.png\n    - images/avatar_small.png\n    - images/github.png\n    - images/app_icon_no_bg.png\n    - assets/tags.json\n    - assets/translation.json\n    - assets/init.js\n    - assets/tags_tw.json\n  # For details regarding adding assets from package dependencies, see\n  # https://flutter.dev/assets-and-images/#from-packages\n\n  # To add custom fonts to your application, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # example:\n  # fonts:\n  #   - family: Schyler\n  #     fonts:\n  #       - asset: fonts/Schyler-Regular.ttf\n  #       - asset: fonts/Schyler-Italic.ttf\n  #         style: italic\n  #   - family: Trajan Pro\n  #     fonts:\n  #       - asset: fonts/TrajanPro.ttf\n  #       - asset: fonts/TrajanPro_Bold.ttf\n  #         weight: 700\n  #\n  # For details regarding fonts from package dependencies,\n  # see https://flutter.dev/custom-fonts/#from-packages"
  },
  {
    "path": "test/widget_test.dart",
    "content": "// This is a basic Flutter widget test.\n//\n// To perform an interaction with a widget in your test, use the WidgetTester\n// utility in the flutter_test package. For example, you can send tap and scroll\n// gestures. You can also use WidgetTester to find child widgets in the widget\n// tree, read text, and verify that the values of widget properties are correct.\n\nvoid main() {\n\n}\n"
  },
  {
    "path": "utils/check_translation.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nMap<String, dynamic>? translation;\n\nvar keys = <String>[];\n\nvoid main() async{\n  var file = File(\"assets/translation.json\");\n  var data = await file.readAsString();\n  translation = jsonDecode(data);\n  find(Directory('lib'));\n  file = File(\"assets/translation.json\");\n  translation!.forEach((key, value) {\n    var shouldRemove = <String>[];\n    for (var element in (value as Map<String, dynamic>).keys) {\n      if(!keys.contains(element)){\n        shouldRemove.add(element);\n      }\n    }\n    for (var element in shouldRemove) {\n      value.remove(element);\n    }\n  });\n  file.writeAsString(const JsonEncoder.withIndent(\"  \").convert(translation));\n}\n\nString realText(String text){\n  text = text.replaceAll(\".tl\", \"\");\n  var char = text[text.length-1];\n  int index = text.length-2;\n  while(true){\n    if(text[index] == char){\n      if(index > 0 && text[index-1] == '\\\\'){\n        index--;\n        continue;\n      }\n      break;\n    }\n    index--;\n  }\n  return text.substring(index+1, text.length-1);\n}\n\nvoid find(Directory directory){\n  for(var entity in directory.listSync()){\n    if(entity is File){\n      var code = entity.readAsStringSync();\n      for(var match in RegExp(r'\".*?\"\\.tl').allMatches(code)){\n        var text = match.group(0);\n        text = realText(text!);\n        if(text.isEmpty)  continue;\n        keys.add(text);\n        if(translation![\"zh_TW\"][text] == null){\n          translation![\"zh_TW\"][text] = \"\";\n        }\n        if(translation![\"en_US\"][text] == null){\n          translation![\"en_US\"][text] = \"\";\n        }\n      }\n      for(var match in RegExp(r\"'.*?'\\.tl\").allMatches(code)){\n        var text = match.group(0);\n        text = realText(text!);\n        if(text.isEmpty)  continue;\n        keys.add(text);\n        if(translation![\"zh_TW\"][text] == null){\n          translation![\"zh_TW\"][text] = \"\";\n        }\n        if(translation![\"en_US\"][text] == null){\n          translation![\"en_US\"][text] = \"\";\n        }\n      }\n    } else if (entity is Directory){\n      find(entity);\n    }\n  }\n}"
  },
  {
    "path": "utils/tags_translation.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\n/// Download tags from https://github.com/EhTagTranslation/DatabaseReleases.git\nvoid main() async{\n  await Process.run(\"git\", [\"clone\", \"https://github.com/EhTagTranslation/DatabaseReleases.git\"]);\n  var file = File(\"DatabaseReleases/db.text.json\");\n  var db = const JsonDecoder().convert(file.readAsStringSync());\n  Map<String, Map<String, String>> res = {};\n  for(var category in db[\"data\"]){\n    Map<String, String> items = {};\n    for(var entry in (category[\"data\"] as Map).entries){\n      items[entry.key] = entry.value[\"name\"];\n    }\n    res[category[\"namespace\"]] = items;\n  }\n  var output = const JsonEncoder().convert(res);\n  File(\"assets/tags.json\").writeAsStringSync(output);\n  Directory(\"DatabaseReleases\").deleteSync(recursive: true);\n}"
  },
  {
    "path": "web/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <!--\n    If you are serving your web app in a path other than the root, change the\n    href value below to reflect the base path you are serving from.\n\n    The path provided below has to start and end with a slash \"/\" in order for\n    it to work correctly.\n\n    For more details:\n    * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base\n\n    This is a placeholder for base href that will be replaced by the value of\n    the `--base-href` argument provided to `flutter build`.\n  -->\n  <base href=\"$FLUTTER_BASE_HREF\">\n\n  <meta charset=\"UTF-8\">\n  <meta content=\"IE=Edge\" http-equiv=\"X-UA-Compatible\">\n  <meta name=\"description\" content=\"非官方Picacg\">\n\n  <!-- iOS meta tags & icons -->\n  <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n  <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"blue\">\n  <meta name=\"apple-mobile-web-app-title\" content=\"pica_comic\">\n  <link rel=\"apple-touch-icon\" href=\"icons/Icon-192.png\">\n\n  <!-- Favicon -->\n  <link rel=\"icon\" type=\"image/png\" href=\"favicon.png\"/>\n\n  <title>pica_comic</title>\n  <link rel=\"manifest\" href=\"manifest.json\">\n\n  <script>\n    // The value below is injected by flutter build, do not touch.\n    var serviceWorkerVersion = null;\n  </script>\n  <!-- This script adds the flutter initialization JS code -->\n  <script src=\"flutter.js\" defer></script>\n</head>\n<body>\n<div id=\"loading\">\n  <style>\n    #loading {\n      width: 50px;\n      height: 50px;\n      position: fixed;\n      top: calc(50% - 25px);\n      left: calc(50% - 25px);\n      z-index: 9999;\n    }\n    #loading img {\n      width: 50px;\n      height: 50px;\n    }\n  </style>\n  <img src=\"loading.gif\">\n</div>\n<script>\n  if ('serviceWorker' in navigator) {\n    window.addEventListener('flutter-first-frame', function () {\n      document.getElementById(\"loading\")?.remove();\n      navigator.serviceWorker.register('flutter_service_worker.js');\n    });\n  }\n</script>\n  <script>\n    window.addEventListener('load', function(ev) {\n      // Download main.dart.js\n      _flutter.loader.loadEntrypoint({\n        serviceWorker: {\n          serviceWorkerVersion: serviceWorkerVersion,\n        },\n        onEntrypointLoaded: function(engineInitializer) {\n          engineInitializer.initializeEngine().then(function(appRunner) {\n            appRunner.runApp();\n          });\n        }\n      });\n    });\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "web/manifest.json",
    "content": "{\n    \"name\": \"pica_comic\",\n    \"short_name\": \"pica_comic\",\n    \"start_url\": \".\",\n    \"display\": \"standalone\",\n    \"background_color\": \"#0175C2\",\n    \"theme_color\": \"#0175C2\",\n    \"description\": \"A new Flutter project.\",\n    \"orientation\": \"portrait-primary\",\n    \"prefer_related_applications\": false,\n    \"icons\": [\n        {\n            \"src\": \"icons/Icon-192.png\",\n            \"sizes\": \"192x192\",\n            \"type\": \"image/png\"\n        },\n        {\n            \"src\": \"icons/Icon-512.png\",\n            \"sizes\": \"512x512\",\n            \"type\": \"image/png\"\n        },\n        {\n            \"src\": \"icons/Icon-maskable-192.png\",\n            \"sizes\": \"192x192\",\n            \"type\": \"image/png\",\n            \"purpose\": \"maskable\"\n        },\n        {\n            \"src\": \"icons/Icon-maskable-512.png\",\n            \"sizes\": \"512x512\",\n            \"type\": \"image/png\",\n            \"purpose\": \"maskable\"\n        }\n    ]\n}\n"
  },
  {
    "path": "windows/.gitignore",
    "content": "flutter/ephemeral/\nflutter/generated_plugin_registrant.h\nflutter/generated_plugin_registrant.cc\n\n# Visual Studio user-specific files.\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# Visual Studio build-related files.\nx64/\nx86/\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n"
  },
  {
    "path": "windows/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.14)\nproject(pica_comic LANGUAGES CXX)\n\n# The name of the executable created for the application. Change this to change\n# the on-disk name of your application.\nset(BINARY_NAME \"pica_comic\")\n\n# Explicitly opt in to modern CMake behaviors to avoid warnings with recent\n# versions of CMake.\ncmake_policy(SET CMP0063 NEW)\n\n# Define build configuration option.\nget_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)\nif(IS_MULTICONFIG)\n  set(CMAKE_CONFIGURATION_TYPES \"Debug;Profile;Release\"\n    CACHE STRING \"\" FORCE)\nelse()\n  if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)\n    set(CMAKE_BUILD_TYPE \"Debug\" CACHE\n      STRING \"Flutter build mode\" FORCE)\n    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS\n      \"Debug\" \"Profile\" \"Release\")\n  endif()\nendif()\n# Define settings for the Profile build mode.\nset(CMAKE_EXE_LINKER_FLAGS_PROFILE \"${CMAKE_EXE_LINKER_FLAGS_RELEASE}\")\nset(CMAKE_SHARED_LINKER_FLAGS_PROFILE \"${CMAKE_SHARED_LINKER_FLAGS_RELEASE}\")\nset(CMAKE_C_FLAGS_PROFILE \"${CMAKE_C_FLAGS_RELEASE}\")\nset(CMAKE_CXX_FLAGS_PROFILE \"${CMAKE_CXX_FLAGS_RELEASE}\")\n\n# Use Unicode for all projects.\nadd_definitions(-DUNICODE -D_UNICODE)\n\n# Compilation settings that should be applied to most targets.\n#\n# Be cautious about adding new options here, as plugins use this function by\n# default. In most cases, you should add new options to specific targets instead\n# of modifying this function.\nfunction(APPLY_STANDARD_SETTINGS TARGET)\n  target_compile_features(${TARGET} PUBLIC cxx_std_17)\n  target_compile_options(${TARGET} PRIVATE /W4 /WX /wd\"4100\" /wd4267)\n  target_compile_options(${TARGET} PRIVATE /EHsc)\n  target_compile_definitions(${TARGET} PRIVATE \"_HAS_EXCEPTIONS=0\")\n  target_compile_definitions(${TARGET} PRIVATE \"$<$<CONFIG:Debug>:_DEBUG>\")\nendfunction()\n\n# Flutter library and tool build rules.\nset(FLUTTER_MANAGED_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/flutter\")\nadd_subdirectory(${FLUTTER_MANAGED_DIR})\n\n# Application build; see runner/CMakeLists.txt.\nadd_subdirectory(\"runner\")\n\n# Generated plugin build rules, which manage building the plugins and adding\n# them to the application.\ninclude(flutter/generated_plugins.cmake)\n\n\n# === Installation ===\n# Support files are copied into place next to the executable, so that it can\n# run in place. This is done instead of making a separate bundle (as on Linux)\n# so that building and running from within Visual Studio will work.\nset(BUILD_BUNDLE_DIR \"$<TARGET_FILE_DIR:${BINARY_NAME}>\")\n# Make the \"install\" step default, as it's required to run.\nset(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)\nif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)\n  set(CMAKE_INSTALL_PREFIX \"${BUILD_BUNDLE_DIR}\" CACHE PATH \"...\" FORCE)\nendif()\n\nset(INSTALL_BUNDLE_DATA_DIR \"${CMAKE_INSTALL_PREFIX}/data\")\nset(INSTALL_BUNDLE_LIB_DIR \"${CMAKE_INSTALL_PREFIX}\")\n\ninstall(TARGETS ${BINARY_NAME} RUNTIME DESTINATION \"${CMAKE_INSTALL_PREFIX}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_ICU_DATA_FILE}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n  COMPONENT Runtime)\n\nif(PLUGIN_BUNDLED_LIBRARIES)\n  install(FILES \"${PLUGIN_BUNDLED_LIBRARIES}\"\n    DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendif()\n\n# Fully re-copy the assets directory on each build to avoid having stale files\n# from a previous install.\nset(FLUTTER_ASSET_DIR_NAME \"flutter_assets\")\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\\\")\n  \" COMPONENT Runtime)\ninstall(DIRECTORY \"${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}\"\n  DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\" COMPONENT Runtime)\n\n# Install the AOT library on non-Debug builds only.\ninstall(FILES \"${AOT_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  CONFIGURATIONS Profile;Release\n  COMPONENT Runtime)\n"
  },
  {
    "path": "windows/build.iss",
    "content": "; Script generated by the Inno Setup Script Wizard.\n; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!\n\n#define MyAppName \"Pica Comic\"\n#define MyAppVersion \"{{version}}\"\n#define MyAppPublisher \"wgh136\"\n#define MyAppURL \"https://github.com/wgh136/PicaComic\"\n#define MyAppExeName \"pica_comic.exe\"\n#define RootPath \"{{root_path}}\"\n\n[Setup]\n; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.\n; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)\nAppId={{B2DED6B2-9A2D-40C3-B008-9B518A628BCA}\nAppName={#MyAppName}\nAppVersion={#MyAppVersion}\n;AppVerName={#MyAppName} {#MyAppVersion}\nAppPublisher={#MyAppPublisher}\nAppPublisherURL={#MyAppURL}\nAppSupportURL={#MyAppURL}\nAppUpdatesURL={#MyAppURL}\nDefaultDirName={autopf}\\{#MyAppName}\nDisableProgramGroupPage=yes\n; Uncomment the following line to run in non administrative install mode (install for current user only.)\n;PrivilegesRequired=lowest\nPrivilegesRequiredOverridesAllowed=dialog\nOutputDir={#RootPath}\\build\\windows\nOutputBaseFilename=PicaComic-{#MyAppVersion}-windows-installer\nSetupIconFile={#RootPath}\\windows\\runner\\resources\\app_icon.ico\nCompression=lzma\nSolidCompression=yes\nWizardStyle=modern\n\n[Languages]\nName: \"english\"; MessagesFile: \"compiler:Default.isl\"\nName: \"chinesesimplified\"; MessagesFile: \"compiler:Languages\\ChineseSimplified.isl\"\n\n[Tasks]\nName: \"desktopicon\"; Description: \"{cm:CreateDesktopIcon}\"; GroupDescription: \"{cm:AdditionalIcons}\"; Flags: unchecked\n\n[Files]\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\{#MyAppExeName}\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\dynamic_color_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\app_links_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\file_selector_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\sqlite3.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\sqlite3_flutter_libs_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\flutter_windows.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\flutter_qjs_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\local_auth_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\desktop_webview_window_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\WebView2Loader.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\share_plus_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\url_launcher_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\zip_flutter.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\screen_retriever_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\window_manager_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\data\\*\"; DestDir: \"{app}\\data\"; Flags: ignoreversion recursesubdirs createallsubdirs\n; NOTE: Don't use \"Flags: ignoreversion\" on any shared system files\n\n[Icons]\nName: \"{autoprograms}\\{#MyAppName}\"; Filename: \"{app}\\{#MyAppExeName}\"\nName: \"{autodesktop}\\{#MyAppName}\"; Filename: \"{app}\\{#MyAppExeName}\"; Tasks: desktopicon\n\n[Run]\nFilename: \"{app}\\{#MyAppExeName}\"; Description: \"{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}\"; Flags: nowait postinstall"
  },
  {
    "path": "windows/build_windows.py",
    "content": "import subprocess\nimport os\n\nfontUse = '''\n  fonts:\n    - family: font\n      fonts:\n        - asset: fonts/NotoSansSC-Regular.ttf\n'''\n\nfile = open('pubspec.yaml', 'r')\ncontent = file.read()\nfile.close()\nfile = open('pubspec.yaml', 'a')\nfile.write(fontUse)\nfile.close()\n\nsubprocess.run([\"flutter\", \"build\", \"windows\"], shell=True)\n\nfile = open('pubspec.yaml', 'w')\nfile.write(content)\n\nif os.path.exists(\"build/app-windows.zip\"):\n    os.remove(\"build/app-windows.zip\")\n\nversion = str.split(str.split(content, 'version: ')[1], '+')[0]\n\n# 压缩build/windows/x64/runner/Release, 生成app-windows.zip, 使用tar命令\nsubprocess.run([\"tar\", \"-a\", \"-c\", \"-f\", f\"build/windows/PicaComic-{version}-windows.zip\", \"-C\", \"build/windows/x64/runner/Release\", \".\"]\n               , shell=True)\n\nissContent = \"\"\nfile = open('windows/build.iss', 'r')\nissContent = file.read()\nnewContent = issContent\nnewContent = newContent.replace(\"{{version}}\", version)\nnewContent = newContent.replace(\"{{root_path}}\", os.getcwd())\nfile.close()\nfile = open('windows/build.iss', 'w')\nfile.write(newContent)\nfile.close()\n\nsubprocess.run([\"iscc\", \"windows/build.iss\"], shell=True)\n\nwith open('windows/build.iss', 'w') as file:\n    file.write(issContent)"
  },
  {
    "path": "windows/flutter/CMakeLists.txt",
    "content": "# This file controls Flutter-level build steps. It should not be edited.\ncmake_minimum_required(VERSION 3.14)\n\nset(EPHEMERAL_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ephemeral\")\n\n# Configuration provided via flutter tool.\ninclude(${EPHEMERAL_DIR}/generated_config.cmake)\n\n# TODO: Move the rest of this into files in ephemeral. See\n# https://github.com/flutter/flutter/issues/57146.\nset(WRAPPER_ROOT \"${EPHEMERAL_DIR}/cpp_client_wrapper\")\n\n# Set fallback configurations for older versions of the flutter tool.\nif (NOT DEFINED FLUTTER_TARGET_PLATFORM)\n  set(FLUTTER_TARGET_PLATFORM \"windows-x64\")\nendif()\n\n# === Flutter Library ===\nset(FLUTTER_LIBRARY \"${EPHEMERAL_DIR}/flutter_windows.dll\")\n\n# Published to parent scope for install step.\nset(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)\nset(FLUTTER_ICU_DATA_FILE \"${EPHEMERAL_DIR}/icudtl.dat\" PARENT_SCOPE)\nset(PROJECT_BUILD_DIR \"${PROJECT_DIR}/build/\" PARENT_SCOPE)\nset(AOT_LIBRARY \"${PROJECT_DIR}/build/windows/app.so\" PARENT_SCOPE)\n\nlist(APPEND FLUTTER_LIBRARY_HEADERS\n  \"flutter_export.h\"\n  \"flutter_windows.h\"\n  \"flutter_messenger.h\"\n  \"flutter_plugin_registrar.h\"\n  \"flutter_texture_registrar.h\"\n)\nlist(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND \"${EPHEMERAL_DIR}/\")\nadd_library(flutter INTERFACE)\ntarget_include_directories(flutter INTERFACE\n  \"${EPHEMERAL_DIR}\"\n)\ntarget_link_libraries(flutter INTERFACE \"${FLUTTER_LIBRARY}.lib\")\nadd_dependencies(flutter flutter_assemble)\n\n# === Wrapper ===\nlist(APPEND CPP_WRAPPER_SOURCES_CORE\n  \"core_implementations.cc\"\n  \"standard_codec.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND \"${WRAPPER_ROOT}/\")\nlist(APPEND CPP_WRAPPER_SOURCES_PLUGIN\n  \"plugin_registrar.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND \"${WRAPPER_ROOT}/\")\nlist(APPEND CPP_WRAPPER_SOURCES_APP\n  \"flutter_engine.cc\"\n  \"flutter_view_controller.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND \"${WRAPPER_ROOT}/\")\n\n# Wrapper sources needed for a plugin.\nadd_library(flutter_wrapper_plugin STATIC\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_PLUGIN}\n)\napply_standard_settings(flutter_wrapper_plugin)\nset_target_properties(flutter_wrapper_plugin PROPERTIES\n  POSITION_INDEPENDENT_CODE ON)\nset_target_properties(flutter_wrapper_plugin PROPERTIES\n  CXX_VISIBILITY_PRESET hidden)\ntarget_link_libraries(flutter_wrapper_plugin PUBLIC flutter)\ntarget_include_directories(flutter_wrapper_plugin PUBLIC\n  \"${WRAPPER_ROOT}/include\"\n)\nadd_dependencies(flutter_wrapper_plugin flutter_assemble)\n\n# Wrapper sources needed for the runner.\nadd_library(flutter_wrapper_app STATIC\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_APP}\n)\napply_standard_settings(flutter_wrapper_app)\ntarget_link_libraries(flutter_wrapper_app PUBLIC flutter)\ntarget_include_directories(flutter_wrapper_app PUBLIC\n  \"${WRAPPER_ROOT}/include\"\n)\nadd_dependencies(flutter_wrapper_app flutter_assemble)\n\n# === Flutter tool backend ===\n# _phony_ is a non-existent file to force this command to run every time,\n# since currently there's no way to get a full input/output list from the\n# flutter tool.\nset(PHONY_OUTPUT \"${CMAKE_CURRENT_BINARY_DIR}/_phony_\")\nset_source_files_properties(\"${PHONY_OUTPUT}\" PROPERTIES SYMBOLIC TRUE)\nadd_custom_command(\n  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}\n    ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}\n    ${CPP_WRAPPER_SOURCES_APP}\n    ${PHONY_OUTPUT}\n  COMMAND ${CMAKE_COMMAND} -E env\n    ${FLUTTER_TOOL_ENVIRONMENT}\n    \"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat\"\n      ${FLUTTER_TARGET_PLATFORM} $<CONFIG>\n  VERBATIM\n)\nadd_custom_target(flutter_assemble DEPENDS\n  \"${FLUTTER_LIBRARY}\"\n  ${FLUTTER_LIBRARY_HEADERS}\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_PLUGIN}\n  ${CPP_WRAPPER_SOURCES_APP}\n)\n"
  },
  {
    "path": "windows/flutter/generated_plugin_registrant.cc",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#include \"generated_plugin_registrant.h\"\n\n#include <app_links/app_links_plugin_c_api.h>\n#include <desktop_webview_window/desktop_webview_window_plugin.h>\n#include <dynamic_color/dynamic_color_plugin_c_api.h>\n#include <file_selector_windows/file_selector_windows.h>\n#include <flutter_qjs/flutter_qjs_plugin.h>\n#include <local_auth_windows/local_auth_plugin.h>\n#include <screen_retriever/screen_retriever_plugin.h>\n#include <share_plus/share_plus_windows_plugin_c_api.h>\n#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>\n#include <url_launcher_windows/url_launcher_windows.h>\n#include <window_manager/window_manager_plugin.h>\n\nvoid RegisterPlugins(flutter::PluginRegistry* registry) {\n  AppLinksPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"AppLinksPluginCApi\"));\n  DesktopWebviewWindowPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"DesktopWebviewWindowPlugin\"));\n  DynamicColorPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"DynamicColorPluginCApi\"));\n  FileSelectorWindowsRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"FileSelectorWindows\"));\n  FlutterQjsPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"FlutterQjsPlugin\"));\n  LocalAuthPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"LocalAuthPlugin\"));\n  ScreenRetrieverPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"ScreenRetrieverPlugin\"));\n  SharePlusWindowsPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"SharePlusWindowsPluginCApi\"));\n  Sqlite3FlutterLibsPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"Sqlite3FlutterLibsPlugin\"));\n  UrlLauncherWindowsRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"UrlLauncherWindows\"));\n  WindowManagerPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"WindowManagerPlugin\"));\n}\n"
  },
  {
    "path": "windows/flutter/generated_plugin_registrant.h",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#ifndef GENERATED_PLUGIN_REGISTRANT_\n#define GENERATED_PLUGIN_REGISTRANT_\n\n#include <flutter/plugin_registry.h>\n\n// Registers Flutter plugins.\nvoid RegisterPlugins(flutter::PluginRegistry* registry);\n\n#endif  // GENERATED_PLUGIN_REGISTRANT_\n"
  },
  {
    "path": "windows/flutter/generated_plugins.cmake",
    "content": "#\n# Generated file, do not edit.\n#\n\nlist(APPEND FLUTTER_PLUGIN_LIST\n  app_links\n  desktop_webview_window\n  dynamic_color\n  file_selector_windows\n  flutter_qjs\n  local_auth_windows\n  screen_retriever\n  share_plus\n  sqlite3_flutter_libs\n  url_launcher_windows\n  window_manager\n)\n\nlist(APPEND FLUTTER_FFI_PLUGIN_LIST\n  zip_flutter\n)\n\nset(PLUGIN_BUNDLED_LIBRARIES)\n\nforeach(plugin ${FLUTTER_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin})\n  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})\nendforeach(plugin)\n\nforeach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})\nendforeach(ffi_plugin)\n"
  },
  {
    "path": "windows/runner/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.14)\nproject(runner LANGUAGES CXX)\n\n# Define the application target. To change its name, change BINARY_NAME in the\n# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer\n# work.\n#\n# Any new source files that you add to the application should be added here.\nadd_executable(${BINARY_NAME} WIN32\n  \"flutter_window.cpp\"\n  \"main.cpp\"\n  \"utils.cpp\"\n  \"win32_window.cpp\"\n  \"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc\"\n  \"Runner.rc\"\n  \"runner.exe.manifest\"\n)\n\n# Apply the standard set of build settings. This can be removed for applications\n# that need different build settings.\napply_standard_settings(${BINARY_NAME})\n\n# Add preprocessor definitions for the build version.\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION=\\\"${FLUTTER_VERSION}\\\"\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}\")\n\n# Disable Windows macros that collide with C++ standard library functions.\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"NOMINMAX\")\n\n# Add dependency libraries and include directories. Add any application-specific\n# dependencies here.\ntarget_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)\ntarget_link_libraries(${BINARY_NAME} PRIVATE \"dwmapi.lib\")\ntarget_include_directories(${BINARY_NAME} PRIVATE \"${CMAKE_SOURCE_DIR}\")\n\n# Run the Flutter tool portions of the build. This must not be removed.\nadd_dependencies(${BINARY_NAME} flutter_assemble)\n"
  },
  {
    "path": "windows/runner/Runner.rc",
    "content": "// Microsoft Visual C++ generated resource script.\n//\n#pragma code_page(65001)\n#include \"resource.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 2 resource.\n//\n#include \"winres.h\"\n\n/////////////////////////////////////////////////////////////////////////////\n#undef APSTUDIO_READONLY_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n// English (United States) resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\n\n#ifdef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// TEXTINCLUDE\n//\n\n1 TEXTINCLUDE\nBEGIN\n    \"resource.h\\0\"\nEND\n\n2 TEXTINCLUDE\nBEGIN\n    \"#include \"\"winres.h\"\"\\r\\n\"\n    \"\\0\"\nEND\n\n3 TEXTINCLUDE\nBEGIN\n    \"\\r\\n\"\n    \"\\0\"\nEND\n\n#endif    // APSTUDIO_INVOKED\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Icon\n//\n\n// Icon with lowest ID value placed first to ensure application icon\n// remains consistent on all systems.\nIDI_APP_ICON            ICON                    \"resources\\\\app_icon.ico\"\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Version\n//\n\n#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)\n#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD\n#else\n#define VERSION_AS_NUMBER 1,0,0,0\n#endif\n\n#if defined(FLUTTER_VERSION)\n#define VERSION_AS_STRING FLUTTER_VERSION\n#else\n#define VERSION_AS_STRING \"1.0.0\"\n#endif\n\nVS_VERSION_INFO VERSIONINFO\n FILEVERSION VERSION_AS_NUMBER\n PRODUCTVERSION VERSION_AS_NUMBER\n FILEFLAGSMASK VS_FFI_FILEFLAGSMASK\n#ifdef _DEBUG\n FILEFLAGS VS_FF_DEBUG\n#else\n FILEFLAGS 0x0L\n#endif\n FILEOS VOS__WINDOWS32\n FILETYPE VFT_APP\n FILESUBTYPE 0x0L\nBEGIN\n    BLOCK \"StringFileInfo\"\n    BEGIN\n        BLOCK \"040904e4\"\n        BEGIN\n            VALUE \"CompanyName\", \"com.kokoiro.xyz\" \"\\0\"\n            VALUE \"FileDescription\", \"pica_comic\" \"\\0\"\n            VALUE \"FileVersion\", VERSION_AS_STRING \"\\0\"\n            VALUE \"InternalName\", \"pica_comic\" \"\\0\"\n            VALUE \"LegalCopyright\", \"Copyright (C) 2023 com.kokoiro.xyz. All rights reserved.\" \"\\0\"\n            VALUE \"OriginalFilename\", \"pica_comic.exe\" \"\\0\"\n            VALUE \"ProductName\", \"pica_comic\" \"\\0\"\n            VALUE \"ProductVersion\", VERSION_AS_STRING \"\\0\"\n        END\n    END\n    BLOCK \"VarFileInfo\"\n    BEGIN\n        VALUE \"Translation\", 0x409, 1252\n    END\nEND\n\n#endif    // English (United States) resources\n/////////////////////////////////////////////////////////////////////////////\n\n\n\n#ifndef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 3 resource.\n//\n\n\n/////////////////////////////////////////////////////////////////////////////\n#endif    // not APSTUDIO_INVOKED\n"
  },
  {
    "path": "windows/runner/flutter_window.cpp",
    "content": "#pragma comment(lib, \"winhttp.lib\")\n#include \"flutter_window.h\"\n#include <dwmapi.h>\n#include <flutter/method_channel.h>\n#include <flutter/event_channel.h>\n#include <flutter/event_sink.h>\n#include <flutter/event_stream_handler_functions.h>\n#include <optional>\n#include \"flutter/generated_plugin_registrant.h\"\n#include <flutter/standard_method_codec.h>\n#include <winhttp.h>\n#include <Windows.h>\n#include <winbase.h>\n#define _CRT_SECURE_NO_WARNINGS\n\nstd::unique_ptr<flutter::EventSink<flutter::EncodableValue>>&& mouseEvents = nullptr;\n\nchar* wideCharToMultiByte(wchar_t* pWCStrKey)\n{\n    size_t pSize = WideCharToMultiByte(CP_OEMCP, 0, pWCStrKey, wcslen(pWCStrKey), NULL, 0, NULL, NULL);\n    char* pCStrKey = new char[pSize + 1];\n    WideCharToMultiByte(CP_OEMCP, 0, pWCStrKey, wcslen(pWCStrKey), pCStrKey, pSize, NULL, NULL);\n    pCStrKey[pSize] = '\\0';\n    GlobalFree(pWCStrKey);\n    return pCStrKey;\n}\n\nchar* getProxy() {\n    _WINHTTP_CURRENT_USER_IE_PROXY_CONFIG net;\n    WinHttpGetIEProxyConfigForCurrentUser(&net);\n    if (net.lpszProxy == nullptr) {\n        GlobalFree(net.lpszAutoConfigUrl);\n        GlobalFree(net.lpszProxyBypass);\n        return nullptr;\n    }\n    else {\n        GlobalFree(net.lpszAutoConfigUrl);\n        GlobalFree(net.lpszProxyBypass);\n        return wideCharToMultiByte(net.lpszProxy);\n    }\n}\n\nFlutterWindow::FlutterWindow(const flutter::DartProject& project)\n    : project_(project) {}\n\nFlutterWindow::~FlutterWindow() {}\n\nbool FlutterWindow::OnCreate() {\n    if (!Win32Window::OnCreate())\n    {\n        return false;\n    }\n\n    const RECT frame = GetClientArea();\n\n    // The size here must match the window dimensions to avoid unnecessary surface\n    // creation / destruction in the startup path.\n    flutter_controller_ = std::make_unique<flutter::FlutterViewController>(\n        frame.right - frame.left, frame.bottom - frame.top, project_);\n    // Ensure that basic setup of the controller was successful.\n    if (!flutter_controller_->engine() || !flutter_controller_->view()) {\n        return false;\n    }\n    RegisterPlugins(flutter_controller_->engine());\n\n    //检查系统代理的MethodChannel\n    const flutter::MethodChannel<> channel(\n        flutter_controller_->engine()->messenger(), \"kokoiro.xyz.pica_comic/proxy\", \n        &flutter::StandardMethodCodec::GetInstance()\n    );\n    channel.SetMethodCallHandler(\n      [](const flutter::MethodCall<>& call,const std::unique_ptr<flutter::MethodResult<>>& result) {\n          const auto res = getProxy();\n          if (res != nullptr){\n              std::string s = res;\n              result->Success(s);\n          }\n          else\n              result->Success(flutter::EncodableValue(\"No Proxy\"));\n          delete(res);\n    });\n\n    //监听鼠标侧键的EventChannel\n    const auto channelName = \"kokoiro.xyz.pica_comic/mouse\";\n    flutter::EventChannel<> channel2(\n        flutter_controller_->engine()->messenger(), channelName, \n        &flutter::StandardMethodCodec::GetInstance()\n    );\n\n    auto eventHandler = std::make_unique<\n        flutter::StreamHandlerFunctions<flutter::EncodableValue>>(\n    [](\n        const flutter::EncodableValue* arguments,\n        std::unique_ptr<flutter::EventSink<flutter::EncodableValue>>&& events){\n            mouseEvents = std::move(events);\n            return nullptr;\n    },\n    [](const flutter::EncodableValue* arguments)\n        -> std::unique_ptr<flutter::StreamHandlerError<flutter::EncodableValue>> {\n            mouseEvents = nullptr;\n            return nullptr;\n    });\n    \n    channel2.SetStreamHandler(std::move(eventHandler));\n\n    const flutter::MethodChannel<> channel3(\n        flutter_controller_->engine()->messenger(), \"pica_comic/title_bar\",\n        &flutter::StandardMethodCodec::GetInstance()\n    );\n    channel3.SetMethodCallHandler(\n        [this](const flutter::MethodCall<>& call, const std::unique_ptr<flutter::MethodResult<>>& result) {\n            auto value = static_cast<COLORREF>(std::get<int64_t>(*call.arguments()));\n            COLORREF color = RGB(GetRValue(value), GetGValue(value), GetBValue(value));\n            DwmSetWindowAttribute(GetHandle(), DWMWA_CAPTION_COLOR,\n            &color, sizeof(color));\n            RedrawWindow(GetHandle(), NULL, 0, RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);\n            result->Success();\n        });\n\n    const flutter::MethodChannel<> channel4(\n        flutter_controller_->engine()->messenger(), \"pica_comic/full_screen\",\n        &flutter::StandardMethodCodec::GetInstance()\n    );\n    channel4.SetMethodCallHandler(\n        [this](const flutter::MethodCall<>& call, const std::unique_ptr<flutter::MethodResult<>>& result) {\n            if (std::get<bool>(*call.arguments())) {\n                GetWindowRect(GetHandle(), &windowRect);\n                int screenWidth = GetSystemMetrics(SM_CXSCREEN);\n                int screenHeight = GetSystemMetrics(SM_CYSCREEN);\n                SetWindowLong(GetHandle(), GWL_STYLE, WS_POPUP);\n                SetWindowPos(GetHandle(), HWND_TOP, 0, 0, screenWidth, screenHeight, SWP_SHOWWINDOW);\n            }\n            else {\n                SetWindowLong(GetHandle(), GWL_STYLE, WS_OVERLAPPEDWINDOW);\n                SetWindowPos(GetHandle(), HWND_TOP, windowRect.left, windowRect.top, windowRect.right - windowRect.left, windowRect.bottom - windowRect.top, SWP_SHOWWINDOW);\n            }\n            result->Success();\n        });\n    \n    SetChildContent(flutter_controller_->view()->GetNativeWindow());\n\n    flutter_controller_->engine()->SetNextFrameCallback([&]() {\n        //this->Show();\n    });\n\n    return true;\n}\n\nvoid FlutterWindow::OnDestroy() {\n  if (flutter_controller_) {\n    flutter_controller_ = nullptr;\n  }\n\n  Win32Window::OnDestroy();\n}\n\nvoid mouse_side_button_listener(unsigned int input)\n{\n    if(mouseEvents != nullptr)\n    {\n        mouseEvents->Success(static_cast<int>(input));\n    }\n}\n\nLRESULT\nFlutterWindow::MessageHandler(HWND hwnd, UINT const message,\n                              WPARAM const wparam,\n                              LPARAM const lparam) noexcept {\n  // Give Flutter, including plugins, an opportunity to handle window messages.\n    UINT button = GET_XBUTTON_WPARAM(wparam);  \n    if (button == XBUTTON1 && message == 528)\n    {\n        mouse_side_button_listener(0);\n    }\n    else if (button == XBUTTON2 && message == 528)\n    {\n        mouse_side_button_listener(1);\n    }\n    if (flutter_controller_) {\n        std::optional<LRESULT> result =\n            flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,\n                                                      lparam);\n        if (result) {\n          return *result;\n        }\n    }\n\n    switch (message) {\n      case WM_FONTCHANGE:\n          flutter_controller_->engine()->ReloadSystemFonts();\n          break;\n    }\n\n  return Win32Window::MessageHandler(hwnd, message, wparam, lparam);\n}"
  },
  {
    "path": "windows/runner/flutter_window.h",
    "content": "#ifndef RUNNER_FLUTTER_WINDOW_H_\n#define RUNNER_FLUTTER_WINDOW_H_\n\n#include <flutter/dart_project.h>\n#include <flutter/flutter_view_controller.h>\n\n#include <memory>\n\n#include \"win32_window.h\"\n\n// A window that does nothing but host a Flutter view.\nclass FlutterWindow : public Win32Window {\n public:\n  // Creates a new FlutterWindow hosting a Flutter view running |project|.\n  explicit FlutterWindow(const flutter::DartProject& project);\n  virtual ~FlutterWindow();\n\n protected:\n  // Win32Window:\n  bool OnCreate() override;\n  void OnDestroy() override;\n  LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,\n                         LPARAM const lparam) noexcept override;\n\n private:\n  // The project to run.\n  flutter::DartProject project_;\n\n  // The Flutter instance hosted by this window.\n  std::unique_ptr<flutter::FlutterViewController> flutter_controller_;\n\n  RECT windowRect;\n};\n\n#endif  // RUNNER_FLUTTER_WINDOW_H_\n"
  },
  {
    "path": "windows/runner/main.cpp",
    "content": "#include <flutter/dart_project.h>\n#include <flutter/flutter_view_controller.h>\n#include <windows.h>\n#include \"flutter_window.h\"\n#include \"utils.h\"\n\nint APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,\n                      _In_ wchar_t *command_line, _In_ int show_command) {\n  // Attach to console when present (e.g., 'flutter run') or create a\n  // new console when running with a debugger.\n  if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {\n    CreateAndAttachConsole();\n  }\n\n  // Initialize COM, so that it is available for use in the library and/or\n  // plugins.\n  ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);\n\n  flutter::DartProject project(L\"data\");\n\n  std::vector<std::string> command_line_arguments =\n      GetCommandLineArguments();\n\n  project.set_dart_entrypoint_arguments(std::move(command_line_arguments));\n\n  FlutterWindow window(project);\n  Win32Window::Point origin(10, 10);\n  Win32Window::Size size(1280, 800);\n  if (!window.Create(L\"Pica Comic\", origin, size)) {\n    return EXIT_FAILURE;\n  }\n  window.SetQuitOnClose(true);\n\n  ::MSG msg;\n  while (::GetMessage(&msg, nullptr, 0, 0)) {\n    ::TranslateMessage(&msg);\n    ::DispatchMessage(&msg);\n  }\n\n  ::CoUninitialize();\n  return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "windows/runner/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\n// Microsoft Visual C++ generated include file.\n// Used by Runner.rc\n//\n#define IDI_APP_ICON                    101\n\n// Next default values for new objects\n//\n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NEXT_RESOURCE_VALUE        102\n#define _APS_NEXT_COMMAND_VALUE         40001\n#define _APS_NEXT_CONTROL_VALUE         1001\n#define _APS_NEXT_SYMED_VALUE           101\n#endif\n#endif\n"
  },
  {
    "path": "windows/runner/runner.exe.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n    <windowsSettings>\n      <dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitorV2</dpiAwareness>\n    </windowsSettings>\n  </application>\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- Windows 10 and Windows 11 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\"/>\n      <!-- Windows 8.1 -->\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\"/>\n      <!-- Windows 8 -->\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\"/>\n      <!-- Windows 7 -->\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\"/>\n    </application>\n  </compatibility>\n</assembly>\n"
  },
  {
    "path": "windows/runner/utils.cpp",
    "content": "#include \"utils.h\"\n\n#include <flutter_windows.h>\n#include <io.h>\n#include <stdio.h>\n#include <windows.h>\n\n#include <iostream>\n\nvoid CreateAndAttachConsole() {\n  if (::AllocConsole()) {\n    FILE *unused;\n    if (freopen_s(&unused, \"CONOUT$\", \"w\", stdout)) {\n      _dup2(_fileno(stdout), 1);\n    }\n    if (freopen_s(&unused, \"CONOUT$\", \"w\", stderr)) {\n      _dup2(_fileno(stdout), 2);\n    }\n    std::ios::sync_with_stdio();\n    FlutterDesktopResyncOutputStreams();\n  }\n}\n\nstd::vector<std::string> GetCommandLineArguments() {\n  // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.\n  int argc;\n  wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);\n  if (argv == nullptr) {\n    return std::vector<std::string>();\n  }\n\n  std::vector<std::string> command_line_arguments;\n\n  // Skip the first argument as it's the binary name.\n  for (int i = 1; i < argc; i++) {\n    command_line_arguments.push_back(Utf8FromUtf16(argv[i]));\n  }\n\n  ::LocalFree(argv);\n\n  return command_line_arguments;\n}\n\nstd::string Utf8FromUtf16(const wchar_t* utf16_string) {\n  if (utf16_string == nullptr) {\n    return std::string();\n  }\n  int target_length = ::WideCharToMultiByte(\n      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,\n      -1, nullptr, 0, nullptr, nullptr);\n  std::string utf8_string;\n  if (target_length == 0 || target_length > utf8_string.max_size()) {\n    return utf8_string;\n  }\n  utf8_string.resize(target_length);\n  int converted_length = ::WideCharToMultiByte(\n      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,\n      -1, utf8_string.data(),\n      target_length, nullptr, nullptr);\n  if (converted_length == 0) {\n    return std::string();\n  }\n  return utf8_string;\n}\n"
  },
  {
    "path": "windows/runner/utils.h",
    "content": "#ifndef RUNNER_UTILS_H_\n#define RUNNER_UTILS_H_\n\n#include <string>\n#include <vector>\n\n// Creates a console for the process, and redirects stdout and stderr to\n// it for both the runner and the Flutter library.\nvoid CreateAndAttachConsole();\n\n// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string\n// encoded in UTF-8. Returns an empty std::string on failure.\nstd::string Utf8FromUtf16(const wchar_t* utf16_string);\n\n// Gets the command line arguments passed in as a std::vector<std::string>,\n// encoded in UTF-8. Returns an empty std::vector<std::string> on failure.\nstd::vector<std::string> GetCommandLineArguments();\n\n#endif  // RUNNER_UTILS_H_\n"
  },
  {
    "path": "windows/runner/win32_window.cpp",
    "content": "#include \"win32_window.h\"\n\n#include <dwmapi.h>\n#include <flutter_windows.h>\n#include <fstream>\n#include \"resource.h\"\n#include <filesystem>\n#include \"app_links/app_links_plugin_c_api.h\"\n\nnamespace {\n\n/// Window attribute that enables dark mode window decorations.\n///\n/// Redefined in case the developer's machine has a Windows SDK older than\n/// version 10.0.22000.0.\n/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute\n#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE\n#define DWMWA_USE_IMMERSIVE_DARK_MODE 20\n#endif\n\nconstexpr const wchar_t kWindowClassName[] = L\"FLUTTER_RUNNER_WIN32_WINDOW\";\n\n/// Registry key for app theme preference.\n///\n/// A value of 0 indicates apps should use dark mode. A non-zero or missing\n/// value indicates apps should use light mode.\nconstexpr const wchar_t kGetPreferredBrightnessRegKey[] =\n  L\"Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize\";\nconstexpr const wchar_t kGetPreferredBrightnessRegValue[] = L\"AppsUseLightTheme\";\n\n// The number of Win32Window objects that currently exist.\nstatic int g_active_window_count = 0;\n\nusing EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);\n\n// Scale helper to convert logical scaler values to physical using passed in\n// scale factor\nint Scale(int source, double scale_factor) {\n  return static_cast<int>(source * scale_factor);\n}\n\n// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.\n// This API is only needed for PerMonitor V1 awareness mode.\nvoid EnableFullDpiSupportIfAvailable(HWND hwnd) {\n  HMODULE user32_module = LoadLibraryA(\"User32.dll\");\n  if (!user32_module) {\n    return;\n  }\n  auto enable_non_client_dpi_scaling =\n      reinterpret_cast<EnableNonClientDpiScaling*>(\n          GetProcAddress(user32_module, \"EnableNonClientDpiScaling\"));\n  if (enable_non_client_dpi_scaling != nullptr) {\n    enable_non_client_dpi_scaling(hwnd);\n  }\n  FreeLibrary(user32_module);\n}\n\n}  // namespace\n\n// Manages the Win32Window's window class registration.\nclass WindowClassRegistrar {\n public:\n  ~WindowClassRegistrar() = default;\n\n  // Returns the singleton registrar instance.\n  static WindowClassRegistrar* GetInstance() {\n    if (!instance_) {\n      instance_ = new WindowClassRegistrar();\n    }\n    return instance_;\n  }\n\n  // Returns the name of the window class, registering the class if it hasn't\n  // previously been registered.\n  const wchar_t* GetWindowClass();\n\n  // Unregisters the window class. Should only be called if there are no\n  // instances of the window.\n  void UnregisterWindowClass();\n\n private:\n  WindowClassRegistrar() = default;\n\n  static WindowClassRegistrar* instance_;\n\n  bool class_registered_ = false;\n};\n\nWindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;\n\nconst wchar_t* WindowClassRegistrar::GetWindowClass() {\n  if (!class_registered_) {\n    WNDCLASS window_class{};\n    window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);\n    window_class.lpszClassName = kWindowClassName;\n    window_class.style = CS_HREDRAW | CS_VREDRAW;\n    window_class.cbClsExtra = 0;\n    window_class.cbWndExtra = 0;\n    window_class.hInstance = GetModuleHandle(nullptr);\n    window_class.hIcon =\n        LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));\n    window_class.hbrBackground = 0;\n    window_class.lpszMenuName = nullptr;\n    window_class.lpfnWndProc = Win32Window::WndProc;\n    RegisterClass(&window_class);\n    class_registered_ = true;\n  }\n  return kWindowClassName;\n}\n\nvoid WindowClassRegistrar::UnregisterWindowClass() {\n  UnregisterClass(kWindowClassName, nullptr);\n  class_registered_ = false;\n}\n\nWin32Window::Win32Window() {\n  ++g_active_window_count;\n}\n\nWin32Window::~Win32Window() {\n  --g_active_window_count;\n  Destroy();\n}\n\nbool Win32Window::SendAppLinkToInstance(const std::wstring& title) {\n    // Find our exact window\n    HWND hwnd = ::FindWindow(kWindowClassName, title.c_str());\n\n    if (hwnd) {\n        // Dispatch new link to current window\n        SendAppLink(hwnd);\n\n        // (Optional) Restore our window to front in same state\n        WINDOWPLACEMENT place = { sizeof(WINDOWPLACEMENT) };\n        GetWindowPlacement(hwnd, &place);\n\n        switch (place.showCmd) {\n        case SW_SHOWMAXIMIZED:\n            ShowWindow(hwnd, SW_SHOWMAXIMIZED);\n            break;\n        case SW_SHOWMINIMIZED:\n            ShowWindow(hwnd, SW_RESTORE);\n            break;\n        default:\n            ShowWindow(hwnd, SW_NORMAL);\n            break;\n        }\n\n        SetWindowPos(0, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);\n        SetForegroundWindow(hwnd);\n        // END Restore\n\n        // Window has been found, don't create another one.\n        return true;\n    }\n\n    return false;\n}\n\nvoid Win32Window::readPlacement(HWND hwnd) {\n    WINDOWPLACEMENT windowsPlacement{};\n    wchar_t appDataPath[MAX_PATH];\n    GetEnvironmentVariableW(L\"APPDATA\", appDataPath, MAX_PATH);\n    std::wstring path{appDataPath};\n    path += L\"\\\\com.kokoiro.xyz\\\\pica_comic\";\n    if (!std::filesystem::exists(path)) {\n        std::filesystem::create_directories(path);\n    }\n    path += L\"\\\\location.data\";\n    std::ifstream file{path, std::ios::binary};\n    if (file.good()) {\n        file.read(reinterpret_cast<char*>(&windowsPlacement), sizeof(WINDOWPLACEMENT));\n        SetWindowPlacement(hwnd, &windowsPlacement);\n    }\n}\n\nbool Win32Window::Create(const std::wstring& title,\n                         const Point& origin,\n                         const Size& size) {\n    if (SendAppLinkToInstance(title)) {\n        return false;\n    }\n  Destroy();\n\n  const wchar_t* window_class =\n      WindowClassRegistrar::GetInstance()->GetWindowClass();\n\n  const POINT target_point = {static_cast<LONG>(origin.x),\n                              static_cast<LONG>(origin.y)};\n  HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);\n  UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);\n  double scale_factor = dpi / 96.0;\n\n  HWND window = CreateWindow(\n      window_class, title.c_str(), WS_OVERLAPPEDWINDOW,\n      Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),\n      Scale(size.width, scale_factor), Scale(size.height, scale_factor),\n      nullptr, nullptr, GetModuleHandle(nullptr), this);\n\n  if (!window) {\n    return false;\n  }\n\n  UpdateTheme(window);\n\n  return OnCreate();\n}\n\nbool Win32Window::Show() {\n  return ShowWindow(window_handle_, SW_SHOWNORMAL);\n}\n\n// static\nLRESULT CALLBACK Win32Window::WndProc(HWND const window,\n                                      UINT const message,\n                                      WPARAM const wparam,\n                                      LPARAM const lparam) noexcept {\n  if (message == WM_NCCREATE) {\n    auto window_struct = reinterpret_cast<CREATESTRUCT*>(lparam);\n    SetWindowLongPtr(window, GWLP_USERDATA,\n                     reinterpret_cast<LONG_PTR>(window_struct->lpCreateParams));\n\n    auto that = static_cast<Win32Window*>(window_struct->lpCreateParams);\n    EnableFullDpiSupportIfAvailable(window);\n    that->window_handle_ = window;\n  } else if (Win32Window* that = GetThisFromHandle(window)) {\n    return that->MessageHandler(window, message, wparam, lparam);\n  }\n\n  return DefWindowProc(window, message, wparam, lparam);\n}\n\nLRESULT\nWin32Window::MessageHandler(HWND hwnd,\n                            UINT const message,\n                            WPARAM const wparam,\n                            LPARAM const lparam) noexcept {\n  switch (message) {\n    case WM_DESTROY:\n      window_handle_ = nullptr;\n      Destroy();\n      if (quit_on_close_) {\n        PostQuitMessage(0);\n      }\n      return 0;\n\n    case WM_DPICHANGED: {\n      auto newRectSize = reinterpret_cast<RECT*>(lparam);\n      LONG newWidth = newRectSize->right - newRectSize->left;\n      LONG newHeight = newRectSize->bottom - newRectSize->top;\n\n      SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,\n                   newHeight, SWP_NOZORDER | SWP_NOACTIVATE);\n\n      return 0;\n    }\n    case WM_SIZE: {\n      RECT rect = GetClientArea();\n      if (child_content_ != nullptr) {\n        // Size and position the child window.\n        MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,\n                   rect.bottom - rect.top, TRUE);\n      }\n      return 0;\n    }\n\n    case WM_ACTIVATE:\n      if (child_content_ != nullptr) {\n        SetFocus(child_content_);\n      }\n      return 0;\n\n    case WM_DWMCOLORIZATIONCOLORCHANGED:\n      UpdateTheme(hwnd);\n      return 0;\n  }\n\n  return DefWindowProc(window_handle_, message, wparam, lparam);\n}\n\nvoid Win32Window::Destroy() {\n  OnDestroy();\n\n  if (window_handle_) {\n    DestroyWindow(window_handle_);\n    window_handle_ = nullptr;\n  }\n  if (g_active_window_count == 0) {\n    WindowClassRegistrar::GetInstance()->UnregisterWindowClass();\n  }\n}\n\nWin32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {\n  return reinterpret_cast<Win32Window*>(\n      GetWindowLongPtr(window, GWLP_USERDATA));\n}\n\nvoid Win32Window::SetChildContent(HWND content) {\n  child_content_ = content;\n  SetParent(content, window_handle_);\n  RECT frame = GetClientArea();\n\n  MoveWindow(content, frame.left, frame.top, frame.right - frame.left,\n             frame.bottom - frame.top, true);\n\n  SetFocus(child_content_);\n}\n\nRECT Win32Window::GetClientArea() {\n  RECT frame;\n  GetClientRect(window_handle_, &frame);\n  return frame;\n}\n\nHWND Win32Window::GetHandle() {\n  return window_handle_;\n}\n\nvoid Win32Window::SetQuitOnClose(bool quit_on_close) {\n  quit_on_close_ = quit_on_close;\n}\n\nbool Win32Window::OnCreate() {\n  // No-op; provided for subclasses.\n  return true;\n}\n\nvoid Win32Window::OnDestroy() {\n  // No-op; provided for subclasses.\n}\n\nvoid Win32Window::UpdateTheme(HWND const window) {\n  DWORD light_mode;\n  DWORD light_mode_size = sizeof(light_mode);\n  LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey,\n                               kGetPreferredBrightnessRegValue,\n                               RRF_RT_REG_DWORD, nullptr, &light_mode,\n                               &light_mode_size);\n\n  if (result == ERROR_SUCCESS) {\n    BOOL enable_dark_mode = light_mode == 0;\n    DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE,\n                          &enable_dark_mode, sizeof(enable_dark_mode));\n  }\n}\n"
  },
  {
    "path": "windows/runner/win32_window.h",
    "content": "#ifndef RUNNER_WIN32_WINDOW_H_\n#define RUNNER_WIN32_WINDOW_H_\n\n#include <windows.h>\n\n#include <functional>\n#include <memory>\n#include <string>\n\n// A class abstraction for a high DPI-aware Win32 Window. Intended to be\n// inherited from by classes that wish to specialize with custom\n// rendering and input handling\nclass Win32Window {\n public:\n     static void readPlacement(HWND hwnd);\n     static void writePlacement(HWND hwnd);\n\n  struct Point {\n    unsigned int x;\n    unsigned int y;\n    Point(unsigned int x, unsigned int y) : x(x), y(y) {}\n  };\n\n  struct Size {\n    unsigned int width;\n    unsigned int height;\n    Size(unsigned int width, unsigned int height)\n        : width(width), height(height) {}\n  };\n\n  Win32Window();\n  virtual ~Win32Window();\n\n  // Creates a win32 window with |title| that is positioned and sized using\n  // |origin| and |size|. New windows are created on the default monitor. Window\n  // sizes are specified to the OS in physical pixels, hence to ensure a\n  // consistent size this function will scale the inputted width and height as\n  // as appropriate for the default monitor. The window is invisible until\n  // |Show| is called. Returns true if the window was created successfully.\n  bool Create(const std::wstring& title, const Point& origin, const Size& size);\n\n  // Show the current window. Returns true if the window was successfully shown.\n  bool Show();\n\n  // Release OS resources associated with window.\n  void Destroy();\n\n  // Inserts |content| into the window tree.\n  void SetChildContent(HWND content);\n\n  // Returns the backing Window handle to enable clients to set icon and other\n  // window properties. Returns nullptr if the window has been destroyed.\n  HWND GetHandle();\n\n  // If true, closing this window will quit the application.\n  void SetQuitOnClose(bool quit_on_close);\n\n  // Return a RECT representing the bounds of the current client area.\n  RECT GetClientArea();\n\n protected:\n  // Processes and route salient window messages for mouse handling,\n  // size change and DPI. Delegates handling of these to member overloads that\n  // inheriting classes can handle.\n  virtual LRESULT MessageHandler(HWND window,\n                                 UINT const message,\n                                 WPARAM const wparam,\n                                 LPARAM const lparam) noexcept;\n\n  // Called when CreateAndShow is called, allowing subclass window-related\n  // setup. Subclasses should return false if setup fails.\n  virtual bool OnCreate();\n\n  // Called when Destroy is called.\n  virtual void OnDestroy();\n\n private:\n  friend class WindowClassRegistrar;\n\n  // OS callback called by message pump. Handles the WM_NCCREATE message which\n  // is passed when the non-client area is being created and enables automatic\n  // non-client DPI scaling so that the non-client area automatically\n  // responsponds to changes in DPI. All other messages are handled by\n  // MessageHandler.\n  static LRESULT CALLBACK WndProc(HWND const window,\n                                  UINT const message,\n                                  WPARAM const wparam,\n                                  LPARAM const lparam) noexcept;\n\n  // Retrieves a class instance pointer for |window|\n  static Win32Window* GetThisFromHandle(HWND const window) noexcept;\n\n  // Update the window frame's theme to match the system theme.\n  static void UpdateTheme(HWND const window);\n\n  bool quit_on_close_ = false;\n\n  // window handle for top level window.\n  HWND window_handle_ = nullptr;\n\n  // window handle for hosted content.\n  HWND child_content_ = nullptr;\n\n  bool SendAppLinkToInstance(const std::wstring& title);\n};\n\n#endif  // RUNNER_WIN32_WINDOW_H_\n"
  }
]